本地搭建 OPC UA MCP 服务

一、项目背景与核心目标

(一)技术背景

Model Context Protocol(MCP)是一套标准化的 AI 交互协议,核心价值在于为 AI 大模型提供 "万能接口"------ 如同 USB-C 接口的通用性,让 AI 无需定制化开发即可无缝对接各类数据源与工具,实现双向数据交互与功能调用。

在工业场景中,PLC(可编程逻辑控制器)作为核心控制设备,普遍采用 OPC UA 协议进行数据传输与通信。为打通 AI 模型与工业控制系统的连接链路,实现 AI 对 PLC 设备的智能管控,搭建 OPC UA-MCP 桥接服务成为关键第一步,其核心作用是解决两种协议的兼容性问题,构建 AI 与工业设备的通信桥梁。

(二)项目目标

  1. 完成本地 OPC UA 工业控制系统服务器搭建,模拟工业设备数据节点;
  2. 部署 Python 版本 MCP 服务,实现 OPC UA 协议与 MCP 协议的双向转换;
  3. 通过调试工具验证 MCP 服务的连接稳定性与功能可用性;
  4. 打通 MCP 服务与工业服务器的通信链路,为后续 AI 调用工业设备奠定基础。

二、前置环境准备

为保障搭建流程顺畅,需提前配置以下基础环境与工具:

  1. 编程语言环境:Python 3.13+(推荐版本,确保依赖兼容性);Node.js 18+(用于 MCP Inspector 调试工具运行);
  2. 依赖管理工具:uv(推荐,高效管理 Python 虚拟环境与依赖)或 pip(默认依赖安装工具);
  3. 版本控制工具:Git,用于拉取开源项目源码;
  4. 辅助工具:代码编辑器(如 VS Code)、终端工具(如 Windows Terminal、iTerm2);可选 OPC UA 客户端测试工具(如 UaExpert,用于交叉验证 OPC UA 服务器状态)。

三、核心搭建步骤与实施细节

(一)获取 OPC UA-MCP 源码

  1. 源码地址:https://github.com/midhunxavier/OPCUA-MCP/tree/main

  2. 仓库核心模块说明:

    • opcua-local-server/:工业级 OPC UA 模拟服务器,内置工业场景常用数据节点(如温度、压力传感器,执行器控制节点等);
    • opcua-mcp-server/:Python 版本 MCP 服务器(本次搭建核心),负责协议转换与数据转发;
    • opcua-mcp-npx-server/:TypeScript/Node.js 版本 MCP 服务器,提供多语言技术选型;
  3. 拉取源码命令: bash

    运行

    复制代码
    git clone https://github.com/midhunxavier/OPCUA-MCP.git
    cd OPCUA-MCP  # 进入项目根目录

(二)搭建 OPC UA 工业控制系统服务器

  1. 进入服务器目录: bash

    运行

    复制代码
    cd opcua-local-server
  2. 依赖安装:

    • 查看pyproject.toml文件确认核心依赖(主要包括opcua库,用于 OPC UA 协议实现);

    • 执行安装命令(推荐 uv,避免依赖冲突): bash

      运行

      复制代码
      uv install  # 虚拟环境自动创建并安装依赖
      # 若使用pip,需先创建虚拟环境(可选),再安装:
      # pip install -r requirements.txt
  3. 启动服务器: bash

    运行

    复制代码
    uv run main.py  # 或 python main.py(非虚拟环境)
  4. 启动验证:

    • 成功运行后,终端输出类似信息:Server started at opc.tcp://0.0.0.0:4840/freeopcua/server/
    • 关键注意事项:保持该终端持续运行,服务器需全程在线以支持后续通信。

(三)测试 OPC UA 协议通信

为确认 OPC UA 服务器正常提供数据服务,需通过脚本验证节点访问功能:

  1. 创建测试脚本:在opcua-local-server目录下新建test_showid.py文件,输入以下代码:

    python

    运行

    复制代码
    from opcua import Client
    
    def browse_all_nodes():
        # 服务器URL需与启动日志一致
        server_url = "opc.tcp://localhost:4840/freeopcua/server/"
        client = Client(server_url)
        
        try:
            client.connect()
            print("✅ OPC UA服务器连接成功,开始浏览节点...\n")
            
            # 从Objects节点开始遍历(工业控制相关节点均在此目录下)
            objects_node = client.get_objects_node()
            print(f"Objects根节点: {objects_node}")
            
            # 递归浏览节点(限制4层深度,避免输出冗余)
            def recursive_browse(node, level=0):
                indent = "  " * level
                node_id = node.nodeid  # 节点唯一标识(后续MCP调用需用到)
                display_name = node.get_display_name().Text  # 节点名称(如温度传感器)
                print(f"{indent}- 节点ID: {node_id}, 节点名称: {display_name}")
                
                if level < 4:
                    for child in node.get_children():
                        recursive_browse(child, level + 1)
            
            recursive_browse(objects_node)
        
        except Exception as e:
            print(f"❌ 浏览失败:{e}(请检查服务器是否启动或URL是否正确)")
        finally:
            client.disconnect()
            print("\n🔌 已断开与OPC UA服务器的连接")
    
    if __name__ == "__main__":
        browse_all_nodes()
  2. 执行测试: bash

    运行

    复制代码
    python test_showid.py
  3. 结果验证:若终端输出清晰的节点层级列表(含节点 ID 与名称,如Temperature_SensorPump_Controller等),说明 OPC UA 服务器通信正常,可进入下一步。

(四)搭建 Python 版本 MCP 服务

MCP 服务作为协议转换核心,需与 OPC UA 服务器联动部署:

  1. 切换至 MCP 服务器目录: bash

    运行

    复制代码
    cd ../opcua-mcp-server  # 从OPC UA服务器目录返回上级,再进入MCP目录
  2. 依赖安装:

    • 查看pyproject.toml确认依赖(核心包括mcp[cli]opcua等,用于 MCP 协议实现与 OPC UA 通信);

    • 执行安装命令: bash

      运行

      复制代码
      uv install  # 或 pip install -r requirements.txt
  3. 配置与启动 MCP 服务:

    • (可选)配置环境变量指定 OPC UA 服务器地址(默认连接localhost:4840,若地址变更需手动设置):

      bash

      运行

      复制代码
      # Windows系统
      set OPCUA_SERVER_URL="opc.tcp://localhost:4840/freeopcua/server/"
      # Mac/Linux系统
      export OPCUA_SERVER_URL="opc.tcp://localhost:4840/freeopcua/server/"
    • 启动 MCP 服务器: bash

      运行

      复制代码
      uv run opcua-mcp-server.py  # 或 python opcua-mcp-server.py
  4. 启动验证:终端输出 "MCP Server ready" 或类似就绪信息,说明 MCP 服务部署成功,保持终端运行。

(五)MCP 服务调试与功能验证

采用官方 MCP Inspector 工具进行交互式调试,确保 MCP 服务能正常调用 OPC UA 服务器功能:

  1. 调试工具简介:MCP Inspector 是官方提供的可视化调试工具,支持连接 MCP 服务器、调用工具函数、监控通信消息,可快速验证服务可用性与错误处理能力。

  2. 启动 Inspector 工具:打开新终端,进入opcua-mcp-server目录,执行以下命令(需 Node.js 18 + 环境):

    bash

    运行

    复制代码
    npx @modelcontextprotocol/inspector python opcua-mcp-server.py
  3. 调试步骤:

    • 步骤 1:验证基础连接。工具启动后自动打开浏览器界面,点击 "Connect" 按钮,若显示 "Connected",说明与 MCP 服务连接成功;
    • 步骤 2:能力协商检查。在界面 "Capabilities" 标签页,可查看 MCP 服务支持的所有工具函数(如get_all_variablesread_opcua_nodewrite_opcua_node等),确认核心功能已加载;
    • 步骤 3:功能调用测试。切换至 "Tools" 标签页,选择目标函数进行测试:
      • 示例 1:调用get_all_variables → 应返回 OPC UA 服务器中所有可用变量列表(与test_showid.py输出一致);
      • 示例 2:调用read_opcua_node → 输入测试脚本中获取的节点 ID(如ns=2;i=101),应返回该节点的当前值(如温度 25℃);
      • 示例 3:调用write_opcua_node → 输入节点 ID 与目标值(如将泵速度设置为 60%),执行后通过 OPC UA 测试脚本验证值是否更新;
    • 步骤 4:边缘情况测试。验证无效节点 ID 输入、缺少参数、并发调用等场景,检查 MCP 服务的错误提示是否清晰、是否能稳定运行。

(六)MCP 服务与工业服务器通信验证

完成上述调试后,进行端到端通信验证:

  1. 确认状态:OPC UA 服务器与 MCP 服务均处于运行状态;
  2. 通信验证:通过 MCP Inspector 调用browse_opcua_node_children等函数,遍历工业服务器节点,确认所有核心节点均可正常访问、数据可实时读取 / 写入;
  3. 结果判定:若所有测试用例均执行成功,说明 MCP 服务已完全打通与工业服务器的通信链路,达到项目预期目标。

四、常见问题排查与解决方案

问题类型 典型诱因 解决方案
OPC UA 服务器启动失败 Python 版本过低、依赖安装不完整 升级 Python 至 3.13+;删除uv.lock/requirements.txt,重新执行uv install
OPC UA 测试脚本连接失败 服务器未启动、URL 与启动日志不一致 确认opcua-local-server终端正常运行;核对脚本中server_url与启动输出一致
MCP 服务启动报错 环境变量配置错误、OPC UA 服务器未启动 检查OPCUA_SERVER_URL是否正确;确保 OPC UA 服务器已先启动再启动 MCP 服务
Inspector 无法连接 MCP Node.js 版本低于 18、终端目录错误 升级 Node.js 至 18+;确保终端当前目录为opcua-mcp-server
工具函数调用返回空值 节点 ID 输入错误、MCP 未关联正确 OPC UA 节点 通过test_showid.py重新获取节点 ID;检查 MCP 服务配置的 OPC UA 地址是否正确

五、注意事项与优化建议

(一)注意事项

  1. 环境一致性:全程使用同一 Python 版本与依赖管理工具(推荐 uv),避免跨工具导致的依赖冲突;
  2. 服务运行:OPC UA 服务器与 MCP 服务需保持终端持续运行,关闭终端将导致服务中断;
  3. 安全提示:当前搭建为本地测试环境,未启用加密与认证机制,生产环境需配置 OPC UA 证书、MCP 访问权限控制,避免数据泄露或误操作。

(二)优化建议

  1. 自动化部署:编写 Shell/Bat 脚本,整合 "依赖安装 - 服务启动 - 测试验证" 流程,减少手动操作;
  2. 日志增强:在 MCP 服务中添加详细日志(如请求参数、响应结果、错误堆栈),便于问题定位;
  3. 监控告警:集成 Prometheus、Grafana 等工具,监控 MCP 服务与 OPC UA 服务器的运行状态、响应时间;
  4. 功能扩展:根据实际工业场景需求,自定义 MCP 工具函数(如批量读取节点、报警阈值监控等)。

六、项目总结与展望

(一)项目总结

本次项目成功完成本地 MCP 服务的搭建与验证,核心成果包括:1. 部署了 OPC UA 工业模拟服务器,提供标准化工业数据节点;2. 搭建了 Python 版本 MCP 服务,实现 OPC UA 与 MCP 协议的无缝转换;3. 通过 Inspector 工具完成全流程调试,验证了数据读取、写入、节点遍历等核心功能,打通了 MCP 服务与工业服务器的通信链路,为后续 AI 模型接入奠定了坚实基础。

(二)未来展望

  1. 真实设备对接:将当前模拟 OPC UA 服务器替换为真实 PLC 设备,适配工业现场环境,完成实际场景验证;
  2. AI 模型集成:接入 Claude、ChatGPT 等大模型,实现通过自然语言指令控制工业设备;
  3. 高可用部署:基于 Docker 容器化部署 MCP 服务与 OPC UA 服务器,配置集群模式,提升服务稳定性与扩展性;
  4. 安全加固:启用 OPC UA 加密通信(如 SecurityPolicy.Basic256Sha256)、MCP 服务身份认证与权限管控,满足工业级安全要求。
相关推荐
WJX_KOI12 小时前
Open Notebook 一个开源的结合AI的记笔记软件
python
0思必得012 小时前
[Web自动化] 反爬虫
前端·爬虫·python·selenium·自动化
2301_8223827613 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
喵手13 小时前
Python爬虫实战:从零搭建字体库爬虫 - requests+lxml 实战采集字体网字体信息数据(附 CSV 导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·csv导出·采集字体库数据·字体库字体信息采集
2301_7903009614 小时前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
程序员敲代码吗15 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
Yyyyy123jsjs15 小时前
如何通过免费的外汇API轻松获取实时汇率数据
开发语言·python
喵手15 小时前
Python爬虫实战:GovDataMiner —— 开放数据门户数据集元数据采集器(附 CSV 导出)!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·open data·开放数据门户数据集列表
历程里程碑15 小时前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django