PokeMCP
The PokeMCP server enables Claude AI to play Pokémon Fire Red through the mGBA emulator by providing tools across four main areas:
Input Controls
Press individual buttons (A, B, START, SELECT, directions, L/R) or sequences with customizable timing
Hold buttons for extended durations (e.g., walking multiple tiles, fast-forwarding text)
Wait a specified number of frames through animations or transitions
Screen Capture
Take screenshots of the current game screen at any time or after input/waiting
Game State Reading (RAM)
Full state summary: player location, badges earned, money, party Pokémon (species, level, HP, moves), and battle status
Detailed party info: stats, moves with PP, IVs, and friendship values
Battle state: active Pokémon HP and moves, plus enemy species, level, and HP
Save/Load State
Save and load emulator states to slots (1–9) for progress management or replaying scenarios
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., "@PokeMCP Check my current party's health and tell me where I am."
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.
PokeMCP - AI Plays Pokemon Fire Red
An MCP server that lets Claude play Pokemon Fire Red through the mGBA emulator. Built for YouTube content — Claude has its own personality, names its Pokemon, trash-talks its rival, and reacts to everything happening in the game.
How It Works
Claude <-> FastMCP Server (Python) <-> TCP Socket <-> Lua Script (inside mGBA)Split gameplay model:
Claude handles: Battles, dialog, menus, naming (trainer/rival/Pokemon), team strategy
Human operator handles: Overworld navigation (walking to destinations)
Navigation is purely visual — Claude reads screenshots to understand the game world
RAM reading is used only for party Pokemon stats, battle data, badges, and money
Related MCP server: mcp-mgba
Prerequisites
mGBA v0.10+ — mgba.io
Python 3.12+
uv —
pip install uvPokemon Fire Red ROM — US v1.0 (game code: BPRE)
Setup
1. Install dependencies
uv sync2. Load the Lua script in mGBA
Open mGBA and load your Pokemon Fire Red ROM
Go to Tools > Scripting
File > Load Script → select
lua/mgba_server.luaConsole should show:
MCP Server listening on 127.0.0.1:5555
3. Configure Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"pokemon-firered": {
"command": "C:\\Users\\YOUR_USER\\AppData\\Roaming\\Python\\Python312\\Scripts\\uv.exe",
"args": ["--directory", "C:/path/to/mGba MCP", "run", "mgba-mcp"]
}
}
}Note: Use the full path to
uv.exe— Claude Desktop may not have it in PATH. Find it withpython -c "import shutil; print(shutil.which('uv'))".
4. Play!
Start a conversation with Claude. It will invent a personality, pick a trainer name, and start playing.
Available Tools
Tool | Description |
| Press a GBA button and get a screenshot |
| Press a sequence of buttons with timing |
| See the current game screen |
| Read badges, money, party Pokemon, battle state from RAM |
| Detailed party info (stats, moves, IVs) |
| Battle details (your/enemy Pokemon, HP, moves, PP) |
| Save emulator state (slots 1-9) |
| Load emulator state |
| Wait through animations/transitions |
| Hold a button for extended walking/scrolling |
What Claude Reads from RAM
Party Pokemon — Species, level, HP, moves with PP, stats, IVs, status conditions
Badges — Which gym badges have been earned
Money — Current funds (XOR-decrypted)
Battle state — Enemy Pokemon species, level, HP, moves
Navigation and dialog are handled visually through screenshots only.
Claude's Personality
Each session, Claude invents a unique persona:
Picks its own trainer name and rival name
Names every Pokemon with creative nicknames
Has strong opinions about Pokemon, moves, and characters
Gets emotionally invested — celebrates wins, mourns faints
Narrates its thought process for the audience
All commentary in Spanish for YouTube content
Project Structure
├── pyproject.toml
├── src/mgba_mcp/
│ ├── server.py # FastMCP tools + personality instructions
│ ├── connection.py # TCP client for mGBA communication
│ ├── game_state.py # Pokemon Fire Red RAM parser
│ └── constants.py # Memory addresses and lookup tables
├── lua/
│ └── mgba_server.lua # Lua TCP server loaded into mGBA
└── data/
├── pokemon_species.json
├── pokemon_moves.json
└── map_names.jsonTips for YouTube Recording
Save states are your friend — save before gyms, important battles, or risky catches
Let Claude fail — mistakes and reactions are entertaining content
Navigate for Claude — walk to destinations, let Claude handle the rest
Nudge when stuck — tell Claude "we're at the Pokemon Center" or "there's a trainer ahead"
The game is in English but Claude comments in Spanish — great for bilingual content
Important Notes
ROM must be US v1.0 (BPRE) for memory addresses to work
Load the Lua script in mGBA before starting Claude Desktop
mGBA must stay open while playing
The Lua script auto-detects the ROM and warns if it doesn't match
License
MIT
Available Tools
10 toolsget_battle_stateA
Get current battle information.
Returns your active Pokemon's HP and moves with PP, and the enemy Pokemon's species, level, and HP. Returns a message if not in battle.
Inputs: no named parameters. Returns: result
get_game_stateA
Read the full game state from RAM.
Returns a summary of: player location, badges, money, party Pokemon (species, level, HP, moves), and whether a battle is active.
Inputs: no named parameters. Returns: result
get_partyA
Get detailed info about all party Pokemon.
Returns species, level, HP, stats, moves with PP, IVs, and friendship for each Pokemon in the party.
Inputs: no named parameters. Returns: result
get_screenshotB
Capture the current game screen without pressing any buttons.
Inputs: no named parameters.
hold_buttonA
Hold a button for an extended period and return a screenshot.
Different from press_button in that it's designed for longer holds like walking multiple tiles or fast-forwarding text with B held.
Args: button: The button to hold frames: Number of frames to hold (default 30, ~500ms)
Inputs: button (required), frames.
load_stateA
Load an emulator state from a slot and return a screenshot.
Args: slot: Save slot number (1-9)
Inputs: slot. Returns: result
press_buttonA
Press a GBA button and return a screenshot of the result.
Args: button: The button to press (A, B, START, SELECT, UP, DOWN, LEFT, RIGHT, L, R) hold_frames: Number of frames to hold the button (default 10, ~167ms)
Inputs: button (required), hold_frames.
press_buttonsA
Press a sequence of buttons and return a screenshot after the last one.
Useful for menu navigation like selecting options or entering text.
Args: sequence: List of button presses. Each entry: {"button": "A", "hold_frames": 10, "release_frames": 5} hold_frames defaults to 10, release_frames defaults to 5.
Inputs: sequence (required).
save_stateB
Save the emulator state to a slot.
Args: slot: Save slot number (1-9)
Inputs: slot. Returns: result
wait_framesA
Wait for a number of frames without input, then screenshot.
Useful for waiting through animations, text, or transitions. At ~60fps, count=60 is approximately 1 second.
Args: count: Number of frames to wait (default 60)
Inputs: count.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose with no overlap: get_battle_state, get_game_state, and get_party provide different scopes of game information, while press_button, hold_button, press_buttons, wait_frames, get_screenshot, save_state, and load_state handle distinct input/output operations. The descriptions explicitly differentiate tools like hold_button vs. press_button, preventing confusion.
All tool names follow a consistent verb_noun pattern (e.g., get_battle_state, press_button, save_state), using snake_case throughout. The naming is predictable and readable, with no deviations in style or convention across the set.
With 10 tools, the count is well-scoped for an emulator control server, covering core functions like state retrieval, input simulation, and save management. Each tool earns its place without redundancy, fitting a typical range for such a domain.
The tool set provides comprehensive coverage for emulator interaction, including reading game state, simulating inputs, and managing saves. A minor gap exists in lacking direct emulation control tools (e.g., reset, speed adjustment), but agents can work around this using existing tools for most workflows.
Maintenance
Related MCP Connectors
AI game maker: build, run, screenshot and play-test Godot and retro console games in a live project
Drive your retro handheld console: find your games, launch, save, set volume, get cheat codes.
Provide detailed Pokémon data and information through a standardized MCP interface. Enable LLMs an…
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables programmatic control of the mGBA emulator for Game Boy, Game Boy Color, and Game Boy Advance games, including screenshot capture, memory reading, sprite data dumping, and custom Lua script execution for automated testing and game analysis.66-
- AlicenseAqualityBmaintenanceMCP server for the mGBA Game Boy Advance emulator. Read and write GBA memory, inject button presses, take screenshots, save/load state, and step the emulator through a Lua bridge.1840 npm7MIT
- AlicenseBqualityBmaintenanceEnables Claude and other MCP clients to play Pokémon games on emulated Game Boy/GBA or real Switch hardware by exposing tools for button input, reading RAM-decoded game state, screenshots, save states, and persistent markdown notes.19MIT
- AlicenseNot gradedqualityCmaintenanceEnables vision-capable models to play Pokemon Emerald through mGBA by providing screenshots, OCR dialogue transcription, movement and button controls, and persistent session journals.1MIT