A sample of MCP implementation using DDD structure with some APIs call.
This server has 3 tools with CRITICAL deficiencies across naming, descriptions, and schemas. Tool names lack clarity and don't follow verb_noun patterns consistently. Descriptions are present but generic and under-optimized (10-50 chars for most). Output schemas are completely undocumented, LLMs cannot infer the response structure. No error handling guidance. No parameter descriptions beyond the bare minimum in one tool. The codebase shows DDD architecture but the tool interface is poorly suited for agent consumption.
Returns details about a block from hash
Get ping to check service is working
Get recommended fees for Bitcoin
CRITICAL: Two tools (get-recommended-fees, get-ping) have NO input schemas in the source code.
CRITICAL: No output schemas documented anywhere. LLMs cannot infer what fields are returned, making it impossible for agents to chain tools or extract data reliably.
Tool names do not follow verb_noun pattern clearly. 'get-ping' is vague (what does it get? a response status?). 'get-recommended-fees' lacks clarity on what 'recommended' means.
Descriptions are too generic and short (10-50 chars). Example: 'Get ping to check service is working' (43 chars) tells the LLM nothing about when to call it, what it returns, or how it differs from other tools. Target 50-200 chars with context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | F | 34 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Only get-block has any parameter schema (hash: string). No parameter descriptions for the 'hash' field beyond 'The hash info to get block'. Descriptions should explain format, constraints, and examples.
No error handling guidance. If a Bitcoin hash is invalid, or the service is down, the LLM gets no recovery hints. Errors should guide LLMs on what to try next.
get-block parameter 'hash' uses .length(64) constraint in Zod but this is not documented in the description. Constraints should be explicit in descriptions: 'The block hash (exactly 64 hex characters)'.
No response structure documented. Code returns { content: [{ type: 'text', text: ... }] } but LLMs see this as a black box. Document the expected output fields and their meaning.