A template for building MCP servers that connect to external APIs
This is a template/scaffold server with only one example tool. The tool definition itself is present with schema and basic description, but the implementation quality reveals significant gaps. The tool name 'example_tool' is generic and lacks a clear action verb. The description is minimal (55 chars, below the 194-char baseline). The schema is present but parameter descriptions are perfunctory ('Example parameter description', 'Optional parameter description'). The server lacks proper error handling guidance, McpError conversions exist but don't inform the LLM what to do next. As a template, this is meant to be customized, but in its current form it does not meet production quality standards even as an example.
Example tool description - what it does
Generic, non-action-verb tool name 'example_tool' does not convey what the tool does. Should be verb_noun like 'get_data', 'fetch_resource', or 'query_endpoint'.
Tool description is only 55 characters ('Example tool description - what it does'), well below the 194-char baseline. Lacks WHAT it does, WHEN to use it, and prerequisites. LLMs cannot reliably select this tool.
Parameter descriptions are placeholder text ('Example parameter description', 'Optional parameter description') with no actual constraint info. LLMs cannot infer valid values or formats.
No output schema documented. The handler returns raw JSON from the API wrapped in a text block, but the structure is not specified. LLMs cannot plan downstream calls without knowing the response structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 35 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Error messages from McpError handlers do not guide the LLM toward recovery. E.g., 'Unknown tool: {name}' or 'Tool execution failed: {error}' provide no actionable next steps.
Parameter 'exampleParam' is marked as required but has no validation beyond the schema check. If the API rejects it, the error response does not indicate what valid values are accepted.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) declared. The server comment indicates the tool has 'Risk: READ_ONLY' but the schema does not include this metadata.