Skip to main content

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_symbols creates the bundled C64 hardware and KERNAL labels in one idempotent Ghidra batch. Symbols use nested C64::... namespaces, and the result reports labels_created, labels_skipped, and labels_failed.
  • decode_c64_text decodes 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 with 0x.
  • decode_c64_hires_bitmap and decode_c64_multicolor_bitmap render bitmap memory.
  • decode_c64_charset, decode_c64_char_screen, and decode_c64_sprites render 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_URL defaults to http://127.0.0.1:8089.
  • GHIDRA_MCP_TIMEOUT defaults 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)

Source distribution for c64-mcp 0.102.0
File Size Uploaded
c64_mcp-0.102.0.tar.gz 155.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for c64-mcp 0.102.0
File Interpreter ABI Platform
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}

Release history Release notifications | RSS feed

This release

0.102.0 This release

2 release files

0.99.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page