FastAPI-based MCP server that handles multiple industrial communication protocols (OPC UA, MQTT, Modbus) and LLM queries through a unified HTTP endpoint
This server has severe definition quality gaps. Tool names lack action verbs (opcua_read/write are acceptable, but mqtt_publish, modbus_read/write, llm_query lack clarity). Descriptions are present but minimal (10-50 chars, well below the 194-char baseline). Parameter descriptions are sparse or missing entirely. Input schemas exist but lack proper type definitions for critical fields (e.g., 'value' in opcua_write is typed 'any', modbus_write value lacks min/max bounds). No output schemas documented. Error handling is absent, handlers return generic {'status': 'ok'} with no recovery guidance. No security controls visible (credentials passed as parameters, no validation, no audit logging). Tool composition is poor: llm_query mixes concerns (context + query in one tool). Overall, this reads like a prototype, not production-grade tooling.
Query an LLM with context and a question
Read a holding register from a Modbus device
Write a value to a Modbus holding register
Publish a message to an MQTT topic
Read a value from an OPC UA node
Write a value to an OPC UA node
No output schemas documented. LLMs cannot plan downstream calls or extract structured data. All tools return generic {'status': 'ok', ...} with no field documentation.
Parameter 'value' in opcua_write and modbus_write typed as 'any' or untyped. No constraints, ranges, or format guidance. LLMs cannot validate input before calling.
Credentials (OPC UA endpoint, MQTT broker, Modbus host) exposed as tool parameters. No server-side secret injection. Secrets will leak into agent logs and prompt history.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 31 | 2026-07-28+ | v2 |
No error handling or recovery guidance. Handlers return bare {'status': 'ok'} or crash silently. LLMs cannot distinguish retryable errors from fatal ones or self-correct.
Tool descriptions are 10-50 characters, far below the 194-char baseline. Descriptions lack WHAT, WHEN, and WHY context. LLMs cannot reliably select the right tool.