plctap
plctap is an MCP server that lets AI agents connect to, read from, diagnose, and analyze industrial PLC devices across eight protocols (Modbus, Modbus RTU, FINS, MELSEC, S7, IEC 104, EtherNet/IP, OPC UA).
Protocol discovery:
detect_devicescans a host, fingerprints open ports, and suggests protocol/read commands;list_protocolsdetails each protocol's addressing and options.Connectivity probing:
probe_devicechecks reachability and classifies failures (refused/timeout/no-reply/exception).Reading data:
plc_readreads registers, tags, or OPC UA nodes with datatype/byteorder interpretation;plc_browseexplores OPC UA address space.Frame analysis:
parse_frame,validate_frame, andparse_pcapparse/validate single frames or Wireshark captures without a live device.Diagnostics:
diagnoseuses a rule engine to produce structured fault candidates and evidence chains.Traffic interception:
start_listener/stop_listener/get_listener_framesrun a fake server to capture device-initiated frames (with fault injection);start_proxy/stop_proxy/get_proxy_framestransparently proxy and record PLC traffic.Writing (gated): Optional
plc_write/send_frame(disabled by default, requiresPLCTAP_ALLOW_WRITE=true) with auditing; six protocols support writes, IEC 104 and OPC UA are read-only.
Provides tools for connecting to, reading from, writing to, and diagnosing Siemens S7comm PLCs, including data area reads, 16-bit word writes to DB/M/I/Q areas, and transparent proxy or listener-based frame inspection.
plctap
中文 | English
Agent 的 PLC 驱动层 — 让 Claude / Codex / Cursor 直接连接、读写、诊断 Modbus TCP / Modbus RTU over TCP / FINS / MELSEC / Siemens S7comm / IEC 60870-5-104 / EtherNet/IP (CIP) 设备的 MCP Server。

状态: v0.6 (协议自动识别 + 透明代理 + 故障注入监听 + 八协议端点接入 (含 OPC UA 连接级诊断), 六端点可写 (IEC 104 / OPC UA 仅读); IEC 104 经 lib60870、EtherNet/IP 经 pycomm3 官方实现交叉验证, OPC UA 为 asyncua 官方库台架自洽验证)。
工具
层 | 工具 | 说明 |
连接 |
| 协议自动识别: 给 IP 并发探测标准端口, 按响应指纹判定协议/端口/置信度, deep 模式验证读并生成可执行的 plc_read 建议; 全程只读 |
连接 |
| 连通性探测 + 四类失败分层归因 (MELSEC 支持 3E binary/ASCII 自动回退; IEC 104 为 STARTDT+TESTFR 握手探测) |
连接 |
| 读数据区并按 datatype/字节序解释 (八个协议端点: modbus / modbus_rtu / fins / melsec / s7 / iec104 / enip / opcua); datatype 缺省返回 uint16/int16/float32 四种字序 (abcd/cdab/badc/dcba)/int32 多解释 (opcua 返回 UA 原生类型) |
连接 |
| 地址空间浏览: 从 node 展开一层子节点, 摸清设备数据结构后再读 (仅 OPC UA; 输出预算 200 子节点, 截断带 total/shown 计数) |
诊断 |
| 单帧结构化解析 / 规范校验清单 |
诊断 |
| 规则引擎 + 故障知识库 → 结构化候选报告 |
诊断 |
| 解析 Wireshark 导出 pcap, 逐流逐帧 (每条 TCP 流独立判别协议, 需 |
监听 |
| 钓鱼模式: 设备只能当 client 时立假 server 收帧分析 (三档: record_only / respond_normal / inject_errors 故障注入轮转; MELSEC 回帧支持全部 4 种帧格式; IEC 104 回 STARTDT/TESTFR CON 与总召罐头帧; EtherNet/IP 回 RegisterSession CON 与读 tag 应答罐头帧) |
监听 |
| 透明代理: 上位机 → 代理 → 真实 PLC, 透传同时分帧录制双向帧, 在线联调免 Wireshark (modbus/fins/melsec) |
执行 |
| 默认不注册, |
全部工具带 MCP annotations hint (wire 逐键锁定于 tests/test_tool_annotations.py): 纯本地解析类
readOnlyHint=true / openWorldHint=false, 联网读/探测/取帧类 readOnlyHint=true, 监听/代理
启停为非只读状态变更 (非破坏、非幂等), 写类 destructiveHint=true 且默认不注册 —— 客户端可
据此判断并行安全性与调用前确认级别。
Related MCP server: wago-plc-mcp-server
写能力
PLCTAP_ALLOW_WRITE=true 后八端点中六个可写 (modbus_rtu 与 modbus 同轨同语义; iec104 与 opcua 仅读):
协议 | 写语义 | options |
Modbus | fc16 批量写寄存器 (默认) / fc05 线圈 / fc06 单寄存器 |
|
S7 | 16 位字写入 DB/M/I/Q 区 |
|
FINS | 0102 存储区写字 (CIO/W/H/A/DM/EM) |
|
MELSEC | 1401 批量写字, 全部 4 种帧格式 |
|
EtherNet/IP | CIP tag 写 (0x4D); 整数默认 DINT, 浮点需显式 |
|
所有写/发送动作逐帧写入审计日志 (发送前留痕, 失败也留)。
协议速查
八个端点的寻址模型与常用参数 (接入前先对表; 工具内 list_protocols 亦可动态获取):
端点 | 默认端口 | 地址语义 | 常用 options |
| 502 | 寄存器地址 0 基, count=寄存器数 |
|
| 网关自定义 (常见 502 / 8899) | 同 | 同 |
| 9600 | 字地址, count=字数 |
|
| 44818 (SLMP; 5007 亦常见) | 起始编号, count=点数 (位软元件按 16 点/字) |
|
| 102 | 字节地址, count=字节数 |
|
| 2404 (2405 亦常见) | IOA 信息对象地址, 总召收集式读, count=连续 IOA 点数 (M_ME_NC 短浮点每点占 2 个 16 位字) |
|
| 44818 (2222 亦常见; 与 MELSEC SLMP 同端口, detect 按响应指纹区分) | tag 名字符串 (如 "alpha[0]"), count=元素个数 (数组 tag) | 写: |
| 4840 | NodeId 字符串 (如 "ns=2;i=5" / "ns=2;s=Demo.Double"), count=数组节点返回元素上限 (0=全部); 值按 UA 内建类型原生返回 | 仅 SecurityPolicy None (诊断场景); |
datatype 支持 uint16 / int16 / float32 / int32; byteorder 仅影响 float32 的寄存器对顺序
(big=ABCD, little=DCBA)。datatype 缺省时返回全部常见类型 × 字序的多解释, 字序存疑时直接比对。
示例调用 (客户端中按参数填写):
plc_read(protocol="modbus", host="10.0.0.10", port=502, address=0, count=2, datatype="float32", byteorder="big")
plc_read(protocol="modbus_rtu", host="192.168.1.50", port=8899, unit=2, address=100, count=10)
plc_read(protocol="fins", host="10.0.0.30", port=9600, address=100, count=10, options={"area": "DM"})
plc_read(protocol="melsec", host="10.0.0.40", port=44818, address=100, count=10, options={"device": "D"})
plc_read(protocol="s7", host="10.0.0.20", port=102, address=0, count=4, datatype="float32", options={"area": "DB", "db_number": 1})
plc_read(protocol="iec104", host="10.0.0.60", port=2404, address=1, count=5, options={"ca": 1})
plc_read(protocol="enip", host="10.0.0.70", port=44818, address="alpha[0]", count=3, datatype="dint")modbus 与 modbus_rtu 怎么选: 网关/上位机已封装 MBAP 头 (标准 Modbus TCP) → modbus;
串口服务器或网关工作在 RTU 透传模式 (TCP 上是裸 RTU 帧) → modbus_rtu。
典型工作流 (现场诊断)
detect_device(host=...)— 不知道对面是什么: 并发探测标准端口, 按响应指纹判定协议/端口/置信度, 返回可直接执行的plc_read建议 (全程只读)。probe_device(protocol, host, port)— 连通性确认; 失败时四类分层归因 (connection_refused / timeout / connected_but_no_reply / exception_response), 直接告诉您该查网络路由还是查协议配置 (IEC 104 为 STARTDT+TESTFR 握手探测)。plc_read(...)— 按「协议速查」读数, 与上位机显示或预期值比对。读数不对 / 通信故障 → 抓包帧喂
parse_frame/validate_frame做结构化解析与规范校验; 日志文本喂diagnose得到带证据链的结构化候选结论。要看上位机 ↔ PLC 全部交互 →
start_proxy透明代理 (上位机改指向代理即可, 免 Wireshark); 设备只能当 client 主动外连 →start_listener假 server 钓帧, 支持inject_errors故障注入档做上位机容错回归。
快速开始
uvx plctap # 或 pipx install plctap已收录于 MCP 官方 Registry: io.github.ymxc152/plctap
(支持按名称检索与安装的客户端可直接发现本服务)。
Claude Desktop 接入 (claude_desktop_config.json)
{
"mcpServers": {
"plctap": {
"command": "uvx",
"args": ["plctap"],
"env": { "PLCTAP_ALLOW_WRITE": "false" }
}
}
}本地开发 (仓库检出路径):
{
"mcpServers": {
"plctap": {
"command": "uv",
"args": ["--directory", "C:/path/to/plctap", "run", "plctap"]
}
}
}Codex 接入 (~/.codex/config.toml)
[mcp_servers.plctap]
command = "uvx"
args = ["plctap"]
[mcp_servers.plctap.env]
PLCTAP_ALLOW_WRITE = "false" # 写闸门默认关闭
PLCTAP_DEFAULT_TIMEOUT_MS = "2000"配置 (环境变量, 均有默认值)
变量 | 默认 | 说明 |
|
| 写类工具默认不注册 (安全闸门) |
|
| 每目标连接池上限 |
|
| 空闲连接回收秒数 |
|
| 网络超时 (串口网关 / 远程站点等慢链路可调大) |
|
| 审计日志路径 (写/发送动作逐帧留痕) |
安全
写操作默认完全不注册; 显式
PLCTAP_ALLOW_WRITE=true才启用。所有写/发送动作逐条写入 JSONL 审计日志 (
~/.plctap/audit.jsonl, 不可关)。发送类调用请配合客户端审批弹窗使用 (用户可见目标 IP 与完整帧)。
审计日志样例:
{"ts":"2026-09-04T01:20:33+0800","tool":"plc_write","target":"modbus://127.0.0.1:15020 unit=1","frame_hex":"0002000000060106000104d2","caller":"mcp"}
开发
uv sync --extra eval --group e2e
uv run pytest -q # 单测 (codec/适配器/诊断/监听) + 跨厂商 e2e + MCP 冒烟
uv run plctap # 本地启动 stdio server质量保障
569 项测试(codec 纯函数 + 适配器(含 Modbus RTU / IEC 104 / EtherNet/IP / OPC UA)+ 诊断引擎 + 监听器 + 透明代理 + detect_device + MCP 冒烟),CI 每次推送回归。
跨厂商 e2e(tests/e2e):plctap 与 pymodbus、python-snap7、 pymcprotocol、pypi fins、MZ Automation 官方 lib60870.NET、pycomm3(Rockwell 官方客户端库)六个第三方权威实现做真实 socket 交叉验证 (读写闭环、读数逐值比对、钓鱼监听互通),CI 随行(
uv sync --group e2e); IEC 104 交叉验证需 .NET 8 SDK(缺省自动跳过)。OPC UA 端点为 asyncua 官方库 + 台架自洽验证(会话协议无帧级诊断,与本节其余端点的字节级交叉验证口径不同,如实区分)。八档评测 49/49:单帧 / RTU 完整性 / 批量日志 / FINS·MELSEC 专项 / 主动探测归因 / 协议自动识别 / IEC 104 专项 / EtherNet/IP 专项 (detect 档含"回显服务器欺骗"与"证据压过端口先验"两类反例);与裸模型的双跑对比见下节。
评测对比 (裸模型基线双跑: 五档 35 用例)
档位 | plctap 工具链 | 裸模型直接问答* |
单帧 Modbus TCP | 8/8 | 8/8 |
RTU 完整性/CRC | 5/5 | 4/5 |
批量日志 (混排) | 5/5 | 3/5 |
FINS/MELSEC 专项 | 12/12 | 5/12 |
主动探测归因 | 5/5 | 4/5 |
合计 | 35/35 (100%) | 24/35 (68.6%) |
* 同一批语料双跑, 除工具外一切相同: 裸模型 (glm-5.3-flash, 无工具, temperature=0) 直接问答; 确定性关键词判分 (事实等价集, 双模式共用); 6 例因推理端点超时未获有效答案计 FAIL (排除超时后 24/29 = 82.8%)。裸模型跑分日期 2026-09-04, 语料版本 317e868 (跑分时点; fins 语料其后于 b319374 随线上格式修正同步更新, 判分语义不变)。 范围说明: 语料建于 M2 (v0.2 时代), 覆盖帧解析 / CRC 完整性 / 日志混排 / 冷门协议语义 / 主动探测归因; v0.3+ 功能 (plc_write / parse_pcap / 透明代理 / modbus_rtu 端点 / vendor_hints / iec104 端点 / enip 端点 / opcua 端点) 未纳入基线。detect 档 (4 用例, v0.4 新增)、iec104 档 (6 用例, v0.5.2 新增) 与 enip 档 (4 用例, v0.5.3 新增) 需起真实网络服务/台架做主动探测与交互, 不适合裸问答 形式, 故未纳入对比 —— 工具模式八档合计 49/49 (2026-09-07 按当前语料复跑, 见「质量保障」)。 结论: 单帧翻译裸模型已能胜任, 价值差距集中在冷门协议语义与多故障混排场景 —— 这正是确定性解析 + 结构化知识库的所在。方法学与复跑步骤见 eval/README.md。
运行时边界: eval/ 是开发期基准测试 harness (裸模型基线对比), 仅复跑评测时需要
PLCTAP_ 前缀环境变量 (key/端点/模型全部显式提供, 仓库不内置任何厂商端点);
发布产物只含 src/plctap —— MCP server 运行时零 AI/LLM 依赖,
不读也不需要任何模型 API 凭据。
多模型裸基线矩阵 (2026-09-08: 4 模型 × 双跑 × 五档 35 用例)
模型 (档位) | run1 | run2 | 无答案 run1/run2* |
glm-5.3-flash (Agent 同款) | 13/35 | 13/35 | 12 / 11 |
glm-5-2 (强) | 10/35 | 10/35 | 13 / 14 |
doubao-seed-turbo (弱) | 9/35 | 9/35 | 14 / 13 |
deepseek-v4-flash (中) | 8/35 | 8/35 | 2 / 2 |
plctap 工具链 (对照, 同语料) | 35/35 | 35/35 | — |
换任何裸模型 (弱/中/强/Agent 同款) 都在 8~13/35 徘徊, 冷门协议档 8 轮合计 0/96; 挂上 plctap 工具层后 49/49 (八档), 且与模型强弱无关。 两种失败模式同时被工具层免疫: 推理跑飞 (八轮 81 次零输出, 单例实测烧满 32768 reasoning tokens 无正文) 与 "流畅的错误" (deepseek-v4-flash 无答案仅 2/2 却总分最低, FINS/MELSEC 档 12 条全错)。
* 无答案 = 模型零输出 (推理超时), 计 FAIL (09-04 口径沿用)。本矩阵与上表 (2026-09-04, 24/35) 不可同表硬比: 端点不同 (火山方舟 vs Codex 本地代理)、服务端模型版本可能漂移、 判分等价集为当期校准 —— 同名模型 ≠ 同条件。双跑总分逐分复现 (temperature=0), 分档内部 有小幅漂移。完整矩阵与方法学见 eval/README.md。
版本与兼容承诺
自 v0.6.1 起遵循稳定化纪律:
向后兼容: MCP 工具名、参数名与各工具的返回结构保持兼容。返回结构由 pydantic 模型 定义并锁定 (
tests/test_tool_shapes.py黄金校验; 例外: list_protocols 的 protocols 条目为自由形态 dict); 新增协议端点、新增工具、新增可选参数只增不改。工具 annotations: 17 个工具的 readOnlyHint/destructiveHint/idempotentHint/openWorldHint 四项全显式 (server.py
_ANN_*四分组), 黄金值锁定于tests/test_tool_annotations.py; annotations 属只增元数据, 任何取值变化按 wire 变化对待。破坏性变更: 若不可避免, 在工具 docstring、本 README 与 Release notes 三处提前标注, 并尽量提供迁移期。
不承诺面:
src/plctap内部模块组织、诊断知识库条目数、评测数字随版本正常演进。1.0 (语义定稿) 的宣布条件: 上述纪律经过至少一个完整发布周期的验证, 届时另行公告。
License
MIT
Available Tools
15 toolsdetect_deviceDetect DeviceARead-onlyIdempotent
设备自动识别: 给定 host 自动扫端口并判定协议 (v0.4, 全程只读)。
流程: 并发扫描候选端口 (缺省 102/502/2000/2404/44818/4840/5007/6000/9600/9601, 单端口连接预算 0.5s) -> 开放端口并发跑已注册协议 probe 指纹 (单协议预算 timeout_ms/1000, 缺省 0.8s; 个别协议有独立预算如 opcua 的完整会话握手) -> high 候选按协议做一次最小读验证 (deep=True 缺省; 成功升级 verified, 失败留痕保持 high; deep=False 跳过验证读)。 只读保证: 全程只发握手帧 + 最小读帧, 不写任何数据; 且识别 ≠ 可访问 —— 例如 S7 PUT/GET 被关闭时识别照样成功, 读 DB 仍可能失败。 返回 DetectResult: candidates 按置信度降序 (同级先验匹配端口优先, next_step 可直接作为 plc_read 调用), unknown_services 为开放但 已注册协议都不认识的端口 (可用 start_listener 钓帧分析)。
Inputs: host (required), deep, ports, timeout_ms. Returns: detect_device 输出: 扫描/指纹/验证三阶段的结构化汇总。 candidates 按 confidence 降序, 同级先验匹配端口优先; un…
diagnoseDiagnoseARead-onlyIdempotent
综合观测给出结构化的故障候选结论 (确定性规则, 不编故事; 全程只读)。
三种证据可任意组合 (至少给一种):
frame_hex: 一帧报文 hex (解析 + 校验 + 规则匹配)
log_snippet: 通信日志文本, 自动提取其中的 hex 帧逐帧解析
host + port: 连上设备做一次探测, 把探测归因纳入推理 返回 DiagnosticReport: candidates 按 confidence 降序, 每条含 symptom/root_cause/evidence(证据链)/suggested_action/next_tools; evidence 与 observations 保留原始观测供复核。空 candidates = 知识库未覆盖, 不硬凑结论。
Inputs: protocol (required), host, port, unit, +2 more. Returns: 诊断引擎 (D4) 的结构化输出: 按置信度降序的候选结论列表。 observations 汇总本次诊断使用的原始观测 (probe 结果/解析错误/校验 失…
get_listener_framesGet Listener FramesARead-onlyIdempotent
取监听收下的帧 (direction/peer/frame_hex), 供 parse_frame/diagnose 分析。
取最新 limit 条; 环形缓冲硬上限 1000 条 (limit 超限自动截到缓冲 大小, limit<=0 返回空) —— 输出量受 limit 与缓冲上限双重约束。
Inputs: port (required), limit. Returns: result
get_proxy_framesGet Proxy FramesARead-onlyIdempotent
取代理录制的双向透传帧 (direction: c2s=上位机→PLC, s2c=PLC→上位机)。
取最新 limit 条; 环形缓冲硬上限 1000 条 (limit 超限自动截到缓冲 大小, limit<=0 返回空)。
Inputs: port (required), limit. Returns: result
list_protocolsList ProtocolsARead-onlyIdempotent
列出本 server 支持的工业协议及其能力。
返回每个协议的端口提示、地址模型、数据类型和品牌线索, Agent 可据此推断 "这个设备该用什么协议" 而无需问用户。 不确定协议名时先调用本工具。 不确定协议/端口时先调用 detect_device。
Inputs: no named parameters. Returns: list_protocols 输出: 外层三键锁定; protocols 内条目保持自由形态 dict (meta 条件键"缺键而非 null"——建模会把缺…
parse_frameParse FrameARead-onlyIdempotent
把一帧报文 hex 逐字段结构化解析 (不需要连接设备)。
每个字段带 byte_offset 与 raw_hex 证据; 支持正常请求/响应与异常 响应帧; 畸形帧不抛错, 而是尽量解析并在 errors 里说明哪里坏 —— "解析失败的方式"本身是诊断证据。 direction: "auto" 按帧结构判别, 也可显式传 "req" / "resp"。 frame_format (仅 melsec): "3e_binary" / "3e_ascii" / "4e_binary" / "4e_ascii"。
modbus: 异常帧/非 12 字节按响应, 12 字节按请求 (fc05/06 的响应 与请求逐字节相同, 任一解释一致)
fins: TCP 命令 0x00 按请求 / 0x01、0x02 按响应; 0x04 按 FINS ICF bit6 判别 (响应置位)
melsec: 副头部 50 00/54 00 按请求, D0 00/D4 00 按响应 (ASCII 帧 "5000"/"5400"/"D000"/"D400" 同理)
s7: rosctr=0x01 (Job) 按请求, 0x03 (Ack_Data) 按响应; 显式传 direction 时按传入值
Inputs: protocol (required), frame_hex (required), direction, frame_format. Returns: codec.parse 的输出。errors 汇总所有结构/交叉校验问题; valid = not errors。
parse_pcapParse PcapARead-onlyIdempotent
解析 Wireshark 导出 pcap: 按 TCP 流聚合载荷 -> 按协议切帧 -> 逐帧 parse_auto。
每个流返回完整帧序列 (带结构化解析) 与尾部半帧 (partial, 截断也是 诊断信息)。protocol 缺省时按"完整帧数最多的协议"自动判别。 需要可选依赖 scapy (uv sync --extra eval)。大批量帧场景比逐条 frame_hex 高效得多。 输出受 64KB token 预算约束: 超出时按流序/帧序装帧并截断, 末尾追加 一条 flow 以 "truncated:" 开头的 sentinel 流 (frames 为空, 带 total/shown 计数)。需要其余帧时用 protocol= 过滤或拆分 pcap 再解析。
Inputs: path (required), protocol. Returns: result
plc_browsePlc BrowseARead-onlyIdempotent
浏览地址空间: 从 node 展开一层子节点 (诊断场景的"列目录")。
返回 {node, children, total, shown, truncated}: children 每项含 node_id / display_name / node_class; 超出输出预算时 truncated=true 且 total 给出全量数 —— 需要更深层级就对着子 node_id 再调一次。 默认从 Objects 文件夹 (ns=0;i=85) 起步; 对 plc_read 前先摸清 设备地址空间结构时用。 当前仅 OPC UA 支持 (会话协议无帧概念, browse 是它的"读目录"形态); 其他协议用 list_protocols 的 read_options 直接构造地址。 输出预算: 单次最多 200 个子节点 (约 30KB), 防止大地址空间撑爆上下文。
Inputs: host (required), port (required), protocol (required), node, +3 more. Returns: plc_browse 输出: 一层子节点 + 预算截断计数。
plc_readPlc ReadARead-onlyIdempotent
从 PLC 读取数据区并按数据类型解释。
address/count 为通用地址与数量, 语义由协议决定:
Modbus: address 为 0 基寄存器地址, count 为寄存器个数
FINS: address 为字地址, count 为字数
MELSEC: address 为起始编号, count 为点数 (位软元件按 16 点/字)
S7: address 为字节地址, count 为字节数 (count=4 + uint16 → 2 个值)
EtherNet/IP: address 为 tag 名字符串 (如 "alpha[0]"), count 为元素个数
OPC UA: address 为 NodeId 字符串 (如 "ns=2;i=5" / "ns=2;s=Demo.Double"), count 为数组节点返回元素上限 (0=全部); 值按 UA 内建类型原生返回
datatype 取 uint16/int16/float32, None 返回原始 16 位值 + 所有常见数据类型的多解释 (interpretations 字段), 便于 Agent 识别正确的数据类型。 byteorder 仅影响 float32 寄存器对顺序 (big=ABCD, little=DCBA)。
options: 协议特有参数, 由各协议 adapter 自行定义与校验。 用 list_protocols 查看每个协议的 read_options 说明。
Inputs: host (required), port (required), address (required), protocol (required), +6 more. Returns: plc_read 输出。raw_registers 为寄存器原始 16 位值; interpreted 为按 datatype/byteorder 解释后的值…
probe_deviceProbe DeviceARead-onlyIdempotent
测试能否连上 PLC 并通信, 失败时给出层级归因。
reachable = 传输层可达 (TCP 已建立; 设备回异常响应也算在线)。 failure_class 取:
connection_refused: 端口没人监听/网络不可达 (查网络与端口)
timeout: 连接超时 (查网络路由/防火墙)
connected_but_no_reply: TCP 通了但设备不回话 (查协议配置)
exception_response: 设备回异常码 (查 unit/寄存器配置, 带 exception_code) 典型用法: 设备"读不到数据"时先调本工具分层定位, 再决定下一步。
Inputs: host (required), port (required), protocol (required), unit. Returns: probe_device 输出: 连通性探测 + 四类失败归因。 reachable 语义 = 传输层可达 (TCP 已建立)。设备回异常响应 (except…
start_listenerStart ListenerA
起钓鱼模式监听: 待测设备只能当 client 时, 立假 server 钓出它的帧行为。
mode 三档: record_only=只收帧不回复 (纯被动) / respond_normal=对读类 请求回最小"正常响应" (数据恒 0, 目的只是让设备继续吐帧, 非通用模拟器) / inject_errors=正常回帧但按 faults 列表轮转注入确定性故障 (评测语料 生产 + 诊断引擎回归)。 faults (仅 inject_errors): modbus 可选 exception/bad_length/truncate, fins/melsec 可选 end_code/bad_length, 全协议通用 garbage。 收下的帧用 get_listener_frames 取, 再喂 parse_frame/diagnose。 port=0 由系统分配, 返回实际端口。建议收满样本后 stop_listener, 并提醒用户恢复设备原配置。
Inputs: protocol (required), host, mode, port, +2 more. Returns: start_listener 输出。
start_proxyStart ProxyA
起透明代理: 上位机 → 代理 → 真实 PLC, 透传同时按协议分帧录制双向帧。
现场联调时把上位机目标地址改成本代理, 无需 Wireshark 即可拿到全部 交互帧 (get_proxy_frames), 再喂 parse_frame/diagnose 做在线分析。 protocol 当前支持 modbus/fins/melsec (S7 TPKT 分帧暂不支持); listen_port=0 由系统分配。代理是诊断设施: 只透传与录制, 不改写帧。
Inputs: protocol (required), target_host (required), target_port (required), listen_host, +2 more. Returns: start_proxy 输出。
stop_listenerStop ListenerA
停掉指定端口的监听, 返回收/发帧统计。
Inputs: port (required). Returns: stop_listener 输出: 收帧统计。
stop_proxyStop ProxyA
停掉指定端口的代理, 返回录制统计 (c2s/s2c 帧数)。
Inputs: port (required). Returns: stop_proxy 输出: 双向录制统计。
validate_frameValidate FrameARead-onlyIdempotent
对一帧报文跑规范校验清单, 逐项 pass/fail (不需要连接设备)。
Modbus TCP: MBAP 长度一致性、协议号、功能码、unit 范围、PDU 自洽、数量/地址边界、异常码 (Modbus TCP 无 CRC, RTU 才有)。 FINS/TCP: magic、TCP 长度自洽、TCP 命令合法、error 字段、 FINS 端结码、载荷完整性。 MELSEC 3E: 副头部、数据长度自洽、命令/软元件代码、结束代码。 direction 取 req 或 resp。
Inputs: protocol (required), frame_hex (required), direction, frame_format. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 15 tools
Each tool targets a distinct diagnostic phase: protocol listing, frame parsing/validation, live probing, data reading/browsing, capture via proxy/listener, and final diagnosis. Even the two capture retrieval tools (get_proxy_frames vs get_listener_frames) are clearly separated by capture source, and parser/validator/diagnose have non-overlapping purposes.
Most tools follow a clear verb_noun snake_case pattern (list_protocols, validate_frame, probe_device, parse_frame, start_listener, stop_proxy). The only minor deviation is plc_read and plc_browse, which invert the pattern to noun_verb, but the pair is internally consistent and still readable.
15 tools is at the upper edge of the well-scoped range but every tool earns its place in the diagnostic workflow: detection, parsing, validation, capture, reading, browsing, and analysis. There is no redundancy or padding, and the count matches the breadth of the industrial protocol domain.
The tool surface covers the full diagnostic lifecycle: detect/probe devices, parse and validate frames, capture live traffic via proxy or listener, retrieve captured frames, browse address spaces, read PLC data, and produce structured diagnoses. The read-only focus is consistent and intentional, with no dead ends in the workflow.
Maintenance
Related MCP Connectors
MCP Server for an Agent Task Marketplace
Agent Orchestrator MCP Server by MEOK AI Labs
MCP gateway and cloud hosting for MCP servers, agents and apps like RAG, managed from your agent.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for Modbus TCP devices that enables AI agents to read/write PLC registers by name using YAML device profiles, with a built-in simulator.2MIT
- FlicenseNot gradedqualityBmaintenanceMCP server that connects WAGO PLCs to LLM agents via the WDx/WDA REST API, enabling AI assistants to read sensor values, change configuration, trigger firmware updates, or monitor entire PLC fleets without custom code.199 PyPI4-
- FlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI agents interact with Siemens TIA Portal via its Openness API.-
- AlicenseBqualityCmaintenanceUniversal MCP server for industrial PLC communication, enabling AI agents to read sensors, alarms, status, setpoints, and write setpoints via adapters for Modbus, S7, or custom PLCs.6MIT