@cyanheads/pokeapi-mcp-server

v0.1.4 pre-1.0

Look up Pokémon, moves, abilities, items, natures, and type matchups from PokéAPI v2 via MCP. STDIO or Streamable HTTP.

@cyanheads/pokeapi-mcp-server
claude mcp add --transport http pokeapi-mcp-server https://pokeapi.caseyjhand.com/mcp
codex mcp add pokeapi-mcp-server --url https://pokeapi.caseyjhand.com/mcp
{
  "mcpServers": {
    "pokeapi-mcp-server": {
      "url": "https://pokeapi.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http pokeapi-mcp-server https://pokeapi.caseyjhand.com/mcp
{
  "mcpServers": {
    "pokeapi-mcp-server": {
      "command": "bunx",
      "args": [
        "@cyanheads/pokeapi-mcp-server@latest"
      ]
    }
  }
}
{
  "mcpServers": {
    "pokeapi-mcp-server": {
      "type": "http",
      "url": "https://pokeapi.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://pokeapi.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

7

pokeapi_get_pokemon

open-world

Get a fully denormalized Pokémon dossier in a single call — base stats, types, abilities (with full English effect text), height/weight, resolved evolution chain, sprite URLs including official artwork, species flavor text, variety list, capture rate, growth rate, gender rate, legendary/mythical flags, egg groups, and (optionally) a summarized learnable-move list. Accepts a name (lowercase, hyphens for spaces, e.g. "bulbasaur", "mr-mime") or Pokédex number. Set include_moves=true to include the move summary (large); defaults to false. Use game_version to select flavor text from a specific game (e.g. "sword", "red"); falls back to the most recent English entry when the version is not found. Use pokeapi_find_pokemon to discover Pokémon by type, generation, or egg group before calling this tool.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_pokemon",
    "arguments": {
      "identifier": "<identifier>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "identifier": {
      "type": "string",
      "description": "Pokémon name (lowercase hyphenated, e.g. \"bulbasaur\", \"mr-mime\") or Pokédex number as a string (e.g. \"1\", \"25\")."
    },
    "include_moves": {
      "default": false,
      "description": "Include the full learnable-move summary. Defaults to false because the list is large (100–200+ moves).",
      "type": "boolean"
    },
    "game_version": {
      "description": "PokéAPI version name to filter flavor text (e.g. \"sword\", \"red\", \"scarlet\"). Falls back to the most recent English entry when the version is not found.",
      "type": "string"
    }
  },
  "required": [
    "identifier",
    "include_moves"
  ],
  "additionalProperties": false
}
view source ↗

pokeapi_get_type_matchups

open-world

Get the full offensive and defensive type effectiveness breakdown. Provide either a type name (e.g. "fire", "psychic") or a Pokémon identifier (name or dex number). For dual-type Pokémon, the defensive multipliers are correctly composed (e.g. Fire/Flying vs Rock = 4× because both types are weak to Rock). Exactly one of type or pokemon must be provided.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_type_matchups",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "type": {
      "description": "Type name in lowercase (e.g. \"fire\", \"water\", \"psychic\"). Provide this or pokemon, not both.",
      "type": "string"
    },
    "pokemon": {
      "description": "Pokémon name or Pokédex number. The server resolves the types automatically. Provide this or type, not both.",
      "type": "string"
    }
  },
  "additionalProperties": false
}
view source ↗

pokeapi_get_move

open-world

Get move details by name or numeric ID — type, damage class, power, accuracy, PP, priority, target, stat changes, status-effect chance, and full English effect text. Set include_learners=true to include the list of Pokémon that can learn the move. Move names are available from pokeapi_get_pokemon when include_moves=true.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_move",
    "arguments": {
      "identifier": "<identifier>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "identifier": {
      "type": "string",
      "description": "Move name in lowercase hyphenated form (e.g. \"flamethrower\", \"close-combat\") or numeric ID as a string."
    },
    "include_learners": {
      "default": false,
      "description": "Include the list of Pokémon that can learn this move. Defaults to false as the list can be large.",
      "type": "boolean"
    }
  },
  "required": [
    "identifier",
    "include_learners"
  ],
  "additionalProperties": false
}
view source ↗

pokeapi_get_ability

open-world

Get ability details by name or numeric ID — full English effect text, short effect text, generation introduced, and the list of Pokémon that have the ability (including hidden-ability flag and slot). Ability names are returned by pokeapi_get_pokemon in the abilities array.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_ability",
    "arguments": {
      "identifier": "<identifier>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "identifier": {
      "type": "string",
      "description": "Ability name in lowercase hyphenated form (e.g. \"overgrow\", \"speed-boost\") or numeric ID as a string."
    }
  },
  "required": [
    "identifier"
  ],
  "additionalProperties": false
}
view source ↗

pokeapi_get_item

open-world

Get item details by name or numeric ID — effect text, category, in-game cost, fling power, item attributes (holdable, consumable, etc.), sprite URL, and Pokémon that commonly hold it.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_item",
    "arguments": {
      "identifier": "<identifier>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "identifier": {
      "type": "string",
      "description": "Item name in lowercase hyphenated form (e.g. \"choice-specs\", \"leftovers\") or numeric ID as a string."
    }
  },
  "required": [
    "identifier"
  ],
  "additionalProperties": false
}
view source ↗

pokeapi_get_nature

Get nature details — the stat boosted (+10%), stat reduced (-10%), and preferred/disliked berry flavors. Omit the identifier to list all 25 natures at once. Natures are critical for competitive team-building: every non-neutral nature modifies two stats by ±10%.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_get_nature",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "identifier": {
      "description": "Nature name (e.g. \"modest\", \"jolly\") or ID 1–25 as a string. Omit to list all 25 natures.",
      "type": "string"
    }
  },
  "additionalProperties": false
}
view source ↗

pokeapi_find_pokemon

Filter Pokémon by generation, type, regional pokédex, or egg group. Returns names and Pokédex numbers suitable for follow-up pokeapi_get_pokemon calls. All filters are optional and combined with AND logic; query adds strict token matching on name. When no category filter is provided alongside query, returns an empty result — at least one categorical filter is required.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "pokeapi_find_pokemon",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "generation": {
      "description": "Generation name (e.g. \"generation-i\", \"generation-iii\"). Filters to Pokémon introduced in this generation.",
      "type": "string"
    },
    "type": {
      "description": "Type name (e.g. \"fire\", \"psychic\"). Filters to Pokémon of this type.",
      "type": "string"
    },
    "pokedex": {
      "description": "Regional pokédex name (e.g. \"kanto\", \"hoenn\", \"galar\"). Filters to entries in that dex.",
      "type": "string"
    },
    "egg_group": {
      "description": "Egg group name (e.g. \"monster\", \"fairy\", \"dragon\"). Filters to Pokémon in this egg group.",
      "type": "string"
    },
    "query": {
      "description": "Strict token match on name. \"chu\" matches \"pikachu\" and \"raichu\". Case-insensitive.",
      "type": "string"
    },
    "limit": {
      "default": 50,
      "description": "Maximum results to return. Defaults to 50.",
      "type": "number"
    },
    "offset": {
      "default": 0,
      "description": "Offset into the filtered result set for pagination. Defaults to 0.",
      "type": "number"
    }
  },
  "required": [
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

Resources

2

Pokémon dossier addressable by name or Pokédex number. Same payload as pokeapi_get_pokemon without move details.

uri pokeapi://pokemon/{identifier} mime application/json