一、项目背景与核心目标
(一)技术背景
Model Context Protocol(MCP)是一套标准化的 AI 交互协议,核心价值在于为 AI 大模型提供 "万能接口"------ 如同 USB-C 接口的通用性,让 AI 无需定制化开发即可无缝对接各类数据源与工具,实现双向数据交互与功能调用。
在工业场景中,PLC(可编程逻辑控制器)作为核心控制设备,普遍采用 OPC UA 协议进行数据传输与通信。为打通 AI 模型与工业控制系统的连接链路,实现 AI 对 PLC 设备的智能管控,搭建 OPC UA-MCP 桥接服务成为关键第一步,其核心作用是解决两种协议的兼容性问题,构建 AI 与工业设备的通信桥梁。
(二)项目目标
- 完成本地 OPC UA 工业控制系统服务器搭建,模拟工业设备数据节点;
- 部署 Python 版本 MCP 服务,实现 OPC UA 协议与 MCP 协议的双向转换;
- 通过调试工具验证 MCP 服务的连接稳定性与功能可用性;
- 打通 MCP 服务与工业服务器的通信链路,为后续 AI 调用工业设备奠定基础。
二、前置环境准备
为保障搭建流程顺畅,需提前配置以下基础环境与工具:
- 编程语言环境:Python 3.13+(推荐版本,确保依赖兼容性);Node.js 18+(用于 MCP Inspector 调试工具运行);
- 依赖管理工具:uv(推荐,高效管理 Python 虚拟环境与依赖)或 pip(默认依赖安装工具);
- 版本控制工具:Git,用于拉取开源项目源码;
- 辅助工具:代码编辑器(如 VS Code)、终端工具(如 Windows Terminal、iTerm2);可选 OPC UA 客户端测试工具(如 UaExpert,用于交叉验证 OPC UA 服务器状态)。
三、核心搭建步骤与实施细节
(一)获取 OPC UA-MCP 源码
-
仓库核心模块说明:
opcua-local-server/:工业级 OPC UA 模拟服务器,内置工业场景常用数据节点(如温度、压力传感器,执行器控制节点等);opcua-mcp-server/:Python 版本 MCP 服务器(本次搭建核心),负责协议转换与数据转发;opcua-mcp-npx-server/:TypeScript/Node.js 版本 MCP 服务器,提供多语言技术选型;
-
拉取源码命令: bash
运行
git clone https://github.com/midhunxavier/OPCUA-MCP.git cd OPCUA-MCP # 进入项目根目录
(二)搭建 OPC UA 工业控制系统服务器
-
进入服务器目录: bash
运行
cd opcua-local-server -
依赖安装:
-
查看
pyproject.toml文件确认核心依赖(主要包括opcua库,用于 OPC UA 协议实现); -
执行安装命令(推荐 uv,避免依赖冲突): bash
运行
uv install # 虚拟环境自动创建并安装依赖 # 若使用pip,需先创建虚拟环境(可选),再安装: # pip install -r requirements.txt
-
-
启动服务器: bash
运行
uv run main.py # 或 python main.py(非虚拟环境) -
启动验证:
- 成功运行后,终端输出类似信息:
Server started at opc.tcp://0.0.0.0:4840/freeopcua/server/; - 关键注意事项:保持该终端持续运行,服务器需全程在线以支持后续通信。
- 成功运行后,终端输出类似信息:
(三)测试 OPC UA 协议通信
为确认 OPC UA 服务器正常提供数据服务,需通过脚本验证节点访问功能:
-
创建测试脚本:在
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() -
执行测试: bash
运行
python test_showid.py -
结果验证:若终端输出清晰的节点层级列表(含节点 ID 与名称,如
Temperature_Sensor、Pump_Controller等),说明 OPC UA 服务器通信正常,可进入下一步。
(四)搭建 Python 版本 MCP 服务
MCP 服务作为协议转换核心,需与 OPC UA 服务器联动部署:
-
切换至 MCP 服务器目录: bash
运行
cd ../opcua-mcp-server # 从OPC UA服务器目录返回上级,再进入MCP目录 -
依赖安装:
-
查看
pyproject.toml确认依赖(核心包括mcp[cli]、opcua等,用于 MCP 协议实现与 OPC UA 通信); -
执行安装命令: bash
运行
uv install # 或 pip install -r requirements.txt
-
-
配置与启动 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
-
-
启动验证:终端输出 "MCP Server ready" 或类似就绪信息,说明 MCP 服务部署成功,保持终端运行。
(五)MCP 服务调试与功能验证
采用官方 MCP Inspector 工具进行交互式调试,确保 MCP 服务能正常调用 OPC UA 服务器功能:
-
调试工具简介:MCP Inspector 是官方提供的可视化调试工具,支持连接 MCP 服务器、调用工具函数、监控通信消息,可快速验证服务可用性与错误处理能力。
-
启动 Inspector 工具:打开新终端,进入
opcua-mcp-server目录,执行以下命令(需 Node.js 18 + 环境):bash
运行
npx @modelcontextprotocol/inspector python opcua-mcp-server.py -
调试步骤:
- 步骤 1:验证基础连接。工具启动后自动打开浏览器界面,点击 "Connect" 按钮,若显示 "Connected",说明与 MCP 服务连接成功;
- 步骤 2:能力协商检查。在界面 "Capabilities" 标签页,可查看 MCP 服务支持的所有工具函数(如
get_all_variables、read_opcua_node、write_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 测试脚本验证值是否更新;
- 示例 1:调用
- 步骤 4:边缘情况测试。验证无效节点 ID 输入、缺少参数、并发调用等场景,检查 MCP 服务的错误提示是否清晰、是否能稳定运行。
(六)MCP 服务与工业服务器通信验证
完成上述调试后,进行端到端通信验证:
- 确认状态:OPC UA 服务器与 MCP 服务均处于运行状态;
- 通信验证:通过 MCP Inspector 调用
browse_opcua_node_children等函数,遍历工业服务器节点,确认所有核心节点均可正常访问、数据可实时读取 / 写入; - 结果判定:若所有测试用例均执行成功,说明 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 地址是否正确 |
五、注意事项与优化建议
(一)注意事项
- 环境一致性:全程使用同一 Python 版本与依赖管理工具(推荐 uv),避免跨工具导致的依赖冲突;
- 服务运行:OPC UA 服务器与 MCP 服务需保持终端持续运行,关闭终端将导致服务中断;
- 安全提示:当前搭建为本地测试环境,未启用加密与认证机制,生产环境需配置 OPC UA 证书、MCP 访问权限控制,避免数据泄露或误操作。
(二)优化建议
- 自动化部署:编写 Shell/Bat 脚本,整合 "依赖安装 - 服务启动 - 测试验证" 流程,减少手动操作;
- 日志增强:在 MCP 服务中添加详细日志(如请求参数、响应结果、错误堆栈),便于问题定位;
- 监控告警:集成 Prometheus、Grafana 等工具,监控 MCP 服务与 OPC UA 服务器的运行状态、响应时间;
- 功能扩展:根据实际工业场景需求,自定义 MCP 工具函数(如批量读取节点、报警阈值监控等)。
六、项目总结与展望
(一)项目总结
本次项目成功完成本地 MCP 服务的搭建与验证,核心成果包括:1. 部署了 OPC UA 工业模拟服务器,提供标准化工业数据节点;2. 搭建了 Python 版本 MCP 服务,实现 OPC UA 与 MCP 协议的无缝转换;3. 通过 Inspector 工具完成全流程调试,验证了数据读取、写入、节点遍历等核心功能,打通了 MCP 服务与工业服务器的通信链路,为后续 AI 模型接入奠定了坚实基础。
(二)未来展望
- 真实设备对接:将当前模拟 OPC UA 服务器替换为真实 PLC 设备,适配工业现场环境,完成实际场景验证;
- AI 模型集成:接入 Claude、ChatGPT 等大模型,实现通过自然语言指令控制工业设备;
- 高可用部署:基于 Docker 容器化部署 MCP 服务与 OPC UA 服务器,配置集群模式,提升服务稳定性与扩展性;
- 安全加固:启用 OPC UA 加密通信(如 SecurityPolicy.Basic256Sha256)、MCP 服务身份认证与权限管控,满足工业级安全要求。