c64bridge 0.9.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/AGENTS.md +19 -3
  2. package/README.md +190 -148
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/c64Client.js +127 -5
  5. package/dist/config.js +12 -8
  6. package/dist/device.js +75 -45
  7. package/dist/mcp-server.js +11 -3
  8. package/dist/platform.js +13 -2
  9. package/dist/tools/audio.js +1 -1
  10. package/dist/tools/developer.js +6 -6
  11. package/dist/tools/graphics.js +4 -4
  12. package/dist/tools/input.js +129 -12
  13. package/dist/tools/machineControl.js +85 -6
  14. package/dist/tools/memory.js +1 -1
  15. package/dist/tools/meta/index.js +1 -1
  16. package/dist/tools/programRunners.js +5 -5
  17. package/dist/tools/rag.js +1 -1
  18. package/dist/tools/registry/batch.js +1 -1
  19. package/dist/tools/registry/config.js +5 -5
  20. package/dist/tools/registry/disk.js +2 -2
  21. package/dist/tools/registry/drive.js +2 -2
  22. package/dist/tools/registry/graphics.js +2 -2
  23. package/dist/tools/registry/memory.js +2 -2
  24. package/dist/tools/registry/platform.js +7 -5
  25. package/dist/tools/registry/program.js +5 -5
  26. package/dist/tools/registry/rag.js +1 -1
  27. package/dist/tools/registry/sound.js +4 -4
  28. package/dist/tools/registry/system.js +13 -3
  29. package/dist/tools/storage.js +1 -1
  30. package/doc/c64u/c64-openapi.yaml +1130 -774
  31. package/doc/u2/u2-openapi.yaml +1192 -0
  32. package/generated/c64/index.js +142 -9
  33. package/generated/openapi/c64u/index.js +1117 -0
  34. package/generated/openapi/u2/index.js +929 -0
  35. package/mcp/schemas/c64_graphics.schema.json +3 -3
  36. package/mcp/schemas/c64_input.schema.json +247 -6
  37. package/mcp/schemas/c64_memory.schema.json +3 -3
  38. package/mcp/schemas/c64_program.schema.json +3 -3
  39. package/mcp/schemas/c64_select_backend.schema.json +2 -0
  40. package/mcp/schemas/c64_system.schema.json +41 -1
  41. package/mcp/server.json +1 -1
  42. package/mcp/tools.json +382 -41
  43. package/mcp.json +14 -2
  44. package/package.json +4 -2
  45. package/scripts/mockC64Server.mjs +40 -0
  46. package/scripts/prepare-release.mjs +13 -2
  47. package/scripts/update-readme.ts +18 -30
  48. package/server.json +3 -3
package/README.md CHANGED
@@ -18,7 +18,7 @@ Your AI Command Bridge for the Commodore 64.
18
18
 
19
19
  C64 Bridge is an MCP server for controlling and working with a Commodore 64 from an AI client.
20
20
 
21
- It lets you run programs, read and write memory, render graphics, and play sound on a real [Commodore 64 Ultimate](https://www.commodore.net/) or [Ultimate 64](https://ultimate64.com/). You can also switch to a [VICE](https://vice-emu.sourceforge.io/) emulator session at any time, so the same MCP conversation works with both hardware and emulator.
21
+ It lets you run programs, read and write memory, render graphics, and play sound on a [C64 Ultimate](https://www.commodore.net/), [Ultimate 64](https://ultimate64.com/), or U2-family cartridge. You can also switch to a [VICE](https://vice-emu.sourceforge.io/) emulator session, so one MCP conversation can span hardware and emulation.
22
22
 
23
23
  It is built on the official TypeScript `@modelcontextprotocol/sdk` and supports both `stdio` for local AI integration and an optional HTTP bridge for manual inspection.
24
24
 
@@ -39,6 +39,7 @@ C64 Bridge is listed in the [Official MCP Registry](https://registry.modelcontex
39
39
  - [Configuration File Order](#configuration-file-order)
40
40
  - [Configuration Merge Rules](#configuration-merge-rules)
41
41
  - [Backend Configuration: C64 Ultimate](#backend-configuration-c64-ultimate)
42
+ - [Backend Configuration: U2-family](#backend-configuration-u2-family)
42
43
  - [Backend Configuration: VICE](#backend-configuration-vice)
43
44
  - [VICE Window Modes](#vice-window-modes)
44
45
  - [Recommended VICE Configurations](#recommended-vice-configurations)
@@ -90,7 +91,7 @@ C64 Bridge gives an AI agent one place to drive program execution, memory access
90
91
  The core workflow is simple:
91
92
 
92
93
  1. Start the MCP server.
93
- 2. Point it at C64 Ultimate hardware, VICE, or both.
94
+ 2. Point it at C64U/U64 hardware, a U2-family cartridge, VICE, or any configured combination.
94
95
  3. Let the client call grouped MCP tools such as `c64_program`, `c64_memory`, `c64_graphics`, and `c64_sound`.
95
96
  4. Switch backends at runtime with `c64_select_backend` when both are configured.
96
97
 
@@ -101,7 +102,7 @@ The core workflow is simple:
101
102
  - System integration for drives, files, printers, and task orchestration
102
103
  - SID music tools for playback, composition, generation, and verification
103
104
  - Built-in knowledge resources and prompts for safer LLM workflows
104
- - Mixed runtime support for hardware `c64u` and emulator `vice`
105
+ - Mixed runtime support for `c64u` (C64U/U64), `u2` (U2/U2+/U2+L), and `vice`
105
106
 
106
107
  ## Quick Start
107
108
 
@@ -109,7 +110,7 @@ If you want the shortest path, do these four things:
109
110
 
110
111
  1. Install Node.js 24+ and npm.
111
112
  2. Start the server.
112
- 3. Add backend configuration for C64 Ultimate, VICE, or both.
113
+ 3. Add backend configuration for C64U/U64, U2-family, VICE, or any combination.
113
114
  4. Connect from VS Code or another MCP client.
114
115
 
115
116
  ### 1. Install Node.js 24+ and npm
@@ -187,11 +188,11 @@ On startup, the server probes the selected target, performs connectivity checks,
187
188
 
188
189
  ### 3. Add Backend Configuration
189
190
 
190
- The server can run against:
191
+ The server can run against one or more of:
191
192
 
192
- - only C64 Ultimate hardware
193
- - only VICE
194
- - both backends in one session, with runtime switching
193
+ - C64U/U64 hardware (`c64u`)
194
+ - U2, U2+, or U2+L (`u2`)
195
+ - VICE (`vice`)
195
196
 
196
197
  The detailed lookup order, merge rules, backend examples, and override model are in the [Configuration](#configuration) section below.
197
198
 
@@ -204,7 +205,7 @@ C64 Bridge ships a single canonical `stdio` entry point that every MCP client us
204
205
  - **Cursor, Visual Studio, VS Code Insiders** — use the install badges at the top of this README.
205
206
  - **Any other MCP client** — point it at the same `stdio` server, with the environment variables documented in [Runtime Environment Variable Reference](#runtime-environment-variable-reference) and the registry manifest in [mcp.json](./mcp.json).
206
207
 
207
- The startup command is the same across clients: `npx -y c64bridge@latest` for the published package, or `node scripts/start.mjs` from a local checkout. Backend selection (`c64u` vs `vice`) and credentials live in the shared [Configuration](#configuration) files and environment variables — clients only need to know the command.
208
+ The startup command is the same across clients: `npx -y c64bridge@latest` for the published package, or `node scripts/start.mjs` from a local checkout. Select `c64u`, `u2`, or `vice` in the shared [Configuration](#configuration); clients only need the command.
208
209
 
209
210
  ## Configuration
210
211
 
@@ -220,9 +221,8 @@ The server reads configuration in this order:
220
221
 
221
222
  Configuration is merged per backend section while scanning those files in order.
222
223
 
223
- - The first file that contains a `c64u` section supplies the C64 Ultimate configuration.
224
- - The first file that contains a `vice` section supplies the VICE configuration.
225
- - This allows a project-local `.c64bridge.json` to define `c64u` while `~/.c64bridge.json` defines `vice`, with both backends available at runtime.
224
+ - The first file that contains each backend section (`c64u`, `u2`, or `vice`) supplies that backend's configuration.
225
+ - This allows a project-local `.c64bridge.json` to define `c64u` while `~/.c64bridge.json` defines `u2` or `vice`.
226
226
 
227
227
  ### Backend Configuration: C64 Ultimate
228
228
 
@@ -242,6 +242,32 @@ Use this for a C64 Ultimate or Ultimate 64:
242
242
  - `networkPassword` is only needed when you enabled a password in the C64 Ultimate network settings.
243
243
  - `C64U_HOST`, `C64U_PORT`, and `C64U_PASSWORD` override the configured host, port, and network password.
244
244
 
245
+ ### Firmware Requirements for Native Input and Menu Screens
246
+
247
+ The following operations require recently added Ultimate REST endpoints. C64 Bridge detects or explains unavailable endpoints without exposing a raw firmware error.
248
+
249
+ Before choosing an endpoint-dependent operation, read `c64://platform/status`. It probes `machine:input` safely and reports whether it is available. When native input is unavailable, use `key` or `write_text` for ordinary C64 input instead of physical matrix events. `machine:menu_screen` can only be confirmed after an Ultimate menu is visible; its tool returns fallback guidance rather than a transport error when no matrix can be read.
250
+
251
+ - `c64_input` `keyboard`, `release_all`, and `state`, plus hardware `joystick`, use `machine:input`. They require a C64U firmware version that provides this endpoint, or U64 firmware 3.15 or later. `machine:input` is not available on U2-family cartridges.
252
+ - `c64_system` `read_menu_screen` uses `machine:menu_screen`; it requires a C64U firmware version that provides this endpoint, or U64/U2 firmware 3.15 or later.
253
+ - On C64U/U64, `c64_system` `power_cycle` verifies Tool Menu navigation with `machine:menu_screen`, so it has the same firmware requirement. U2-family `power_cycle` uses REST reboot instead.
254
+
255
+ ### Backend Configuration: U2-family
256
+
257
+ Use this profile for U2, U2+, and U2+L cartridges:
258
+
259
+ ```json
260
+ {
261
+ "u2": {
262
+ "host": "u2",
263
+ "port": 80,
264
+ "networkPassword": "secret"
265
+ }
266
+ }
267
+ ```
268
+
269
+ Set `C64_MODE=u2` to make this the initial backend. `U2_HOST`, `U2_PORT`, and `U2_PASSWORD` override this profile. U2-family firmware exposes the shared REST subset; it does not provide machine input, debug-register access, power-off, or streaming. `read_menu_screen` requires U2 firmware 3.15 or later.
270
+
245
271
  ### Backend Configuration: VICE
246
272
 
247
273
  C64 Bridge can either connect to an already running VICE Binary Monitor or manage a local VICE process for you. The usual managed setup only needs the emulator binary and, when auto-detection cannot find it, the VICE resource directory:
@@ -324,13 +350,15 @@ If VICE is installed outside the usual search paths, add `VICE_BINARY` and, if R
324
350
 
325
351
  ### Runtime Backend Switching
326
352
 
327
- When both `c64u` and `vice` are configured, C64 Bridge starts with one active backend and keeps the other available for runtime switching.
353
+ Configure any combination of `c64u`, `u2`, and `vice`. C64 Bridge starts on `C64_MODE` (default `c64u`) and keeps every configured backend ready for `c64_select_backend`.
328
354
 
329
- - `C64_MODE` chooses the initial backend: `c64u` or `vice`
330
- - `c64_select_backend` switches backends without restarting the MCP server
331
- - `c64://platform/status` reports the active backend and the full configured backend set
332
- - In prompts, say things like `use vice`, `vice: run this program`, `use c64u`, or `run this on the real machine`
333
- - In VS Code, include the backend preference in the same prompt when you want to force emulator versus hardware execution
355
+ | Profile | Targets | Key limits |
356
+ | --- | --- | --- |
357
+ | `c64u` | C64 Ultimate, Ultimate 64 | Full Ultimate REST surface, including machine input and streaming. |
358
+ | `u2` | U2, U2+, U2+L | Shared REST subset; no machine input, debug registers, power-off, or streaming. |
359
+ | `vice` | VICE emulator | Binary Monitor-backed emulator controls; no Ultimate REST API. |
360
+
361
+ Use `c64://platform/status` to inspect the active backend and available tools. State the target in the same prompt, for example `u2: list drives`, `c64u: run this PRG`, or `vice: write HELLO`. On U2-family cartridges, `c64_system` `power_cycle` uses REST reboot; C64U/U64 uses verified Tool Menu navigation, and VICE starts fresh.
334
362
 
335
363
  Prompt illustration (issued via Copilot in VS Code, using GPT 5.4 Medium):
336
364
 
@@ -342,11 +370,12 @@ c64u: write a small BASIC program that clears the screen and prints HELLO C64U
342
370
  vice: write a small BASIC program that clears the screen and prints HELLO VICE
343
371
  ```
344
372
 
345
- The screenshots below were captured from actual backend bitmap responses after those prompts ran, using the same `c64_graphics` `capture_frame` MCP tool on both backends. The C64U implementation captures streamed video frames, while the VICE implementation captures and normalizes the emulator display frame. Both images were then verified optically against the expected text with the C64 character generator, and both matched exactly.
373
+ The screenshots below are available for the two backends that provide frame capture. C64U uses streamed video frames; VICE captures and normalizes its display. U2-family cartridges do not provide firmware streaming, so they intentionally have no screenshot row.
346
374
 
347
375
  | Backend | Screenshot |
348
376
  | --- | --- |
349
377
  | C64 Ultimate | ![C64 Ultimate backend switch example](doc/img/backend-switch/hello-c64u.png) |
378
+ | U2-family | Frame capture unavailable (no firmware streaming). |
350
379
  | VICE | ![VICE backend switch example](doc/img/backend-switch/hello-vice.png) |
351
380
 
352
381
  ## VS Code MCP Setup
@@ -415,7 +444,7 @@ You can add `env` entries in `.vscode/mcp.json` to select a config file, overrid
415
444
 
416
445
  - `C64BRIDGE_CONFIG` points to a specific config file
417
446
  - `C64U_HOST`, `C64U_PORT`, and `C64U_PASSWORD` override the C64 Ultimate connection without editing config files
418
- - `C64_MODE` forces the initial backend to `c64u` or `vice`
447
+ - `C64_MODE` forces the initial backend to `c64u`, `u2`, or `vice`; `U2_HOST`, `U2_PORT`, and `U2_PASSWORD` override the selected U2 profile.
419
448
  - `LOG_LEVEL=debug` enables verbose logging
420
449
 
421
450
  For VICE-specific overrides such as `VICE_ARGS=-minimized`, `VICE_VISIBLE=false`, or custom VICE paths, use the patterns in [Backend Configuration: VICE](#backend-configuration-vice).
@@ -493,7 +522,7 @@ Every runtime environment variable documented in `mcp.json` can be set in your M
493
522
 
494
523
  | Variable | Default | JSON Config Key | Description |
495
524
  | --- | --- | --- | --- |
496
- | `C64_MODE` | c64u | — | Select active backend (c64u for Ultimate hardware, vice for emulator) |
525
+ | `C64_MODE` | c64u | — | Select active backend (c64u/U64 hardware, u2/U2-family cartridge, or vice emulator) |
497
526
  | `C64_TASK_STATE_FILE` | auto | — | Override the path used to persist MCP background-task state |
498
527
  | `C64BRIDGE_CONFIG` | ~/.c64bridge.json | config path | Path to configuration JSON |
499
528
  | `C64BRIDGE_DIAGNOSTICS_DIR` | ~/.c64bridge/diagnostics | — | Override the directory where persistent MCP diagnostics files are written |
@@ -511,6 +540,14 @@ Every runtime environment variable documented in `mcp.json` can be set in your M
511
540
  | `C64U_PASSWORD` | | c64u.networkPassword | Override the C64 Ultimate network password sent as X-Password |
512
541
  | `C64U_PORT` | 80 | c64u.port | Override the C64 Ultimate REST port |
513
542
 
543
+ #### U2-family
544
+
545
+ | Variable | Default | JSON Config Key | Description |
546
+ | --- | --- | --- | --- |
547
+ | `U2_HOST` | | u2.host | Override the U2/U2+/U2+L host name or IP address when C64_MODE=u2 |
548
+ | `U2_PASSWORD` | | u2.networkPassword | Override the U2-family network password sent as X-Password when C64_MODE=u2 |
549
+ | `U2_PORT` | | u2.port | Override the U2-family REST port when C64_MODE=u2 |
550
+
514
551
  #### VICE Runtime
515
552
 
516
553
  | Variable | Default | JSON Config Key | Description |
@@ -573,7 +610,7 @@ Every runtime environment variable documented in `mcp.json` can be set in your M
573
610
  claude mcp add c64bridge -- npx -y c64bridge@latest
574
611
  ```
575
612
 
576
- Use `--scope user` to make it available across all your projects, or `--scope project` to write a `.mcp.json` next to the current repo. Backend selection (`c64u` vs `vice`), host, port, and password come from the same files documented in [Configuration](#configuration); per-shell overrides come from the variables in [Runtime Environment Variable Reference](#runtime-environment-variable-reference).
613
+ Use `--scope user` to make it available across all your projects, or `--scope project` to write a `.mcp.json` next to the current repo. Backend selection (`c64u`, `u2`, or `vice`), host, port, and password come from the same files documented in [Configuration](#configuration); per-shell overrides come from the variables in [Runtime Environment Variable Reference](#runtime-environment-variable-reference).
577
614
 
578
615
  **Project-scoped discovery** — this repository ships a checked-in [.mcp.json](./.mcp.json) that points Claude Code at the local source via `node scripts/start.mjs`. When you open the repo with `claude` (CLI or VS Code plugin), Claude Code prompts to enable the project-scoped server on first run. Approve it once and the `c64_*` tools become discoverable in that workspace.
579
616
 
@@ -676,221 +713,226 @@ _No operations defined._
676
713
 
677
714
  Grouped entry point for configuration reads/writes, diagnostics, and snapshots.
678
715
 
679
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
716
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
680
717
  | --- | --- | --- | --- | --- | --- | --- |
681
- | `batch_update` | Apply multiple configuration updates in a single request. | — | — | — | ✅ | ✅ |
682
- | `diff` | Compare the current configuration with a snapshot. | `path` | — | — | ✅ | ✅ |
683
- | `get` | Read a configuration category or specific item. | `category` | `item` | — | ✅ | ✅ |
684
- | `info` | Retrieve Ultimate hardware information and status. | — | — | — | ✅ | ✅ |
685
- | `list` | List configuration categories reported by the firmware. | — | — | — | ✅ | ✅ |
686
- | `load_flash` | Load configuration from flash storage. | — | — | — | ✅ | |
687
- | `read_debugreg` | Read the Ultimate debug register ($D7FF). | — | — | — | ✅ | |
688
- | `reset_defaults` | Reset firmware configuration to factory defaults. | — | — | — | ✅ | |
689
- | `restore` | Restore configuration from a snapshot file. | `path` | `applyToFlash=false` | — | ✅ | ✅ |
690
- | `save_flash` | Persist the current configuration to flash storage. | — | — | — | ✅ | |
691
- | `set` | Write a configuration value in the selected category. | `category`, `item`, `value` | — | — | ✅ | ✅ |
692
- | `shuffle` | Discover PRG/CRT files and run each with optional screen capture. | — | `root="/"`, `extensions=["prg","crt"]`, `durationMs=5000`, `captureScreen=true`, `maxPrograms=10`, `outputPath`, `resetDelayMs=100` | — | ✅ | |
693
- | `snapshot` | Snapshot configuration to disk for later restore or diff. | `path` | — | — | ✅ | ✅ |
694
- | `version` | Fetch firmware version details. | — | — | — | ✅ | ✅ |
695
- | `write_debugreg` | Write a hex value to the Ultimate debug register ($D7FF). | `value` | — | — | ✅ | |
718
+ | `batch_update` | Apply multiple configuration updates in a single request. | — | — | ✅ | ✅ | ✅ |
719
+ | `diff` | Compare the current configuration with a snapshot. | `path` | — | ✅ | ✅ | ✅ |
720
+ | `get` | Read a configuration category or specific item. | `category` | `item` | ✅ | ✅ | ✅ |
721
+ | `info` | Retrieve Ultimate hardware information and status. | — | — | ✅ | ✅ | ✅ |
722
+ | `list` | List configuration categories reported by the firmware. | — | — | ✅ | ✅ | ✅ |
723
+ | `load_flash` | Load configuration from flash storage. | — | — | ✅ | ✅ | |
724
+ | `read_debugreg` | Read the Ultimate debug register ($D7FF). | — | — | ✅ | | |
725
+ | `reset_defaults` | Reset firmware configuration to factory defaults. | — | — | ✅ | ✅ | |
726
+ | `restore` | Restore configuration from a snapshot file. | `path` | `applyToFlash=false` | ✅ | ✅ | ✅ |
727
+ | `save_flash` | Persist the current configuration to flash storage. | — | — | ✅ | ✅ | |
728
+ | `set` | Write a configuration value in the selected category. | `category`, `item`, `value` | — | ✅ | ✅ | ✅ |
729
+ | `shuffle` | Discover PRG/CRT files and run each with optional screen capture. | — | `root="/"`, `extensions=["prg","crt"]`, `durationMs=5000`, `captureScreen=true`, `maxPrograms=10`, `outputPath`, `resetDelayMs=100` | ✅ | ✅ | |
730
+ | `snapshot` | Snapshot configuration to disk for later restore or diff. | `path` | — | ✅ | ✅ | ✅ |
731
+ | `version` | Fetch firmware version details. | — | — | ✅ | ✅ | ✅ |
732
+ | `write_debugreg` | Write a hex value to the Ultimate debug register ($D7FF). | `value` | — | ✅ | | |
696
733
 
697
734
  #### c64_debug
698
735
 
699
736
  Grouped entry point for VICE debugger operations (breakpoints, registers, stepping).
700
737
 
701
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
738
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
702
739
  | --- | --- | --- | --- | --- | --- | --- |
703
- | `continue_execution` | Exit the Binary Monitor and resume CPU execution (BM 0xAA Exit). | — | — | — | | ✅ |
704
- | `create_checkpoint` | Create a new checkpoint (breakpoint) in VICE. | `address` | `endAddress`, `stopOnHit=true`, `enabled=true`, `temporary=false`, `label`, `operations`, `memspace` | — | | ✅ |
705
- | `delete_checkpoint` | Remove a checkpoint by id. | `id` | — | — | | ✅ |
706
- | `get_checkpoint` | Fetch a single checkpoint by id. | `id` | — | — | | ✅ |
707
- | `get_monitor_state` | Read CPU registers and return the current monitor state. | — | `memspace` | — | | ✅ |
708
- | `get_registers` | Read register values, optionally filtered by name or id. | — | `memspace`, `registers` | — | | ✅ |
709
- | `list_checkpoints` | List all active VICE checkpoints (breakpoints). | — | — | — | | ✅ |
710
- | `list_registers` | List available registers (metadata). | — | `memspace` | — | | ✅ |
711
- | `nuclear_reset` | Kill and restart the VICE process (managed instances only). | — | — | — | | ✅ |
712
- | `set_condition` | Attach a conditional expression to a checkpoint. | `id`, `expression` | — | — | | ✅ |
713
- | `set_registers` | Write register values. | `writes` | `memspace` | — | | ✅ |
714
- | `step` | Single-step CPU execution. | — | `count=1`, `mode` | — | | ✅ |
715
- | `step_return` | Continue execution until the current routine returns. | — | — | — | | ✅ |
716
- | `toggle_checkpoint` | Enable or disable a checkpoint by id. | `id`, `enabled` | — | — | | ✅ |
717
- | `wait_for_state` | Poll CPU registers until PC equals expectedPC or timeout elapses. | — | `expectedPC`, `timeoutMs=5000`, `pollMs=100` | — | | ✅ |
740
+ | `continue_execution` | Exit the Binary Monitor and resume CPU execution (BM 0xAA Exit). | — | — | | | ✅ |
741
+ | `create_checkpoint` | Create a new checkpoint (breakpoint) in VICE. | `address` | `endAddress`, `stopOnHit=true`, `enabled=true`, `temporary=false`, `label`, `operations`, `memspace` | | | ✅ |
742
+ | `delete_checkpoint` | Remove a checkpoint by id. | `id` | — | | | ✅ |
743
+ | `get_checkpoint` | Fetch a single checkpoint by id. | `id` | — | | | ✅ |
744
+ | `get_monitor_state` | Read CPU registers and return the current monitor state. | — | `memspace` | | | ✅ |
745
+ | `get_registers` | Read register values, optionally filtered by name or id. | — | `memspace`, `registers` | | | ✅ |
746
+ | `list_checkpoints` | List all active VICE checkpoints (breakpoints). | — | — | | | ✅ |
747
+ | `list_registers` | List available registers (metadata). | — | `memspace` | | | ✅ |
748
+ | `nuclear_reset` | Kill and restart the VICE process (managed instances only). | — | — | | | ✅ |
749
+ | `set_condition` | Attach a conditional expression to a checkpoint. | `id`, `expression` | — | | | ✅ |
750
+ | `set_registers` | Write register values. | `writes` | `memspace` | | | ✅ |
751
+ | `step` | Single-step CPU execution. | — | `count=1`, `mode` | | | ✅ |
752
+ | `step_return` | Continue execution until the current routine returns. | — | — | | | ✅ |
753
+ | `toggle_checkpoint` | Enable or disable a checkpoint by id. | `id`, `enabled` | — | | | ✅ |
754
+ | `wait_for_state` | Poll CPU registers until PC equals expectedPC or timeout elapses. | — | `expectedPC`, `timeoutMs=5000`, `pollMs=100` | | | ✅ |
718
755
 
719
756
  #### c64_disk
720
757
 
721
758
  Grouped entry point for disk mounts, listings, image creation, and program discovery.
722
759
 
723
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
760
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
724
761
  | --- | --- | --- | --- | --- | --- | --- |
725
- | `create_image` | Create a blank disk image of the specified format. | `format`, `path` | `diskname`, `tracks` | — | ✅ | |
726
- | `file_info` | Inspect metadata for a file on the Ultimate filesystem. | `path` | — | — | ✅ | |
727
- | `find_and_run` | Search for a PRG/CRT by name substring and run the first match. | `nameContains` | `root="/"`, `extensions`, `caseInsensitive=true`, `sort="discovered"`, `waitMs=0`, `captureCandidates=10` | — | ✅ | |
728
- | `list_drives` | List Ultimate drive slots and their mounted images. | — | — | — | ✅ | ✅ |
729
- | `mount` | Mount a disk image with optional verification and retries. | `drive`, `image` | `type`, `attachmentMode`, `driveMode`, `verify=false`, `powerOnIfNeeded=true`, `resetAfterMount=true`, `maxRetries=2`, `retryDelayMs=500` | supports verify | ✅ | ✅ |
730
- | `unmount` | Remove the mounted image from an Ultimate drive slot. | `drive` | — | — | ✅ | ✅ |
762
+ | `create_image` | Create a blank disk image of the specified format. | `format`, `path` | `diskname`, `tracks` | ✅ | ✅ | |
763
+ | `file_info` | Inspect metadata for a file on the Ultimate filesystem. | `path` | — | ✅ | ✅ | |
764
+ | `find_and_run` | Search for a PRG/CRT by name substring and run the first match. | `nameContains` | `root="/"`, `extensions`, `caseInsensitive=true`, `sort="discovered"`, `waitMs=0`, `captureCandidates=10` | ✅ | ✅ | |
765
+ | `list_drives` | List Ultimate drive slots and their mounted images. | — | — | ✅ | ✅ | ✅ |
766
+ | `mount` | Mount a disk image with optional verification and retries. Supports verification. | `drive`, `image` | `type`, `attachmentMode`, `driveMode`, `verify=false`, `powerOnIfNeeded=true`, `resetAfterMount=true`, `maxRetries=2`, `retryDelayMs=500` | ✅ | ✅ | ✅ |
767
+ | `unmount` | Remove the mounted image from an Ultimate drive slot. | `drive` | — | ✅ | ✅ | ✅ |
731
768
 
732
769
  #### c64_drive
733
770
 
734
771
  Grouped entry point for drive power, mode, reset, and ROM operations.
735
772
 
736
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
773
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
737
774
  | --- | --- | --- | --- | --- | --- | --- |
738
- | `load_rom` | Temporarily load a custom ROM into an Ultimate drive slot. | `drive`, `path` | — | — | ✅ | |
739
- | `power_off` | Power off a specific Ultimate drive slot. | `drive` | — | — | ✅ | ✅ |
740
- | `power_on` | Power on a specific Ultimate drive slot. | `drive` | — | — | ✅ | ✅ |
741
- | `reset` | Issue an IEC reset for the selected drive slot. | `drive` | — | — | ✅ | ✅ |
742
- | `set_mode` | Set the emulation mode for a drive slot (1541/1571/1581). | `drive`, `mode` | — | — | ✅ | ✅ |
775
+ | `load_rom` | Temporarily load a custom ROM into an Ultimate drive slot. | `drive`, `path` | — | ✅ | ✅ | |
776
+ | `power_off` | Power off a specific Ultimate drive slot. | `drive` | — | ✅ | ✅ | ✅ |
777
+ | `power_on` | Power on a specific Ultimate drive slot. | `drive` | — | ✅ | ✅ | ✅ |
778
+ | `reset` | Issue an IEC reset for the selected drive slot. | `drive` | — | ✅ | ✅ | ✅ |
779
+ | `set_mode` | Set the emulation mode for a drive slot (1541/1571/1581). | `drive`, `mode` | — | ✅ | ✅ | ✅ |
743
780
 
744
781
  #### c64_extract
745
782
 
746
783
  Grouped entry point for sprite/charset extraction, memory dumps, filesystem stats, and firmware health checks.
747
784
 
748
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
785
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
749
786
  | --- | --- | --- | --- | --- | --- | --- |
750
- | `charset` | Locate and extract 2KB character sets from RAM. | — | `address`, `scanRange="common"`, `outputPath`, `pauseDuringRead=true`, `minNonEmptyChars=32`, `minEntropy=0.3` | — | ✅ | |
751
- | `firmware_health` | Run firmware readiness checks and report status metrics. | — | — | — | ✅ | |
752
- | `fs_stats` | Walk the filesystem and aggregate counts/bytes by extension. | — | `root="/"`, `extensions`, `includeContainers=true`, `maxSamplesPerExtension=3` | — | ✅ | |
753
- | `memory_dump` | Dump a RAM range to hex or binary files with manifest metadata. | `address`, `length`, `outputPath` | `format="hex"`, `chunkSize=512`, `pauseDuringRead=true`, `retries=1` | — | ✅ | |
754
- | `sprites` | Scan RAM for sprites and optionally export .spr files. | `address`, `length` | `stride=64`, `maxSprites=16`, `minNonZeroRows=4`, `minSetBits=12`, `includeBase64=true`, `outputDir`, `pauseDuringRead=true` | — | ✅ | |
787
+ | `charset` | Locate and extract 2KB character sets from RAM. | — | `address`, `scanRange="common"`, `outputPath`, `pauseDuringRead=true`, `minNonEmptyChars=32`, `minEntropy=0.3` | ✅ | | |
788
+ | `firmware_health` | Run firmware readiness checks and report status metrics. | — | — | ✅ | | |
789
+ | `fs_stats` | Walk the filesystem and aggregate counts/bytes by extension. | — | `root="/"`, `extensions`, `includeContainers=true`, `maxSamplesPerExtension=3` | ✅ | | |
790
+ | `memory_dump` | Dump a RAM range to hex or binary files with manifest metadata. | `address`, `length`, `outputPath` | `format="hex"`, `chunkSize=512`, `pauseDuringRead=true`, `retries=1` | ✅ | | |
791
+ | `sprites` | Scan RAM for sprites and optionally export .spr files. | `address`, `length` | `stride=64`, `maxSprites=16`, `minNonZeroRows=4`, `minSetBits=12`, `includeBase64=true`, `outputDir`, `pauseDuringRead=true` | ✅ | | |
755
792
 
756
793
  #### c64_graphics
757
794
 
758
795
  Grouped entry point for frame capture and graphics rendering workflows.
759
796
 
760
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
797
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
761
798
  | --- | --- | --- | --- | --- | --- | --- |
762
- | `capture_frame` | Capture one or more complete video frames from the active backend. | — | `count=1`, `includePixels=true`, `encoding="base64"` | — | ✅ | ✅ |
763
- | `get_display_state` | Read VIC-II and CIA2 registers to determine the current graphics mode and memory layout. Works on C64U and VICE; both backends are read through shared memory primitives so the response shape is identical. | — | — | — | ✅ | ✅ |
764
- | `render_bitmap` | Import an image file, convert it to VIC-II bitmap memory, write it into RAM, and display it. | `imagePath`, `format` | `bitmapAddress=8192`, `screenAddress=1024`, `borderColor=0`, `backgroundColor=0`, `preserveAspect=true` | — | ✅ | ✅ |
765
- | `render_petscii_art` | Create PETSCII art from prompts, text, or explicit bitmap data, and optionally display it on the C64. | — | `prompt`, `text`, `maxWidth`, `maxHeight`, `borderColor`, `backgroundColor`, `foregroundColor`, `dryRun=false`, `bitmap` | — | ✅ | ✅ |
766
- | `render_petscii_text` | Display PETSCII text with optional border and background colours. | `text` | `borderColor`, `backgroundColor` | — | ✅ | ✅ |
767
- | `render_sprite` | Display supplied 63-byte sprite data at the requested position and colour by writing memory and patching VIC-II registers directly. | `sprite` | `index=0`, `x=100`, `y=100`, `color=1`, `multicolour=false` | — | ✅ | ✅ |
799
+ | `capture_frame` | Capture one or more complete video frames from the active backend. | — | `count=1`, `includePixels=true`, `encoding="base64"` | ✅ | ✅ | ✅ |
800
+ | `get_display_state` | Read VIC-II and CIA2 registers to determine the current graphics mode and memory layout. The same shared-memory path is used on C64U/U64, U2-family hardware, and VICE, so the response shape is identical. | — | — | ✅ | ✅ | ✅ |
801
+ | `render_bitmap` | Import an image file, convert it to VIC-II bitmap memory, write it into RAM, and display it. | `imagePath`, `format` | `bitmapAddress=8192`, `screenAddress=1024`, `borderColor=0`, `backgroundColor=0`, `preserveAspect=true` | ✅ | ✅ | ✅ |
802
+ | `render_petscii_art` | Create PETSCII art from prompts, text, or explicit bitmap data, and optionally display it on the C64. | — | `prompt`, `text`, `maxWidth`, `maxHeight`, `borderColor`, `backgroundColor`, `foregroundColor`, `dryRun=false`, `bitmap` | ✅ | ✅ | ✅ |
803
+ | `render_petscii_text` | Display PETSCII text with optional border and background colours. | `text` | `borderColor`, `backgroundColor` | ✅ | ✅ | ✅ |
804
+ | `render_sprite` | Display supplied 63-byte sprite data at the requested position and colour by writing memory and patching VIC-II registers directly. | `sprite` | `index=0`, `x=100`, `y=100`, `color=1`, `multicolour=false` | ✅ | ✅ | ✅ |
768
805
 
769
806
  #### c64_input
770
807
 
771
- Keyboard buffer injection (cross-platform) and joystick simulation (VICE only).
808
+ Cross-platform PETSCII typing plus native Ultimate keyboard and joystick events.
772
809
 
773
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
810
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
774
811
  | --- | --- | --- | --- | --- | --- | --- |
775
- | `joystick` | Simulate joystick input by writing directly to CIA1 Port A/B registers. | `port`, `controls`, `action` | `durationMs=80` | — | | ✅ |
776
- | `key` | Tap a single key or hold it for a duration. | `key` | `durationMs=0`, `count=1` | — | ✅ | ✅ |
777
- | `write_text` | Send a text string to the keyboard buffer, with PETSCII token expansion. | `text` | `delayMs=0` | — | ✅ | ✅ |
812
+ | `joystick` | Simulate joystick input. On C64U/U64 this uses machine:input (a C64U firmware version that provides it, or U64 3.15+); VICE writes CIA1 registers. | `port`, `controls`, `action` | `durationMs=80` | ✅ | | ✅ |
813
+ | `key` | Tap a single key or hold it for a duration. | `key` | `durationMs=0`, `count=1` | ✅ | ✅ | ✅ |
814
+ | `keyboard` | Send physical C64 keyboard matrix events through machine:input (a C64U firmware version that provides it, or U64 3.15+). | `inputs`, `transition` | — | ✅ | | |
815
+ | `release_all` | Release every key and joystick control injected through machine:input (a C64U firmware version that provides it, or U64 3.15+). | — | — | ✅ | | |
816
+ | `state` | Read the keys and joystick controls held through machine:input (a C64U firmware version that provides it, or U64 3.15+). | — | — | ✅ | | |
817
+ | `write_text` | Send a text string to the keyboard buffer, with PETSCII token expansion. | `text` | `delayMs=0` | ✅ | ✅ | ✅ |
778
818
 
779
819
  #### c64_memory
780
820
 
781
821
  Grouped entry point for memory I/O, screen reads, and screen polling.
782
822
 
783
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
823
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
784
824
  | --- | --- | --- | --- | --- | --- | --- |
785
- | `compare_memory` | Compare two memory regions byte-by-byte and report differences. | `address1`, `address2`, `length` | `maxDiffs=10` | — | ✅ | ✅ |
786
- | `copy_memory` | Copy a RAM region to another address. | `source`, `dest`, `length` | — | — | ✅ | ✅ |
787
- | `disassemble` | Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on both C64U and VICE. | `address` | `length=64`, `instructionCount` | — | ✅ | ✅ |
788
- | `fill_memory` | Fill a memory range with a repeating byte pattern. | `address`, `length`, `pattern` | — | — | ✅ | ✅ |
789
- | `read` | Read a range of bytes and return a hex dump with address metadata. | `address` | `length=256` | — | ✅ | ✅ |
790
- | `read_screen` | Return the current 40x25 text screen converted to ASCII. | — | — | — | ✅ | ✅ |
791
- | `save_memory` | Dump a memory range to a local file, with an optional PRG load-address header. | `startAddress`, `endAddress`, `filePath` | `asPrg=true` | — | ✅ | ✅ |
792
- | `search_memory` | Search for a byte pattern within a memory range and return matching addresses. | `startAddress`, `endAddress`, `pattern` | `maxResults=10` | — | ✅ | ✅ |
793
- | `wait_for_text` | Poll the screen until a substring or regex appears, or timeout elapses. | `pattern` | `isRegex=false`, `caseInsensitive=true`, `timeoutMs=3000`, `intervalMs=100` | — | ✅ | ✅ |
794
- | `write` | Write a hexadecimal byte sequence into RAM. | `address`, `bytes` | `verify=false`, `expected`, `mask`, `abortOnMismatch=true` | supports verify | ✅ | ✅ |
825
+ | `compare_memory` | Compare two memory regions byte-by-byte and report differences. | `address1`, `address2`, `length` | `maxDiffs=10` | ✅ | ✅ | ✅ |
826
+ | `copy_memory` | Copy a RAM region to another address. | `source`, `dest`, `length` | — | ✅ | ✅ | ✅ |
827
+ | `disassemble` | Disassemble a memory region into annotated 6502/6510 instructions, including undocumented opcodes with canonical names. Symbol annotations from `.vs` files are applied when available. Works on C64U/U64, U2-family hardware, and VICE. | `address` | `length=64`, `instructionCount` | ✅ | ✅ | ✅ |
828
+ | `fill_memory` | Fill a memory range with a repeating byte pattern. | `address`, `length`, `pattern` | — | ✅ | ✅ | ✅ |
829
+ | `read` | Read a range of bytes and return a hex dump with address metadata. | `address` | `length=256` | ✅ | ✅ | ✅ |
830
+ | `read_screen` | Return the current 40x25 text screen converted to ASCII. | — | — | ✅ | ✅ | ✅ |
831
+ | `save_memory` | Dump a memory range to a local file, with an optional PRG load-address header. | `startAddress`, `endAddress`, `filePath` | `asPrg=true` | ✅ | ✅ | ✅ |
832
+ | `search_memory` | Search for a byte pattern within a memory range and return matching addresses. | `startAddress`, `endAddress`, `pattern` | `maxResults=10` | ✅ | ✅ | ✅ |
833
+ | `wait_for_text` | Poll the screen until a substring or regex appears, or timeout elapses. | `pattern` | `isRegex=false`, `caseInsensitive=true`, `timeoutMs=3000`, `intervalMs=100` | ✅ | ✅ | ✅ |
834
+ | `write` | Write a hexadecimal byte sequence into RAM. Supports verification. | `address`, `bytes` | `verify=false`, `expected`, `mask`, `abortOnMismatch=true` | ✅ | ✅ | ✅ |
795
835
 
796
836
  #### c64_printer
797
837
 
798
838
  Grouped entry point for Commodore and Epson printing helpers.
799
839
 
800
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
840
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
801
841
  | --- | --- | --- | --- | --- | --- | --- |
802
- | `define_chars` | Define custom printer characters (Commodore DLL mode). | `firstChar`, `chars` | `secondaryAddress` | — | ✅ | |
803
- | `print_bitmap` | Print a bitmap row via Commodore (BIM) or Epson ESC/P workflows. | `printer="commodore"`, `columns` | `repeats`, `useSubRepeat`, `secondaryAddress`, `ensureMsb=true`, `mode`, `density`, `timesPerLine` | — | ✅ | |
804
- | `print_text` | Generate BASIC that prints text to device 4. | `text` | `target="commodore"`, `secondaryAddress`, `formFeed=false` | — | ✅ | |
842
+ | `define_chars` | Define custom printer characters (Commodore DLL mode). | `firstChar`, `chars` | `secondaryAddress` | ✅ | | |
843
+ | `print_bitmap` | Print a bitmap row via Commodore (BIM) or Epson ESC/P workflows. | `printer="commodore"`, `columns` | `repeats`, `useSubRepeat`, `secondaryAddress`, `ensureMsb=true`, `mode`, `density`, `timesPerLine` | ✅ | | |
844
+ | `print_text` | Generate BASIC that prints text to device 4. | `text` | `target="commodore"`, `secondaryAddress`, `formFeed=false` | ✅ | | |
805
845
 
806
846
  #### c64_program
807
847
 
808
848
  Grouped entry point for program upload, execution, and batch workflows.
809
849
 
810
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
850
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
811
851
  | --- | --- | --- | --- | --- | --- | --- |
812
- | `batch_run` | Run multiple PRG/CRT programs with post-run assertions. | `programs` | `continueOnError=false`, `durationMs=2000`, `outputPath`, `resetDelayMs=100` | — | ✅ | ✅ |
813
- | `bundle_run` | Capture screen, memory, and debug registers into an artifact bundle. | `runId`, `outputPath` | `captureScreen=true`, `memoryRanges`, `captureDebugReg=true` | — | ✅ | |
814
- | `cross_platform_greeting` | Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results. | — | `platforms=["vice","c64u"]`, `messageTemplate="HAVE A GREAT DAY, {PLATFORM}!"`, `verify=true`, `captureScreenshot=true`, `outputPath`, `restoreActiveBackend=true`, `timeoutMs=1500`, `pollIntervalMs=100` | supports verify | ✅ | ✅ |
815
- | `load_prg` | Load a PRG from Ultimate storage without executing it. | `path` | `symbolsFile` | — | ✅ | |
816
- | `run_crt` | Mount and run a CRT cartridge image. | `path` | — | — | ✅ | |
817
- | `run_prg` | Load and execute a PRG from Ultimate-visible storage on c64u or a host-local path on VICE. | `path` | `symbolsFile` | — | ✅ | ✅ |
818
- | `upload_run_asm` | Assemble 6502/6510 source, upload the PRG, and execute it. | `program` | `verify=false` | supports verify | ✅ | ✅ |
819
- | `upload_run_basic` | Upload Commodore BASIC v2 source and execute it immediately. | `program` | `verify=false` | supports verify | ✅ | ✅ |
852
+ | `batch_run` | Run multiple PRG/CRT programs with post-run assertions. | `programs` | `continueOnError=false`, `durationMs=2000`, `outputPath`, `resetDelayMs=100` | ✅ | ✅ | ✅ |
853
+ | `bundle_run` | Capture screen, memory, and debug registers into an artifact bundle. | `runId`, `outputPath` | `captureScreen=true`, `memoryRanges`, `captureDebugReg=true` | ✅ | ✅ | |
854
+ | `cross_platform_greeting` | Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results. Supports verification. | — | `platforms=["vice","c64u"]`, `messageTemplate="HAVE A GREAT DAY, {PLATFORM}!"`, `verify=true`, `captureScreenshot=true`, `outputPath`, `restoreActiveBackend=true`, `timeoutMs=1500`, `pollIntervalMs=100` | ✅ | ✅ | ✅ |
855
+ | `load_prg` | Load a PRG from Ultimate storage without executing it. | `path` | `symbolsFile` | ✅ | ✅ | |
856
+ | `run_crt` | Mount and run a CRT cartridge image. | `path` | — | ✅ | ✅ | |
857
+ | `run_prg` | Load and execute a PRG from Ultimate-visible storage on C64U/U64 or U2-family hardware, or from a host-local path on VICE. | `path` | `symbolsFile` | ✅ | ✅ | ✅ |
858
+ | `upload_run_asm` | Assemble 6502/6510 source, upload the PRG, and execute it. Supports verification. | `program` | `verify=false` | ✅ | ✅ | ✅ |
859
+ | `upload_run_basic` | Upload Commodore BASIC v2 source and execute it immediately. Supports verification. | `program` | `verify=false` | ✅ | ✅ | ✅ |
820
860
 
821
861
  #### c64_rag
822
862
 
823
863
  Grouped entry point for BASIC and assembly RAG lookups.
824
864
 
825
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
865
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
826
866
  | --- | --- | --- | --- | --- | --- | --- |
827
- | `asm` | Retrieve 6502/6510 assembly references from the local knowledge base. | `q` | `k=3` | — | ✅ | ✅ |
828
- | `basic` | Retrieve BASIC references and snippets from the local knowledge base. | `q` | `k=3` | — | ✅ | ✅ |
867
+ | `asm` | Retrieve 6502/6510 assembly references from the local knowledge base. | `q` | `k=3` | ✅ | ✅ | ✅ |
868
+ | `basic` | Retrieve BASIC references and snippets from the local knowledge base. | `q` | `k=3` | ✅ | ✅ | ✅ |
829
869
 
830
870
  #### c64_select_backend
831
871
 
832
- Switch the active backend between C64U hardware and the VICE emulator at runtime.
872
+ Switch the active backend between C64U/U64 hardware, U2-family cartridges, and the VICE emulator at runtime.
833
873
 
834
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
874
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
835
875
  | --- | --- | --- | --- | --- | --- | --- |
836
- | `select` | Switch the active runtime backend without restarting the MCP server. | `backend` | — | — | ✅ | ✅ |
876
+ | `select` | Switch the active runtime backend without restarting the MCP server. | `backend` | — | ✅ | ✅ | ✅ |
837
877
 
838
878
  #### c64_sound
839
879
 
840
880
  Grouped entry point for SID control, playback, composition, and analysis workflows.
841
881
 
842
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
882
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
843
883
  | --- | --- | --- | --- | --- | --- | --- |
844
- | `analyze` | Automatically analyze SID playback when verification is requested. | `request` | `durationSeconds`, `expectedSidwave` | — | ✅ | |
845
- | `capture_samples` | Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream. | — | `count=256`, `encoding="base64"` | — | ✅ | |
846
- | `compile_play` | Compile SIDWAVE or CPG source and optionally play it immediately. | — | `sidwave`, `cpg`, `format`, `output="prg"`, `dryRun=false` | — | ✅ | ✅ |
847
- | `generate` | Generate a lightweight SID arpeggio playback sequence. | — | `root="C4"`, `pattern="0,4,7"`, `steps=16`, `tempoMs=120`, `waveform="tri"`, `preset="classic"` | — | ✅ | ✅ |
848
- | `note_off` | Release a SID voice by clearing its gate bit. | `voice` | — | — | ✅ | ✅ |
849
- | `note_on` | Trigger a SID voice with configurable waveform, ADSR, and pitch. | — | `voice=1`, `note`, `frequencyHz`, `system="PAL"`, `waveform="pulse"`, `pulseWidth=2048`, `attack=1`, `decay=1`, `sustain=15`, `release=3` | — | ✅ | ✅ |
850
- | `pipeline` | Compile a SIDWAVE score, play it, and analyze the recording. | — | `sidwave`, `cpg`, `output="prg"`, `waitBeforeCaptureMs=500`, `analysisDurationSeconds=3`, `expectedSidwave`, `verifySilenceBefore=true`, `verifySilenceAfter=true`, `silenceDurationSeconds=1.5`, `silenceRmsThreshold=0.02`, `postSilenceWaitMs=200`, `silenceWaitMs=150` | supports verify | ✅ | |
851
- | `play_mod_file` | Play a MOD tracker module via the Ultimate SID player. | `path` | — | — | ✅ | |
852
- | `play_preset` | Compile and play a built-in SID preset such as Für Elise by Beethoven. | — | `preset="fuer_elise"`, `platforms`, `verify=true`, `analysisDurationSeconds=4`, `waitBeforeCaptureMs=400`, `restoreActiveBackend=true` | supports verify | ✅ | ✅ |
853
- | `play_sid_file` | Play a SID file stored on the Ultimate filesystem. | `path` | `songnr` | — | ✅ | |
854
- | `record_analyze` | Record audio for a fixed duration and return SID analysis metrics. | `durationSeconds` | `expectedSidwave` | — | ✅ | |
855
- | `reset` | Soft or hard reset of SID registers to clear glitches. | — | `hard=false` | — | ✅ | ✅ |
856
- | `set_volume` | Set the SID master volume register at $D418 (0-15). | `volume` | — | — | ✅ | ✅ |
857
- | `silence_all` | Silence all SID voices with optional audio verification. | — | `verify=false` | supports verify | ✅ | ✅ |
884
+ | `analyze` | Automatically analyze SID playback when verification is requested. | `request` | `durationSeconds`, `expectedSidwave` | ✅ | | |
885
+ | `capture_samples` | Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream. | — | `count=256`, `encoding="base64"` | ✅ | | |
886
+ | `compile_play` | Compile SIDWAVE or CPG source and optionally play it immediately. | — | `sidwave`, `cpg`, `format`, `output="prg"`, `dryRun=false` | ✅ | ✅ | ✅ |
887
+ | `generate` | Generate a lightweight SID arpeggio playback sequence. | — | `root="C4"`, `pattern="0,4,7"`, `steps=16`, `tempoMs=120`, `waveform="tri"`, `preset="classic"` | ✅ | ✅ | ✅ |
888
+ | `note_off` | Release a SID voice by clearing its gate bit. | `voice` | — | ✅ | ✅ | ✅ |
889
+ | `note_on` | Trigger a SID voice with configurable waveform, ADSR, and pitch. | — | `voice=1`, `note`, `frequencyHz`, `system="PAL"`, `waveform="pulse"`, `pulseWidth=2048`, `attack=1`, `decay=1`, `sustain=15`, `release=3` | ✅ | ✅ | ✅ |
890
+ | `pipeline` | Compile a SIDWAVE score, play it, and analyze the recording. Supports verification. | — | `sidwave`, `cpg`, `output="prg"`, `waitBeforeCaptureMs=500`, `analysisDurationSeconds=3`, `expectedSidwave`, `verifySilenceBefore=true`, `verifySilenceAfter=true`, `silenceDurationSeconds=1.5`, `silenceRmsThreshold=0.02`, `postSilenceWaitMs=200`, `silenceWaitMs=150` | ✅ | ✅ | |
891
+ | `play_mod_file` | Play a MOD tracker module via the Ultimate SID player. | `path` | — | ✅ | ✅ | |
892
+ | `play_preset` | Compile and play a built-in SID preset such as Für Elise by Beethoven. Supports verification. | — | `preset="fuer_elise"`, `platforms`, `verify=true`, `analysisDurationSeconds=4`, `waitBeforeCaptureMs=400`, `restoreActiveBackend=true` | ✅ | ✅ | ✅ |
893
+ | `play_sid_file` | Play a SID file stored on the Ultimate filesystem. | `path` | `songnr` | ✅ | ✅ | |
894
+ | `record_analyze` | Record audio for a fixed duration and return SID analysis metrics. | `durationSeconds` | `expectedSidwave` | ✅ | | |
895
+ | `reset` | Soft or hard reset of SID registers to clear glitches. | — | `hard=false` | ✅ | ✅ | ✅ |
896
+ | `set_volume` | Set the SID master volume register at $D418 (0-15). | `volume` | — | ✅ | ✅ | ✅ |
897
+ | `silence_all` | Silence all SID voices with optional audio verification. Supports verification. | — | `verify=false` | ✅ | ✅ | ✅ |
858
898
 
859
899
  #### c64_stream
860
900
 
861
901
  Grouped entry point for starting and stopping Ultimate streaming sessions.
862
902
 
863
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
903
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
864
904
  | --- | --- | --- | --- | --- | --- | --- |
865
- | `start` | Start an Ultimate streaming session toward a host:port target. | `stream`, `target` | — | — | ✅ | |
866
- | `stop` | Stop an active Ultimate streaming session. | `stream` | — | — | ✅ | |
905
+ | `start` | Start an Ultimate streaming session toward a host:port target. | `stream`, `target` | — | ✅ | | |
906
+ | `stop` | Stop an active Ultimate streaming session. | `stream` | — | ✅ | | |
867
907
 
868
908
  #### c64_system
869
909
 
870
910
  Grouped entry point for power, reset, menu, and background task control.
871
911
 
872
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
912
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
873
913
  | --- | --- | --- | --- | --- | --- | --- |
874
- | `list_tasks` | List known background tasks with status metadata. | — | — | — | ✅ | ✅ |
875
- | `menu` | Toggle the Ultimate menu button for navigation. | — | — | — | ✅ | |
876
- | `pause` | Pause the machine until resumed. | — | — | — | ✅ | |
877
- | `performance_report` | Summarize diagnostics spans and tool latencies from the current or latest MCP session. | — | `scope="current"`, `includeTimeline=true`, `maxEntries=25` | — | ✅ | ✅ |
878
- | `poweroff` | Request a controlled shutdown via the Ultimate firmware. | — | — | — | ✅ | ✅ |
879
- | `reboot` | Trigger a firmware reboot to recover from faults. | — | — | — | ✅ | ✅ |
880
- | `reset` | Issue a soft reset without cutting power. | — | — | — | ✅ | ✅ |
881
- | `resume` | Resume CPU execution after a pause. | — | — | — | ✅ | |
882
- | `start_task` | Start a named background task that runs on an interval. | `name`, `operation` | `arguments={}`, `intervalMs=1000`, `maxIterations` | — | ✅ | ✅ |
883
- | `stop_all_tasks` | Stop every running background task and persist state. | — | — | — | ✅ | ✅ |
884
- | `stop_task` | Stop a specific background task and clear its timer. | `name` | — | — | ✅ | ✅ |
914
+ | `list_tasks` | List known background tasks with status metadata. | — | — | ✅ | ✅ | ✅ |
915
+ | `menu` | Toggle the Ultimate menu button for navigation. | — | — | ✅ | ✅ | |
916
+ | `pause` | Pause the machine until resumed. | — | — | ✅ | ✅ | |
917
+ | `performance_report` | Summarize diagnostics spans and tool latencies from the current or latest MCP session. | — | `scope="current"`, `includeTimeline=true`, `maxEntries=25` | ✅ | ✅ | ✅ |
918
+ | `power_cycle` | Return the active backend to a fresh state. C64U/U64 Tool Menu verification requires machine:menu_screen (a C64U firmware version that provides it, or U64 3.15+); U2-family reboots through REST. | — | — | ✅ | ✅ | ✅ |
919
+ | `poweroff` | Request a controlled shutdown via the Ultimate firmware. | — | — | ✅ | ✅ | ✅ |
920
+ | `read_menu_screen` | Read the active Ultimate menu's raw character and colour matrix through machine:menu_screen (a C64U firmware version that provides it, or U64/U2 3.15+). | — | — | ✅ | ✅ | |
921
+ | `reboot` | Trigger a firmware reboot to recover from faults. | — | — | ✅ | ✅ | ✅ |
922
+ | `reset` | Issue a soft reset without cutting power. | — | — | ✅ | ✅ | ✅ |
923
+ | `resume` | Resume CPU execution after a pause. | — | — | ✅ | ✅ | |
924
+ | `start_task` | Start a named background task that runs on an interval. | `name`, `operation` | `arguments={}`, `intervalMs=1000`, `maxIterations` | ✅ | ✅ | ✅ |
925
+ | `stop_all_tasks` | Stop every running background task and persist state. | — | — | ✅ | ✅ | ✅ |
926
+ | `stop_task` | Stop a specific background task and clear its timer. | `name` | — | ✅ | ✅ | ✅ |
885
927
 
886
928
  #### c64_vice
887
929
 
888
930
  Grouped entry point for reading and updating selected VICE resources.
889
931
 
890
- | Operation | Description | Required Inputs | Optional Inputs | Notes | C64U | VICE |
932
+ | Operation | Description | Required Inputs | Optional Inputs | C64U | U2 | VICE |
891
933
  | --- | --- | --- | --- | --- | --- | --- |
892
- | `resource_get` | Read a VICE configuration resource (safe prefixes only). | `name` | — | — | | ✅ |
893
- | `resource_set` | Write a VICE configuration resource (safe prefixes only). | `name`, `value` | — | — | | ✅ |
934
+ | `resource_get` | Read a VICE configuration resource (safe prefixes only). | `name` | — | | | ✅ |
935
+ | `resource_set` | Write a VICE configuration resource (safe prefixes only). | `name`, `value` | — | | | ✅ |
894
936
 
895
937
  ### Resources
896
938