plctap
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
Agent 的 PLC 驱动层 — 让 Claude / Codex / Cursor 直接连接、读写、诊断 Modbus TCP / FINS / MELSEC / Siemens S7comm PLC 的 MCP Server。

状态: v0.4.0 (协议自动识别 + 透明代理 + 故障注入监听 + 四协议读写 + 跨厂商 e2e)。
工具
层 | 工具 | 说明 |
连接 |
| 协议自动识别: 给 IP 并发探测标准端口, 按响应指纹判定协议/端口/置信度, deep 模式验证读并生成可执行的 plc_read 建议; 全程只读 |
连接 |
| 连通性探测 + 四类失败分层归因 (MELSEC 支持 3E binary/ASCII 自动回退) |
连接 |
| 读数据区并按 datatype/字节序解释 (四协议); datatype 缺省返回 uint16/int16/float32 四种字序 (abcd/cdab/badc/dcba)/int32 多解释 |
诊断 |
| 单帧结构化解析 / 规范校验清单 |
诊断 |
| 规则引擎 + 故障知识库 → 结构化候选报告 |
诊断 |
| 解析 Wireshark 导出 pcap, 逐流逐帧 (每条 TCP 流独立判别协议, 需 |
监听 |
| 钓鱼模式: 设备只能当 client 时立假 server 收帧分析 (三档: record_only / respond_normal / inject_errors 故障注入轮转; MELSEC 回帧支持全部 4 种帧格式) |
监听 |
| 透明代理: 上位机 → 代理 → 真实 PLC, 透传同时分帧录制双向帧, 在线联调免 Wireshark (modbus/fins/melsec) |
执行 |
| 默认不注册, |
Related MCP server: wago-plc-mcp-server
写能力
PLCTAP_ALLOW_WRITE=true 后四协议能力:
协议 | 写语义 | options |
Modbus | fc16 批量写寄存器 (默认) / fc05 线圈 / fc06 单寄存器 |
|
S7 | 16 位字写入 DB/M/I/Q 区 |
|
FINS | 0102 存储区写字 (CIO/W/H/A/DM/EM) |
|
MELSEC | 1401 批量写字, 全部 4 种帧格式 |
|
所有写/发送动作逐帧写入审计日志 (发送前留痕, 失败也留)。
质量保障
452 项单测(codec 纯函数 + 适配器 + 诊断引擎 + 监听器 + 透明代理 + detect_device),CI 每次推送回归。
跨厂商 e2e(tests/e2e):plctap 与 pymodbus、python-snap7、 pymcprotocol、pypi fins 四个第三方权威实现做真实 socket 交叉验证 (读写闭环、读数逐值比对、钓鱼监听互通),CI 随行(
uv sync --group e2e)。六档评测 39/39:单帧 / RTU 完整性 / 批量日志 / FINS·MELSEC 专项 / 主动探测归因 / 协议自动识别 (detect 档含"回显服务器欺骗"与"证据压过端口先验"两类反例)。
评测对比 (五档, 35 用例)
档位 | plctap 工具链 | 裸模型直接问答* |
单帧 Modbus TCP | 8/8 | 8/8 |
RTU 完整性/CRC | 5/5 | 4/5 |
批量日志 (混排) | 5/5 | 4/5 |
FINS/MELSEC 专项 | 12/12 | 5/12 |
主动探测归因 | 5/5 | 5/5 |
合计 | 35/35 (100%) | 24/35 (68.6%) |
* 基线方法: 同一批语料, 裸模型 (glm-5.3-flash, 无工具, temperature=0) 直接问答; 确定性关键词判分 (事实等价集, 双模式共用); 6 例因推理端点超时未获有效答案计 FAIL (排除超时后 24/29 = 82.8%)。跑分日期 2026-09-04, 语料版本见 git。 结论: 单帧翻译裸模型已能胜任, 价值差距集中在冷门协议语义与多故障混排场景 —— 这正是确定性解析 + 结构化知识库的所在。
快速开始
uvx plctap # 或 pipx install plctapClaude 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 serverLicense
MIT
Available Tools
14 toolsdetect_deviceDetect DeviceA
设备自动识别: 给定 host 自动扫端口并判定协议 (v0.4, 全程只读)。
流程: 并发扫描候选端口 (缺省 102/502/2000/44818/5007/6000/9600/9601, 单端口连接预算 0.5s) -> 开放端口并发跑四协议 probe 指纹 (单协议 预算 timeout_ms/1000, 缺省 0.8s) -> high 候选按协议做一次最小读 验证 (deep=True 缺省; 成功升级 verified, 失败留痕保持 high; deep=False 跳过验证读)。 只读保证: 全程只发握手帧 + 最小读帧, 不写任何数据; 且识别 ≠ 可访问 —— 例如 S7 PUT/GET 被关闭时识别照样成功, 读 DB 仍可能失败。 返回 DetectResult: candidates 按置信度降序 (同级先验匹配端口优先, next_step 可直接作为 plc_read 调用), unknown_services 为开放但 四协议都不认识的端口 (可用 start_listener 钓帧分析)。
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | ||
| host | Yes | ||
| ports | No | ||
| timeout_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| host | Yes | |
| candidates | Yes | |
| elapsed_ms | Yes | |
| open_ports | Yes | |
| closed_count | Yes | |
| scanned_ports | Yes | |
| unknown_services | Yes | |
| network_assessment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the read-only guarantee, that only handshake and minimal read frames are sent, that no data is written, and that recognition does not imply accessibility. It also details the deep verification behavior and default timing budgets, going well beyond what the schema or annotations could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and well-structured, with a clear flow from scanning to probing to verification, followed by the read-only guarantee and return semantics. Every sentence contributes useful information, though the length is considerable and could be streamlined for faster consumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is highly complete. It covers input semantics, defaults, operational steps, safety guarantees, output ordering, and inter-tool handoffs (e.g., 'next_step' for 'plc_read', 'unknown_services' for 'start_listener'). The presence of an output schema further reduces the need to document return values, making this definition sufficient for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'deep' parameter's effect (verification read or skip), 'timeout_ms' as a per-protocol budget (timeout_ms/1000 seconds, default 0.8s), 'ports' with a default candidate list, and 'host' as the target. This adds meaningful semantic context and defaults beyond the raw schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: given a host, it scans ports and determines the protocol ('设备自动识别: 给定 host 自动扫端口并判定协议'). It also describes the output structure and downstream uses. However, it does not explicitly differentiate itself from the sibling tool 'probe_device', which appears semantically similar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the operational flow and default behaviors, but it does not specify when to use this tool versus alternatives like 'probe_device' or 'plc_read'. There is no explicit 'when to use' or 'when not to use' guidance, leaving the agent to infer the appropriate invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnoseDiagnoseA
综合观测给出结构化的故障候选结论 (确定性规则, 不编故事)。
三种证据可任意组合 (至少给一种):
frame_hex: 一帧报文 hex (解析 + 校验 + 规则匹配)
log_snippet: 通信日志文本, 自动提取其中的 hex 帧逐帧解析
host + port: 连上设备做一次探测, 把探测归因纳入推理 返回 DiagnosticReport: candidates 按 confidence 降序, 每条含 symptom/root_cause/evidence(证据链)/suggested_action/next_tools; evidence 与 observations 保留原始观测供复核。空 candidates = 知识库未覆盖, 不硬凑结论。
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| port | No | ||
| unit | No | ||
| protocol | Yes | ||
| frame_hex | No | ||
| log_snippet | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| candidates | No | |
| next_tools | No | |
| observations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does an excellent job: it discloses deterministic rule-based behavior, no fabrication, automatic frame extraction from logs, network probing from host+port, sorted candidates, preservation of raw observations, and empty candidates when the knowledge base does not cover the case. This is substantial behavioral disclosure beyond the bare tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, uses a bullet list for evidence modes, and every sentence carries information. It is dense but not bloated, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and 0% schema coverage, it covers the essential input modes, output contract, and behavior meaningfully, and the presence of an output schema reduces the need to describe return fields. The main missing piece is the required protocol/unit semantics and an explicit pointer to list_protocols or a list of supported values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds useful semantics for frame_hex, log_snippet, host, and port, including parse/checksum, automatic frame extraction, and probing behavior. But the schema coverage is 0% and the required protocol parameter is left completely unexplained, as is unit; an agent would have to guess or look elsewhere for valid protocol values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as one that maps observations to structured fault candidates and specifies the output report. The verb 'diagnose' plus resource ('故障候选结论') is concrete, but it does not explicitly differentiate from sibling tools such as parse_frame or probe_device, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit input constraints: any combination of frame_hex, log_snippet, or host+port, with at least one required. However, it never states when to choose diagnose over the sibling parsing/probing/listening tools or names an alternative, so the agent must infer the intended entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listener_framesGet Listener FramesB
取监听收下的帧 (direction/peer/frame_hex), 供 parse_frame/diagnose 分析。
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral transparency burden. It discloses that the result is a set of frames with direction/peer/frame_hex and frames them as analysis input, implying a read-only fetch. However, it does not mention prerequisites such as whether the listener must already be running, nor does it state side effects or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the operation and includes the relevant payload fields and purpose. The phrasing is slightly awkward, but there is no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter getter with an output schema, the description is minimally adequate: it states the resource and reason for use. Gaps remain around when to prefer get_proxy_frames, listener prerequisites, and parameter meaning, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage and the tool description does not explain the port or limit parameters. Port is inferable from the tool name, and limit has a schema default, but the description adds no meaningful semantic detail beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool retrieves frames received by a listener and lists the payload fields (direction/peer/frame_hex) plus the downstream consumers (parse_frame/diagnose). It is distinguishable from the sibling get_proxy_frames by the 'listener' scope, though it does not explicitly name the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this tool to obtain listener frames for later analysis by parse_frame/diagnose. It does not state when not to use it or explicitly contrast it with get_proxy_frames, but the intended use case is clear enough for basic routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_proxy_framesGet Proxy FramesB
取代理录制的双向透传帧 (direction: c2s=上位机→PLC, s2c=PLC→上位机)。
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It identifies the operation as retrieval, but does not state whether an active proxy is required, whether frames are returned from a buffer, whether the call has side effects, or what happens when no frames exist. The direction definitions add domain context but not behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that front-loads the verb and object, then clarifies direction terminology in parentheses. Every word carries meaning; there is no redundant filler, and it remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists, the description is incomplete for effective invocation. It fails to explain the port parameter's role, the behavior of limit, or the relationship to the proxy lifecycle. In the absence of annotations, key context is missing, leaving an agent to guess how to correctly use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for explaining port and limit. It does not: port is entirely undefined, and limit is not explained beyond its schema default. The only parameter-related addition is the meaning of direction labels, but those are output semantics, not input parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('取' / get) and a specific resource ('代理录制的双向透传帧' / proxy-recorded bidirectional transparent frames). It additionally defines the meaning of the direction values (c2s and s2c), making the tool's function unambiguous and distinct from the sibling get_listener_frames by explicitly anchoring it to proxy recording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives. There is no mention of prerequisites such as an active proxy, nor an explicit contrast with get_listener_frames or start_proxy. The usage context must be inferred entirely from the tool name and resource description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_protocolsList ProtocolsA
列出本 server 支持的工业协议及其能力。
返回每个协议的端口提示、地址模型、数据类型和品牌线索, Agent 可据此推断 "这个设备该用什么协议" 而无需问用户。 不确定协议名时先调用本工具。 不确定协议/端口时先调用 detect_device。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explains what the tool returns (port hints, address model, data types, brand clues) and that it is a read-only listing operation implied by '列出'. It does not explicitly state side-effect absence, but the listing nature makes that evident.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short, purposeful sentences. It front-loads the main purpose, then summarizes return content, then gives actionable usage rules. There is no filler or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description is complete. It states what data comes back, how the agent should use it, and when to delegate to detect_device, leaving no important gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty with 100% coverage, so the baseline is 4. The description correctly focuses on the output and decision context rather than parameter details that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it lists the industrial protocols supported by this server and their capabilities. It further distinguishes itself from detect_device by stating that this tool answers 'which protocol should this device use' while detect_device handles protocol/port uncertainty.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: call this tool first when the protocol name is uncertain, and call detect_device when both protocol and port are uncertain. This directly routes the agent to the right sibling tool and states when not to rely on this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_frameParse FrameA
把一帧报文 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 时按传入值
| Name | Required | Description | Default |
|---|---|---|---|
| protocol | Yes | ||
| direction | No | auto | |
| frame_hex | Yes | ||
| frame_format | No | 3e_binary |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | No | |
| errors | No | |
| fields | No | |
| protocol | Yes | |
| direction | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden and does so thoroughly: no device connection, malformed frames do not throw but return errors, and each field includes byte_offset and raw_hex evidence. It also discloses per-protocol direction heuristics, giving an agent an accurate model of how the tool behaves in edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary, then extends into necessary protocol-specific rules in a structured list. It is long, but each section serves a distinct purpose; a small amount of tightening could remove minor redundancy across the protocol examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and the tool handles multiple protocols, the description covers the essential behavioral and parameter context well. The main gaps are the missing explicit list of accepted protocol identifiers and frame_hex formatting details (whitespace, '0x' prefixes, case), which an agent may need to construct valid input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description compensates by explaining direction values ('auto', 'req', 'resp'), frame_format values ('3e_binary' etc.), and per-protocol classification logic. It does not enumerate accepted protocol values or the exact hex string format for frame_hex, but the core meaning of each parameter is well conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '把一帧报文 hex 逐字段结构化解析', which names the exact action (parse), resource (a single frame hex), and result (field-by-field structured output). It also states '不需要连接设备', distinguishing it from device-connecting tools. This clearly separates it from siblings like parse_pcap and validate_frame.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: this is an offline parser for one frame, and it explains when to override direction ('auto' vs explicit 'req'/'resp') and when frame_format applies (only melsec). It does not explicitly name sibling alternatives or say when not to use this tool, but the conditions are sufficiently implied by the scope and protocol-specific guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_pcapParse PcapA
解析 Wireshark 导出 pcap: 按 TCP 流聚合载荷 -> 按协议切帧 -> 逐帧 parse_auto。
每个流返回完整帧序列 (带结构化解析) 与尾部半帧 (partial, 截断也是 诊断信息)。protocol 缺省时按"完整帧数最多的协议"自动判别。 需要可选依赖 scapy (uv sync --extra eval)。大批量帧场景比逐条 frame_hex 高效得多。
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| protocol | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it details the processing pipeline, return of full frame sequences plus partial truncated frames as diagnostic info, automatic protocol detection, and the optional scapy dependency. This is rich behavioral disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description opens with the core action and pipeline, then methodically covers return values, default behavior, dependency, and performance. Each sentence adds information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description covers the processing flow, return semantics, dependencies, and parameter defaults. The only minor omission is naming the sibling parse_frame for single-frame cases, but that's not required for invoking this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must fill the gap. It explains the protocol parameter (default auto-detection by the protocol with the most complete frames) and characterizes the path as a Wireshark pcap export. While it doesn't explicitly map each parameter name, it provides necessary context for both.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific verb+resource: parsing a Wireshark-exported pcap. The pipeline of aggregating by TCP stream, slicing by protocol, and per-frame parse_auto clearly distinguishes it from single-frame siblings like parse_frame.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly notes the batch scenario is far more efficient than per-frame frame_hex, giving a clear when-to-use. However, it does not name an alternative for single-frame cases (e.g., parse_frame) or state when not to use this tool, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_readPlc ReadA
从 PLC 读取数据区并按数据类型解释。
address/count 为通用地址与数量, 语义由协议决定:
Modbus: address 为 0 基寄存器地址, count 为寄存器个数
FINS: address 为字地址, count 为字数
MELSEC: address 为起始编号, count 为点数 (位软元件按 16 点/字)
S7: address 为字节地址, count 为字节数 (count=4 + uint16 → 2 个值)
datatype 取 uint16/int16/float32, None 返回原始 16 位值 + 所有常见数据类型的多解释 (interpretations 字段), 便于 Agent 识别正确的数据类型。 byteorder 仅影响 float32 寄存器对顺序 (big=ABCD, little=DCBA)。
options: 协议特有参数, 由各协议 adapter 自行定义与校验。 用 list_protocols 查看每个协议的 read_options 说明。
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| port | Yes | ||
| unit | No | ||
| count | No | ||
| address | Yes | ||
| options | No | ||
| datatype | No | ||
| protocol | Yes | ||
| byteorder | No | big | |
| timeout_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| target | Yes | 目标设备标识, 同时是连接池 key 的组成部分 (D1)。 |
| address | Yes | |
| elapsed_ms | Yes | |
| interpreted | No | |
| raw_registers | Yes | |
| request_frame | Yes | |
| interpretations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does a good job: it discloses protocol-dependent address/count semantics, the special datatype=None behavior returning an interpretations field, and the byteorder effect on float32 register pairs. It does not mention timeout/error behavior or explicitly state read-only safety, but the read verb plus return behavior covers most of the risk profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into scannable bullets with the main purpose front-loaded. Each bullet adds necessary information (protocol semantics, datatype behavior, byteorder, options) and the final pointer to list_protocols prevents duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-protocol tool with 10 parameters and no annotations, the description covers the hard parts: protocol-specific addressing, datatype interpretation, byteorder, and where to find adapter-defined options. The existing output schema covers return shape, so its absence in prose is fine. Remaining gaps are the unexplained unit parameter and no statement about timeout/failure behavior, making it strong but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds substantial meaning for address, count, datatype, byteorder, and options, including concrete examples like S7 count=4 + uint16 yielding 2 values. However, unit is left unexplained despite being protocol-sensitive (e.g., Modbus slave ID), which is a noticeable gap for a 10-parameter tool with zero schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific action and object: '从 PLC 读取数据区并按数据类型解释' (read data area from PLC and interpret by data type). This clearly separates it from siblings like parse_pcap, list_protocols, and proxy operations, even without naming alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to call the tool (to read live PLC data) and instructs the agent to consult list_protocols for read_options, which is useful workflow guidance. It does not explicitly state when not to use plc_read versus probing or parsing tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
probe_deviceProbe DeviceA
测试能否连上 PLC 并通信, 失败时给出层级归因。
reachable = 传输层可达 (TCP 已建立; 设备回异常响应也算在线)。 failure_class 取:
connection_refused: 端口没人监听/网络不可达 (查网络与端口)
timeout: 连接超时 (查网络路由/防火墙)
connected_but_no_reply: TCP 通了但设备不回话 (查协议配置)
exception_response: 设备回异常码 (查 unit/寄存器配置, 带 exception_code) 典型用法: 设备"读不到数据"时先调本工具分层定位, 再决定下一步。
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| port | Yes | ||
| unit | No | ||
| protocol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reachable | Yes | |
| layer_hint | No | |
| failure_class | No | |
| exception_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does it well. It defines 'reachable', enumerates all failure_class values with their meanings and remediation hints, and explains that exception responses still count as online. It does not mention side effects or timeout details, but a probe tool's behavior is largely covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: primary purpose first, then reachable definition, then failure classes with troubleshooting hints, then a typical usage scenario. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so the return-value details do not need to be explained. The description covers the core scenario, failure taxonomy, and next-step suggestions, which is reasonably complete for a diagnostic probe. It could add more explicit parameter guidance or sibling-tool differentiation, but nothing essential is missing for calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented parameters. It indirectly adds meaning to protocol and unit by referencing 'protocol config' and 'unit/register config' in the failure-class guidance, and host/port are self-evident. However, it does not document valid protocol values, unit semantics, or parameter formatting, leaving a clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: test whether a PLC can be connected to and communicated with, and provide layered attribution on failure. It is specific about the resource (PLC connectivity/communication) and the failure-class output, but it does not explicitly distinguish itself from sibling tools such as plc_read or detect_device.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete when-to-use hint: when a device reports 'cannot read data', call this tool first to locate the failing layer before deciding the next step. It does not explicitly name alternative tools or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, 并提醒用户恢复设备原配置 (BUILD.md Skill 节)。
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | 0.0.0.0 | |
| mode | No | record_only | |
| port | No | ||
| faults | No | ||
| protocol | Yes | ||
| idle_timeout_sec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the three mode behaviors, that respond_normal is not a general-purpose simulator and returns constant-zero data, that inject_errors rotates deterministic faults, the protocol-specific fault options, that port=0 means OS-assigned with the actual port returned, and the recommended cleanup/restore step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: the core purpose is front-loaded, followed by mode semantics, fault details, workflow, and lifecycle guidance. Every sentence adds needed operational information, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful listener with no annotations and 0% schema coverage, the description covers the core behavior, mode-specific caveats, fault options, port behavior, downstream tool usage, and cleanup. It omits explicit semantics for host and idle_timeout_sec, but an output schema exists and the included operational workflow is sufficiently complete for a capable agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates for the key parameters: mode is fully explained with three enumerated behaviors, faults are explained per protocol, and port=0 semantics are clarified. However, host and idle_timeout_sec are only inferable from their names and defaults, not explicitly described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and scenario: start a fake-server ('phishing') listener when the device under test can only act as a client. It also distinguishes the listener from a generic simulator and orients it within the broader frame-analysis workflow, so an agent can tell it apart from start_proxy, probe_device, and stop_listener.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly gives the condition for use ('when the device can only be a client'), describes the downstream pipeline (get_listener_frames → parse_frame/diagnose), and recommends stopping the listener and restoring the device config. It does not explicitly name a direct alternative for the opposite topology, but the usage context is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_proxyStart ProxyA
起透明代理: 上位机 → 代理 → 真实 PLC, 透传同时按协议分帧录制双向帧。
现场联调时把上位机目标地址改成本代理, 无需 Wireshark 即可拿到全部 交互帧 (get_proxy_frames), 再喂 parse_frame/diagnose 做在线分析。 protocol 当前支持 modbus/fins/melsec (S7 TPKT 分帧暂不支持); listen_port=0 由系统分配。代理是诊断设施: 只透传与录制, 不改写帧。
| Name | Required | Description | Default |
|---|---|---|---|
| protocol | Yes | ||
| listen_host | No | 127.0.0.1 | |
| listen_port | No | ||
| target_host | Yes | ||
| target_port | Yes | ||
| idle_timeout_sec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It discloses key behaviors: transparent pass-through, bidirectional frame recording, no frame rewriting, diagnostic-only purpose, and OS-assigned port when listen_port=0. It could add lifecycle details such as needing stop_proxy, but the current level of transparency is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, then adds usage context, protocol constraints, and a behavioral guarantee. The text is slightly dense with wrapping, but every sentence contributes useful information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's role, supported protocols, port allocation behavior, and the intended diagnostic workflow. It does not explain all parameters or explicitly mention proxy shutdown, but the output schema and the sibling stop_proxy help fill the remaining context. Overall it is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It explains protocol values and listen_port=0 behavior, but does not explain target_host, target_port, listen_host, or idle_timeout_sec, leaving significant param semantics to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: start a transparent proxy between a host and a real PLC, forwarding frames and recording bidirectional traffic by protocol framing. It distinguishes itself from siblings by emphasizing the diagnostic role and referencing get_proxy_frames, parse_frame, and diagnose for the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: during on-site commissioning, point the host at this proxy instead of the PLC to capture all frames and analyze them later. It also states protocol support limits (modbus/fins/melsec, no S7 TPKT framing), though it does not explicitly contrast with alternatives like start_listener or stop_proxy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_listenerStop ListenerA
停掉指定端口的监听, 返回收/发帧统计。
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It states the core state-changing behavior (stopping listener) and the return value (frame statistics), which is valuable. However, it does not disclose side effects, idempotency, or behavior when the port is not currently being listened on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the action and the return result with no wasted words. Every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simple single-parameter schema and the presence of an output schema, the description is mostly complete for selecting and invoking it. It could be more complete by adding guidance about stopping behavior and side effects, but the essential calling contract is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides 'port' as an integer with 0% description coverage. The description adds minimal meaning by indicating the port is the one whose listener should be stopped, but it does not specify ranges, formats, or edge conditions. For a single simple parameter this is adequate but not rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: stopping listener on a specified port and returning receive/transmit frame statistics. This distinguishes it from sibling tools such as start_listener and get_listener_frames.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when the agent needs to stop listening on a given port, but it does not explicitly state when to use this tool versus alternatives like get_listener_frames or stop_proxy. Usage context is inferable but not directly articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_proxyStop ProxyA
停掉指定端口的代理, 返回录制统计 (c2s/s2c 帧数)。
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action and that recording statistics are returned, but does not mention side effects, idempotency, whether recorded frames are preserved, or any prerequisites. For a state-changing operation this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that states the action and return value without any filler. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, and an output schema exists so return values need not be fully detailed in the description. The core purpose and outcome are covered. Missing details like error behavior or prerequisites are minor for this level of complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema provides no description for 'port'. The description's '指定端口' clarifies that the port identifies which proxy to stop, which partially compensates, but it does not explain what the integer should represent (e.g., local listening port) or any constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb '停掉' (stop) with a clear resource '指定端口的代理' (proxy on the specified port), and even specifies the return value. This distinguishes it from siblings like start_proxy and stop_listener without requiring further inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (stop a proxy on a specific port), but there is no explicit guidance about when not to use it or alternatives such as stop_listener. The inference is straightforward, yet no exclusions or conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_frameValidate FrameA
对一帧报文跑规范校验清单, 逐项 pass/fail (不需要连接设备)。
Modbus TCP: MBAP 长度一致性、协议号、功能码、unit 范围、PDU 自洽、数量/地址边界、异常码 (Modbus TCP 无 CRC, RTU 才有)。 FINS/TCP: magic、TCP 长度自洽、TCP 命令合法、error 字段、 FINS 端结码、载荷完整性。 MELSEC 3E: 副头部、数据长度自洽、命令/软元件代码、结束代码。 direction 取 req 或 resp。
| Name | Required | Description | Default |
|---|---|---|---|
| protocol | Yes | ||
| direction | No | resp | |
| frame_hex | Yes | ||
| frame_format | No | 3e_binary |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does so reasonably well: it discloses offline operation, item-by-item pass/fail behavior, and protocol-specific validation logic including the nuance that Modbus TCP has no CRC (unlike RTU). It does not cover error handling or invalid-input behavior, but the output schema covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence summary, followed by clean per-protocol bullet lists, and ends with a direction note. Every sentence adds protocol-specific value; there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema handles return values, so that is not a gap. However, for a 4-parameter tool with no annotations and no schema descriptions, accepted protocol strings, frame_hex formatting, and frame_format values should be specified; they are mostly implied. The rich protocol checklists make it usable, but the missing parameter details keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains direction explicitly ('direction 取 req 或 resp') and hints at protocol values via the protocol sections. frame_hex format and frame_format semantics are not described, leaving an agent without enough information about how to supply those parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: run a spec validation checklist on one frame with itemized pass/fail results, and explicitly notes it requires no device connection. The protocol-specific checklists (Modbus TCP, FINS/TCP, MELSEC 3E) make the validation purpose concrete. It does not explicitly distinguish from the sibling parse_frame tool, so it stops short of a top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use it offline to validate a frame against protocol rules, and it enumerates the supported protocols with their specific check items. It also explains the direction parameter accepts req or resp. It does not explicitly name alternatives or state when not to use it, so exclusion guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
14 tool updates
v0.4.0- First observed
detect_device - First observed
diagnose - First observed
get_listener_frames - First observed
get_proxy_frames - First observed
list_protocols - First observed
parse_frame - First observed
parse_pcap - First observed
plc_read - First observed
probe_device - First observed
start_listener - First observed
start_proxy - First observed
stop_listener - First observed
stop_proxy - First observed
validate_frame
TDQS
Most tools have clearly distinct roles: detect, probe, parse, validate, diagnose, read, capture, and proxy functions are separated by input and purpose. The closest overlaps are parse_frame/validate_frame/diagnose and start_listener/start_proxy, but detailed descriptions make the boundaries understandable.
The naming is predominantly verb_noun snake_case (start_listener, parse_pcap, detect_device, get_proxy_frames), which is predictable. Minor deviations are 'diagnose' (bare verb) and 'plc_read' (noun_verb), but they do not undermine the overall pattern.
With 14 tools, the count sits comfortably in the well-scoped range. Each tool serves a distinct role in the diagnostic workflow: capture, parse, validate, detect, probe, read, and diagnose, with no meaningful redundancy.
The surface covers the full diagnostic lifecycle: device/protocol discovery, connectivity probing, frame capture via proxy/listener/pcap, frame parsing and validation, structured reads, and fault diagnosis. Capture methods all have corresponding retrieval and analysis tools, leaving no obvious dead ends.
Maintenance
Related MCP Connectors
MCP Server for an Agent Task Marketplace
Agent Orchestrator MCP Server by MEOK AI Labs
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
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 gradedqualityAmaintenanceMCP 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.3-
- FlicenseNot gradedqualityBmaintenanceAn MCP server that lets AI agents interact with Siemens TIA Portal via its Openness API.-
- FlicenseBqualityBmaintenanceUniversal 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.6-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/ymxc152/plctap'
If you have feedback or need assistance with the MCP directory API, please join our Discord server