@cyanheads/pokeapi-mcp-server
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., "@@cyanheads/pokeapi-mcp-serverlook up Pikachu"
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.
Public Hosted Server: https://pokeapi.caseyjhand.com/mcp
Tools
Seven tools covering the full PokéAPI v2 surface — a flagship consolidation tool, a computed matchup tool, single-resource lookups, and a filter tool:
Tool | Description |
| Denormalized Pokémon dossier in one call: base stats, types, abilities with effect text, height/weight, evolution chain, learnable moves, sprites, species flavor text, and variant list |
| Computed offensive and defensive type effectiveness — for a type name or Pokémon identifier; correctly composes dual-type matchups |
| Move details: type, damage class, power, accuracy, PP, priority, target, stat changes, status-effect chance, and full English effect text |
| Ability details: full and short English effect text, and the Pokémon that have it (with hidden-ability flag and slot) |
| Item details: effect text, category, cost, fling power, attributes, and Pokémon that commonly hold it |
| Nature details: stat boost/penalty, preferred and disliked berry flavor. Returns all 25 natures when called without an identifier |
| Filter Pokémon by generation, type, pokédex, or egg group; also resolves fuzzy name queries to canonical entries |
pokeapi_get_pokemon
The flagship tool — fans out across the PokéAPI resource graph in parallel and returns one denormalized dossier, replacing 10–30 sub-resource GETs.
Fetches
/pokemon,/pokemon-species,/evolution-chain, and each/abilityin a two-tier parallel fan-outIncludes sprites (with
official-artworkhigh-quality art URL),is_legendary,is_mythical,capture_rate,growth_rate,gender_rateinclude_moves(defaultfalse) — set totruefor a summarized learnable-move list filtered to the latest generationgame_versionstring to select flavor text by game (e.g."sword","red") — silently falls back to first available when no matchSurfaces the variant list so callers can re-call with a specific form name (regional forms, Gigantamax, Mega, etc.)
pokeapi_get_type_matchups
Computed type effectiveness — pass a type name or Pokémon identifier to get the full offensive and defensive breakdown with multiplier values.
For dual-type Pokémon: composes both type defensive relations correctly (immune in either type wins)
Returns
superEffective,resistant, andimmunelists for both offense and defenseAccepts either
type(type name) orpokemon(name or dex number) — exactly one required
pokeapi_find_pokemon
Filter Pokémon by multiple criteria — returns names and dex numbers for follow-up pokeapi_get_pokemon calls.
Filters:
generation(e.g."generation-i"),type(e.g."fire"),pokedex(e.g."kanto"),egg_group(e.g."fairy")queryparameter for fuzzy name searchPagination via
limitandoffset
Related MCP server: dexMCP
Resources and prompts
Type | Name | Description |
Resource |
| Pokémon dossier by name or dex number — same payload as |
Resource |
| Type damage relations — raw multiplier table, offensive and defensive |
All resource data is also reachable via tools.
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats
Pluggable auth:
none,jwt,oauthSwappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
PokéAPI-specific:
Keyless and read-only — no API key, no auth, no configuration required to run
Graph-walk consolidation —
pokeapi_get_pokemonfans out across/pokemon,/pokemon-species,/evolution-chain, and N/abilityendpoints in two parallel tiers, returning one objectAggressive caching — PokéAPI data is static game data; responses are cached in
ctx.statewith a configurable TTL (default 6 h) to respect PokéAPI's fair-use policyInput normalization — accepts lowercase-hyphenated names or numeric IDs; strips and lowercases user input before fetching
English-first —
effect_entriesandflavor_text_entriesare always filtered tolanguage.name === 'en'; absent entries surface asnullrather than a foreign-language string
Agent-friendly output:
Dual-type composition —
pokeapi_get_type_matchupscomputes the effective matchup matrix from raw damage relations, so agents get a direct answer rather than raw tables to multiplyVariant surface —
pokeapi_get_pokemonlists all form variants so agents can identify and re-call with specific forms (Alolan, Galarian, Mega, Gigantamax)Sparse-safe nullable fields — upstream absent fields surface as
nullrather than crashing or returning a fabricated default
Getting started
Public Hosted Instance
A public instance is available at https://pokeapi.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"pokeapi-mcp-server": {
"type": "streamable-http",
"url": "https://pokeapi.caseyjhand.com/mcp"
}
}
}Self-Hosted / Local
No API key required. Add the following to your MCP client configuration file:
{
"mcpServers": {
"pokeapi-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/pokeapi-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"pokeapi-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/pokeapi-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}Or with Docker:
{
"mcpServers": {
"pokeapi-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/pokeapi-mcp-server:latest"
]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.0 or higher (or Node.js v24+).
No API key required — PokéAPI is fully public.
Installation
Clone the repository:
git clone https://github.com/cyanheads/pokeapi-mcp-server.gitNavigate into the directory:
cd pokeapi-mcp-serverInstall dependencies:
bun installConfigure environment (optional):
cp .env.example .env
# All vars are optional — the server works with defaultsConfiguration
Variable | Description | Default |
| PokéAPI base URL — override for local mirrors or proxies. |
|
| How long to cache PokéAPI responses (seconds). |
|
| Per-request timeout in milliseconds. |
|
| Transport: |
|
| Session mode: |
|
| Port for HTTP server. |
|
| Auth mode: |
|
| Log level (RFC 5424). |
|
| Directory for log files (Node.js only). |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Self-hosting for high-volume use
PokéAPI's Fair Use Policy asks consumers to cache aggressively and points high-volume deployments toward running a local instance. This server already caches responses for 6 hours by default (POKEAPI_CACHE_TTL_SECONDS), which covers most workloads. For hosted or batch-heavy deployments, run the official PokéAPI Docker image locally and point POKEAPI_BASE_URL at it — the server switches transparently.
Running the server
Local development
Build and run:
bun run rebuild bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t pokeapi-mcp-server .
docker run --rm -p 3010:3010 pokeapi-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/pokeapi-mcp-server. Build with --build-arg OTEL_ENABLED=false to omit OpenTelemetry peer dependencies.
Project structure
Path | Purpose |
|
|
| Server-specific env var parsing with Zod ( |
| Tool definitions ( |
| Resource definitions ( |
|
|
| Vitest test suite mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — catch typed upstream errors only to map a declared
errors[]contract withctx.fail(...)Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage (and caching)Register new tools and resources via the barrels in
src/mcp-server/*/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Pokemon MCP — wraps PokéAPI (free, no auth required)
Provide detailed Pokémon data and information through a standardized MCP interface. Enable LLMs an…
PyPI MCP — wraps the Python Package Index (PyPI) JSON API (free, no auth).
D&D 5e MCP — wraps the D&D 5th Edition API (free, no auth)
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that interfaces with PokeAPI to provide Pokémon information to LLM applications through JSON-RPC over stdio.-
- AlicenseAqualityDmaintenanceA Model Context Protocol server that wraps pypokedex to provide Pokemon data tools for MCP-compatible applications.101MIT
- AlicenseNot gradedqualityDmaintenanceMCP server providing tools to look up Pokémon, moves, abilities, items, locations, evolutions, and more from the PokéAPI via natural language.81 npm2ISC
- AlicenseNot gradedqualityDmaintenanceProvides Pokemon data access through MCP tools like get_pokemon, list_pokemon, and evolution chains via PokeAPI.12 npmMIT