Pokémon Champions MCP Server
A local, offline MCP server for competitive Pokémon Champions data — damage math, type matchups, dex/item/move lookups, and regulation legality — usable from any stdio MCP client or as a hosted Cloudflare Worker endpoint.
Calculate damage (
calculate_damage): full damage/percent range, hits-to-KO, and a readable calc string for attacker vs. defender with a move — handling items, abilities, natures, stat boosts, status, Stat Points, weather, terrain, screens, Helping Hand, Friend Guard, crits, multi-hit and Doubles spread reduction;moveContexthandles variable-power moves (Rage Fist, Last Respects, or a rawbasePowerOverride).Check type matchups (
type_effectiveness): 0–4x multiplier for one attacking type vs. one or two defending types, with an explanation.Look up Pokémon (
get_pokemon): base stats, typing, abilities, weight and full learnable movelist for any species or form (Megas, regional forms, Rotom-Wash, Indeedee-F), plus optional regulation legality and legal moves.Look up and browse items (
get_item,list_items): effect, how to obtain, category (Hold Item / Mega Stone / Berry / Miscellaneous), filterable by category or name substring, optionally marked legal/illegal per regulation.Search moves by user (
find_pokemon_by_move): every Pokémon legal in a regulation that can learn a given move, with that move's type/category/base power.List regulation pools (
list_legal_moves,list_legal_pokemon): the moves learnable by at least one legal Pokémon (with usage counts) and the legal roster enriched with dex number, typing, stats and abilities — both filterable by type and name substring.Verify legality (
check_legality): whether a Pokémon, and optionally listed moves and held items, is legal in a given regulation; missing or absent per-move/per-item data is reported, not guessed.Discover data (
list_regulations): which regulation files exist locally, with metadata, date ranges and legal-counts.Deploy either way: run locally over stdio against bundled JSON datasets (no network for normal queries), or host statelessly on Cloudflare Workers' free tier with no auth and add it as a remote
/mcpconnector.Note on the schema: it exposes 10 tools defaulting to regulation
m-b; the README also documentsget_moveandget_ability(12 total) and namesm-cas the current default — so those two tools (and the M-C default) are described but not present in this schema.
Enables deployment of the MCP server as a remote HTTP service on Cloudflare Workers' free tier for universal access without local installation.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Pokémon Champions MCP Server Mega Staraptor vs Garchomp damage calc?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Pokémon Champions MCP Server
A small MCP server that gives an AI assistant accurate, up-to-date data for competitive Pokémon Champions. Hook it up to Claude (or any MCP client) and you can ask things like:
"Does my Choice Band Mega Staraptor OHKO Garchomp?" "Is Sneasler legal in Regulation M-C, and who else can run Fake Out there?" "What Fairy moves are usable this format?"
It covers damage calculation, type matchups, Pokédex and item lookups, move search, and regulation legality. Everything runs locally — normal queries never hit the network.
Setup
You'll need Node 18+. Clone the repo, then:
npm install
npm run buildThat compiles everything into dist/. Quick check that it works:
npm testRelated MCP server: Pokemon Showdown MCP Server
Connecting it to your assistant
This is a standard stdio MCP server, so any MCP client can launch it — you just point it at
the built dist/index.js.
Grab the absolute path to the entry point (you'll paste this into your client):
node -e "console.log(require('path').resolve('dist/index.js'))"Add it to your client's MCP config:
{ "mcpServers": { "pokemon-champions": { "command": "node", "args": ["/absolute/path/to/poke-mcp-tool/dist/index.js"] } } }Claude Desktop — Settings → Developer → Edit Config, then merge in the block above.
Claude Code —
claude mcp add pokemon-champions node /absolute/path/dist/index.js.Anything else — add an equivalent stdio entry (
command: node,args: [path]).
Restart the client. It should now list tools like
calculate_damageandfind_pokemon_by_move. Try asking it one of the questions up top.
Use the absolute path — the client runs from its own working directory, so a relative one won't resolve.
Hosting it online (Cloudflare Workers)
Want people to use it without installing anything — or from Claude on the web or your phone? Deploy it as a remote HTTP server and they just paste a URL. It runs on Cloudflare Workers' free tier.
Every tool is read-only over public data, so the hosted server is stateless and needs no
login or API key — there's no OAuth to set up. Workers has no filesystem, so the datasets are
bundled into the Worker (src/worker.ts) instead of read from disk; the local
stdio server is untouched.
npm install
npx wrangler login # one-time: authorize Wrangler with your free Cloudflare account
npm run dev:worker # optional: test locally (real Workers runtime, no account needed)
npm run deploy:worker # deploy — prints your public URLThe MCP endpoint is the printed URL plus /mcp (e.g.
https://pokemon-champions-mcp.<you>.workers.dev/mcp); a plain GET / is a health check.
Add that /mcp URL as a custom connector in Claude (Settings → Connectors; requires a paid
plan, or one connector on Free) or as a remote MCP server in Cursor. Config lives in
wrangler.toml.
Tools
Tool | What it answers |
| "Does my Mystic Water Blastoise OHKO that Garchomp?" — full damage/percent range, hits-to-KO, and the human-readable calc string. Runs on @smogon/calc's Pokémon Champions mode: the Champions roster (Champions-only Megas like Mega Eelektross included), rebalanced moves (Snipe Shot 85 BP, ...), Champions-only abilities (Mega Sol, Dragonize, Aura Guard, ...) and Stat Points. Species outside the Champions Pokédex are rejected. Handles items, weather, terrain, crits (pass |
| The multiplier (0–4x) of an attacking type against 1–2 defending types. |
| Base stats, typing, abilities, weight, and full movelist for a Pokémon or any of its forms, by either spelling ( |
| Effect, how-to-obtain, and category (Hold Item / Mega Stone / Berry) for a held item, e.g. |
| Browse the held-item catalog, optionally filtered by |
| Whether a Pokémon — and optionally listed moves and/or held |
| "Who can run Fake Out in M-C?" — every Pokémon legal in a regulation that can learn a given move, with the move's type/category/base power. Name-tolerant ( |
| The pool of moves usable in a regulation (everything learnable by at least one legal Pokémon), each with type, category, base power, and how many Pokémon learn it. Filter by |
| The regulation's legal roster, every form as its own entry (Megas, regional forms, Rotom-Wash, …), each with its dex number, typing, base stats, and abilities. Filter by |
| A move as it works in Champions: type, category, power, accuracy, PP, the in-game description, target and flags (contact, slicing, …), plus what Champions changed from Scarlet/Violet ( |
| An ability's Champions description, whether it's new in Champions (Mega Sol, Aura Guard, …), and which Pokémon can have it — optionally only those legal in a regulation. |
| Which regulations are available locally, with each one's metadata and counts. |
Good to know
A few things that reflect how the format actually works, and which the tools tell you about in their output rather than hiding:
There are no per-move bans. A move is "legal" if a legal Pokémon can learn it, so
list_legal_movesis really the pool of learnable moves — and a move with no legal learners (e.g. Spore in M-C) shows up as unusable.Forms follow the base species. Every form — Megas, regional forms (Alolan Ninetales), Rotom-Wash, Indeedee-F, … — is legal when its species is, unless that specific form is separately excluded: M-B dropped Mega Garchomp Z and Mega Lucario Z, both of which M-C enables. M-C excludes none. Each form has its own typing, stats, abilities and learnset.
The current regulation is
m-c(Sept 9 – Dec 2, 2026), and it's the default for every regulation-scoped tool. Earlier regulations stay queryable by passing their id (m-b); their files are frozen snapshots of what was legal then.Type matchups are never left to be worked out by hand.
get_pokemonreturns the whole defensive table (all 18 types), andcalculate_damagereports the multiplier the engine actually used — so it reflects retypes (Aerilate's Flying Double-Edge, Weather Ball in sun) and move exceptions like Freeze-Dry hitting Water for 2x. When a hit does 0 damage for a non-type reason (Levitate, Flash Fire, Air Balloon, Protect), the output says so instead of blaming the type chart.There is no Terastallization in Champions, so
calculate_damagehas no Tera input.Two Champions sources, cross-checked. Damage calcs and move flags use @smogon/calc's Champions data; move numbers and descriptions, abilities and learnsets use Serebii's. The test suite compares the two and lists every known disagreement (e.g. Growth is Grass-type in Champions, the engine still says Normal), so a patch that lands on one side first shows up as a failing test.
Refreshing the data
The server only ever reads its data files; the scrapers below are run by hand when the game changes. They pull from Serebii.
npm run scrape -- m-c # regulation legality (roster + bans + legal items)
npm run scrape:items # held-item catalog (effects, locations, categories)
npm run scrape:dex # per-Pokémon stats, typing, abilities, learnsets + ability text
npm run scrape:moves # move numbers + descriptions, changes from Scarlet/VioletPass a different id to the first one for future regulations (npm run scrape -- m-d). The
scrapers are deliberately forgiving — if a page changes shape they warn and write what they
found instead of crashing.
Only the current regulation can be scraped. The roster and item catalog come from live pages showing the game as it is today, so re-running the scraper against an expired regulation would inflate its legal lists with things added afterwards; the scraper detects this and refuses.
When a new regulation starts, three things need updating beyond running the scrapers:
CURRENT_REGULATIONinsrc/server.ts— the default and the id named in every tool description.An
import+provideRegulationData()line insrc/worker.ts— Workers can't enumerate a directory, so a newregulations/*.jsonis invisible to the hosted server until it's added there.KNOWN_EXCLUSIONSinscripts/scrape-regulation.ts, if the regulation excludes specific Mega forms — the source page doesn't encode those. That file documents how to re-derive the list from the dex.
Layout
src/server.ts the 12 MCP tools (transport-agnostic; no Node-only or filesystem code)
src/index.ts stdio entry — mounts server.ts on stdio (the local default)
src/worker.ts Cloudflare Workers entry — mounts server.ts on HTTP, with data bundled in
src/diskdata.ts Node-only: reads the JSON datasets from disk and registers them (stdio)
src/calc.ts @smogon/calc (Champions mode) wrapper + type effectiveness
src/dex.ts Pokémon lookups (data/champions-dex.json; injected or disk-loaded)
src/items.ts item lookups (data/champions-items.json; injected or disk-loaded)
src/movedata.ts move lookups (data/champions-moves.json; injected or disk-loaded)
src/abilitydata.ts ability lookups (data/champions-abilities.json; injected or disk-loaded)
src/movedex.ts move search, regulation-scoped
src/regulations.ts legality checks over regulations/*.json (injected or disk-loaded)
src/names.ts Pokémon-name normalization (Mega word order, base species)
scripts/ the standalone scrapers
data/, regulations/ generated data (committed; bundled into the Worker)
test/smoke.ts in-memory MCP client exercising every tool
wrangler.toml Cloudflare Workers config (hosted deployment)Available Tools
10 toolscalculate_damageCalculate battle damage (Pokémon Champions)A
Calculate the damage one Pokémon deals to another with a given move in Pokémon Champions (VGC-style, defaults to Doubles). Wraps the trusted @smogon/calc engine, so abilities (Contrary, Intimidate, ...), items, weather, terrain, Tera, crits, multi-hit, screens and Doubles spread reduction are all handled correctly. For moves whose power builds up over a battle — Rage Fist (per hit taken), Last Respects (per fainted ally) — pass moveContext so the base power scales correctly; or pin any variable-power move with moveContext.basePowerOverride. Answers questions like "does my Choice Band Staraptor-Mega OHKO that Garchomp?". Returns the damage range, percent range, hits-to-KO, and the human-readable calc string.
Inputs: move (required), attacker (required), defender (required), field, +1 more.
check_legalityCheck regulation legality (Pokémon Champions)A
Check whether a Pokémon — and optionally specific moves and/or held items — is legal in a given Pokémon Champions regulation (e.g. "m-b"). Reads purely from local regulation JSON (fully offline). If the regulation file is missing, returns an error telling you to run the scraper. If the regulation has no per-move or per-item legality data, that is stated explicitly rather than guessed.
Inputs: pokemon (required), regulation (required), items, moves.
find_pokemon_by_moveFind legal Pokémon that learn a move (Pokémon Champions)A
Given a move and a Pokémon Champions regulation (e.g. "m-b"), list every Pokémon that is legal in that regulation AND can learn the move. Answers "who can run Fake Out in M-B?" or "which legal mons get Spore?". Learnsets come from the Champions dex; the move's type/category/base power are included when the engine knows the move. NOTE: Champions publishes no per-move bans, so "legal move" means a legal Pokémon can learn it. Defaults to regulation "m-b".
Inputs: move (required), regulation.
get_itemLook up a held item (Pokémon Champions)A
Look up a single Pokémon Champions held item by name (e.g. "Choice Scarf", "Garchompite", "Sitrus Berry"): returns its in-game effect, how to obtain it, its category (Hold Item / Mega Stone / Berry), and whether it can be held in battle. Data comes from the Champions items page (Serebii). The "source" field shows whether the answer came from the Champions catalog or the @smogon/calc fallback (which lacks effect/location text). Optionally pass a regulation id (e.g. "m-b") to also get whether the item is legal there.
Inputs: name (required), regulation.
get_pokemonLook up a Pokémon (Pokémon Champions)A
Look up a Pokémon by name (Mega forms accepted, e.g. "Staraptor-Mega" or "Mega Staraptor") in Pokémon Champions: returns base stats, typing, abilities, and weight. Data comes from the Champions Pokédex (Serebii) so game-original Mega Evolutions are accurate — e.g. Mega Staraptor has Contrary, which @smogon/calc gets wrong. Also returns the Pokémon's full learnable movelist ("moves"). The "source" field shows whether the answer came from the Champions dex or the @smogon/calc fallback. Optionally pass a regulation id (e.g. "m-b") to also get whether the Pokémon is legal there and its regulation-legal moves.
Inputs: name (required), regulation.
list_itemsList held items (Pokémon Champions)A
Browse the items a Pokémon can hold in Pokémon Champions: Hold Items (Choice Scarf, Life Orb, Leftovers, ...), Mega Stones (Garchompite, Charizardite X, ...), and Berries (Sitrus, Lum, type-resist berries, ...). Each item includes its in-game effect, how to obtain it, and its category. Data is scraped from the Champions items page (Serebii). Optionally filter by category or a name substring, and pass a regulation id (e.g. "m-b") to mark which items are legal there. Answers "what berries can I hold?" or "which Mega Stones exist in Champions?".
Inputs: category, regulation, nameContains, includeNonHeld.
list_legal_movesList legal moves in a regulation (Pokémon Champions)A
List the moves available in a Pokémon Champions regulation (e.g. "m-b") — i.e. every move learnable by at least one legal Pokémon — each with its type, category (Physical/Special/Status), base power, and how many legal Pokémon can learn it. Optionally filter by name substring, move type (e.g. "Fire"), or category. Answers "what Fairy moves are usable in M-B?" or "is Glacial Lance legal here?". NOTE: Champions publishes no per-move bans, so this is the pool of learnable moves, not a separate curated allowlist. Defaults to regulation "m-b".
Inputs: type, category, regulation, nameContains.
list_legal_pokemonList legal Pokémon in a regulation (Pokémon Champions)A
List the Pokémon legal in a Pokémon Champions regulation (e.g. "m-b") — the regulation's legal pool — each enriched with its National Dex number, typing, base stats, and abilities from the Champions dex. Optionally filter by name substring or by type (e.g. "Dragon"). Answers "what Fairy types are legal in M-B?" or "show me the M-B roster". Reads the regulation's legal-Pokémon allowlist directly (the complement to list_legal_moves). Defaults to regulation "m-b".
Inputs: type, regulation, nameContains.
list_regulationsList available regulations (Pokémon Champions)A
List the Pokémon Champions regulations currently available locally (the JSON files in regulations/), with each one's metadata (name, date range, source URL, last-scraped timestamp) and counts of legal Pokémon/moves. Cheap way to know what legality data this server has before calling check_legality.
Inputs: no named parameters.
type_effectivenessType effectiveness multiplier (Pokémon Champions)A
Given an attacking type and 1 or 2 defending types, return the damage multiplier (0, 0.25, 0.5, 1, 2, or 4) and a short explanation, for Pokémon Champions. Derived from the type chart bundled in @smogon/calc. Answers "how effective is Fighting vs a Flying/Psychic Pokémon?".
Inputs: attackingType (required), defendingTypes (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool targets a distinct query type—damage calculation, type chart, Pokémon data, legality, items, and move/regulation lists. No two tools appear to do the same thing; even list_items vs get_item follow the standard browse/detail pattern.
Most tools follow a verb_noun pattern (calculate_damage, get_pokemon, list_regulations, check_legality), but 'type_effectiveness' is a noun phrase rather than a command, and the verbs vary (list, get, check, find). Still, the naming is readable and predictable within action groups.
With 10 tools, the server is well-scoped for its purpose, covering damage calc, type matchups, Pokémon lookup, legality, items, and regulation queries without redundancy. This falls comfortably within the ideal 3-15 range.
The tool surface covers the core workflows: damage calculation, type effectiveness, Pokémon data, legality checks, item browsing, and legal move/Pokémon lists. Minor gaps like a dedicated get_move tool are not critical because list_legal_moves and get_pokemon already provide move information.
Maintenance
Related MCP Connectors
Provide detailed Pokémon data and information through a standardized MCP interface. Enable LLMs an…
Look up Pokemon TCG Pocket cards, sets, packs, and evaluate decks with battle simulations.
Pokémon TCG card and sealed product prices in EUR, deal checks, and your PokéItem binder.
Look up Pokémon, moves, abilities, items, natures, and type matchups from PokéAPI v2.
Related MCP Servers
- FlicenseCqualityDmaintenanceEnables interaction with live Pokémon data through PokeAPI, providing comprehensive Pokémon information, battle calculations, moveset validation, and team analysis. Supports searching Pokémon and moves, calculating stats, checking type effectiveness, and analyzing team synergies with in-memory caching for improved performance.9-
- AlicenseAqualityDmaintenanceProvides Pokemon Showdown competitive battle data to AI assistants, enabling lookup of Pokemon stats, moves, abilities, items, type matchups, and strategic information through natural language queries.85MIT
- AlicenseAqualityCmaintenanceProvides accurate Pokemon data and Gen 9 damage calculation tools including stats, moves, type effectiveness, damage calculations, and accuracy checks for Pokemon battles.8MIT
- AlicenseNot gradedqualityDmaintenanceA high-precision damage calculator for Pokemon Scarlet and Violet, supporting 16-step random rolls, type effectiveness, terastal, and weather effects. Enables users to calculate damage, compare moves, search Pokemon/moves/items, and analyze KO probabilities.MIT