A FastAPI-based server providing Pokémon data, battle simulation, and move recommendation tools using the PokéAPI
This MCP server provides 5 tools with mixed definition quality. Tool naming is generally adequate (verb_noun pattern), but descriptions lack depth and LLM-optimization. Parameter schemas are present but sparse, many parameters have minimal or no descriptions. Output schemas are entirely undocumented, forcing LLMs to infer structure. Error handling is present but not recovery-guided. The server lacks modern MCP patterns like tool annotations, structured error guidance, and comprehensive parameter documentation.
Runs a random battle simulation with two randomly selected Pokémon
Runs a 1v1 battle simulation between two Pokémon and returns the result
Runs a 3v3 team battle simulation between two teams of three Pokémon each
Fetches data for a single Pokémon from the backend
Fetches the names of all Pokémon from the backend
Output schemas are completely undocumented. LLMs must infer what fields are returned by each tool, risking wrong downstream tool calls and context loss.
Parameter descriptions are minimal or missing. The 'name' parameter in pokemon_data/get has a basic description ('The name of the Pokémon to fetch data for'), but no guidance on format, validation, or error cases. The 'pokemon1' and 'pokemon2' parameters in battle_simulation/run and battle_simulation/team lack any description at all.
Tool descriptions are generic and lack LLM guidance. 'Fetches data for a single Pokémon from the backend' (35 chars) does not explain WHEN to use this tool vs pokemon_data/list, what happens on error, or what structure is returned. Descriptions should be 50-200 chars and answer: what, when, why, and what to do if it fails.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
No error recovery guidance. The code raises HTTPException(status_code=400) and HTTPException(status_code=404) with basic messages ('Missing name parameter', 'Pokémon not found'), but does not guide the LLM on next steps. E.g., 'Pokémon not found' should suggest 'Try pokemon_data/list to see available names.'
Parameter validation is done after receipt, not declared upfront. The team battle validation (len(team1) != 3) is enforced at runtime, not expressed in the JSON Schema. This means LLMs cannot know the constraint before calling and may pass invalid arrays.
No tool annotations for read-only vs destructive operations. All tools are marked Risk: READ_ONLY, but no readOnlyHint annotation is present in the MCP tool definitions. This prevents the agent from reasoning about side effects and batching read-only calls.
Tool naming uses slash-separated resource/action pairs (pokemon_data/list, battle_simulation/run) instead of verb_noun convention (list_pokemon, run_battle_simulation). This deviates from production baseline where 90% of A+ tools use verb_noun naming. The slash notation is router-like and less scannable for LLMs.