A Model Context Protocol server example for playing Minesweeper
This MCP server exposes 4 tools with basic schemas and minimal descriptions. All tools have names and explicit input schemas with typed parameters, but descriptions are trivially short (15-28 characters), parameter descriptions are completely absent, output schemas are undocumented, and error handling is generic. The tool definitions are directly visible in src/index.ts via server.setRequestHandler(ListToolsRequestSchema), so inference penalties do not apply. However, the lack of parameter-level documentation, missing output schema documentation, and generic error messages create significant usability gaps for LLM-based agents. Average tool score: 42 (naming 65, description 25, schema 35).
Click at a cell on the Minesweeper board
Place a flag at a cell on the Minesweeper board
Start a new game of Minesweeper
Remove the flag at a cell on the Minesweeper board
All parameter descriptions missing. Tools 'click', 'flag', 'unflag' accept row and col parameters with no documentation of indexing (0- vs 1-indexed), valid ranges (0-8? 0-15?), or error handling if out of bounds.
Output schema completely undocumented across all 4 tools. Agents have no visibility into the structure of responses (board representation, game state, error details, image format). Per the rubric baseline, 100% of A+ tools have documented return types.
Tool descriptions are below the recommended 34-192 char range (p10=34, p90=392). Descriptions like 'Start a new game of Minesweeper' (28 chars) lack context about game initialization, board size, mine count, state returned, or when to call this tool vs others.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 20 | - | v1 |
No parameter type constraints (min/max for row/col, enums, patterns). Agents cannot infer valid board dimensions. Code assumes row/col are 1-based or 0-based but does not document this.
Generic error handling. CallToolRequestSchema handler throws McpError(InternalError) for missing tools and failed game server calls, with generic messages like 'Game server failed.' No actionable guidance (e.g., retry, check server status, or call start_game first). Per pattern:recovery-guide, error responses must tell the LLM what to do next.
No dry-run or confirmation for irreversible operations. Tools 'click', 'flag', 'unflag' directly modify game state with no undo mechanism or pre-execution confirmation. Agents cannot preview outcomes before committing.