A Rust-based Modbus TCP server simulator with MCP (Model Context Protocol) support for reading/writing Modbus registers, coils, and inputs. Includes simulation scripting via JavaScript and variable mapping.
Server has 23 tools with explicit schemas and descriptions visible in src/service/mcp/server.rs. Naming follows verb_noun pattern (modbus_read_*, modbus_write_*, sim_scripts_*, var_map_*, simulation_*). Descriptions are present but brief (10-50 chars), below the 50-200 char LLM-optimized baseline. All parameters have type definitions and descriptions. However, descriptions lack context on WHEN to use each tool, dependencies between operations, and recovery guidance for errors. Output schemas are not documented, callers must infer structure from tool names. Error handling returns generic ErrorData without actionable recovery steps. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Modbus tools are well-structured but lack domain context (e.g., what is FC 03 vs FC 04 for users unfamiliar with Modbus?). Simulation and variable map tools have complex nested parameters (ScriptImportParams, SimulationImportParams) but descriptions do not explain merge vs replace semantics or data loss risks.
Read discrete coils (FC 01)
Read discrete inputs (FC 02)
Read Modbus holding registers (FC 03)
Read Modbus input registers (FC 04)
Write a single discrete coil
Write multiple discrete coils from a starting address
Write a single discrete input
Descriptions are too brief (10-50 chars) and lack LLM-optimized context. Missing WHEN to use each tool, dependencies, and prerequisites. Baseline is 50-200 chars for A-grade tools.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite explicit risk levels (READ_ONLY, WRITE, DESTRUCTIVE) in metadata. LLMs cannot infer safety properties without annotations.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Write multiple discrete inputs from a starting address
Write a single holding register
Write multiple holding registers from a starting address
Write a single input register
Write multiple input registers from a starting address
Delete a simulation script
Export all simulation scripts as JSON
Get simulation script content by name
Import simulation scripts from JSON
List all simulation scripts
Create or update a simulation script
Reload all simulation scripts
Export complete simulation bundle (scripts + var-map)
Import complete simulation bundle (scripts + var-map)
Export variable map
Import variable map
Output schemas are not documented. Tools return JSON strings but callers cannot infer field names, types, or structure. Baseline: 100% of A+ tools document return types.
Error handling returns generic ErrorData without actionable recovery guidance. Missing pattern: 'User not found. Try search_users() first.' Agents cannot self-correct.
Complex import parameters (ScriptImportParams, SimulationImportParams) lack documentation of merge vs replace semantics and data loss risks. Descriptions do not explain when to use each mode or consequences.