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.
Release files for c64-mcp 0.102.0
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.0.tar.gz | 155.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| c64_mcp-0.102.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 210.4 kB
Release files / c64_mcp-0.102.0.tar.gz
| Download URL | c64_mcp-0.102.0.tar.gz |
|---|---|
| Size | 155.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
184649dde1e6e6b66844ef070088add9d6eb103339ed17734845fb708d152395
|
|
BLAKE2b-256 checksum How to use checksums |
42c569159ae5ec21ec7e44383c3edc3eec368df9bf1f3cff301313328a827bff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","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.0-py3-none-any.whl
| Download URL | c64_mcp-0.102.0-py3-none-any.whl |
|---|---|
| Size | 55.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
95df06cc1f0b8af856ac3cb0cdf4d3f5fb7fe283012346079daeadd40e8a2edd
|
|
BLAKE2b-256 checksum How to use checksums |
bd220c60e8bc98d18c5aac9167f4f05e70acb7d2cf07fc0f60d279cff05b0f87
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|