An MCP server template using express with SSE written in TypeScript
This template server has severe quality gaps across all dimensions. Both tools lack descriptions entirely (critical violation of pattern:tool-description). Parameter descriptions are null/missing. Schemas exist but are minimal. The server has no error handling, no output documentation, and no guidance for LLMs on when/how to use each tool. This is a bare-bones template, not production-ready.
All tools missing descriptions. Both 'calculate-bmi' and 'fetch-weather' have no description field in server.tool() registration.
All parameter descriptions are null. In calculate-bmi, weightKg and heightM have null descriptions. In fetch-weather, city has null description.
No output schema documentation. Neither tool documents what fields the response contains. LLMs need to know what fields to expect so they can plan downstream tool calls.' Responses are bare { content: [{ type: 'text', text: ... }] }.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 30 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 21 | - | v1 |
No error handling or recovery guidance. fetch-weather calls external API but has no try-catch, timeout, or error message. If api.weather.com is down or returns 404, the tool will crash or return cryptic error.
Parameter naming ambiguity. 'heightM' is unclear, is this height in meters? The suffix 'M' is cryptic; should be 'height_meters'. 'weightKg' similarly should be 'weight_kg'.
No input validation or constraint documentation. calculate-bmi accepts any number for weight and height, including negative values or zero (which produce invalid BMI). No enum, pattern, or range constraint.
Bare API response in fetch-weather. Tool calls external weather API and returns raw response text. Strip pagination internals, audit fields, and raw IDs the user never sees.' No parsing, filtering, or structure.