MCP server for PokeArena: a deterministic, fog-of-war Pokemon battle environment. Provides tools for starting battles, joining battles, submitting teams, viewing battle state, waiting for turns, acting in battles, and discovering Pokemon/items/natures data.
Strong tool naming (verb-first, clear intent) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 11 tools have input schemas with types and descriptions. Output structures documented in descriptions. Key gaps: no error handling guidance (tools don't explain recovery paths), no parameter enums for constrained inputs (e.g., opponent='heuristic'|'expectimax', kind='move'|'switch'), missing output schema documentation in formal JSON Schema format, and no tool annotations (readOnlyHint/destructiveHint). Composition is sound, tools chain well (find_pokemon → get_pokemon → submit_team). Risk classifications present but not leveraged in error responses.
Submit an action (move or switch) and wait for the result. Requires kind ('move' or 'switch'), index from legal_actions, and optional switch_target for self-switch moves. Returns recent log, acceptance, turn number, ready status, terminal status, view, error, winner, and outcome.
Cheap discovery via substring match against species names. Returns lightweight tuples (dex_no, name, type1, type2) needed to decide which species to fetch in detail. Capped to 30 results to keep output bounded.
Get full species detail for one dex number. Returns dex number, name, types, base stats, abilities, genders, and authoritative move learn list for submit_team.
Attach to a battle somebody else created on a running gateway. Requires battle UUID, slot assignment (p1 or p2), and optional join token for PvP battles. Returns battle state, trainer names, phase, and initial view if active.
Leave the current battle and clean up session state.
Get the held-item catalog. Items are not species-restricted — any catalog item is legal on any Pokémon. Returns flat list of items with id, display name, and engine behavior description.
No error handling guidance. Tools lack recovery hints (e.g., 'Invalid opponent: must be heuristic or expectimax'). Errors don't tell LLMs what to do next or whether to retry.
Missing enum constraints in schemas. opponent, kind, slot, and other constrained parameters accept free-form strings instead of enums. LLMs may hallucinate invalid values.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk classifications exist (READ_ONLY, WRITE) but are not exposed to the LLM via MCP annotations.
Output schemas not formally documented. Descriptions mention return fields (e.g., 'Returns battle ID, slot assignment...') but no JSON Schema output type is provided. LLMs cannot parse response structure reliably.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Get the 25 natures plus numeric caps that bound a spread. Returns natures (id, display name, stat modifiers) and format rules (level, EV/IV caps) needed to build a legal team.
Create a local battle inside this process with a built-in opponent. No server, no Docker, no second player required. Returns battle ID, slot assignment, trainer names, phase, seed, opponent policy, and team briefing.
Submit a team for the picker phase. Accepts either a Showdown paste (preferred) or structured picks. Returns acceptance status and validation report with any problems or warnings.
Get the current redacted fog-of-war snapshot of the battle. Returns your full side, opponent's active Pokemon (with HP percentage not exact), foe bench alive count, turn number, phase, weather/terrain, and side conditions.
Block waiting for your turn. Returns recent log, ready status, terminal status, view (when ready), error explanation, winner, and outcome. Timeout clamped to [1,120] seconds, default 60.
Timeout parameters lack bounds documentation. wait_seconds and act's wait_seconds mention clamping to [1,120] in descriptions but not in schema minValue/maxValue constraints.