A Haskell-based MCP server for serial port communication. Handles serial port operations including open, close, read, write, and message handling with support for telnet protocol negotiation.
This server provides 6 serial port tools with basic descriptions and schemas. However, several critical issues limit quality: (1) tool names do not follow action-verb conventions (SerialEchoCommand, SerialOpenCommand use 'Command' suffix rather than verb_noun pattern); (2) descriptions are present but generic and lack context about when to use each tool or what prerequisites exist; (3) parameters lack detailed constraints (e.g., SerialOpenCommand speed parameter has no enum of valid baud rates, no validation guidance); (4) output schemas are not documented in the source code provided, we can only see input schemas; (5) error handling guidance is minimal; (6) no mention of idempotency, dry-run, or confirmation steps for destructive operations like SerialWriteCommand and SerialMessageCommand. The server appears functional for basic serial communication but falls short of production-grade agentic tool standards.
Close the active serial port connection
Echo command that returns the provided string value
Send a message to the serial port and optionally expect a response
Open a serial port connection with specified device and baud rate
Read data from the open serial port connection
Write data to the open serial port connection
Tool names violate verb_noun convention. All tools use 'SerialXxxCommand' suffix instead of action verbs (open_serial, close_serial, read_serial, write_serial, echo_value, send_message). LLMs infer action from the verb in position 1, 'Command' suffix obscures intent. [Source: pattern:tool, baseline: 90% of A+ tools start with action verb]
SerialOpenCommand 'speed' parameter lacks enumeration of valid baud rates and validation guidance. Description says 'Baud rate (e.g., 9600, 115200)' but does not state: which values are valid, what happens if an invalid rate is provided, whether the device supports the requested speed. [Source: pattern:constrained-input, rubric:param-validation]
No output schemas documented in source. The rubric requires 'Document the output schema. LLMs need to know what fields to expect.' Only input schemas are visible (Parameter definitions in JSON); return types are not specified. [Source: pattern:tool, D. SCHEMAS & OUTPUT critical check]
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 34 | <=2025-11-25 | v2 |
Destructive operations (SerialWriteCommand, SerialMessageCommand) have no confirmation or dry-run capability. The rubric requires: 'Irreversible operations (delete, send, publish) should support a dry-run or confirmation step.' Writing arbitrary bytes to a serial device is irreversible and could cause physical harm. [Source: pattern:confirmation-request]
Tool descriptions lack context about prerequisites and use cases. For example, SerialReadCommand description is 'Read data from the open serial port connection' but does not say: 'Call SerialOpenCommand first. This tool blocks until data arrives or timeout occurs.' Agents cannot infer dependency order. [Source: pattern:tool-description, rubric B. critical checks]
SerialReadCommand 'size' parameter has no bounds or guidance. Does 'size' mean bytes? What is the maximum? What happens if size > available_data? No min/max constraints stated. [Source: rubric C. numeric bounds critical check]
Error handling guidance is absent. If SerialOpenCommand fails (device not found, permission denied, baud rate unsupported), the tool gives no recovery hint. The rubric requires: 'Error responses must tell the LLM what to do next.' [Source: pattern:recovery-guide]
SerialMessageCommand mixes two concerns: sending a command and optionally expecting a response. The rubric states 'Each tool should do exactly one thing.' Consider splitting into send_serial_command and read_serial_response. [Source: pattern:tool, rubric G. COMPOSITION critical check]