Skip to main content
Glama
Pokémon Champions MCP Server

Pokémon Champions MCP Server

by Emieeel

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 build

That compiles everything into dist/. Quick check that it works:

npm test

Related 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.

  1. 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'))"
  2. 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]).

  3. Restart the client. It should now list tools like calculate_damage and find_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 URL

The 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

calculate_damage

"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 isCrit for a critical hit; Sniper and screen-ignoring included), multi-hit, and Doubles spread reduction. Every result also reports how effective the hit was, in the game's own words (It's super effective!).

type_effectiveness

The multiplier (0–4x) of an attacking type against 1–2 defending types.

get_pokemon

Base stats, typing, abilities, weight, and full movelist for a Pokémon or any of its forms, by either spelling (Mega Raichu X / Raichu-Mega-X, Alolan Ninetales / Ninetales-Alola, Indeedee-F, Rotom-Wash). Always includes a defensiveProfile: all 18 attacking types with their multipliers, split into weaknesses / resistances / immunities, plus a table per ability that changes damage taken (Levitate, Thick Fat, Heatproof, …). Pass a regulation id to also get legality and regulation-legal moves.

get_item

Effect, how-to-obtain, and category (Hold Item / Mega Stone / Berry) for a held item, e.g. Choice Scarf, Garchompite, Lum Berry. Pass a regulation id to also check legality.

list_items

Browse the held-item catalog, optionally filtered by category or a nameContains substring (held-only by default; includeNonHeld adds tickets). Pass a regulation id to mark which items are legal.

check_legality

Whether a Pokémon — and optionally listed moves and/or held items — is legal in a regulation.

find_pokemon_by_move

"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 (willowisp → Will-O-Wisp). Defaults to m-c.

list_legal_moves

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 type, category, or a nameContains substring. Defaults to m-c.

list_legal_pokemon

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 type (e.g. Dragon) or a nameContains substring. The complement to list_legal_moves. Defaults to m-c.

get_move

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 (Base power 80 -> 85) and the changed status rules for what it inflicts (paralysis is 12.5% in Champions).

get_ability

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.

list_regulations

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_moves is 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_pokemon returns the whole defensive table (all 18 types), and calculate_damage reports 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_damage has 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/Violet

Pass 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:

  1. CURRENT_REGULATION in src/server.ts — the default and the id named in every tool description.

  2. An import + provideRegulationData() line in src/worker.ts — Workers can't enumerate a directory, so a new regulations/*.json is invisible to the hosted server until it's added there.

  3. KNOWN_EXCLUSIONS in scripts/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 tools
calculate_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_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

    A4.4/5.0

    Scored across 10 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count5/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      C
      quality
      D
      maintenance
      Enables 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
      -
    • A
      license
      A
      quality
      D
      maintenance
      Provides 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.
      8
      5
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Provides accurate Pokemon data and Gen 9 damage calculation tools including stats, moves, type effectiveness, damage calculations, and accuracy checks for Pokemon battles.
      8
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A 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