Zafiro.Nes.Debug.Mcp
0.0.12
dotnet tool install --global Zafiro.Nes.Debug.Mcp --version 0.0.12
dotnet new tool-manifest
dotnet tool install --local Zafiro.Nes.Debug.Mcp --version 0.0.12
#tool dotnet:?package=Zafiro.Nes.Debug.Mcp&version=0.0.12
nuke :add-package Zafiro.Nes.Debug.Mcp --version 0.0.12
Zafiro.Nes.Debug
Zafiro.Nes.Debug.Mcp is a cross-platform .NET MCP server for inspecting and controlling NES ROMs in iNES format.
The MCP server exposes CPU stepping, frame execution, deterministic controller input timelines, breakpoints/watchpoints, CPU memory reads/writes, authoritative PPU/OAM inspection, continuous PPU-register tracing, correlated screen/RAM/PPU observation, symbols, lightweight disassembly, savestates, screen-region probes, and PNG screen capture.
Zafiro.Nes.Debug.Mcp directly uses the vendored AprNes backend for every supported ROM. AprNes implements the complete MCP debug workflow, including continuous PPU-register tracing and correlated execution observation for mappers 0-3 and the broader supported mapper set.
Build
Requirements:
- .NET 10 SDK
From the repo root:
dotnet build Zafiro.Nes.Debug.slnx
Run
From the repo root:
dotnet run --project src/Zafiro.Nes.Debug.Mcp/Zafiro.Nes.Debug.Mcp.csproj
Connect An MCP Client
Use stdio transport. For development against this local checkout:
{
"mcpServers": {
"nes_debug": {
"command": "dotnet",
"args": [
"run",
"--no-restore",
"--project",
"/absolute/path/to/Zafiro.Nes.Debug/src/Zafiro.Nes.Debug.Mcp/Zafiro.Nes.Debug.Mcp.csproj"
],
"startup_timeout_sec": 60,
"tool_timeout_sec": 60
}
}
}
After changing or updating the local checkout, restart the MCP client so it terminates and relaunches the stdio server. The dnx form uses the published NuGet package; use the local dotnet run form when validating source changes that have not been released as a package yet.
Once the tool is packed and published, the path-independent form should be:
{
"mcpServers": {
"nes_debug": {
"command": "dnx",
"args": ["Zafiro.Nes.Debug.Mcp", "--yes"]
}
}
}
Tools
Implemented tools:
load_romsave_stateload_stateresetstep_instructionstep_overstep_outrun_frameset_controllerset_joypadpress_buttonsrun_input_timelinecontinue_until_breakrun_until_conditionset_breakpointclear_breakpointlist_breakpointsset_watchpointset_watchpoint_rangeclear_watchpointlist_watchpointsget_stateread_registersread_memorywrite_memorydisassembleload_symbolsresolve_symbolread_symboldump_oamread_ppu_statecapture_screenfind_last_writerfind_last_writerstrace_until_writetrace_until_write_rangetrace_ppu_register_writesread_screen_regionobserve_screenobserve_executiondump_nametablesdump_tilemapdump_tileset
See docs/mcp-tools.md for schemas and examples.
Current Limitations
- Debug stepping, conditional breakpoints, and watchpoints are implemented by the AprNes debug session.
- Disassembly is intentionally small and currently covers the opcodes most useful for first smoke/debug work; unknown opcodes are returned as
.db. - Symbol parsing is intentionally simple:
BANK:ADDR NameandADDR Namelines with;or#comments. - Savestates are debugger snapshots, not a stable long-term archival format. They should be treated as version-bound to the current backend implementation.
Validate
dotnet test Zafiro.Nes.Debug.slnx -m:1
git diff --check
Third-Party Code
See THIRD-PARTY-NOTICES.md for attribution, license notes, and acknowledgements for vendored emulator code and credited emulator reference work.
The main local license files are:
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.0.12 | 75 | 10/4/2026 |
# Changelog 0.0.12
## Changes (initial history)
- Rename to Zafiro.Nes.Debug (#18) (`27b6624`)
- fix: set ContentRootPath to AppContext.BaseDirectory to avoid recursive inotify watches (`22bfb0b`)
- Replace ADNES with AprNes as the sole NES backend (#17) (`68b7e41`)
- test: certify AprNes NROM conformance (#16) (`2d09c49`)
- Fix MMC3 frame runs through OAM DMA (#7) (`43f559b`)
- Add deterministic PPU observability (#5) (`8e09f30`)
- fix(mcp): resolve DI circular dependency that hung every NES tool call (#4) (`c67ee43`)
- docs: add emulator license notices (`2d162e5`)
- feat: complete AprNes debug workflows (`ab902d0`)
- feat: add AprNes backend for mapper support (`21b956e`)
- feat: support four-screen nametable VRAM (`24f1a67`)
- feat: align NES MCP debug workflows with Game Boy (`9283f4c`)
- feat: align NES MCP debug tools with Game Boy (`460708f`)
- feat: add NES debug MCP server (`e9ffa71`)