返回市场
OPC-UA-MCP

OPC-UA-MCP

作者:midhunxavier8 星标更新:2025-06-02

项目介绍

OPC UA MCP 服务器

OPC UA MCP 服务器截图

概述

通过MCP工具,Python和TypeScript实现提供了相同的OPC UA操作核心功能,但在实现方法和部署模型上有所不同。

示例用法对话

配置完成后,您可以要求Claude执行实际的OPC UA操作:

读取传感器值

  • “反应器容器当前的温度读数是多少?”
  • “检查储罐A的压力水平”
  • “读取冷却系统中的所有温度传感器”
  • “获取生产线B上的当前流量率”

控制设备

  • “启动传送带电机”
  • “将混合器速度设置为80转/分钟”
  • “将阀门V-101打开到75%位置”
  • “启动循环泵”
  • “将加热元件设置为150°C”

生产操作

  • “以每小时100单位的速度开始生产线1的生产”
  • “在紧急模式下停止所有电机”
  • “使用配方A初始化批次反应器”
  • “开始对储罐B进行清洁周期”

系统监控

  • “显示系统中所有的报警状态”
  • “从水处理厂读取所有传感器值”
  • “检查所有泵和电机的状态”
  • “获取能耗读数”
  • “发现OPC UA服务器中所有可用变量”
  • “显示所有传感器和执行器的完整清单”

实际示例场景

用户: “反应器R-101的温度是多少?”
助手: 我将读取反应器R-101的温度传感器。
工具调用: 使用node_id "ns=2;i=11" 调用read_opcua_node
结果: “反应器R-101的温度:87.3°C”

用户: “启动主传送带电机”
助手: 我将为您启动主传送带电机。
工具调用: 使用node_id "ns=2;i=12" 和值 "true" 调用write_opcua_node
结果: “主传送带电机成功启动”

用户: “将泵速设置为65%”
助手: 我将调整泵速至65%。
工具调用: 使用node_id "ns=2;i=13" 和值 "65" 调用write_opcua_node
结果: “泵速已设置为65%”

用户: “显示系统中所有可用变量”
助手: 我将获取OPC UA服务器中所有变量的完整列表。
工具调用: 调用get_all_variables
结果: “找到15个变量:
- 名称:Temperature_Sensor_01,NodeID:ns=2;i=101,值:87.3°C
- 名称:Pressure_Sensor_01,NodeID:ns=2;i=102,值:2.5巴
- 名称:Flow_Rate_01,NodeID:ns=2;i=103,值:125.8升/分钟
…”

实现语言

Python版本(opcua-mcp-server

  • 语言:Python 3.13+
  • 框架:FastMCP
  • OPC UA库opcua(FreeOpcUa)
  • 传输:STDIO
  • 入口点opcua-mcp-server.py

NPX版本(opcua-mcp-npx-server

  • 语言:TypeScript/Node.js
  • 框架:@modelcontextprotocol/sdk
  • OPC UA库node-opcua
  • 传输:STDIO
  • 入口点src/index.ts(编译为build/index.js

功能比较

功能Python版本NPX版本备注
读取单个节点两者都支持自动类型检测
写入单个节点两者都支持自动类型转换
浏览节点子项两者返回JSON格式的结果
调用OPC UA方法两者支持参数转换
读取多个节点批量读取操作
写入多个节点批量写入操作
获取所有变量发现服务器地址空间中的所有变量
连接管理两者自动处理生命周期
错误处理全面的错误报告
类型转换自动数据类型转换

工具实现

可用工具(两个版本)

  1. read_opcua_node

    • 从单个OPC UA节点读取值
    • 参数:node_id(字符串)
    • 返回:带有ID前缀的节点值
  2. write_opcua_node

    • 向单个OPC UA节点写入值
    • 参数:node_id(字符串),value(字符串)
    • 返回:成功或失败的消息
  3. browse_opcua_node_children

    • 浏览OPC UA节点的子项
    • 参数:node_id(字符串)
    • 返回:带有ID和浏览名称的子节点数组
  4. read_multiple_opcua_nodes

    • 在一个请求中读取多个节点的值
    • 参数:node_ids(字符串数组)
    • 返回:将节点ID映射到值的字典
  5. write_multiple_opcua_nodes

    • 在一个请求中向多个节点写入值
    • 参数:nodes_to_write({node_id, value}对象数组)
    • 返回:每个写入操作的状态结果
  6. call_opcua_method

    • 调用OPC UA对象的方法
    • 参数:object_node_idmethod_node_idarguments(可选)
    • 返回:方法执行结果
  7. get_all_variables

    • 从OPC UA服务器获取所有可用变量
    • 参数:无
    • 返回:包含所有变量属性(名称、节点ID、值、数据类型、描述)的综合列表

部署与安装

Python版本

# 安装
cd opcua-mcp-server
uv install  # 或者pip install

# 使用
uv run opcua-mcp-server.py
# 或者
python opcua-mcp-server.py

NPX版本

# 直接使用(推荐)
npx opcua-mcp-npx-server

# 全局安装
npm install -g opcua-mcp-npx-server
opcua-mcp-npx-server

# 开发
npm install
npm run build
npm start

NPM包https://www.npmjs.com/package/opcua-mcp-npx-server

配置

两个版本使用相同的环境变量:

  • OPCUA_SERVER_URL:OPC UA服务器端点(默认:opc.tcp://localhost:4840

Python配置示例

{
  "mcpServers": {
    "opcua-python": {
      "command": "/Users/mx/.local/bin/uv",
      "args": [
        "--directory",
        "/path/to/opcua-mcp-server",
        "run",
        "opcua-mcp-server.py"
      ],
      "env": {
        "OPCUA_SERVER_URL": "opc.tcp://localhost:4840"
      }
    }
  }
}

NPX配置示例

{
  "mcpServers": {
    "opcua-npx": {
      "command": "npx",
      "args": ["opcua-mcp-npx-server"],
      "env": {
        "OPCUA_SERVER_URL": "opc.tcp://localhost:4840"
      }
    }
  }
}

依赖项

Python版本

  • mcp[cli]>=1.9.1:MCP框架
  • opcua>=0.98.13:OPC UA客户端库
  • cryptography>=45.0.2:安全支持
  • httpx>=0.28.1:HTTP客户端

NPX版本

  • @modelcontextprotocol/sdk:Node.js的MCP SDK
  • node-opcua:全面的OPC UA库
  • typescript:TypeScript编译器
  • @types/node:Node.js类型定义

安全性

两个版本目前连接时使用:

  • SecurityPolicy.None
  • MessageSecurityMode.None

对于生产用途,两者应实现:

  • 基于证书的身份验证
  • 加密通信
  • 用户身份验证
  • 输入验证