MCP server exposing customer lookup and refund tools over stdio
Two well-defined tools with complete JSON schemas, clear descriptions, and proper input validation. Both tools have explicit type definitions, parameter descriptions, and tool annotations (readOnlyHint, destructiveHint). Descriptions are concise (120 - 180 chars) and explain what, when, and consequences. Error handling distinguishes domain errors (is_error=True) from protocol errors (JSON-RPC codes). Main gaps: no output schema documentation, no pagination support, and descriptions lack dependency hints or recovery guidance.
Fetch the billing record for a customer. `customer_id` must be formatted as CUST-XXXXX, where XXXXX is exactly five uppercase letters or digits.
Raise a pending refund against a customer's refundable balance. Requires a positive `amount` with at most two decimal places and a `reason` of at least 10 characters. This writes to the billing system and is not reversible.
Output schemas not documented. LLMs cannot infer what fields to expect from tool responses, forcing them to guess at downstream field names and risk broken tool chains.
Descriptions lack recovery guidance. Error messages say 'customer_not_found' but do not suggest calling search_customers() or listing available IDs. Agents cannot self-correct without extra reasoning.
trigger_refund description does not explain idempotency or retry semantics. Agents do not know if retrying with the same amount/reason creates duplicate refunds or is safe.
No batch operations. If an agent needs to refund 10 customers, it must call trigger_refund 10 times sequentially, wasting tokens and latency. A batch_trigger_refunds tool would be more efficient.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients. Limits deployment to local/embedded scenarios.