MCP server to control Dolphin emulator (GameCube/Wii) memory, input, savestates, reset, and frame advance via MCP clients.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent ā or use 1-click editor setup below.
š” Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Inspect callable tools, capabilities, and parameters exposed to AI agents by MCP Dolphin.
dolphin_pingPURPOSE: Verify the Dolphin Python bridge is reachable and responding. USAGE: Call once at session start before other tool calls. Issues the bridge's `bridge.ping` method ā doubles as a liveness probe and bridge-version sniff. BEHAVIOR: No side effects. mcp-dolphin connects to the bridge on demand (TCP 127.0.0.1:55355 by default). The bridge must be loaded inside Dolphin via Scripting ā Add New Script ā mcp_bridge.py. 10-second timeout if the bridge isn't running, Dolphin isn't running, or the port is wrong. RETURNS: Single line 'OK ā bridge vBRIDGE_VERSION (DOLPHIN_LABEL)'.
dolphin_get_infoPURPOSE: Report what the bridge knows about its environment (bridge version, Dolphin label). v0.1.0 doesn't query game metadata ā Felk's API doesn't expose disc ID / title directly, those have to be read from OS_GLOBALS at 0x80000020 yourself via dolphin_read_range. USAGE: Diagnostic. For game state, use dolphin_read_range(0x80000000, 32) and decode: bytes 0-3 are the disc ID (4-char ASCII), 4-5 are maker code, 6 is disc number, 7 is disc version. BEHAVIOR: No side effects. Same underlying call as dolphin_ping but presents fields explicitly. RETURNS: Multi-line text ā Bridge version, Dolphin label.
dolphin_read8PURPOSE: Read an unsigned 8-bit byte from PowerPC memory at the given absolute address. USAGE: Use for single-byte fields ā flags, counters, small enums. For 16/32/64-bit values use dolphin_read16/read32/read64. For spans of more than ~4 bytes use dolphin_read_range. PowerPC is big-endian ā so for multi-byte values you almost always want the dedicated width tool, not this one. BEHAVIOR: No side effects ā pure read. No alignment requirement. Returns an error on unmapped address, bridge disconnect, or bridge FAIL. GameCube + Wii main address space landmarks (PowerPC, big-endian): 0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) ā GameCube + Wii game code & data GameCube games stay entirely within MEM1. Wii games use MEM1 for code and frequently-accessed data. 0x80000020 OS_GLOBALS ā game-info struct (disc ID, FST, etc.) 0x80000034 OS_ARENA_LO (start of free MEM1 heap) 0x80003100 OS_REPORT (developer-console mirror, varies by SDK) 0x90000000-0x93FFFFFF MEM2 (64 MiB) ā Wii ONLY. Larger texture/asset data, IOS work areas. Reading MEM2 on a GameCube game returns garbage / FAIL. 0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) ā DMA, GPU FIFO, AI, EXI registers. Reads are usually safe, writes can wedge the emulator. Avoid. 0xCD000000-0xCD007FFF Wii-only Hollywood registers. Notes: ⢠All multi-byte values are BIG-ENDIAN on the real hardware. Felk's memory.read_u*/write_u* helpers handle the byte swap for you ā the value you see is the value the game sees as a u32. ⢠Addresses are 32-bit; Felk truncates the high bits of any u64 address argument. ⢠Pointers in MEM1 are often stored as 4-byte addresses with the high bit set (e.g. 0x81234567). Dereferencing them requires no masking ā pass the raw value back into memory.read_*. RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)', e.g. '0x80003000: 99 (0x63)'.
dolphin_read16PURPOSE: Read an unsigned 16-bit big-endian value from PowerPC memory at the given absolute address. USAGE: For 16-bit fields ā HP, score, coordinates on many GC/Wii titles. For single bytes use dolphin_read8; for 32/64-bit use dolphin_read32/read64. Value is interpreted big-endian (PowerPC native); the byte at `address` is the high byte. BEHAVIOR: No side effects ā pure read. Address MUST be 2-byte aligned. Returns an error on unmapped address, bridge disconnect, or FAIL. GameCube + Wii main address space landmarks (PowerPC, big-endian): 0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) ā GameCube + Wii game code & data GameCube games stay entirely within MEM1. Wii games use MEM1 for code and frequently-accessed data. 0x80000020 OS_GLOBALS ā game-info struct (disc ID, FST, etc.) 0x80000034 OS_ARENA_LO (start of free MEM1 heap) 0x80003100 OS_REPORT (developer-console mirror, varies by SDK) 0x90000000-0x93FFFFFF MEM2 (64 MiB) ā Wii ONLY. Larger texture/asset data, IOS work areas. Reading MEM2 on a GameCube game returns garbage / FAIL. 0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) ā DMA, GPU FIFO, AI, EXI registers. Reads are usually safe, writes can wedge the emulator. Avoid. 0xCD000000-0xCD007FFF Wii-only Hollywood registers. Notes: ⢠All multi-byte values are BIG-ENDIAN on the real hardware. Felk's memory.read_u*/write_u* helpers handle the byte swap for you ā the value you see is the value the game sees as a u32. ⢠Addresses are 32-bit; Felk truncates the high bits of any u64 address argument. ⢠Pointers in MEM1 are often stored as 4-byte addresses with the high bit set (e.g. 0x81234567). Dereferencing them requires no masking ā pass the raw value back into memory.read_*. RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)'.
dolphin_read32PURPOSE: Read an unsigned 32-bit big-endian value from PowerPC memory at the given absolute address. USAGE: The workhorse ā most game state and pointers are 32-bit. Use for timestamps, large counters, RGBA colors, full pointers (PowerPC is a 32-bit ISA so pointers fit here). For 8/16/64-bit values use the corresponding sibling. BEHAVIOR: No side effects ā pure read. Address MUST be 4-byte aligned. Returns an error on unmapped address, bridge disconnect, or FAIL. GameCube + Wii main address space landmarks (PowerPC, big-endian): 0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) ā GameCube + Wii game code & data GameCube games stay entirely within MEM1. Wii games use MEM1 for code and frequently-accessed data. 0x80000020 OS_GLOBALS ā game-info struct (disc ID, FST, etc.) 0x80000034 OS_ARENA_LO (start of free MEM1 heap) 0x80003100 OS_REPORT (developer-console mirror, varies by SDK) 0x90000000-0x93FFFFFF MEM2 (64 MiB) ā Wii ONLY. Larger texture/asset data, IOS work areas. Reading MEM2 on a GameCube game returns garbage / FAIL. 0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) ā DMA, GPU FIFO, AI, EXI registers. Reads are usually safe, writes can wedge the emulator. Avoid. 0xCD000000-0xCD007FFF Wii-only Hollywood registers. Notes: ⢠All multi-byte values are BIG-ENDIAN on the real hardware. Felk's memory.read_u*/write_u* helpers handle the byte swap for you ā the value you see is the value the game sees as a u32. ⢠Addresses are 32-bit; Felk truncates the high bits of any u64 address argument. ⢠Pointers in MEM1 are often stored as 4-byte addresses with the high bit set (e.g. 0x81234567). Dereferencing them requires no masking ā pass the raw value back into memory.read_*. RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)'.
dolphin_read64PURPOSE: Read an unsigned 64-bit big-endian value from PowerPC memory at the given absolute address. USAGE: For paired 32-bit slots, doubles, packed flags. PowerPC is 32-bit so true 64-bit fields are less common than on PS2 ā usually game state is 32-bit. Use this when you actually have a 64-bit field, not as a convenience for two 32-bit reads. BEHAVIOR: No side effects ā pure read. Address MUST be 8-byte aligned. The result is returned as a decimal STRING (not a JSON number) to preserve precision past 2^53. Returns an error on unmapped address, bridge disconnect, or FAIL. GameCube + Wii main address space landmarks (PowerPC, big-endian): 0x80000000-0x817FFFFF MEM1 main RAM (24 MiB) ā GameCube + Wii game code & data GameCube games stay entirely within MEM1. Wii games use MEM1 for code and frequently-accessed data. 0x80000020 OS_GLOBALS ā game-info struct (disc ID, FST, etc.) 0x80000034 OS_ARENA_LO (start of free MEM1 heap) 0x80003100 OS_REPORT (developer-console mirror, varies by SDK) 0x90000000-0x93FFFFFF MEM2 (64 MiB) ā Wii ONLY. Larger texture/asset data, IOS work areas. Reading MEM2 on a GameCube game returns garbage / FAIL. 0xCC000000-0xCC00FFFF Hollywood I/O (Wii) / Flipper I/O (GameCube) ā DMA, GPU FIFO, AI, EXI registers. Reads are usually safe, writes can wedge the emulator. Avoid. 0xCD000000-0xCD007FFF Wii-only Hollywood registers. Notes: ⢠All multi-byte values are BIG-ENDIAN on the real hardware. Felk's memory.read_u*/write_u* helpers handle the byte swap for you ā the value you see is the value the game sees as a u32. ⢠Addresses are 32-bit; Felk truncates the high bits of any u64 address argument. ⢠Pointers in MEM1 are often stored as 4-byte addresses with the high bit set (e.g. 0x81234567). Dereferencing them requires no masking ā pass the raw value back into memory.read_*. RETURNS: Single line 'ADDR_HEX: VAL_DEC (0xVAL_HEX)' ā VAL_DEC is a decimal string that may exceed 2^53.
An MCP server for Dolphin (GameCube + Wii) ā drives memory r/w, controller input (GameCube + Wii Remote), pause/resume/reset, savestates, and frame advance from MCP-compatible clients (Claude Desktop, Claude Code, etc.).
Not yet wired in v0.1.0 (deferred to a later release):
Mainline Dolphin does not have Python scripting. mcp-dolphin talks to Felk's actively-maintained Dolphin fork which embeds Python with first-class access to memory, controllers, savestates, and the frame loop. Mainline Dolphin Python PRs (#7064) have been stuck since 2022; the Lua forks (dolphinWatch, SwareJonge/Dolphin-Lua-Core) are dead. Felk is the only living scripting path.
Grab a build from Felk/dolphin Releases ā currently Python Scripting Preview 4 (December 2025). Unzip it somewhere you can find. It's a regular Dolphin build plus a Scripting panel under the View menu.
If you see Python errors when loading the bridge, enable the Scripting log type: View ā Show Log Configuration ā check Scripting (set verbosity to "Info" or "Error"), then View ā Show Log so the log window is visible.
Then in Felk's Dolphin:
mcp_bridge.py you just wrote.[mcp-bridge] listening on 127.0.0.1:55355 (bridge v0.1.0).The script keeps running as long as Dolphin is open. Remove it from the Scripting panel to stop the bridge.
Claude Code:
Claude Desktop ā edit claude_desktop_config.json:
Restart your MCP client after editing.
Load a GameCube or Wii game in Dolphin, then ask the agent to call dolphin_ping. You should see OK ā bridge v0.1.0 (Felk Python fork).
| Tool | Description |
|---|---|
dolphin_ping | Liveness probe + bridge-version sniff |
dolphin_get_info | Report bridge version and Dolphin label |
dolphin_read8/16/32/64 | Read PowerPC memory (big-endian) |
dolphin_read_range | Bulk read up to 64 KiB as hex dump |
dolphin_write8/16/32/64 | Write PowerPC memory |
dolphin_press_gc_buttons | Set GameCube controller state (port + button/axis dict) |
dolphin_press_wiimote_buttons | Set Wii Remote button state |
dolphin_set_wiimote_pointer | Set Wii Remote IR pointer position (port + x + y) |
dolphin_set_wiimote_acceleration | Set Wii Remote accelerometer (port + x + y + z, ~g units) |
dolphin_set_wiimote_angular_velocity | Set Wii MotionPlus angular velocity (port + x + y + z, rad/s) |
dolphin_reset | Emulation soft-reset (pause/resume deferred to v0.2 ā see Known limitations) |
dolphin_frame_advance | Wait N frames (TAS sequencing) |
dolphin_save_state / dolphin_load_state | Slot-based savestate (0-255) |
| Range | Region |
|---|---|
0x80000000-0x817FFFFF | MEM1 main RAM (24 MiB) ā GC + Wii |
0x80000020 | OS_GLOBALS ā disc ID, FST pointer, etc. |
0x90000000-0x93FFFFFF | MEM2 (64 MiB) ā Wii only |
0xCC000000+ | Flipper / Hollywood I/O ā reads usually safe, writes can wedge |
0xCD000000+ | Wii-only Hollywood registers |
PowerPC is big-endian on hardware. The bridge handles byte-swap on read/write ā pass and receive the value the game logically sees, not the byte order.
dolphin_press_gc_buttons)A, B, X, Y, Z, Start, L, R, Up, Down, Left, RightStickX, StickY, CStickX, CStickY (0-255, 128 = center)TriggerLeft, TriggerRight (0-255, 0 = released)dolphin_press_wiimote_buttons)A, B, One, Two, Plus, Minus, Home, Up, Down, Left, Right| Env var | Default | Purpose |
|---|---|---|
DOLPHIN_BRIDGE_HOST | 127.0.0.1 | Bridge host (the Dolphin process is local, so this rarely changes) |
DOLPHIN_BRIDGE_PORT | 55355 | Bridge port (must match LISTEN_PORT in mcp_bridge.py) |
DOLPHIN_TIMEOUT_MS | 10000 | Per-call timeout |
MCP_DOLPHIN_DEBUG | unset | Set to 1 to trace every TX message on stderr |
If you change the port, edit both mcp_bridge.py (in your scripts dir) and set DOLPHIN_BRIDGE_PORT.
| Symptom | Cause / Fix |
|---|---|
Dolphin bridge not reachable | Dolphin not running, script not loaded in Scripting panel, or wrong port. Check Dolphin's Log window for [mcp-bridge] listening on .... |
unknown method: <something> from bridge | Bridge script is older than mcp-dolphin. Re-export with npx mcp-dolphin --print-bridge > mcp_bridge.py and reload in Dolphin. |
| Memory reads return 0xFFFFFFFF or error | Address is unmapped on the current title. MEM2 (0x90000000+) is Wii-only; reading it on a GameCube game returns garbage. |
| Controller input has no effect | Game expects input on a different port. Try port: 0 first, then 1-3. For Wii games requiring motion, this v0.1.0 doesn't cover Wii Remote pointer/accel yet. |
| Tool calls hang ~10 s then time out | Bridge script crashed inside Dolphin. Open Felk's Scripting panel, remove the script, re-add it. |
Browse and call this server's tools interactively with the MCP Inspector:
Build first if you've edited src/ since your last npm install (npm run build, or keep npm run dev running). Override the bridge address with DOLPHIN_BRIDGE_HOST / DOLPHIN_BRIDGE_PORT (default 127.0.0.1:55355). tools/list works even without Dolphin connected; calling a tool needs Felk's Dolphin running bridge/mcp_bridge.py.
MIT ā see LICENSE.
Factual signals from GitHub, npm, and our automated checks ā not a rating.
No reviews yet ā be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/dmang-dev-mcp-dolphin)<a href="https://allmcps.com/mcp/dmang-dev-mcp-dolphin"><img src="https://allmcps.com/api/badge/dmang-dev-mcp-dolphin?style=directory" alt="MCP Dolphin on AllMCPs" /></a>