Config-driven built-in schema discovery and payload echo service for structured MCP tool returns
Echo MCP defines 3 tools with clear verb-noun naming (list_schemas, get_schema, echo) and proper Zod schemas. All tools have descriptions (10-100 chars) and input parameters are typed. Tool annotations (readOnlyHint, destructiveHint, openWorldHint) are present. However, descriptions are minimal (34-100 chars, below the 50-200 char LLM-optimized baseline), parameter descriptions lack context about expected formats/constraints, and output schemas are not documented. The 'echo' tool's 'payload' parameter uses z.unknown() without validation guidance, and error handling is absent from visible code.
Validate a payload against a session schema and return the payload unchanged in a stable envelope
Fetch the full definition for a schema available in the current MCP session
List schema identifiers available in the current MCP session
Output schemas not documented. LLMs cannot infer what fields list_schemas, get_schema, and echo return, forcing them to guess downstream field names and risk broken tool chains.
Parameter descriptions lack actionable constraints. 'schema_id' is described as 'Schema identifier to fetch' but does not specify format, length, or valid characters. 'payload' uses z.unknown() with no validation guidance.
Tool descriptions are below LLM-optimized baseline (34-100 chars vs 50-200 char target). Descriptions lack WHEN to use, prerequisites, or dependency hints. E.g., 'echo' does not explain when validation fails or what 'stable envelope' means.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
No error handling visible. Code does not show recovery guidance, error categorization (retryable vs fatal), or actionable error messages. If schema validation fails in 'echo', the LLM receives no guidance on what to do next.
Tool composition assumes session context via getSessionId(ctx). If session is undefined, it defaults to 'local-session', but this fallback is not documented in tool descriptions. LLMs cannot reason about multi-session behavior.