A template for creating Model Context Protocol (MCP) servers
Single tool with basic schema and description. Tool name 'example-tool' lacks action verb (should be 'process_input' or similar). Description is 47 chars, acceptable but generic. Input schema present with proper types and minLength constraint. No output schema documented. No error recovery guidance. No parameter descriptions beyond 'Input string to process'. Tool is READ_ONLY but description does not state this. Missing idempotent/destructive hints. Validation occurs in handler (Zod) but errors are not actionable to LLM.
An example tool that processes input data
Tool name 'example-tool' does not start with action verb. Should be 'process_input', 'transform_text', or similar to signal intent to LLM.
No output schema documented. LLM cannot predict return structure or plan downstream calls. Handler returns {type:'text', text:string} but this is not declared in tool definition.
Error handling returns raw error messages without recovery guidance. 'Failed to process input: ...' tells LLM nothing about what to do next. Should include 'Try with shorter input' or similar.
Tool description does not state that it is READ_ONLY or idempotent. LLM cannot determine if repeated calls are safe or if this modifies state.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | <=2025-11-25 | v2 |
Input parameter 'input' has description 'Input string to process' but lacks format guidance, length limits, or examples of valid input. Vague descriptions invite hallucinated values.