c64-mcp
Small C64-specific MCP tools layered over GhidraMCP-next and the separately installed Ghidra VICE connector. The server uses stdio and never opens VICE's binary-monitor socket.
Tools
Static analysis
apply_c64_symbolscreates the bundled C64 hardware and KERNAL labels in one idempotent Ghidra batch. Symbols use nestedC64::...namespaces, and the result reportslabels_created,labels_skipped, andlabels_failed.decode_c64_textdecodes inline bytes or a bounded Ghidra read as upper or lower PETSCII or screen codes. Input may use a fixed length, a terminator, or a one/two-byte little-endian length prefix. Token keys are decimal unless prefixed with0x.decode_c64_hires_bitmapanddecode_c64_multicolor_bitmaprender bitmap memory.decode_c64_charset,decode_c64_char_screen, anddecode_c64_spritesrender character and sprite data.
Graphics inputs explicitly name their source:
{"kind": "inline", "bytes": "00ff"}
{"kind": "ghidra", "program": "game", "start": "RAM:2000"}
Renderers return an indexed PNG and a compact summary. output_path is optional; an existing file is replaced only when overwrite=true. Static rendering uses the Pepto PAL palette.
Live VICE
Call vice_connect after the VICE connector has established its TraceRMI session. The remaining vice_* tools cover:
- status, registers, banks, and bank-aware memory;
- checkpoints, step/next/finish, resume, interrupt, and stop waits;
- deterministic keyboard and joystick input;
- reset and snapshot save/load;
- capture of VICE's composited display;
- copying one verified VICE memory range into Ghidra.
vice_disconnect drops only this process's binding. It does not close VICE, the connector, or the trace.
Binary-monitor reads require VICE to be stopped. A normal sequence is vice_interrupt, read or capture, then vice_resume. Display capture is optional: other VICE tools remain usable when the connector lacks it. Capture requires the display methods and a VICE build with the safe display-command fix.
copy_vice_memory_to_ghidra reads the complete range once, verifies its length and SHA-256, then makes one Ghidra write request. It defaults to dry_run=true.
vice_set_joyport injects one raw active-low joystick-line byte on public port 1 or 2. The value remains in effect until another input, reset, or emulator shutdown changes it.
vice_set_keyboard_matrix presses or releases one physical matrix position (row and column 0–7). A press remains held until explicitly released or the keyboard is cleared. It requires a VICE build containing binary-monitor command 0xa3 from the companion patch; stock builds reject it cleanly.
Limits and behavior
- Text and graphics sources are capped at 64 KiB.
- VICE memory calls transfer at most 16 KiB; a verified copy into Ghidra may span 64 KiB.
- Keyboard input is capped at 255 bytes.
- Graphics geometry is bounded before remote reads.
- Requests are never retried automatically. A timed-out mutation may already have changed VICE or Ghidra, so inspect state before repeating it.
- The Ghidra and connector boundaries are local and unauthenticated.
Configuration
GHIDRA_MCP_URLdefaults tohttp://127.0.0.1:8089.GHIDRA_MCP_TIMEOUTdefaults to 30 seconds.
Run with:
uv run c64-mcp
The package contains the immutable text tables and C64 symbol data used by the tools.
Metadata
Release files for c64-mcp 0.102.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| c64_mcp-0.102.1.tar.gz | 154.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| c64_mcp-0.102.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 209.0 kB
Release files / c64_mcp-0.102.1.tar.gz
| Download URL | c64_mcp-0.102.1.tar.gz |
|---|---|
| Size | 154.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
11f8d5367caf855a8f915babfc7fd45ce31da5813ae93a11d2e2d7d2efabe017
|
|
BLAKE2b-256 checksum How to use checksums |
36ae2a9c63a24331a63c74fa9339f1507bf46ae64e7ec3b783dff77e3ec9a9ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / c64_mcp-0.102.1-py3-none-any.whl
| Download URL | c64_mcp-0.102.1-py3-none-any.whl |
|---|---|
| Size | 55.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0703df4c61239ad1810bad13cbd36ecc44cb99e53a9d83a6e723249d43e6e24f
|
|
BLAKE2b-256 checksum How to use checksums |
bd5a26dc309985b5e852ada18d560685901b3857911a841e7b14eb54f825117b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.6 {"installer":{"name":"uv","version":"0.12.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|