Node.js TypeScript REST API with MySQL and Sequelize for a Penguin Adventure game with MCP protocol support
The server registers 7 tools with explicit schemas and descriptions via the MCP SDK. Tool names follow verb-first convention (list-, get-, create-) and are moderately clear. Descriptions exist but are brief (7 - 64 chars, well below the 194-char baseline). Input schemas use Zod validators with type information, but parameter descriptions are minimal or missing context about valid ranges, format, and use cases. Output schemas are not documented, responses return JSON via structuredContent but lack formal documentation of return field structure. Error handling is minimal, with no recovery guidance. The server demonstrates basic MCP competence but falls short of production-grade tool design in description depth, parameter documentation, and output schema clarity.
Submit a score to the global leaderboard.
Start a game session for a player (auto-create by name).
Return the recommended gameplay flow and endpoints.
Fetch a player by id.
Check API health status.
Return the global leaderboard entries.
Return the most recent players.
Tool descriptions are too brief (avg 36 chars vs. 194-char baseline). Descriptions lack context about WHEN to use each tool, how it differs from similar tools, and what the return value contains. E.g., 'Return the most recent players' doesn't explain: are these sorted by date? Can I page them? What fields does each player have?
Output schemas are not documented. Tools return structuredContent but no formal documentation of return field structure. E.g., list-players returns 'items' but clients don't know the schema of each player object. Agents cannot plan downstream calls or extract fields without reverse-engineering from responses.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Parameter descriptions are minimal or missing. E.g., 'limit' is described as 'Optional limit for number of players to return (1-500)' but doesn't explain the default value, sort order, or what happens if you pass limit=0. 'metadata' in create-session is described as 'Optional metadata record for the session' but doesn't explain the schema or what fields are expected.
No error handling or recovery guidance. Tools do not document what happens on failure (e.g., player not found, database error, invalid session). Responses lack actionable error messages or suggestions for what to try next. This violates pattern:recovery-guide and forces LLMs to guess recovery steps.
Parameter constraints are enforced via Zod but not repeated in descriptions. A parameter with z.string().min(1) has a length constraint that LLMs may not infer from the JSON Schema type alone. Descriptions should spell out constraints in prose: 'playerName (required, 1 - 255 characters)'.
No documented pagination or result limits. list-players and list-leaderboard accept a 'limit' parameter but don't document: is there a default? What's the max reasonable value? If limit=1000 is passed, do we enforce a cap? What does the response contain, total count, next_cursor, or just the items?
Tool names are generic for discovery/utility tools. 'health' and 'gameplay-flow' are vague, they don't indicate whether these are diagnostic tools, admin tools, or game mechanics. Better names: 'check-server-health' and 'describe-game-flow' or 'get-tutorial-flow'. Current names lack verb clarity and don't convey action.