Pokemon Showdown MCP Server
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.
README
mcpkmn-showdown
An MCP server that gives AI assistants complete knowledge of competitive Pokemon.
Give Claude (or any MCP-compatible LLM) instant access to Pokemon stats, moves, abilities, items, and type matchups—no API keys, no rate limits, works offline.

Why This Exists
Without this MCP server, getting accurate Pokemon battle data into an LLM is painful:
- Hallucination city — LLMs frequently make up stats, forget abilities, or miscalculate type matchups
- No structured data — You're stuck copy-pasting from Bulbapedia or Serebii
- Can't build agents — No programmatic way for an AI to query battle mechanics
With mcpkmn-showdown:
- Zero hallucination — Data comes directly from Pokemon Showdown, the competitive standard
- Structured responses — Tools return formatted data ready for reasoning
- Agent-ready — Build bots that analyze replays, suggest teams, or play battles
Quickstart (5 minutes)
1. Install
pip install mcpkmn-showdown
2. Configure Claude Desktop
Add to your config file:
| OS | Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
{
"mcpServers": {
"pokemon": {
"command": "mcpkmn-showdown"
}
}
}
3. Restart Claude Desktop
4. Try it
Ask Claude: "What's the best ability for Garchomp and why?"
What You Can Do
Here are concrete workflows this MCP enables:
| Workflow | Example Prompt |
|---|---|
| Team Analysis | "Analyze this team's type coverage and suggest improvements" |
| Matchup Calc | "Is Choice Scarf Garchomp fast enough to outspeed Dragapult?" |
| Set Building | "Build a Trick Room sweeper that can handle Fairy types" |
| Replay Analysis | "What went wrong in this battle? [paste replay log]" |
| Learning | "Explain how Intimidate affects damage calculations" |
API Reference
Tools Overview
| Tool | Purpose | Key Input |
|---|---|---|
get_pokemon |
Pokemon stats, types, abilities | name: string |
get_move |
Move power, accuracy, effects | name: string |
get_ability |
What an ability does in battle | name: string |
get_item |
Held item effects | name: string |
get_type_effectiveness |
Damage multiplier calculation | attack_type, defend_types |
search_priority_moves |
Find priority moves | min_priority: int |
search_pokemon_by_ability |
Pokemon with a specific ability | ability: string |
list_dangerous_abilities |
Battle-critical abilities by category | category: string |
get_pokemon
Look up complete Pokemon data.
Schema:
{
"name": "string" // Pokemon name (e.g., "garchomp", "Mega Charizard X")
}
Example:
Input: {"name": "garchomp"}
Output:
Garchomp
Types: Ground/Dragon
Stats: HP 108 | Atk 130 | Def 95 | SpA 80 | SpD 85 | Spe 102
Abilities: Sand Veil / Rough Skin (Hidden)
Weight: 95 kg
Tier: OU
get_move
Look up move details including effects and priority.
Schema:
{
"name": "string" // Move name (e.g., "earthquake", "swords-dance")
}
Example:
Input: {"name": "earthquake"}
Output:
Earthquake
Type: Ground | Category: Physical
Power: 100 | Accuracy: 100%
PP: 10 | Priority: 0
Effect: Hits all adjacent Pokemon. Double damage on Dig.
get_ability
Look up what an ability does in battle.
Schema:
{
"name": "string" // Ability name (e.g., "levitate", "protean")
}
Example:
Input: {"name": "protean"}
Output:
Protean: This Pokemon's type changes to match the type of the move
it is about to use. This effect comes after all effects that change
a move's type.
get_item
Look up held item battle effects.
Schema:
{
"name": "string" // Item name (e.g., "choice-scarf", "leftovers")
}
Example:
Input: {"name": "choice-scarf"}
Output:
Choice Scarf: Holder's Speed is 1.5x, but it can only use the first
move it selects.
get_type_effectiveness
Calculate type matchup multipliers.
Schema:
{
"attack_type": "string", // Attacking type (e.g., "electric")
"defend_types": ["string"] // Defending types (e.g., ["water", "flying"])
}
Example:
Input: {"attack_type": "electric", "defend_types": ["water", "flying"]}
Output: 4x - Super effective!
search_priority_moves
Find moves that act before normal speed order.
Schema:
{
"min_priority": 1 // Minimum priority level (default: 1)
}
Example:
Input: {"min_priority": 1}
Output:
+1 Priority: Aqua Jet, Bullet Punch, Ice Shard, Mach Punch,
Quick Attack, Shadow Sneak, Sucker Punch...
+2 Priority: Extreme Speed, Feint...
+3 Priority: Fake Out...
search_pokemon_by_ability
Find all Pokemon with a specific ability.
Schema:
{
"ability": "string" // Ability name (e.g., "intimidate")
}
Example:
Input: {"ability": "levitate"}
Output: Azelf, Bronzong, Cresselia, Eelektross, Flygon, Gengar,
Hydreigon, Latias, Latios, Mismagius, Rotom, Uxie, Vikavolt...
list_dangerous_abilities
List abilities that significantly impact battle outcomes.
Schema:
{
"category": "string" // One of: immunity, defense, reflect, offense,
// priority, contact, or "all"
}
Categories:
immunity— Levitate, Flash Fire, Volt Absorb, Water Absorb, etc.defense— Multiscale, Fur Coat, Fluffy, Marvel Scale, etc.reflect— Magic Bounceoffense— Huge Power, Pure Power, Gorilla Tactics, etc.priority— Prankster, Gale Wingscontact— Rough Skin, Iron Barbs, Flame Body, Static, etc.
Architecture
┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────┐
│ │ │ │ │ │
│ Claude/LLM │────▶│ mcpkmn-showdown │────▶│ Local JSON │
│ │ MCP │ (MCP Server) │ │ Cache │
│ │◀────│ │◀────│ │
└─────────────────┘ └─────────────────────┘ └──────────────────┘
│
│ (manual update)
▼
┌──────────────────┐
│ Pokemon │
│ Showdown │
│ Data Files │
└──────────────────┘
Why MCP?
LLMs hallucinate Pokemon data — wrong stats, forgotten abilities, botched type calculations. MCP tools let the model query authoritative data instead of guessing from training.
Why local JSON instead of connecting to Pokemon Showdown?
Pokemon Showdown doesn't have a REST API. Their data is served as minified JavaScript for their web client. Connecting live would mean parsing JS on every query, network latency, rate limiting concerns, and breaking if they change formats.
| Approach | Tradeoff |
|---|---|
| Local JSON | Instant, offline, reliable — but data can go stale |
| Live connection | Always fresh — but slow, fragile, requires internet |
For reference data (stats, moves, abilities), local is the right call. The data only changes with new games/DLC. For live features (ladder stats, ongoing battles), we'd need WebSocket connections — that's on the roadmap.
Data sources (from Pokemon Showdown):
pokedex.json— 1,500+ Pokemon with stats, types, abilitiesmoves_showdown.json— 950+ moves with effectsabilities_full.json— 300+ abilities with descriptionsitems.json— 580+ items with effectstypechart.json— Complete type effectiveness matrix
To refresh the data: python -m mcpkmn_showdown.data_fetcher
Safety & Limits
| Concern | How It's Handled |
|---|---|
| Rate limits | None — all data is local, no external API calls |
| Data freshness | Ships with latest Showdown data; manually updateable |
| Input validation | Names normalized and validated before lookup |
| Error handling | Returns helpful "not found" messages, never crashes |
| Credential handling | No credentials needed, no auth, no API keys |
Roadmap
Planned features:
- [ ] Live battle integration (connect to a running Showdown battle)
- [ ] Team import/export (paste Showdown format, get structured data)
- [ ] Damage calculator integration
- [ ] Format-specific tier lists and banlists
- [ ] Usage statistics from Smogon
Help wanted — good first issues:
- [ ] Add
get_formattool to explain format rules (OU, UU, etc.) - [ ] Add
search_pokemon_by_typetool - [ ] Add
search_moves_by_typetool - [ ] Improve form normalization (regional forms, Gigantamax, etc.)
- [ ] Add more test coverage
See CONTRIBUTING.md for how to get started.
Contributing
See CONTRIBUTING.md for full guidelines. Quick start:
git clone https://github.com/drewsungg/mcpkmn-showdown.git
cd mcpkmn-showdown
pip install -e ".[dev]"
pytest # Run tests
npx @modelcontextprotocol/inspector mcpkmn-showdown # Interactive testing

We Want Your Feedback
If you try this out, please let us know:
- Is the tool naming/schema intuitive for an agent? Would different boundaries help?
- What's missing for your use case? Teambuilding? Laddering? Replay analysis? Eval harness?
- Any security/abuse concerns? Anything that could be misused?
- Does it behave well under load? Concurrent requests? Long sessions?
Open an issue or reach out: @drewsungg
Related Projects
- pokemon-llm-battle-bot — LLM-powered Pokemon battle bot using this MCP
- Pokemon Showdown — The competitive battle simulator
- Model Context Protocol — The MCP specification
License
MIT License — see LICENSE for details.
Author
Andrew Sung — @drewsungg
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。