bulbapedia-mcp
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., "@bulbapedia-mcpShow me Pikachu's evolution chain and learnset."
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.
bulbapedia-mcp
A remote MCP server that gives Claude (and any other MCP client) structured access to Bulbapedia, the community Pokémon encyclopedia. It runs on Cloudflare Workers as a stateless Streamable HTTP server: no Durable Objects, no sessions, and every request is served from Bulbapedia's public MediaWiki API with edge caching.
Content is fetched live from Bulbapedia and is licensed
CC BY-NC-SA 2.5. Only the API
endpoint (/w/api.php) is used; HTML pages are never scraped.
Tools
Search and pages
Tool | What it does |
| Full-text search or title autocomplete; |
| Lead paragraph and image of any page |
| Section outline of a page |
| Plain text of one section (by index or heading) |
| Categories a page belongs to |
| Names of any subject in other languages, with origins |
Pokémon
Tool | What it does |
| Species data: dex number, types, abilities, egg groups, base stats, forms, artwork, HOME render, icon |
| Level-up, TM, breeding, tutor, pre-evolution and event moves; any generation |
| Defensive matchups with weaknesses, resistances, immunities |
| Every stage with method, including branched families |
| Flavor text per game plus regional dex numbers |
| Where to obtain it in each game, plus event distributions |
| Wild held items with chances |
| Artwork, HOME render, menu icon and every game sprite with URLs |
| Browse by generation, type, egg group, legendary/mythical; optional images |
| Look up by National Dex number |
Moves and Abilities
Tool | What it does |
| Type, category, power, accuracy, PP, flags, TM numbers, per-game descriptions, effect text |
| Every Pokémon that learns a move, by method and generation |
| Browse by type, damage category, generation |
| Generation, per-generation descriptions, effect text |
| Every Pokémon with an Ability and in which slot |
| Browse, optionally by generation |
Other page types
Tool | What it does |
| Pockets, prices, fling power, descriptions, effect, acquisition |
| Region, map description, connections, encounter tables, items, trainers |
| Matchups, average stats, Pokémon lists, all moves of the type, abilities |
| Anime episode: titles, air dates, plot, major events, characters |
| Profile, anime/game/manga appearances, teams |
| TCG card prints, attacks, Pokédex data, card text |
| Platform, developer, release dates, ratings |
| Any Bulbapedia category, with pagination |
Wiki meta
Tool | What it does |
| Direct URLs and sizes for up to 50 image files |
| Latest article edits |
| Recent revisions of a page |
A bulbapedia://page/{title} resource template returns a page's introduction.
Related MCP server: Pokédex MCP Server
How it works
Browser (React app, served by the Worker)
│ /auth/google → Google sign-in (OAuth 2.0 + PKCE, owned by the Worker) → session cookie
│ /api/* tokens, usage, admin (session cookie)
▼
Cloudflare Worker (Hono)
/mcp bearer = personal token (bp_…) → every tool call logged to usage_events
/api/* ── Postgres (Supabase) via Hyperdrive ──┐
/auth/* │ users, sessions, api_tokens, usage_events
/* static assets (Vite build) └──────────────────────────────────────────Users sign in with Google, create personal bearer tokens on the dashboard, and see their own usage.
Admins (
users.is_admin) see every user, every token, and a filterable event log at/admin.The browser never talks to the database; all reads and writes go through the Worker.
Tokens are stored as SHA-256 hashes and shown once. Each token has an expiry chosen at creation (1 hour to 1 year, or never). Expired tokens are rejected immediately and deleted: when presented, when their owner opens the token list, and by a Cron Trigger every 6 hours (which also keeps a free Supabase project from pausing). Usage rows keep the token's name.
Sessions are HttpOnly cookies backed by a
sessionstable.
Local development
npm install
cp .dev.vars.example .dev.vars # SESSION_SECRET, DEV_LOGIN_SECRET, optional MCP_AUTH_TOKEN
npm run db:start # embedded Postgres on 127.0.0.1:54329 (+ migrations)
npm run dev # http://localhost:8788 (Vite + Worker in one dev server)Sign in locally without Google: open http://localhost:8788/auth/dev-login?secret=dev-login&email=you@example.com&name=You&admin=1
(only works while DEV_LOGIN_SECRET is set in .dev.vars; never set it in production).
Tests and checks:
npm test # parser + auth unit tests (fixtures, no network)
npm run verify:live # every MCP tool against the running server (MCP_TOKEN=local-dev-token)
npm run verify:accounts # login, tokens, /mcp with a user token, usage log, admin routes
npm run fixtures # refresh test fixtures from the live Bulbapedia API
npm run db:stopDeploy
1. Supabase (Postgres)
Create a project at supabase.com.
SQL editor → paste and run every file in
db/migrations/in order (0001_init.sql,0002_token_expiry.sql).Project settings → Database → copy the Session pooler connection string (IPv4 compatible), e.g.
postgres://postgres.<ref>:<password>@aws-0-<region>.pooler.supabase.com:5432/postgres.
2. Hyperdrive (Cloudflare's connection pooler for Postgres)
npx wrangler login
npx wrangler hyperdrive create bulbapedia-db --connection-string="<session pooler string>"Paste the printed id into wrangler.jsonc → hyperdrive[0].id.
3. Google OAuth client
console.cloud.google.com → APIs & Services → OAuth consent screen (External). While it is in "Testing", only listed test users can sign in; publish it to open sign-in to everyone.
Credentials → Create credentials → OAuth client ID → Web application.
Authorized redirect URIs:
http://localhost:8788/auth/callbackandhttps://bulbapedia-mcp.<your-subdomain>.workers.dev/auth/callback.Put the client id in
wrangler.jsonc→vars.GOOGLE_CLIENT_ID. Optionally setvars.BOOTSTRAP_ADMIN_EMAILto your Google email so your first login becomes admin.
4. Secrets and deploy
npx wrangler secret put GOOGLE_CLIENT_SECRET
npx wrangler secret put SESSION_SECRET # any 32+ random characters, e.g. openssl rand -base64 32
npm run deploy # builds the app + worker, then wrangler deployThe app is at https://bulbapedia-mcp.<your-subdomain>.workers.dev; the MCP endpoint is /mcp. Do not set DEV_LOGIN_SECRET or MCP_AUTH_TOKEN in production.
To make someone admin later: Supabase table editor → users → set is_admin = true, or use the toggle on the admin page.
Connect a client
Create a token on the dashboard; it shows ready-to-paste snippets. Claude Code:
claude mcp add --transport http bulbapedia https://bulbapedia-mcp.<your-subdomain>.workers.dev/mcp --header "Authorization: Bearer bp_..."Claude Desktop only launches local servers, so it needs the mcp-remote bridge. In
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"bulbapedia": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://bulbapedia-mcp.<your-subdomain>.workers.dev/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer bp_..." }
}
}
}Restart Claude Desktop afterwards. Cursor, Windsurf and other clients that support HTTP servers with headers take the direct form:
{
"mcpServers": {
"bulbapedia": {
"url": "https://bulbapedia-mcp.<your-subdomain>.workers.dev/mcp",
"headers": { "Authorization": "Bearer bp_..." }
}
}
}Design system
The web app follows the project's minimalist-ui skill: warm monochrome palette (#F7F6F3 canvas, #111 ink, #EAEAEA hairlines,
warm dark equivalents under prefers-color-scheme: dark), Newsreader for display headings, Geist for UI text, Geist Mono for
numbers and code, muted pastels only for status tags, 12px cards, 6px controls, no gradients or shadows. Fonts are self-hosted
via Fontsource; icons come from Phosphor (bold weight). Tokens live at the top of src/index.css.
Layout
worker/index.ts Hono app: /health, /auth/*, /api/*, /mcp; static assets for everything else
worker/server.ts McpServer factory; registers all tools and the page resource
worker/auth.ts Bearer gate for /mcp (per-user tokens, optional legacy MCP_AUTH_TOKEN)
worker/auth/ Google OAuth (PKCE), sessions, token generation, crypto helpers
worker/routes/ /auth and /api (+ /api/admin) route handlers
worker/db/ postgres.js client (via Hyperdrive) and typed queries
worker/usage.ts Logs every tool call to usage_events
worker/bulbapedia/ Bulbapedia API client (Cache API), categories, dex index, images
worker/parsers/ Pure wikitext → JSON parsers for infoboxes, learnsets, evolution, pages…
worker/wikitext/ Template extraction and wikitext-to-plain-text cleaning
worker/tools/ One file per tool group
src/ React app (Vite): landing, dashboard, admin
db/migrations/ SQL schema (run in Supabase)
test/ Vitest: parser tests against captured fixtures, auth unit tests
scripts/ fixtures capture, local Postgres, end-to-end verificationNotes
Responses from Bulbapedia are cached at the edge for 1 hour (24 hours for the National Dex index).
Bulbapedia's HTML pages sit behind a bot challenge. This server never requests them; if the API itself ever starts challenging requests, tools return an error rather than attempting a bypass.
Tool arguments are stored in the usage log, so admins can see what users looked up. The landing page says so.
This server cannot be deployed
Maintenance
Related MCP Connectors
Provide detailed Pokémon data and information through a standardized MCP interface. Enable LLMs an…
Look up Pokémon, moves, abilities, items, natures, and type matchups from PokéAPI v2.
Search Wikipedia, read summaries and full text, target sections, find nearby pages, list languages.
Look up Pokemon TCG Pocket cards, sets, packs, and evaluate decks with battle simulations.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables users to access comprehensive Pokemon data through the PokeAPI, including Pokemon stats, types, descriptions, move details, and complete evolution chains. Allows Claude to answer Pokemon-related questions with detailed information about any Pokemon, their abilities, and evolutionary relationships.19 npmISC
- AlicenseBqualityDmaintenanceEnables AI agents to access comprehensive Pokémon data through PokeAPI, including detailed Pokémon information, type effectiveness charts, encounter locations, and search capabilities. Provides a complete toolkit for retrieving stats, abilities, sprites, battle mechanics, and wild encounter data for all Pokémon.4179 npm1MIT
- 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-
- AlicenseBqualityDmaintenanceEmpowers AI assistants to fetch and explore comprehensive Pokémon data from PokeAPI via 47 tools covering Pokémon, moves, items, game mechanics, and more.4751 npm1ISC