MCP server that gives Claude hands, eyes, and a diary for Pokémon — Game Boy, GBA, and a real Switch
17 tools with mixed quality. Naming is verb-forward and clear (start_game, press_buttons, screenshot). Descriptions present but often terse (10-80 chars, well below the 194-char baseline). Input schemas visible for all tools with proper types, but parameter descriptions are minimal and lack constraints (ranges, enums, formats). No output schemas documented. Error handling is absent, tools return plain strings with no recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Critical gap: descriptions like 'Press game buttons' (18 chars) and 'Wait for a specified number of seconds' (38 chars) are too brief to guide LLM selection. Parameters like 'buttons' (array) lack enum constraints; 'direction' in walk() lacks explicit enum; numeric ranges (hold_frames, tiles, duration_ms) lack min/max documentation.
Close the game window and shut down the emulator
Pause the game by pressing HOME (Switch suspend), returns screenshot as bytes
Get the full game state report as markdown (RAM decoding for Pokémon Red)
List all available saved game states
Load a previously saved game state by name
Move an analog stick (left or right) to a position for a duration
Press game buttons (a, b, start, select, up, down, left, right) with hold and wait timing in frames
Descriptions too brief (avg 45 chars vs 194-char baseline). Examples: 'Press game buttons' (18 chars), 'Wait for a specified number of seconds' (38 chars). Too short to guide LLM tool selection or explain when to use vs similar tools.
No output schemas documented. Tools return plain strings or bytes with no structured field definitions. LLMs cannot plan downstream calls or extract typed data.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Press game buttons with timing in milliseconds (for real hardware without RAM access)
Read a range of memory bytes from the emulator (hex address and length)
Resume the game from pause and optionally press buttons
Save a named game state (save file)
Take a screenshot of the current game state, returned as JPEG bytes
Summon the emulator window and start the game
Tap the touch screen at normalized coordinates (0..1)
Wait for a specified number of frames (1-3600)
Wait for a specified number of seconds (clamped to 0-60s)
Move step-by-step in a direction and report what happened (moved/blocked/scene changed)
Parameter constraints missing. 'direction' in walk() lacks enum (up|down|left|right); 'buttons' array lacks enum of valid button names; numeric ranges (hold_frames 1-3600, tiles 1-30, duration_ms) not documented in descriptions.
No error handling or recovery guidance. Tools return plain strings on success but no documented error cases, error messages, or what the LLM should do if a call fails.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. E.g., save_state, load_state, close_game should be marked destructive; screenshot, game_state should be marked read-only.