Built by Claude Code
On 2026-10-29, the emulator behind this player was written from scratch in one Claude Code session. Times are taken from the project’s file and commit timestamps.
| Elapsed | Milestone |
|---|---|
| 0 min | First line of the 65C816 CPU |
| ~6 min | Graphics (PPU), DMA and sound (SPC700 + DSP) written — the game’s intro runs |
| ~10 min | Title screen and main menu, with music |
| ~20 min | Playable in the browser: play with the keyboard |
The player
- Runs entirely in your browser. Game files (
.sfc,.smc,.zip) are read locally and never uploaded. - Save states, autosave and “continue where you left off”
- 1–8× speed; hold Tab to fast-forward
- Cheat tools: Pro Action Replay codes and a memory search
- Key profiles and gamepad support
Let an AI play
The player speaks MCP (Model Context Protocol), so Claude Code, Codex or any MCP client can play: press buttons, look at the screen, read on-screen text, save and load states, and search or change memory. The game only advances when the AI acts, so it never misses a moment while it is thinking.
- Download the MCP server — one file, Node.js 18 or later, no dependencies: aixsfc-mcp.mjs
- Add it to Claude Code:
or to Codex (claude mcp add aixsfc -- node /path/to/aixsfc-mcp.mjs~/.codex/config.toml):[mcp_servers.aixsfc] command = "node" args = ["/path/to/aixsfc-mcp.mjs"] - Open the player, load a game and press Connect AI. Enter the pairing code shown at
http://localhost:8765, or ask the AI to callbridge_status. - Ask the AI to play:
Call bridge_status, then play the game in the paired browser player. Use read_screen_text before looking at screenshots, narrate what you see and what you plan with note, and save_state before risky choices. Once you understand the main commands, write a short strategy guide to guide.md.
Your game files stay in your browser. The MCP server runs on your own computer and only relays commands between the AI and the page.
| Tool | What it does |
|---|---|
press, tap, wait, wait_for_change | Play: input buttons, then return a screenshot once the screen settles |
screenshot, read_screen_text | See the screen; read its text exactly with the game’s own font (supported games) |
save_state, load_state | Try something, roll back if it goes wrong |
search_memory, diff_memory, read_memory, write_memory | Research: find where values live and change them |
note | Narrate for the human watching |
Build your own with Claude Code
Curious how far one prompt goes? This is close to how the project started:
Write a Super Famicom (SNES) emulator that runs in the browser, in plain JavaScript with no third-party libraries and no code copied from existing emulators. Implement the 65C816 CPU, the PPU (backgrounds, sprites, windows, color math), DMA/HDMA, and the SPC700 + DSP audio, and emulate the audio boot ROM's upload protocol instead of including it. Load .sfc/.smc/.zip files by drag and drop, map the keyboard and gamepads, and keep SRAM in IndexedDB. Before building any UI, write a headless Node runner that renders frames to PNG and records audio, and use it to verify each step with my game at ./game.sfc.
Research notice
AI x SFC Player is a personal research project on emulation and AI agents. It provides no games.