c64bridge 0.7.4 → 0.8.1

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 (109) hide show
  1. package/.github/prompts/README.md +14 -4
  2. package/.github/prompts/assembly-routine-session.prompt.md +9 -9
  3. package/.github/prompts/basic-program-session.prompt.md +11 -9
  4. package/.github/prompts/drive-management-session.prompt.md +9 -9
  5. package/.github/prompts/hello-world-session.prompt.md +17 -0
  6. package/.github/prompts/petscii-art-session.prompt.md +9 -9
  7. package/.github/prompts/play-classic-game.prompt.md +9 -9
  8. package/.github/prompts/pr-converge.prompt.md +13 -0
  9. package/.github/prompts/sid-music-session.prompt.md +9 -9
  10. package/AGENTS.md +59 -60
  11. package/README.md +550 -191
  12. package/data/assembly/assembly-spec.md +290 -1
  13. package/data/context/bootstrap.md +26 -2
  14. package/data/context/fast-paths.md +44 -0
  15. package/data/graphics/petscii-style-guide.md +6 -2
  16. package/data/graphics/sprite-charset-best-practices.md +5 -5
  17. package/dist/.tsbuildinfo +1 -1
  18. package/dist/c64Client.js +990 -26
  19. package/dist/config.js +5 -1
  20. package/dist/device.js +680 -57
  21. package/dist/diagnostics.js +371 -0
  22. package/dist/mcp/metadata.js +39 -0
  23. package/dist/mcp-server.js +170 -20
  24. package/dist/platform.js +10 -2
  25. package/dist/prompts/registry.js +166 -309
  26. package/dist/rag/init.js +37 -1
  27. package/dist/rag/knowledgeIndex.js +18 -6
  28. package/dist/rag/rateLimiter.js +2 -2
  29. package/dist/streamCapture.js +135 -0
  30. package/dist/tools/audio.js +3 -1
  31. package/dist/tools/debug.js +470 -0
  32. package/dist/tools/developer.js +10 -4
  33. package/dist/tools/graphics.js +183 -17
  34. package/dist/tools/machineControl.js +11 -5
  35. package/dist/tools/memory.js +19 -10
  36. package/dist/tools/meta/audio.js +240 -1
  37. package/dist/tools/meta/config.js +20 -28
  38. package/dist/tools/meta/configInventory.js +104 -0
  39. package/dist/tools/meta/diagnostics.js +45 -2
  40. package/dist/tools/meta/graphics.js +14 -6
  41. package/dist/tools/meta/index.js +1 -0
  42. package/dist/tools/meta/memory.js +20 -6
  43. package/dist/tools/meta/program.js +473 -0
  44. package/dist/tools/pollValidator.js +4 -2
  45. package/dist/tools/programRunners.js +8 -4
  46. package/dist/tools/registry/config.js +17 -0
  47. package/dist/tools/registry/disk.js +7 -0
  48. package/dist/tools/registry/drive.js +3 -0
  49. package/dist/tools/registry/graphics.js +111 -27
  50. package/dist/tools/registry/index.js +6 -0
  51. package/dist/tools/registry/memory.js +1 -0
  52. package/dist/tools/registry/platform.js +121 -0
  53. package/dist/tools/registry/program.js +26 -8
  54. package/dist/tools/registry/sound.js +96 -0
  55. package/dist/tools/registry/system.js +15 -2
  56. package/dist/tools/storage.js +1 -0
  57. package/dist/tools/streaming.js +1 -0
  58. package/dist/tools/types.js +38 -4
  59. package/dist/tools/vice.js +160 -0
  60. package/dist/vicBitmap.js +317 -0
  61. package/dist/vice/mockServer.js +439 -0
  62. package/dist/vice/process.js +310 -0
  63. package/dist/vice/readiness.js +18 -2
  64. package/dist/vice/viceClient.js +382 -22
  65. package/doc/developer.md +71 -25
  66. package/doc/img/backend-switch/hello-c64u.png +0 -0
  67. package/doc/img/backend-switch/hello-vice-and-c64u.png +0 -0
  68. package/doc/img/backend-switch/hello-vice.png +0 -0
  69. package/doc/img/backend-switch/metadata.json +50 -0
  70. package/doc/plans/vice-backend-switch/plan.md +486 -0
  71. package/doc/plans/vice-backend-switch-2/plan.md +48 -0
  72. package/doc/plans/vice-support/notes.md +1 -0
  73. package/doc/plans/vice-support/plan.md +5 -0
  74. package/doc/plans/vice-support/rollout.md +23 -17
  75. package/doc/reviews/vice-support-review.md +185 -0
  76. package/doc/troubleshooting-mcp.md +35 -6
  77. package/doc/vice/support-matrix.md +54 -0
  78. package/mcp/prompts.json +292 -0
  79. package/mcp/protocol-examples.json +46 -0
  80. package/mcp/resources.json +940 -0
  81. package/mcp/schemas/c64_config.schema.json +350 -0
  82. package/mcp/schemas/c64_debug.schema.json +380 -0
  83. package/mcp/schemas/c64_disk.schema.json +278 -0
  84. package/mcp/schemas/c64_drive.schema.json +120 -0
  85. package/mcp/schemas/c64_extract.schema.json +302 -0
  86. package/mcp/schemas/c64_graphics.schema.json +333 -0
  87. package/mcp/schemas/c64_memory.schema.json +155 -0
  88. package/mcp/schemas/c64_printer.schema.json +218 -0
  89. package/mcp/schemas/c64_program.schema.json +391 -0
  90. package/mcp/schemas/c64_rag.schema.json +67 -0
  91. package/mcp/schemas/c64_select_backend.schema.json +32 -0
  92. package/mcp/schemas/c64_sound.schema.json +644 -0
  93. package/mcp/schemas/c64_stream.schema.json +61 -0
  94. package/mcp/schemas/c64_system.schema.json +227 -0
  95. package/mcp/schemas/c64_vice.schema.json +63 -0
  96. package/mcp/server.json +15 -0
  97. package/mcp/tools.json +4517 -0
  98. package/mcp.json +90 -15
  99. package/package.json +11 -4
  100. package/scripts/capture-backend-switch-screenshots.mjs +276 -0
  101. package/scripts/generate-mcp-interface.ts +289 -0
  102. package/scripts/invoke-bun.mjs +67 -21
  103. package/scripts/mockC64Server.mjs +162 -6
  104. package/scripts/prepare-release.mjs +59 -2
  105. package/scripts/run-coverage.mjs +284 -0
  106. package/scripts/run-tests.mjs +95 -39
  107. package/scripts/run-tests.ts +378 -73
  108. package/scripts/update-readme.ts +147 -13
  109. package/server.json +94 -0
package/mcp/tools.json ADDED
@@ -0,0 +1,4517 @@
1
+ {
2
+ "tools": [
3
+ {
4
+ "name": "c64_program",
5
+ "title": "Runs PRG/CRT files, uploads BASIC or ASM, and coordinates batch test flows.",
6
+ "description": "Grouped entry point for program upload, execution, and batch workflows.",
7
+ "inputSchema": {
8
+ "type": "object",
9
+ "description": "Program operations available via the c64_program tool.",
10
+ "oneOf": [
11
+ {
12
+ "type": "object",
13
+ "description": "Load a PRG from Ultimate storage without executing it.",
14
+ "properties": {
15
+ "path": {
16
+ "type": "string",
17
+ "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
18
+ "minLength": 1
19
+ },
20
+ "op": {
21
+ "const": "load_prg"
22
+ }
23
+ },
24
+ "required": [
25
+ "path",
26
+ "op"
27
+ ],
28
+ "additionalProperties": false
29
+ },
30
+ {
31
+ "type": "object",
32
+ "description": "Load and execute a PRG from Ultimate-visible storage on c64u or a host-local path on VICE.",
33
+ "properties": {
34
+ "path": {
35
+ "type": "string",
36
+ "description": "Path to the PRG image. Use an Ultimate-visible filesystem path on c64u, or a host-local filesystem path on VICE.",
37
+ "minLength": 1
38
+ },
39
+ "op": {
40
+ "const": "run_prg"
41
+ }
42
+ },
43
+ "required": [
44
+ "path",
45
+ "op"
46
+ ],
47
+ "additionalProperties": false
48
+ },
49
+ {
50
+ "type": "object",
51
+ "description": "Mount and run a CRT cartridge image.",
52
+ "properties": {
53
+ "path": {
54
+ "type": "string",
55
+ "description": "Path to the CRT image on Ultimate-visible storage. CRT mounting is only supported on c64u.",
56
+ "minLength": 1
57
+ },
58
+ "op": {
59
+ "const": "run_crt"
60
+ }
61
+ },
62
+ "required": [
63
+ "path",
64
+ "op"
65
+ ],
66
+ "additionalProperties": false
67
+ },
68
+ {
69
+ "type": "object",
70
+ "description": "Upload Commodore BASIC v2 source and execute it immediately.",
71
+ "properties": {
72
+ "program": {
73
+ "type": "string",
74
+ "description": "Commodore BASIC v2 program source to upload and run.",
75
+ "minLength": 1
76
+ },
77
+ "verify": {
78
+ "type": "boolean",
79
+ "description": "Run post-execution polling to ensure the BASIC program executed without errors.",
80
+ "default": false
81
+ },
82
+ "op": {
83
+ "const": "upload_run_basic"
84
+ }
85
+ },
86
+ "required": [
87
+ "program",
88
+ "op"
89
+ ],
90
+ "additionalProperties": false
91
+ },
92
+ {
93
+ "type": "object",
94
+ "description": "Assemble 6502/6510 source, upload the PRG, and execute it.",
95
+ "properties": {
96
+ "program": {
97
+ "type": "string",
98
+ "description": "Assembly source that will be assembled to a PRG and executed.",
99
+ "minLength": 1
100
+ },
101
+ "verify": {
102
+ "type": "boolean",
103
+ "description": "Run post-execution polling to confirm the assembly program remained stable.",
104
+ "default": false
105
+ },
106
+ "op": {
107
+ "const": "upload_run_asm"
108
+ }
109
+ },
110
+ "required": [
111
+ "program",
112
+ "op"
113
+ ],
114
+ "additionalProperties": false
115
+ },
116
+ {
117
+ "type": "object",
118
+ "description": "Run multiple PRG/CRT programs with post-run assertions.",
119
+ "properties": {
120
+ "programs": {
121
+ "type": "array",
122
+ "items": {
123
+ "type": "object",
124
+ "description": "Program to run with assertions",
125
+ "properties": {
126
+ "path": {
127
+ "type": "string",
128
+ "description": "Program path (PRG or CRT)",
129
+ "minLength": 1
130
+ },
131
+ "assertions": {
132
+ "type": [
133
+ "array",
134
+ "null"
135
+ ],
136
+ "items": {
137
+ "type": "object",
138
+ "description": "Assertion to check after run",
139
+ "properties": {
140
+ "type": {
141
+ "type": "string",
142
+ "description": "Assertion type",
143
+ "enum": [
144
+ "screen_contains",
145
+ "memory_equals",
146
+ "sid_silent"
147
+ ]
148
+ },
149
+ "pattern": {
150
+ "type": [
151
+ "string",
152
+ "null"
153
+ ],
154
+ "description": "Pattern for screen_contains",
155
+ "minLength": 1
156
+ },
157
+ "address": {
158
+ "type": [
159
+ "string",
160
+ "null"
161
+ ],
162
+ "description": "Address for memory_equals",
163
+ "minLength": 1
164
+ },
165
+ "expected": {
166
+ "type": [
167
+ "string",
168
+ "null"
169
+ ],
170
+ "description": "Expected value (hex)",
171
+ "minLength": 1
172
+ }
173
+ },
174
+ "required": [
175
+ "type"
176
+ ],
177
+ "additionalProperties": false
178
+ }
179
+ }
180
+ },
181
+ "required": [
182
+ "path"
183
+ ],
184
+ "additionalProperties": false
185
+ }
186
+ },
187
+ "continueOnError": {
188
+ "type": [
189
+ "boolean",
190
+ "null"
191
+ ],
192
+ "description": "Continue running programs after assertion failure",
193
+ "default": false
194
+ },
195
+ "durationMs": {
196
+ "type": [
197
+ "integer",
198
+ "null"
199
+ ],
200
+ "description": "Duration to run each program before assertions",
201
+ "minimum": 1,
202
+ "default": 2000
203
+ },
204
+ "outputPath": {
205
+ "type": [
206
+ "string",
207
+ "null"
208
+ ],
209
+ "description": "Output directory for test results",
210
+ "minLength": 1
211
+ },
212
+ "resetDelayMs": {
213
+ "type": [
214
+ "integer",
215
+ "null"
216
+ ],
217
+ "description": "Delay after reset operations to allow the platform to settle.",
218
+ "minimum": 0,
219
+ "maximum": 1000,
220
+ "default": 100
221
+ },
222
+ "op": {
223
+ "const": "batch_run"
224
+ }
225
+ },
226
+ "required": [
227
+ "programs",
228
+ "op"
229
+ ],
230
+ "additionalProperties": false
231
+ },
232
+ {
233
+ "type": "object",
234
+ "description": "Capture screen, memory, and debug registers into an artifact bundle.",
235
+ "properties": {
236
+ "runId": {
237
+ "type": "string",
238
+ "description": "Unique identifier for this run",
239
+ "minLength": 1
240
+ },
241
+ "outputPath": {
242
+ "type": "string",
243
+ "description": "Output directory for artifacts bundle",
244
+ "minLength": 1
245
+ },
246
+ "captureScreen": {
247
+ "type": [
248
+ "boolean",
249
+ "null"
250
+ ],
251
+ "description": "Capture screen content",
252
+ "default": true
253
+ },
254
+ "memoryRanges": {
255
+ "type": [
256
+ "array",
257
+ "null"
258
+ ],
259
+ "items": {
260
+ "type": "object",
261
+ "description": "Memory range to snapshot",
262
+ "properties": {
263
+ "address": {
264
+ "type": "string",
265
+ "description": "Start address",
266
+ "minLength": 1
267
+ },
268
+ "length": {
269
+ "type": "integer",
270
+ "description": "Length in bytes",
271
+ "minimum": 1
272
+ }
273
+ },
274
+ "required": [
275
+ "address",
276
+ "length"
277
+ ],
278
+ "additionalProperties": false
279
+ }
280
+ },
281
+ "captureDebugReg": {
282
+ "type": [
283
+ "boolean",
284
+ "null"
285
+ ],
286
+ "description": "Capture debugreg state",
287
+ "default": true
288
+ },
289
+ "op": {
290
+ "const": "bundle_run"
291
+ }
292
+ },
293
+ "required": [
294
+ "runId",
295
+ "outputPath",
296
+ "op"
297
+ ],
298
+ "additionalProperties": false
299
+ },
300
+ {
301
+ "type": "object",
302
+ "description": "Show a platform-customized greeting on one or more configured backends, capture screenshots, and verify the results.",
303
+ "properties": {
304
+ "platforms": {
305
+ "type": [
306
+ "array",
307
+ "null"
308
+ ],
309
+ "items": {
310
+ "type": "string",
311
+ "description": "Backends to target in sequence.",
312
+ "minLength": 1,
313
+ "enum": [
314
+ "vice",
315
+ "c64u"
316
+ ]
317
+ },
318
+ "default": [
319
+ "vice",
320
+ "c64u"
321
+ ]
322
+ },
323
+ "messageTemplate": {
324
+ "type": [
325
+ "string",
326
+ "null"
327
+ ],
328
+ "description": "Greeting template. Use {PLATFORM}/{BACKEND} for uppercase or {platform}/{backend} for lowercase substitution.",
329
+ "minLength": 1,
330
+ "default": "HAVE A GREAT DAY, {PLATFORM}!"
331
+ },
332
+ "verify": {
333
+ "type": [
334
+ "boolean",
335
+ "null"
336
+ ],
337
+ "description": "Poll the text screen and require the rendered greeting to appear.",
338
+ "default": true
339
+ },
340
+ "captureScreenshot": {
341
+ "type": [
342
+ "boolean",
343
+ "null"
344
+ ],
345
+ "description": "Capture a framebuffer screenshot and save it as a PNG per backend.",
346
+ "default": true
347
+ },
348
+ "outputPath": {
349
+ "type": [
350
+ "string",
351
+ "null"
352
+ ],
353
+ "description": "Directory for screenshots and the workflow summary JSON.",
354
+ "minLength": 1
355
+ },
356
+ "restoreActiveBackend": {
357
+ "type": [
358
+ "boolean",
359
+ "null"
360
+ ],
361
+ "description": "Restore the backend that was active before the workflow started.",
362
+ "default": true
363
+ },
364
+ "timeoutMs": {
365
+ "type": [
366
+ "integer",
367
+ "null"
368
+ ],
369
+ "description": "Maximum time to wait for each greeting to appear on screen.",
370
+ "minimum": 100,
371
+ "maximum": 5000,
372
+ "default": 1500
373
+ },
374
+ "pollIntervalMs": {
375
+ "type": [
376
+ "integer",
377
+ "null"
378
+ ],
379
+ "description": "Delay between screen polls while verifying the greeting.",
380
+ "minimum": 50,
381
+ "maximum": 1000,
382
+ "default": 100
383
+ },
384
+ "op": {
385
+ "const": "cross_platform_greeting"
386
+ }
387
+ },
388
+ "additionalProperties": false,
389
+ "required": [
390
+ "op"
391
+ ]
392
+ }
393
+ ],
394
+ "discriminator": {
395
+ "propertyName": "op"
396
+ }
397
+ },
398
+ "_meta": {
399
+ "domain": "programs",
400
+ "summary": "Runs PRG/CRT files, uploads BASIC or ASM, and coordinates batch test flows.",
401
+ "lifecycle": "request-response",
402
+ "resources": [
403
+ "c64://context/bootstrap",
404
+ "c64://specs/basic",
405
+ "c64://specs/assembly"
406
+ ],
407
+ "prompts": [
408
+ "basic-program",
409
+ "assembly-program"
410
+ ],
411
+ "examples": [
412
+ {
413
+ "name": "Run PRG from storage",
414
+ "description": "Load and execute a PRG in one call",
415
+ "arguments": {
416
+ "op": "run_prg",
417
+ "path": "//USB0/demo.prg"
418
+ }
419
+ },
420
+ {
421
+ "name": "Upload BASIC source",
422
+ "description": "Send inline BASIC to the C64 and run it",
423
+ "arguments": {
424
+ "op": "upload_run_basic",
425
+ "program": "10 PRINT \"HELLO\"\n20 GOTO 10"
426
+ }
427
+ },
428
+ {
429
+ "name": "Show greeting on both backends",
430
+ "description": "Render a platform-specific greeting on VICE and C64U with screenshot verification",
431
+ "arguments": {
432
+ "op": "cross_platform_greeting"
433
+ }
434
+ }
435
+ ],
436
+ "tags": [
437
+ "programs",
438
+ "execution",
439
+ "grouped"
440
+ ],
441
+ "workflowHints": [
442
+ "Choose BASIC or assembly uploaders based on the language you just generated for the user.",
443
+ "Prefer PRG or CRT runners when the user supplies a file path instead of source text; PRG paths are host-local on VICE and Ultimate-visible on c64u.",
444
+ "For a quick visible confirmation on VICE and/or C64U, prefer cross_platform_greeting instead of composing manual backend switches and BASIC upload steps."
445
+ ],
446
+ "platforms": [
447
+ "c64u",
448
+ "vice"
449
+ ],
450
+ "operationPlatforms": {
451
+ "load_prg": [
452
+ "c64u"
453
+ ],
454
+ "run_crt": [
455
+ "c64u"
456
+ ],
457
+ "bundle_run": [
458
+ "c64u"
459
+ ]
460
+ }
461
+ }
462
+ },
463
+ {
464
+ "name": "c64_memory",
465
+ "title": "Reads or writes RAM, captures the screen, or waits for text matches in one tool.",
466
+ "description": "Grouped entry point for memory I/O, screen reads, and screen polling.",
467
+ "inputSchema": {
468
+ "type": "object",
469
+ "description": "Memory operations available via the c64_memory tool.",
470
+ "oneOf": [
471
+ {
472
+ "type": "object",
473
+ "description": "Read a range of bytes and return a hex dump with address metadata.",
474
+ "properties": {
475
+ "address": {
476
+ "type": "string",
477
+ "description": "Start address expressed as $HHHH, decimal, or a documented symbol name.",
478
+ "minLength": 1
479
+ },
480
+ "length": {
481
+ "type": "integer",
482
+ "description": "Number of bytes to read starting from the resolved address.",
483
+ "minimum": 1,
484
+ "maximum": 4096,
485
+ "default": 256
486
+ },
487
+ "op": {
488
+ "const": "read"
489
+ }
490
+ },
491
+ "required": [
492
+ "address",
493
+ "op"
494
+ ],
495
+ "additionalProperties": false
496
+ },
497
+ {
498
+ "type": "object",
499
+ "description": "Write a hexadecimal byte sequence into RAM.",
500
+ "properties": {
501
+ "address": {
502
+ "type": "string",
503
+ "description": "Destination address expressed as $HHHH, decimal, or a documented symbol name.",
504
+ "minLength": 1
505
+ },
506
+ "bytes": {
507
+ "type": "string",
508
+ "description": "Hex byte sequence like $AABBCC or AA BB CC to write starting at the resolved address.",
509
+ "minLength": 2,
510
+ "pattern": "^[\\s_0-9A-Fa-f$]+$"
511
+ },
512
+ "verify": {
513
+ "type": "boolean",
514
+ "description": "When true, verify the write by reading before and after the change; Ultimate hardware also pauses during verification.",
515
+ "default": false
516
+ },
517
+ "expected": {
518
+ "type": [
519
+ "string",
520
+ "null"
521
+ ],
522
+ "description": "Optional hex data expected before the write (verifies before writing).",
523
+ "minLength": 2,
524
+ "pattern": "^[\\s_0-9A-Fa-f$]+$"
525
+ },
526
+ "mask": {
527
+ "type": [
528
+ "string",
529
+ "null"
530
+ ],
531
+ "description": "Optional verification mask (hex); only bits set in the mask are compared.",
532
+ "minLength": 2,
533
+ "pattern": "^[\\s_0-9A-Fa-f$]+$"
534
+ },
535
+ "abortOnMismatch": {
536
+ "type": "boolean",
537
+ "description": "Abort the write when the pre-write verification fails.",
538
+ "default": true
539
+ },
540
+ "op": {
541
+ "const": "write"
542
+ }
543
+ },
544
+ "required": [
545
+ "address",
546
+ "bytes",
547
+ "op"
548
+ ],
549
+ "additionalProperties": false
550
+ },
551
+ {
552
+ "type": "object",
553
+ "description": "Return the current 40x25 text screen converted to ASCII.",
554
+ "properties": {
555
+ "op": {
556
+ "const": "read_screen"
557
+ }
558
+ },
559
+ "additionalProperties": false,
560
+ "required": [
561
+ "op"
562
+ ]
563
+ },
564
+ {
565
+ "type": "object",
566
+ "description": "Poll the screen until a substring or regex appears, or timeout elapses.",
567
+ "properties": {
568
+ "pattern": {
569
+ "type": "string",
570
+ "description": "Substring or regex to find",
571
+ "minLength": 1
572
+ },
573
+ "isRegex": {
574
+ "type": [
575
+ "boolean",
576
+ "null"
577
+ ],
578
+ "description": "Interpret pattern as regular expression",
579
+ "default": false
580
+ },
581
+ "caseInsensitive": {
582
+ "type": [
583
+ "boolean",
584
+ "null"
585
+ ],
586
+ "description": "Case-insensitive search",
587
+ "default": true
588
+ },
589
+ "timeoutMs": {
590
+ "type": [
591
+ "integer",
592
+ "null"
593
+ ],
594
+ "description": "Overall timeout in milliseconds",
595
+ "minimum": 1,
596
+ "default": 3000
597
+ },
598
+ "intervalMs": {
599
+ "type": [
600
+ "integer",
601
+ "null"
602
+ ],
603
+ "description": "Poll interval in milliseconds",
604
+ "minimum": 1,
605
+ "default": 100
606
+ },
607
+ "op": {
608
+ "const": "wait_for_text"
609
+ }
610
+ },
611
+ "required": [
612
+ "pattern",
613
+ "op"
614
+ ],
615
+ "additionalProperties": false
616
+ }
617
+ ],
618
+ "discriminator": {
619
+ "propertyName": "op"
620
+ }
621
+ },
622
+ "_meta": {
623
+ "domain": "memory",
624
+ "summary": "Reads or writes RAM, captures the screen, or waits for text matches in one tool.",
625
+ "lifecycle": "request-response",
626
+ "resources": [
627
+ "c64://context/bootstrap",
628
+ "c64://specs/basic",
629
+ "c64://specs/assembly"
630
+ ],
631
+ "prompts": [
632
+ "memory-debug",
633
+ "basic-program",
634
+ "assembly-program"
635
+ ],
636
+ "examples": [
637
+ {
638
+ "name": "Read colour RAM",
639
+ "description": "Read 16 bytes starting at $D800",
640
+ "arguments": {
641
+ "op": "read",
642
+ "address": "$D800",
643
+ "length": 16
644
+ }
645
+ },
646
+ {
647
+ "name": "Wait for READY prompt",
648
+ "description": "Poll until the READY. prompt appears",
649
+ "arguments": {
650
+ "op": "wait_for_text",
651
+ "pattern": "READY."
652
+ }
653
+ }
654
+ ],
655
+ "tags": [
656
+ "memory",
657
+ "debug",
658
+ "screen",
659
+ "grouped"
660
+ ],
661
+ "workflowHints": [
662
+ "Pair memory operations with documentation snippets so addresses and symbols stay meaningful to the user.",
663
+ "Confirm intent before mutating RAM and explain how the change affects the running program."
664
+ ],
665
+ "platforms": [
666
+ "c64u",
667
+ "vice"
668
+ ]
669
+ }
670
+ },
671
+ {
672
+ "name": "c64_sound",
673
+ "title": "Adjusts SID registers, plays files, composes music, and runs verification captures.",
674
+ "description": "Grouped entry point for SID control, playback, composition, and analysis workflows.",
675
+ "inputSchema": {
676
+ "type": "object",
677
+ "description": "Sound operations available via the c64_sound tool.",
678
+ "oneOf": [
679
+ {
680
+ "type": "object",
681
+ "description": "Capture raw stereo PCM samples from the C64 Ultimate audio UDP stream.",
682
+ "properties": {
683
+ "op": {
684
+ "const": "capture_samples"
685
+ },
686
+ "count": {
687
+ "type": [
688
+ "integer",
689
+ "null"
690
+ ],
691
+ "description": "Number of stereo sample pairs to capture.",
692
+ "minimum": 1,
693
+ "maximum": 65536,
694
+ "default": 256
695
+ },
696
+ "encoding": {
697
+ "type": [
698
+ "string",
699
+ "null"
700
+ ],
701
+ "description": "Encoding used for the PCM sample payload.",
702
+ "enum": [
703
+ "base64",
704
+ "hex"
705
+ ],
706
+ "default": "base64"
707
+ }
708
+ },
709
+ "required": [
710
+ "op"
711
+ ],
712
+ "additionalProperties": false
713
+ },
714
+ {
715
+ "type": "object",
716
+ "description": "Set the SID master volume register at $D418 (0-15).",
717
+ "properties": {
718
+ "volume": {
719
+ "type": "number",
720
+ "description": "Desired SID master volume. Values outside 0-15 are clamped.",
721
+ "minimum": 0,
722
+ "maximum": 15
723
+ },
724
+ "op": {
725
+ "const": "set_volume"
726
+ }
727
+ },
728
+ "required": [
729
+ "volume",
730
+ "op"
731
+ ],
732
+ "additionalProperties": false
733
+ },
734
+ {
735
+ "type": "object",
736
+ "description": "Soft or hard reset of SID registers to clear glitches.",
737
+ "properties": {
738
+ "hard": {
739
+ "type": "boolean",
740
+ "description": "If true, perform a hard register scrub; otherwise silence voices softly.",
741
+ "default": false
742
+ },
743
+ "op": {
744
+ "const": "reset"
745
+ }
746
+ },
747
+ "additionalProperties": false,
748
+ "required": [
749
+ "op"
750
+ ]
751
+ },
752
+ {
753
+ "type": "object",
754
+ "description": "Trigger a SID voice with configurable waveform, ADSR, and pitch.",
755
+ "properties": {
756
+ "voice": {
757
+ "type": "integer",
758
+ "description": "SID voice to trigger (1-3).",
759
+ "minimum": 1,
760
+ "maximum": 3,
761
+ "default": 1
762
+ },
763
+ "note": {
764
+ "type": [
765
+ "string",
766
+ "null"
767
+ ],
768
+ "description": "Musical note like A4, C#5, or Bb3. Overrides frequencyHz if provided.",
769
+ "pattern": "^([A-Ga-g])([#b]?)(-?\\d+)$"
770
+ },
771
+ "frequencyHz": {
772
+ "type": [
773
+ "number",
774
+ "null"
775
+ ],
776
+ "description": "Explicit frequency in Hz. Used when note is omitted.",
777
+ "minimum": 1
778
+ },
779
+ "system": {
780
+ "type": "string",
781
+ "description": "Video system for frequency calculation.",
782
+ "enum": [
783
+ "PAL",
784
+ "NTSC"
785
+ ],
786
+ "default": "PAL"
787
+ },
788
+ "waveform": {
789
+ "type": "string",
790
+ "description": "SID waveform to enable.",
791
+ "enum": [
792
+ "pulse",
793
+ "saw",
794
+ "tri",
795
+ "noise"
796
+ ],
797
+ "default": "pulse"
798
+ },
799
+ "pulseWidth": {
800
+ "type": "integer",
801
+ "description": "Pulse width (0-4095). Used for pulse waveform.",
802
+ "minimum": 0,
803
+ "maximum": 4095,
804
+ "default": 2048
805
+ },
806
+ "attack": {
807
+ "type": "integer",
808
+ "description": "Attack rate nibble (0-15).",
809
+ "minimum": 0,
810
+ "maximum": 15,
811
+ "default": 1
812
+ },
813
+ "decay": {
814
+ "type": "integer",
815
+ "description": "Decay rate nibble (0-15).",
816
+ "minimum": 0,
817
+ "maximum": 15,
818
+ "default": 1
819
+ },
820
+ "sustain": {
821
+ "type": "integer",
822
+ "description": "Sustain level nibble (0-15).",
823
+ "minimum": 0,
824
+ "maximum": 15,
825
+ "default": 15
826
+ },
827
+ "release": {
828
+ "type": "integer",
829
+ "description": "Release rate nibble (0-15).",
830
+ "minimum": 0,
831
+ "maximum": 15,
832
+ "default": 3
833
+ },
834
+ "op": {
835
+ "const": "note_on"
836
+ }
837
+ },
838
+ "additionalProperties": false,
839
+ "required": [
840
+ "op"
841
+ ]
842
+ },
843
+ {
844
+ "type": "object",
845
+ "description": "Release a SID voice by clearing its gate bit.",
846
+ "properties": {
847
+ "voice": {
848
+ "type": "integer",
849
+ "description": "SID voice to release (1-3).",
850
+ "minimum": 1,
851
+ "maximum": 3
852
+ },
853
+ "op": {
854
+ "const": "note_off"
855
+ }
856
+ },
857
+ "required": [
858
+ "voice",
859
+ "op"
860
+ ],
861
+ "additionalProperties": false
862
+ },
863
+ {
864
+ "type": "object",
865
+ "description": "Silence all SID voices with optional audio verification.",
866
+ "properties": {
867
+ "verify": {
868
+ "type": [
869
+ "boolean",
870
+ "null"
871
+ ],
872
+ "description": "When true, record audio after silencing to confirm the SID output is quiet.",
873
+ "default": false
874
+ },
875
+ "op": {
876
+ "const": "silence_all"
877
+ }
878
+ },
879
+ "additionalProperties": false,
880
+ "required": [
881
+ "op"
882
+ ]
883
+ },
884
+ {
885
+ "type": "object",
886
+ "description": "Play a SID file stored on the Ultimate filesystem.",
887
+ "properties": {
888
+ "path": {
889
+ "type": "string",
890
+ "description": "Absolute or Ultimate filesystem path to the SID, PRG, or audio file.",
891
+ "minLength": 1
892
+ },
893
+ "songnr": {
894
+ "type": [
895
+ "integer",
896
+ "null"
897
+ ],
898
+ "description": "Song number within the SID file (0-based index).",
899
+ "minimum": 0
900
+ },
901
+ "op": {
902
+ "const": "play_sid_file"
903
+ }
904
+ },
905
+ "required": [
906
+ "path",
907
+ "op"
908
+ ],
909
+ "additionalProperties": false
910
+ },
911
+ {
912
+ "type": "object",
913
+ "description": "Play a MOD tracker module via the Ultimate SID player.",
914
+ "properties": {
915
+ "path": {
916
+ "type": "string",
917
+ "description": "Absolute or Ultimate filesystem path to the SID, PRG, or audio file.",
918
+ "minLength": 1
919
+ },
920
+ "op": {
921
+ "const": "play_mod_file"
922
+ }
923
+ },
924
+ "required": [
925
+ "path",
926
+ "op"
927
+ ],
928
+ "additionalProperties": false
929
+ },
930
+ {
931
+ "type": "object",
932
+ "description": "Generate a lightweight SID arpeggio playback sequence.",
933
+ "properties": {
934
+ "root": {
935
+ "type": "string",
936
+ "description": "Root note for the arpeggio such as C4 or A#3.",
937
+ "pattern": "^([A-Ga-g])([#b]?)(-?\\d+)$",
938
+ "default": "C4"
939
+ },
940
+ "pattern": {
941
+ "type": "string",
942
+ "description": "Comma-separated semitone offsets (e.g. '0,4,7').",
943
+ "minLength": 1,
944
+ "default": "0,4,7"
945
+ },
946
+ "steps": {
947
+ "type": "integer",
948
+ "description": "Number of notes to schedule.",
949
+ "minimum": 1,
950
+ "maximum": 128,
951
+ "default": 16
952
+ },
953
+ "tempoMs": {
954
+ "type": "integer",
955
+ "description": "Delay in milliseconds between notes.",
956
+ "minimum": 20,
957
+ "maximum": 2000,
958
+ "default": 120
959
+ },
960
+ "waveform": {
961
+ "type": "string",
962
+ "description": "Waveform for playback.",
963
+ "enum": [
964
+ "pulse",
965
+ "saw",
966
+ "tri",
967
+ "noise"
968
+ ],
969
+ "default": "tri"
970
+ },
971
+ "preset": {
972
+ "type": [
973
+ "string",
974
+ "null"
975
+ ],
976
+ "description": "Optional musical preset to influence timing/expression.",
977
+ "enum": [
978
+ "classic",
979
+ "expression"
980
+ ],
981
+ "default": "classic"
982
+ },
983
+ "op": {
984
+ "const": "generate"
985
+ }
986
+ },
987
+ "additionalProperties": false,
988
+ "required": [
989
+ "op"
990
+ ]
991
+ },
992
+ {
993
+ "type": "object",
994
+ "description": "Compile SIDWAVE or CPG source and optionally play it immediately.",
995
+ "properties": {
996
+ "sidwave": {
997
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
998
+ "type": [
999
+ "string",
1000
+ "object",
1001
+ "null"
1002
+ ]
1003
+ },
1004
+ "cpg": {
1005
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
1006
+ "type": [
1007
+ "string",
1008
+ "object",
1009
+ "null"
1010
+ ]
1011
+ },
1012
+ "format": {
1013
+ "type": [
1014
+ "string",
1015
+ "null"
1016
+ ],
1017
+ "description": "Source format hint when providing raw text.",
1018
+ "enum": [
1019
+ "yaml",
1020
+ "json"
1021
+ ]
1022
+ },
1023
+ "output": {
1024
+ "type": [
1025
+ "string",
1026
+ "null"
1027
+ ],
1028
+ "description": "Playback target format.",
1029
+ "enum": [
1030
+ "prg",
1031
+ "sid"
1032
+ ],
1033
+ "default": "prg"
1034
+ },
1035
+ "dryRun": {
1036
+ "type": [
1037
+ "boolean",
1038
+ "null"
1039
+ ],
1040
+ "description": "When true, skip playback and only return compilation metadata.",
1041
+ "default": false
1042
+ },
1043
+ "op": {
1044
+ "const": "compile_play"
1045
+ }
1046
+ },
1047
+ "additionalProperties": false,
1048
+ "required": [
1049
+ "op"
1050
+ ]
1051
+ },
1052
+ {
1053
+ "type": "object",
1054
+ "description": "Compile and play a built-in SID preset such as Für Elise by Beethoven.",
1055
+ "properties": {
1056
+ "preset": {
1057
+ "type": [
1058
+ "string",
1059
+ "null"
1060
+ ],
1061
+ "description": "Named SID preset to compile and play. Canonical public preset: fuer_elise.",
1062
+ "minLength": 1,
1063
+ "default": "fuer_elise"
1064
+ },
1065
+ "platforms": {
1066
+ "type": [
1067
+ "array",
1068
+ "null"
1069
+ ],
1070
+ "items": {
1071
+ "type": "string",
1072
+ "description": "Backends to target in sequence.",
1073
+ "minLength": 1,
1074
+ "enum": [
1075
+ "vice",
1076
+ "c64u"
1077
+ ]
1078
+ }
1079
+ },
1080
+ "verify": {
1081
+ "type": [
1082
+ "boolean",
1083
+ "null"
1084
+ ],
1085
+ "description": "Capture and analyze audio on supported backends after playback starts.",
1086
+ "default": true
1087
+ },
1088
+ "analysisDurationSeconds": {
1089
+ "type": [
1090
+ "number",
1091
+ "null"
1092
+ ],
1093
+ "description": "Length of the verification recording on analyzable backends.",
1094
+ "minimum": 0.5,
1095
+ "maximum": 20,
1096
+ "default": 4
1097
+ },
1098
+ "waitBeforeCaptureMs": {
1099
+ "type": [
1100
+ "number",
1101
+ "null"
1102
+ ],
1103
+ "description": "Delay between starting playback and beginning verification capture.",
1104
+ "minimum": 0,
1105
+ "maximum": 5000,
1106
+ "default": 400
1107
+ },
1108
+ "restoreActiveBackend": {
1109
+ "type": [
1110
+ "boolean",
1111
+ "null"
1112
+ ],
1113
+ "description": "Restore the backend that was active before the workflow started.",
1114
+ "default": true
1115
+ },
1116
+ "op": {
1117
+ "const": "play_preset"
1118
+ }
1119
+ },
1120
+ "additionalProperties": false,
1121
+ "required": [
1122
+ "op"
1123
+ ]
1124
+ },
1125
+ {
1126
+ "type": "object",
1127
+ "description": "Compile a SIDWAVE score, play it, and analyze the recording.",
1128
+ "properties": {
1129
+ "sidwave": {
1130
+ "type": [
1131
+ "string",
1132
+ "null"
1133
+ ],
1134
+ "description": "SIDWAVE source in YAML or JSON format.",
1135
+ "minLength": 1
1136
+ },
1137
+ "cpg": {
1138
+ "type": [
1139
+ "string",
1140
+ "null"
1141
+ ],
1142
+ "description": "Legacy CPG input format.",
1143
+ "minLength": 1
1144
+ },
1145
+ "output": {
1146
+ "type": [
1147
+ "string",
1148
+ "null"
1149
+ ],
1150
+ "description": "Playback artifact format.",
1151
+ "enum": [
1152
+ "prg",
1153
+ "sid"
1154
+ ],
1155
+ "default": "prg"
1156
+ },
1157
+ "waitBeforeCaptureMs": {
1158
+ "type": [
1159
+ "number",
1160
+ "null"
1161
+ ],
1162
+ "description": "Delay between starting playback and beginning analysis capture (milliseconds).",
1163
+ "minimum": 0,
1164
+ "maximum": 5000,
1165
+ "default": 500
1166
+ },
1167
+ "analysisDurationSeconds": {
1168
+ "type": [
1169
+ "number",
1170
+ "null"
1171
+ ],
1172
+ "description": "Audio capture length in seconds.",
1173
+ "minimum": 0.5,
1174
+ "maximum": 20,
1175
+ "default": 3
1176
+ },
1177
+ "expectedSidwave": {
1178
+ "type": [
1179
+ "string",
1180
+ "null"
1181
+ ],
1182
+ "description": "Optional expected SIDWAVE used to refine analysis comparisons.",
1183
+ "minLength": 1
1184
+ },
1185
+ "verifySilenceBefore": {
1186
+ "type": [
1187
+ "boolean",
1188
+ "null"
1189
+ ],
1190
+ "description": "Run silence verification before playback to ensure a quiet baseline.",
1191
+ "default": true
1192
+ },
1193
+ "verifySilenceAfter": {
1194
+ "type": [
1195
+ "boolean",
1196
+ "null"
1197
+ ],
1198
+ "description": "Run silence verification after playback to ensure voices are released.",
1199
+ "default": true
1200
+ },
1201
+ "silenceDurationSeconds": {
1202
+ "type": [
1203
+ "number",
1204
+ "null"
1205
+ ],
1206
+ "description": "Audio capture length used for silence verification.",
1207
+ "minimum": 0.5,
1208
+ "maximum": 10,
1209
+ "default": 1.5
1210
+ },
1211
+ "silenceRmsThreshold": {
1212
+ "type": [
1213
+ "number",
1214
+ "null"
1215
+ ],
1216
+ "description": "RMS threshold applied to silence verification captures.",
1217
+ "minimum": 0,
1218
+ "maximum": 1,
1219
+ "default": 0.02
1220
+ },
1221
+ "postSilenceWaitMs": {
1222
+ "type": [
1223
+ "number",
1224
+ "null"
1225
+ ],
1226
+ "description": "Delay between main analysis capture and the post-playback silence check (milliseconds).",
1227
+ "minimum": 0,
1228
+ "maximum": 5000,
1229
+ "default": 200
1230
+ },
1231
+ "silenceWaitMs": {
1232
+ "type": [
1233
+ "number",
1234
+ "null"
1235
+ ],
1236
+ "description": "Delay between silencing the SID and recording during pre/post checks (milliseconds).",
1237
+ "minimum": 0,
1238
+ "maximum": 5000,
1239
+ "default": 150
1240
+ },
1241
+ "op": {
1242
+ "const": "pipeline"
1243
+ }
1244
+ },
1245
+ "additionalProperties": false,
1246
+ "required": [
1247
+ "op"
1248
+ ]
1249
+ },
1250
+ {
1251
+ "type": "object",
1252
+ "description": "Automatically analyze SID playback when verification is requested.",
1253
+ "properties": {
1254
+ "request": {
1255
+ "type": "string",
1256
+ "description": "Natural language user request describing the verification goal.",
1257
+ "minLength": 1
1258
+ },
1259
+ "durationSeconds": {
1260
+ "type": [
1261
+ "number",
1262
+ "null"
1263
+ ],
1264
+ "description": "Override capture duration in seconds.",
1265
+ "minimum": 0.5,
1266
+ "maximum": 30
1267
+ },
1268
+ "expectedSidwave": {
1269
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
1270
+ "type": [
1271
+ "string",
1272
+ "object",
1273
+ "null"
1274
+ ]
1275
+ },
1276
+ "op": {
1277
+ "const": "analyze"
1278
+ }
1279
+ },
1280
+ "required": [
1281
+ "request",
1282
+ "op"
1283
+ ],
1284
+ "additionalProperties": false
1285
+ },
1286
+ {
1287
+ "type": "object",
1288
+ "description": "Record audio for a fixed duration and return SID analysis metrics.",
1289
+ "properties": {
1290
+ "durationSeconds": {
1291
+ "type": "number",
1292
+ "description": "Capture duration in seconds (0.5 - 30).",
1293
+ "minimum": 0.5,
1294
+ "maximum": 30
1295
+ },
1296
+ "expectedSidwave": {
1297
+ "description": "SIDWAVE composition represented as YAML/JSON text or an already parsed object.",
1298
+ "type": [
1299
+ "string",
1300
+ "object",
1301
+ "null"
1302
+ ]
1303
+ },
1304
+ "op": {
1305
+ "const": "record_analyze"
1306
+ }
1307
+ },
1308
+ "required": [
1309
+ "durationSeconds",
1310
+ "op"
1311
+ ],
1312
+ "additionalProperties": false
1313
+ }
1314
+ ],
1315
+ "discriminator": {
1316
+ "propertyName": "op"
1317
+ }
1318
+ },
1319
+ "_meta": {
1320
+ "domain": "audio",
1321
+ "summary": "Adjusts SID registers, plays files, composes music, and runs verification captures.",
1322
+ "lifecycle": "request-response",
1323
+ "resources": [
1324
+ "c64://specs/sid",
1325
+ "c64://specs/sidwave",
1326
+ "c64://docs/sid/file-structure"
1327
+ ],
1328
+ "prompts": [
1329
+ "sid-music"
1330
+ ],
1331
+ "examples": [
1332
+ {
1333
+ "name": "Capture samples",
1334
+ "description": "Grab 256 stereo sample pairs from the Ultimate audio stream",
1335
+ "arguments": {
1336
+ "op": "capture_samples"
1337
+ }
1338
+ },
1339
+ {
1340
+ "name": "Trigger SID voice",
1341
+ "description": "Start voice 1 on C4 with a triangle waveform",
1342
+ "arguments": {
1343
+ "op": "note_on",
1344
+ "voice": 1,
1345
+ "note": "C4",
1346
+ "waveform": "tri"
1347
+ }
1348
+ },
1349
+ {
1350
+ "name": "Play Für Elise",
1351
+ "description": "Compile and play the built-in Für Elise preset on the active backend",
1352
+ "arguments": {
1353
+ "op": "play_preset",
1354
+ "preset": "fuer_elise"
1355
+ }
1356
+ },
1357
+ {
1358
+ "name": "Verify silence",
1359
+ "description": "Stop all voices and confirm the SID output is quiet",
1360
+ "arguments": {
1361
+ "op": "silence_all",
1362
+ "verify": true
1363
+ }
1364
+ }
1365
+ ],
1366
+ "tags": [
1367
+ "sid",
1368
+ "audio",
1369
+ "grouped"
1370
+ ],
1371
+ "workflowHints": [
1372
+ "Trigger note_on or generate when the user wants immediate SID playback.",
1373
+ "Follow up playback changes with analyze or silence verification to provide confident audio feedback."
1374
+ ],
1375
+ "platforms": [
1376
+ "c64u",
1377
+ "vice"
1378
+ ],
1379
+ "operationPlatforms": {
1380
+ "capture_samples": [
1381
+ "c64u"
1382
+ ],
1383
+ "play_sid_file": [
1384
+ "c64u"
1385
+ ],
1386
+ "play_mod_file": [
1387
+ "c64u"
1388
+ ],
1389
+ "pipeline": [
1390
+ "c64u"
1391
+ ],
1392
+ "analyze": [
1393
+ "c64u"
1394
+ ],
1395
+ "record_analyze": [
1396
+ "c64u"
1397
+ ]
1398
+ }
1399
+ }
1400
+ },
1401
+ {
1402
+ "name": "c64_system",
1403
+ "title": "Manages machine state (pause, reset, power) and schedules recurring background tasks.",
1404
+ "description": "Grouped entry point for power, reset, menu, and background task control.",
1405
+ "inputSchema": {
1406
+ "type": "object",
1407
+ "description": "System operations available via the c64_system tool.",
1408
+ "oneOf": [
1409
+ {
1410
+ "type": "object",
1411
+ "description": "Pause the machine until resumed.",
1412
+ "properties": {
1413
+ "op": {
1414
+ "const": "pause"
1415
+ }
1416
+ },
1417
+ "additionalProperties": false,
1418
+ "required": [
1419
+ "op"
1420
+ ]
1421
+ },
1422
+ {
1423
+ "type": "object",
1424
+ "description": "Resume CPU execution after a pause.",
1425
+ "properties": {
1426
+ "op": {
1427
+ "const": "resume"
1428
+ }
1429
+ },
1430
+ "additionalProperties": false,
1431
+ "required": [
1432
+ "op"
1433
+ ]
1434
+ },
1435
+ {
1436
+ "type": "object",
1437
+ "description": "Issue a soft reset without cutting power.",
1438
+ "properties": {
1439
+ "op": {
1440
+ "const": "reset"
1441
+ }
1442
+ },
1443
+ "additionalProperties": false,
1444
+ "required": [
1445
+ "op"
1446
+ ]
1447
+ },
1448
+ {
1449
+ "type": "object",
1450
+ "description": "Trigger a firmware reboot to recover from faults.",
1451
+ "properties": {
1452
+ "op": {
1453
+ "const": "reboot"
1454
+ }
1455
+ },
1456
+ "additionalProperties": false,
1457
+ "required": [
1458
+ "op"
1459
+ ]
1460
+ },
1461
+ {
1462
+ "type": "object",
1463
+ "description": "Request a controlled shutdown via the Ultimate firmware.",
1464
+ "properties": {
1465
+ "op": {
1466
+ "const": "poweroff"
1467
+ }
1468
+ },
1469
+ "additionalProperties": false,
1470
+ "required": [
1471
+ "op"
1472
+ ]
1473
+ },
1474
+ {
1475
+ "type": "object",
1476
+ "description": "Toggle the Ultimate menu button for navigation.",
1477
+ "properties": {
1478
+ "op": {
1479
+ "const": "menu"
1480
+ }
1481
+ },
1482
+ "additionalProperties": false,
1483
+ "required": [
1484
+ "op"
1485
+ ]
1486
+ },
1487
+ {
1488
+ "type": "object",
1489
+ "description": "Start a named background task that runs on an interval.",
1490
+ "properties": {
1491
+ "name": {
1492
+ "type": "string",
1493
+ "description": "Unique task name",
1494
+ "minLength": 1
1495
+ },
1496
+ "operation": {
1497
+ "type": "string",
1498
+ "description": "Operation name (e.g., read, read_screen)",
1499
+ "minLength": 1
1500
+ },
1501
+ "arguments": {
1502
+ "type": [
1503
+ "object",
1504
+ "null"
1505
+ ],
1506
+ "description": "Operation-specific arguments",
1507
+ "properties": {},
1508
+ "additionalProperties": true,
1509
+ "default": {}
1510
+ },
1511
+ "intervalMs": {
1512
+ "type": [
1513
+ "integer",
1514
+ "null"
1515
+ ],
1516
+ "description": "Interval milliseconds",
1517
+ "minimum": 1,
1518
+ "default": 1000
1519
+ },
1520
+ "maxIterations": {
1521
+ "type": [
1522
+ "integer",
1523
+ "null"
1524
+ ],
1525
+ "description": "Maximum number of iterations (omit for indefinite)",
1526
+ "minimum": 1
1527
+ },
1528
+ "op": {
1529
+ "const": "start_task"
1530
+ }
1531
+ },
1532
+ "required": [
1533
+ "name",
1534
+ "operation",
1535
+ "op"
1536
+ ],
1537
+ "additionalProperties": false
1538
+ },
1539
+ {
1540
+ "type": "object",
1541
+ "description": "Stop a specific background task and clear its timer.",
1542
+ "properties": {
1543
+ "name": {
1544
+ "type": "string",
1545
+ "description": "Task name",
1546
+ "minLength": 1
1547
+ },
1548
+ "op": {
1549
+ "const": "stop_task"
1550
+ }
1551
+ },
1552
+ "required": [
1553
+ "name",
1554
+ "op"
1555
+ ],
1556
+ "additionalProperties": false
1557
+ },
1558
+ {
1559
+ "type": "object",
1560
+ "description": "Stop every running background task and persist state.",
1561
+ "properties": {
1562
+ "op": {
1563
+ "const": "stop_all_tasks"
1564
+ }
1565
+ },
1566
+ "additionalProperties": false,
1567
+ "required": [
1568
+ "op"
1569
+ ]
1570
+ },
1571
+ {
1572
+ "type": "object",
1573
+ "description": "List known background tasks with status metadata.",
1574
+ "properties": {
1575
+ "op": {
1576
+ "const": "list_tasks"
1577
+ }
1578
+ },
1579
+ "additionalProperties": false,
1580
+ "required": [
1581
+ "op"
1582
+ ]
1583
+ },
1584
+ {
1585
+ "type": "object",
1586
+ "description": "Summarize diagnostics spans and tool latencies from the current or latest MCP session.",
1587
+ "properties": {
1588
+ "scope": {
1589
+ "type": [
1590
+ "string",
1591
+ "null"
1592
+ ],
1593
+ "description": "Which diagnostics session to summarize.",
1594
+ "enum": [
1595
+ "current",
1596
+ "latest"
1597
+ ],
1598
+ "default": "current"
1599
+ },
1600
+ "includeTimeline": {
1601
+ "type": [
1602
+ "boolean",
1603
+ "null"
1604
+ ],
1605
+ "description": "Include the tail of the event timeline.",
1606
+ "default": true
1607
+ },
1608
+ "maxEntries": {
1609
+ "type": [
1610
+ "integer",
1611
+ "null"
1612
+ ],
1613
+ "description": "Maximum number of span and timeline entries to return.",
1614
+ "minimum": 1,
1615
+ "maximum": 200,
1616
+ "default": 25
1617
+ },
1618
+ "op": {
1619
+ "const": "performance_report"
1620
+ }
1621
+ },
1622
+ "additionalProperties": false,
1623
+ "required": [
1624
+ "op"
1625
+ ]
1626
+ }
1627
+ ],
1628
+ "discriminator": {
1629
+ "propertyName": "op"
1630
+ }
1631
+ },
1632
+ "_meta": {
1633
+ "domain": "system",
1634
+ "summary": "Manages machine state (pause, reset, power) and schedules recurring background tasks.",
1635
+ "lifecycle": "request-response",
1636
+ "resources": [
1637
+ "c64://context/bootstrap"
1638
+ ],
1639
+ "prompts": [
1640
+ "memory-debug"
1641
+ ],
1642
+ "examples": [
1643
+ {
1644
+ "name": "Soft reset",
1645
+ "description": "Issue a soft reset without cutting power",
1646
+ "arguments": {
1647
+ "op": "reset"
1648
+ }
1649
+ },
1650
+ {
1651
+ "name": "Start background screen capture",
1652
+ "description": "Launch a recurring read_screen task",
1653
+ "arguments": {
1654
+ "op": "start_task",
1655
+ "name": "screen_poll",
1656
+ "operation": "read_screen",
1657
+ "intervalMs": 2000
1658
+ }
1659
+ },
1660
+ {
1661
+ "name": "Inspect performance trace",
1662
+ "description": "Summarize the current session diagnostics for profiling",
1663
+ "arguments": {
1664
+ "op": "performance_report",
1665
+ "scope": "current"
1666
+ }
1667
+ }
1668
+ ],
1669
+ "tags": [
1670
+ "system",
1671
+ "control",
1672
+ "grouped"
1673
+ ],
1674
+ "workflowHints": [
1675
+ "Use pause/resume around invasive memory changes, and explain the impact of resets or power changes.",
1676
+ "Combine background task operations with list_tasks to monitor long-running diagnostics."
1677
+ ],
1678
+ "platforms": [
1679
+ "c64u",
1680
+ "vice"
1681
+ ],
1682
+ "operationPlatforms": {
1683
+ "pause": [
1684
+ "c64u"
1685
+ ],
1686
+ "resume": [
1687
+ "c64u"
1688
+ ],
1689
+ "menu": [
1690
+ "c64u"
1691
+ ]
1692
+ }
1693
+ }
1694
+ },
1695
+ {
1696
+ "name": "c64_select_backend",
1697
+ "title": "Changes the active backend without restarting the MCP server and reports resulting tool availability.",
1698
+ "description": "Switch the active backend between C64U hardware and the VICE emulator at runtime.",
1699
+ "inputSchema": {
1700
+ "type": "object",
1701
+ "description": "Runtime backend selection operations.",
1702
+ "oneOf": [
1703
+ {
1704
+ "type": "object",
1705
+ "description": "Switch the active runtime backend without restarting the MCP server.",
1706
+ "properties": {
1707
+ "op": {
1708
+ "const": "select",
1709
+ "description": "Selects the select operation."
1710
+ },
1711
+ "backend": {
1712
+ "type": "string",
1713
+ "enum": [
1714
+ "c64u",
1715
+ "vice"
1716
+ ],
1717
+ "description": "Backend to activate for subsequent tool calls."
1718
+ }
1719
+ },
1720
+ "required": [
1721
+ "op",
1722
+ "backend"
1723
+ ],
1724
+ "additionalProperties": false
1725
+ }
1726
+ ],
1727
+ "discriminator": {
1728
+ "propertyName": "op"
1729
+ }
1730
+ },
1731
+ "_meta": {
1732
+ "domain": "platform",
1733
+ "summary": "Changes the active backend without restarting the MCP server and reports resulting tool availability.",
1734
+ "lifecycle": "request-response",
1735
+ "resources": [
1736
+ "c64://platform/status",
1737
+ "c64://context/bootstrap"
1738
+ ],
1739
+ "prompts": [],
1740
+ "examples": [
1741
+ {
1742
+ "name": "Switch to VICE",
1743
+ "description": "Move subsequent tool calls to the emulator backend",
1744
+ "arguments": {
1745
+ "op": "select",
1746
+ "backend": "vice"
1747
+ }
1748
+ }
1749
+ ],
1750
+ "tags": [
1751
+ "platform",
1752
+ "backend",
1753
+ "grouped",
1754
+ "switch"
1755
+ ],
1756
+ "workflowHints": [
1757
+ "Switch backends before invoking backend-specific tools so platform gating stays accurate."
1758
+ ],
1759
+ "platforms": [
1760
+ "c64u",
1761
+ "vice"
1762
+ ]
1763
+ }
1764
+ },
1765
+ {
1766
+ "name": "c64_graphics",
1767
+ "title": "Captures frames, renders PETSCII text or art, previews sprites, and displays bitmap images from one tool.",
1768
+ "description": "Grouped entry point for frame capture and graphics rendering workflows.",
1769
+ "inputSchema": {
1770
+ "type": "object",
1771
+ "description": "Graphics operations available via the c64_graphics tool.",
1772
+ "oneOf": [
1773
+ {
1774
+ "type": "object",
1775
+ "description": "Capture one or more complete video frames from the active backend.",
1776
+ "properties": {
1777
+ "op": {
1778
+ "const": "capture_frame"
1779
+ },
1780
+ "count": {
1781
+ "type": [
1782
+ "integer",
1783
+ "null"
1784
+ ],
1785
+ "description": "Number of frames to capture.",
1786
+ "minimum": 1,
1787
+ "maximum": 32,
1788
+ "default": 1
1789
+ },
1790
+ "includePixels": {
1791
+ "type": [
1792
+ "boolean",
1793
+ "null"
1794
+ ],
1795
+ "description": "Include pixel payload bytes in the response.",
1796
+ "default": true
1797
+ },
1798
+ "encoding": {
1799
+ "type": [
1800
+ "string",
1801
+ "null"
1802
+ ],
1803
+ "description": "Encoding used for the pixel payload when included.",
1804
+ "enum": [
1805
+ "base64",
1806
+ "hex"
1807
+ ],
1808
+ "default": "base64"
1809
+ }
1810
+ },
1811
+ "required": [
1812
+ "op"
1813
+ ],
1814
+ "additionalProperties": false
1815
+ },
1816
+ {
1817
+ "type": "object",
1818
+ "description": "Create PETSCII art from prompts, text, or explicit bitmap data, and optionally display it on the C64.",
1819
+ "properties": {
1820
+ "prompt": {
1821
+ "type": [
1822
+ "string",
1823
+ "null"
1824
+ ],
1825
+ "description": "Natural language prompt describing the desired PETSCII art.",
1826
+ "minLength": 1
1827
+ },
1828
+ "text": {
1829
+ "type": [
1830
+ "string",
1831
+ "null"
1832
+ ],
1833
+ "description": "Exact text to render in PETSCII (overrides prompt derivation).",
1834
+ "minLength": 1
1835
+ },
1836
+ "maxWidth": {
1837
+ "type": [
1838
+ "integer",
1839
+ "null"
1840
+ ],
1841
+ "description": "Maximum bitmap width in pixels (1-320).",
1842
+ "minimum": 1,
1843
+ "maximum": 320
1844
+ },
1845
+ "maxHeight": {
1846
+ "type": [
1847
+ "integer",
1848
+ "null"
1849
+ ],
1850
+ "description": "Maximum bitmap height in pixels (1-200).",
1851
+ "minimum": 1,
1852
+ "maximum": 200
1853
+ },
1854
+ "borderColor": {
1855
+ "type": [
1856
+ "integer",
1857
+ "null"
1858
+ ],
1859
+ "description": "Border colour index (0-15).",
1860
+ "minimum": 0,
1861
+ "maximum": 15
1862
+ },
1863
+ "backgroundColor": {
1864
+ "type": [
1865
+ "integer",
1866
+ "null"
1867
+ ],
1868
+ "description": "Background colour index (0-15).",
1869
+ "minimum": 0,
1870
+ "maximum": 15
1871
+ },
1872
+ "foregroundColor": {
1873
+ "type": [
1874
+ "integer",
1875
+ "null"
1876
+ ],
1877
+ "description": "Foreground colour index (0-15).",
1878
+ "minimum": 0,
1879
+ "maximum": 15
1880
+ },
1881
+ "dryRun": {
1882
+ "type": "boolean",
1883
+ "description": "When true, skip uploading the generated BASIC program to the C64.",
1884
+ "default": false
1885
+ },
1886
+ "bitmap": {
1887
+ "description": "Explicit bitmap definition for PETSCII rendering.",
1888
+ "type": [
1889
+ "object",
1890
+ "null"
1891
+ ],
1892
+ "properties": {
1893
+ "width": {
1894
+ "type": "integer",
1895
+ "minimum": 1,
1896
+ "maximum": 320
1897
+ },
1898
+ "height": {
1899
+ "type": "integer",
1900
+ "minimum": 1,
1901
+ "maximum": 200
1902
+ },
1903
+ "pixels": {
1904
+ "type": "array",
1905
+ "items": {
1906
+ "type": "integer",
1907
+ "minimum": 0,
1908
+ "maximum": 1
1909
+ }
1910
+ }
1911
+ },
1912
+ "required": [
1913
+ "width",
1914
+ "height",
1915
+ "pixels"
1916
+ ],
1917
+ "additionalProperties": false
1918
+ },
1919
+ "op": {
1920
+ "const": "render_petscii_art"
1921
+ }
1922
+ },
1923
+ "additionalProperties": false,
1924
+ "required": [
1925
+ "op"
1926
+ ]
1927
+ },
1928
+ {
1929
+ "type": "object",
1930
+ "description": "Display PETSCII text with optional border and background colours.",
1931
+ "properties": {
1932
+ "text": {
1933
+ "type": "string",
1934
+ "description": "The PETSCII text to print after clearing the screen.",
1935
+ "minLength": 1
1936
+ },
1937
+ "borderColor": {
1938
+ "type": [
1939
+ "integer",
1940
+ "null"
1941
+ ],
1942
+ "description": "Border colour index (0-15).",
1943
+ "minimum": 0,
1944
+ "maximum": 15
1945
+ },
1946
+ "backgroundColor": {
1947
+ "type": [
1948
+ "integer",
1949
+ "null"
1950
+ ],
1951
+ "description": "Background colour index (0-15).",
1952
+ "minimum": 0,
1953
+ "maximum": 15
1954
+ },
1955
+ "op": {
1956
+ "const": "render_petscii_text"
1957
+ }
1958
+ },
1959
+ "required": [
1960
+ "text",
1961
+ "op"
1962
+ ],
1963
+ "additionalProperties": false
1964
+ },
1965
+ {
1966
+ "type": "object",
1967
+ "description": "Display supplied 63-byte sprite data at the requested position and colour by writing memory and patching VIC-II registers directly.",
1968
+ "properties": {
1969
+ "sprite": {
1970
+ "description": "63-byte sprite definition provided as base64/hex string or array of bytes.",
1971
+ "type": [
1972
+ "string",
1973
+ "array"
1974
+ ],
1975
+ "items": {
1976
+ "type": "integer",
1977
+ "minimum": 0,
1978
+ "maximum": 255
1979
+ },
1980
+ "minItems": 63,
1981
+ "maxItems": 63
1982
+ },
1983
+ "index": {
1984
+ "type": "integer",
1985
+ "description": "Sprite index (0-7) to configure in screen memory.",
1986
+ "minimum": 0,
1987
+ "maximum": 7,
1988
+ "default": 0
1989
+ },
1990
+ "x": {
1991
+ "type": "integer",
1992
+ "description": "Sprite X position (0-511).",
1993
+ "minimum": 0,
1994
+ "maximum": 511,
1995
+ "default": 100
1996
+ },
1997
+ "y": {
1998
+ "type": "integer",
1999
+ "description": "Sprite Y position (0-255).",
2000
+ "minimum": 0,
2001
+ "maximum": 255,
2002
+ "default": 100
2003
+ },
2004
+ "color": {
2005
+ "type": "integer",
2006
+ "description": "Sprite colour index (0-15).",
2007
+ "minimum": 0,
2008
+ "maximum": 15,
2009
+ "default": 1
2010
+ },
2011
+ "multicolour": {
2012
+ "type": "boolean",
2013
+ "description": "Enable multicolour mode for the sprite.",
2014
+ "default": false
2015
+ },
2016
+ "op": {
2017
+ "const": "render_sprite"
2018
+ }
2019
+ },
2020
+ "required": [
2021
+ "sprite",
2022
+ "op"
2023
+ ],
2024
+ "additionalProperties": false
2025
+ },
2026
+ {
2027
+ "type": "object",
2028
+ "description": "Import an image file, convert it to VIC-II bitmap memory, write it into RAM, and display it.",
2029
+ "properties": {
2030
+ "imagePath": {
2031
+ "type": "string",
2032
+ "description": "Filesystem path of the source image (PNG, JPEG, BMP, GIF, TIFF, and other Jimp-supported formats).",
2033
+ "minLength": 1
2034
+ },
2035
+ "format": {
2036
+ "description": "Bitmap encoding mode to generate for the VIC-II display.",
2037
+ "type": "string",
2038
+ "enum": [
2039
+ "hires",
2040
+ "multicolor"
2041
+ ]
2042
+ },
2043
+ "bitmapAddress": {
2044
+ "description": "Absolute C64 memory address, provided as an integer or hex string such as $2000.",
2045
+ "type": [
2046
+ "integer",
2047
+ "string",
2048
+ "null"
2049
+ ],
2050
+ "default": 8192
2051
+ },
2052
+ "screenAddress": {
2053
+ "description": "Absolute C64 memory address, provided as an integer or hex string such as $2000.",
2054
+ "type": [
2055
+ "integer",
2056
+ "string",
2057
+ "null"
2058
+ ],
2059
+ "default": 1024
2060
+ },
2061
+ "borderColor": {
2062
+ "type": [
2063
+ "integer",
2064
+ "null"
2065
+ ],
2066
+ "description": "Border colour index (0-15).",
2067
+ "minimum": 0,
2068
+ "maximum": 15,
2069
+ "default": 0
2070
+ },
2071
+ "backgroundColor": {
2072
+ "type": [
2073
+ "integer",
2074
+ "null"
2075
+ ],
2076
+ "description": "Background colour index (0-15). Used for multicolor mode and aspect-ratio padding.",
2077
+ "minimum": 0,
2078
+ "maximum": 15,
2079
+ "default": 0
2080
+ },
2081
+ "preserveAspect": {
2082
+ "type": "boolean",
2083
+ "description": "Preserve the source image aspect ratio and pad with the background colour.",
2084
+ "default": true
2085
+ },
2086
+ "op": {
2087
+ "const": "render_bitmap"
2088
+ }
2089
+ },
2090
+ "required": [
2091
+ "imagePath",
2092
+ "format",
2093
+ "op"
2094
+ ],
2095
+ "additionalProperties": false
2096
+ }
2097
+ ],
2098
+ "discriminator": {
2099
+ "propertyName": "op"
2100
+ }
2101
+ },
2102
+ "_meta": {
2103
+ "domain": "graphics",
2104
+ "summary": "Captures frames, renders PETSCII text or art, previews sprites, and displays bitmap images from one tool.",
2105
+ "lifecycle": "request-response",
2106
+ "resources": [
2107
+ "c64://specs/vic",
2108
+ "c64://specs/basic",
2109
+ "c64://specs/assembly"
2110
+ ],
2111
+ "prompts": [
2112
+ "graphics-demo",
2113
+ "basic-program",
2114
+ "assembly-program"
2115
+ ],
2116
+ "examples": [
2117
+ {
2118
+ "name": "Capture one frame",
2119
+ "description": "Grab the current framebuffer from the active backend",
2120
+ "arguments": {
2121
+ "op": "capture_frame"
2122
+ }
2123
+ },
2124
+ {
2125
+ "name": "Create PETSCII art (dry run)",
2126
+ "description": "Synthesize art without uploading to the C64",
2127
+ "arguments": {
2128
+ "op": "render_petscii_art",
2129
+ "prompt": "duck on a pond",
2130
+ "dryRun": true
2131
+ }
2132
+ },
2133
+ {
2134
+ "name": "Render PETSCII text",
2135
+ "description": "Print HELLO with blue border",
2136
+ "arguments": {
2137
+ "op": "render_petscii_text",
2138
+ "text": "HELLO",
2139
+ "borderColor": 6
2140
+ }
2141
+ },
2142
+ {
2143
+ "name": "Display sprite",
2144
+ "description": "Show sprite data at coordinates",
2145
+ "arguments": {
2146
+ "op": "render_sprite",
2147
+ "sprite": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
2148
+ }
2149
+ },
2150
+ {
2151
+ "name": "Import bitmap image",
2152
+ "description": "Convert a PNG into VIC bitmap memory and display it",
2153
+ "arguments": {
2154
+ "op": "render_bitmap",
2155
+ "imagePath": "./artifacts/sample.png",
2156
+ "format": "hires"
2157
+ }
2158
+ }
2159
+ ],
2160
+ "tags": [
2161
+ "graphics",
2162
+ "vic",
2163
+ "grouped"
2164
+ ],
2165
+ "workflowHints": [
2166
+ "Use render helpers for PETSCII text, PETSCII art, sprites, and bitmaps; clarify whether PETSCII art executed or stayed a dry run.",
2167
+ "Mention sprite positions/colours so follow-up memory inspection stays grounded."
2168
+ ],
2169
+ "platforms": [
2170
+ "c64u",
2171
+ "vice"
2172
+ ]
2173
+ }
2174
+ },
2175
+ {
2176
+ "name": "c64_rag",
2177
+ "title": "Returns curated knowledge references for BASIC or 6502/6510 assembly queries.",
2178
+ "description": "Grouped entry point for BASIC and assembly RAG lookups.",
2179
+ "inputSchema": {
2180
+ "type": "object",
2181
+ "description": "RAG operations available via the c64_rag tool.",
2182
+ "oneOf": [
2183
+ {
2184
+ "type": "object",
2185
+ "description": "Retrieve BASIC references and snippets from the local knowledge base.",
2186
+ "properties": {
2187
+ "q": {
2188
+ "type": "string",
2189
+ "description": "Natural-language query describing the desired BASIC or assembly guidance.",
2190
+ "minLength": 3
2191
+ },
2192
+ "k": {
2193
+ "type": [
2194
+ "integer",
2195
+ "null"
2196
+ ],
2197
+ "description": "Maximum number of references to return (1-12).",
2198
+ "minimum": 1,
2199
+ "maximum": 12,
2200
+ "default": 3
2201
+ },
2202
+ "op": {
2203
+ "const": "basic"
2204
+ }
2205
+ },
2206
+ "required": [
2207
+ "q",
2208
+ "op"
2209
+ ],
2210
+ "additionalProperties": false
2211
+ },
2212
+ {
2213
+ "type": "object",
2214
+ "description": "Retrieve 6502/6510 assembly references from the local knowledge base.",
2215
+ "properties": {
2216
+ "q": {
2217
+ "type": "string",
2218
+ "description": "Natural-language query describing the desired BASIC or assembly guidance.",
2219
+ "minLength": 3
2220
+ },
2221
+ "k": {
2222
+ "type": [
2223
+ "integer",
2224
+ "null"
2225
+ ],
2226
+ "description": "Maximum number of references to return (1-12).",
2227
+ "minimum": 1,
2228
+ "maximum": 12,
2229
+ "default": 3
2230
+ },
2231
+ "op": {
2232
+ "const": "asm"
2233
+ }
2234
+ },
2235
+ "required": [
2236
+ "q",
2237
+ "op"
2238
+ ],
2239
+ "additionalProperties": false
2240
+ }
2241
+ ],
2242
+ "discriminator": {
2243
+ "propertyName": "op"
2244
+ }
2245
+ },
2246
+ "_meta": {
2247
+ "domain": "rag",
2248
+ "summary": "Returns curated knowledge references for BASIC or 6502/6510 assembly queries.",
2249
+ "lifecycle": "request-response",
2250
+ "resources": [
2251
+ "c64://specs/basic",
2252
+ "c64://specs/assembly",
2253
+ "c64://context/bootstrap"
2254
+ ],
2255
+ "prompts": [
2256
+ "basic-program",
2257
+ "assembly-program"
2258
+ ],
2259
+ "examples": [
2260
+ {
2261
+ "name": "Retrieve BASIC snippet",
2262
+ "description": "Search for device 4 printing guidance",
2263
+ "arguments": {
2264
+ "op": "basic",
2265
+ "q": "basic print device 4"
2266
+ }
2267
+ },
2268
+ {
2269
+ "name": "Retrieve assembly snippet",
2270
+ "description": "Search for raster IRQ examples",
2271
+ "arguments": {
2272
+ "op": "asm",
2273
+ "q": "stable raster irq"
2274
+ }
2275
+ }
2276
+ ],
2277
+ "tags": [
2278
+ "rag",
2279
+ "search",
2280
+ "reference",
2281
+ "grouped"
2282
+ ],
2283
+ "workflowHints": [
2284
+ "Use BASIC retrieval before synthesising new BASIC code and mention primary resources in responses.",
2285
+ "For assembly, note registers or addresses surfaced so the user can inspect them further."
2286
+ ],
2287
+ "platforms": [
2288
+ "c64u",
2289
+ "vice"
2290
+ ]
2291
+ }
2292
+ },
2293
+ {
2294
+ "name": "c64_disk",
2295
+ "title": "Mount or unmount images, create new disks, list drives, and find programs from one tool.",
2296
+ "description": "Grouped entry point for disk mounts, listings, image creation, and program discovery.",
2297
+ "inputSchema": {
2298
+ "type": "object",
2299
+ "description": "Disk operations available via the c64_disk tool.",
2300
+ "oneOf": [
2301
+ {
2302
+ "type": "object",
2303
+ "description": "List Ultimate drive slots and their mounted images.",
2304
+ "properties": {
2305
+ "op": {
2306
+ "const": "list_drives"
2307
+ }
2308
+ },
2309
+ "additionalProperties": false,
2310
+ "required": [
2311
+ "op"
2312
+ ]
2313
+ },
2314
+ {
2315
+ "type": "object",
2316
+ "description": "Mount a disk image with optional verification and retries.",
2317
+ "properties": {
2318
+ "drive": {
2319
+ "type": "string",
2320
+ "description": "Drive identifier (for example drive8).",
2321
+ "minLength": 1
2322
+ },
2323
+ "image": {
2324
+ "type": "string",
2325
+ "description": "Absolute or Ultimate filesystem path to the disk image.",
2326
+ "minLength": 1
2327
+ },
2328
+ "type": {
2329
+ "type": [
2330
+ "string",
2331
+ "null"
2332
+ ],
2333
+ "description": "Override detected image type when firmware guesses incorrectly.",
2334
+ "enum": [
2335
+ "d64",
2336
+ "g64",
2337
+ "d71",
2338
+ "g71",
2339
+ "d81"
2340
+ ]
2341
+ },
2342
+ "attachmentMode": {
2343
+ "type": [
2344
+ "string",
2345
+ "null"
2346
+ ],
2347
+ "description": "Attachment mode controlling how the firmware treats the mounted image.",
2348
+ "enum": [
2349
+ "readwrite",
2350
+ "readonly",
2351
+ "unlinked"
2352
+ ]
2353
+ },
2354
+ "driveMode": {
2355
+ "type": [
2356
+ "string",
2357
+ "null"
2358
+ ],
2359
+ "description": "Drive emulation mode to switch to during verification.",
2360
+ "enum": [
2361
+ "1541",
2362
+ "1571",
2363
+ "1581"
2364
+ ]
2365
+ },
2366
+ "verify": {
2367
+ "type": "boolean",
2368
+ "description": "When true, power on/reset/verify using the reliability workflow.",
2369
+ "default": false
2370
+ },
2371
+ "powerOnIfNeeded": {
2372
+ "type": "boolean",
2373
+ "description": "Power on the drive automatically before mounting when verify=true.",
2374
+ "default": true
2375
+ },
2376
+ "resetAfterMount": {
2377
+ "type": "boolean",
2378
+ "description": "Issue a drive reset after mounting when verify=true.",
2379
+ "default": true
2380
+ },
2381
+ "maxRetries": {
2382
+ "type": "integer",
2383
+ "description": "Maximum number of mount retries when verify=true.",
2384
+ "minimum": 0,
2385
+ "maximum": 5,
2386
+ "default": 2
2387
+ },
2388
+ "retryDelayMs": {
2389
+ "type": "integer",
2390
+ "description": "Delay between mount retry attempts when verify=true.",
2391
+ "minimum": 0,
2392
+ "maximum": 5000,
2393
+ "default": 500
2394
+ },
2395
+ "op": {
2396
+ "const": "mount"
2397
+ }
2398
+ },
2399
+ "required": [
2400
+ "drive",
2401
+ "image",
2402
+ "op"
2403
+ ],
2404
+ "additionalProperties": false
2405
+ },
2406
+ {
2407
+ "type": "object",
2408
+ "description": "Remove the mounted image from an Ultimate drive slot.",
2409
+ "properties": {
2410
+ "drive": {
2411
+ "type": "string",
2412
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2413
+ "minLength": 1
2414
+ },
2415
+ "op": {
2416
+ "const": "unmount"
2417
+ }
2418
+ },
2419
+ "required": [
2420
+ "drive",
2421
+ "op"
2422
+ ],
2423
+ "additionalProperties": false
2424
+ },
2425
+ {
2426
+ "type": "object",
2427
+ "description": "Inspect metadata for a file on the Ultimate filesystem.",
2428
+ "properties": {
2429
+ "path": {
2430
+ "type": "string",
2431
+ "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
2432
+ "minLength": 1
2433
+ },
2434
+ "op": {
2435
+ "const": "file_info"
2436
+ }
2437
+ },
2438
+ "required": [
2439
+ "path",
2440
+ "op"
2441
+ ],
2442
+ "additionalProperties": false
2443
+ },
2444
+ {
2445
+ "type": "object",
2446
+ "description": "Create a blank disk image of the specified format.",
2447
+ "properties": {
2448
+ "format": {
2449
+ "type": "string",
2450
+ "description": "Disk image format to create.",
2451
+ "enum": [
2452
+ "d64",
2453
+ "d71",
2454
+ "d81",
2455
+ "dnp"
2456
+ ]
2457
+ },
2458
+ "path": {
2459
+ "type": "string",
2460
+ "description": "Destination path on the Ultimate filesystem.",
2461
+ "minLength": 1
2462
+ },
2463
+ "diskname": {
2464
+ "type": [
2465
+ "string",
2466
+ "null"
2467
+ ],
2468
+ "description": "Optional disk label (1-16 characters, converted to PETSCII).",
2469
+ "minLength": 1,
2470
+ "maxLength": 16
2471
+ },
2472
+ "tracks": {
2473
+ "type": [
2474
+ "integer",
2475
+ "null"
2476
+ ],
2477
+ "description": "Track count (D64 supports 35 or 40; DNP requires explicit tracks).",
2478
+ "minimum": 1,
2479
+ "maximum": 255
2480
+ },
2481
+ "op": {
2482
+ "const": "create_image"
2483
+ }
2484
+ },
2485
+ "required": [
2486
+ "format",
2487
+ "path",
2488
+ "op"
2489
+ ],
2490
+ "additionalProperties": false
2491
+ },
2492
+ {
2493
+ "type": "object",
2494
+ "description": "Search for a PRG/CRT by name substring and run the first match.",
2495
+ "properties": {
2496
+ "root": {
2497
+ "type": [
2498
+ "string",
2499
+ "null"
2500
+ ],
2501
+ "description": "Root path to search",
2502
+ "minLength": 1,
2503
+ "default": "/"
2504
+ },
2505
+ "nameContains": {
2506
+ "type": "string",
2507
+ "description": "Substring to match",
2508
+ "minLength": 1
2509
+ },
2510
+ "extensions": {
2511
+ "type": [
2512
+ "array",
2513
+ "null"
2514
+ ],
2515
+ "items": {
2516
+ "type": "string",
2517
+ "description": "File extensions to include (without dot)",
2518
+ "minLength": 1
2519
+ }
2520
+ },
2521
+ "caseInsensitive": {
2522
+ "type": [
2523
+ "boolean",
2524
+ "null"
2525
+ ],
2526
+ "description": "Case-insensitive name match",
2527
+ "default": true
2528
+ },
2529
+ "sort": {
2530
+ "type": [
2531
+ "string",
2532
+ "null"
2533
+ ],
2534
+ "description": "Sort order for matches",
2535
+ "enum": [
2536
+ "discovered",
2537
+ "alphabetical"
2538
+ ],
2539
+ "default": "discovered"
2540
+ },
2541
+ "waitMs": {
2542
+ "type": [
2543
+ "integer",
2544
+ "null"
2545
+ ],
2546
+ "description": "Delay after firmware run before returning",
2547
+ "minimum": 0,
2548
+ "default": 0
2549
+ },
2550
+ "captureCandidates": {
2551
+ "type": [
2552
+ "integer",
2553
+ "null"
2554
+ ],
2555
+ "description": "Include up to this many candidates in result",
2556
+ "minimum": 1,
2557
+ "maximum": 100,
2558
+ "default": 10
2559
+ },
2560
+ "op": {
2561
+ "const": "find_and_run"
2562
+ }
2563
+ },
2564
+ "required": [
2565
+ "nameContains",
2566
+ "op"
2567
+ ],
2568
+ "additionalProperties": false
2569
+ }
2570
+ ],
2571
+ "discriminator": {
2572
+ "propertyName": "op"
2573
+ }
2574
+ },
2575
+ "_meta": {
2576
+ "domain": "storage",
2577
+ "summary": "Mount or unmount images, create new disks, list drives, and find programs from one tool.",
2578
+ "lifecycle": "request-response",
2579
+ "resources": [
2580
+ "c64://context/bootstrap"
2581
+ ],
2582
+ "prompts": [
2583
+ "drive-management"
2584
+ ],
2585
+ "examples": [
2586
+ {
2587
+ "name": "Mount image with verification",
2588
+ "description": "Power on drive8, mount image, and verify",
2589
+ "arguments": {
2590
+ "op": "mount",
2591
+ "drive": "drive8",
2592
+ "image": "/tmp/demo.d64",
2593
+ "verify": true
2594
+ }
2595
+ },
2596
+ {
2597
+ "name": "Create D81",
2598
+ "description": "Create blank D81 image",
2599
+ "arguments": {
2600
+ "op": "create_image",
2601
+ "format": "d81",
2602
+ "path": "/tmp/new.d81"
2603
+ }
2604
+ },
2605
+ {
2606
+ "name": "List drives",
2607
+ "description": "Fetch drive status",
2608
+ "arguments": {
2609
+ "op": "list_drives"
2610
+ }
2611
+ }
2612
+ ],
2613
+ "tags": [
2614
+ "storage",
2615
+ "drive",
2616
+ "grouped"
2617
+ ],
2618
+ "workflowHints": [
2619
+ "Summarise drive state before and after mounts so the user can confirm hardware changes.",
2620
+ "Call out when verification retries succeed or fail so follow-up actions are clear."
2621
+ ],
2622
+ "platforms": [
2623
+ "c64u",
2624
+ "vice"
2625
+ ],
2626
+ "operationPlatforms": {
2627
+ "file_info": [
2628
+ "c64u"
2629
+ ],
2630
+ "create_image": [
2631
+ "c64u"
2632
+ ],
2633
+ "find_and_run": [
2634
+ "c64u"
2635
+ ]
2636
+ }
2637
+ }
2638
+ },
2639
+ {
2640
+ "name": "c64_drive",
2641
+ "title": "Power cycle drive slots, reset IEC state, switch emulation modes, or load custom ROMs.",
2642
+ "description": "Grouped entry point for drive power, mode, reset, and ROM operations.",
2643
+ "inputSchema": {
2644
+ "type": "object",
2645
+ "description": "Drive operations available via the c64_drive tool.",
2646
+ "oneOf": [
2647
+ {
2648
+ "type": "object",
2649
+ "description": "Issue an IEC reset for the selected drive slot.",
2650
+ "properties": {
2651
+ "drive": {
2652
+ "type": "string",
2653
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2654
+ "minLength": 1
2655
+ },
2656
+ "op": {
2657
+ "const": "reset"
2658
+ }
2659
+ },
2660
+ "required": [
2661
+ "drive",
2662
+ "op"
2663
+ ],
2664
+ "additionalProperties": false
2665
+ },
2666
+ {
2667
+ "type": "object",
2668
+ "description": "Power on a specific Ultimate drive slot.",
2669
+ "properties": {
2670
+ "drive": {
2671
+ "type": "string",
2672
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2673
+ "minLength": 1
2674
+ },
2675
+ "op": {
2676
+ "const": "power_on"
2677
+ }
2678
+ },
2679
+ "required": [
2680
+ "drive",
2681
+ "op"
2682
+ ],
2683
+ "additionalProperties": false
2684
+ },
2685
+ {
2686
+ "type": "object",
2687
+ "description": "Power off a specific Ultimate drive slot.",
2688
+ "properties": {
2689
+ "drive": {
2690
+ "type": "string",
2691
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2692
+ "minLength": 1
2693
+ },
2694
+ "op": {
2695
+ "const": "power_off"
2696
+ }
2697
+ },
2698
+ "required": [
2699
+ "drive",
2700
+ "op"
2701
+ ],
2702
+ "additionalProperties": false
2703
+ },
2704
+ {
2705
+ "type": "object",
2706
+ "description": "Temporarily load a custom ROM into an Ultimate drive slot.",
2707
+ "properties": {
2708
+ "drive": {
2709
+ "type": "string",
2710
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2711
+ "minLength": 1
2712
+ },
2713
+ "path": {
2714
+ "type": "string",
2715
+ "description": "Absolute or Ultimate filesystem path to the disk image to mount or manage.",
2716
+ "minLength": 1
2717
+ },
2718
+ "op": {
2719
+ "const": "load_rom"
2720
+ }
2721
+ },
2722
+ "required": [
2723
+ "drive",
2724
+ "path",
2725
+ "op"
2726
+ ],
2727
+ "additionalProperties": false
2728
+ },
2729
+ {
2730
+ "type": "object",
2731
+ "description": "Set the emulation mode for a drive slot (1541/1571/1581).",
2732
+ "properties": {
2733
+ "drive": {
2734
+ "type": "string",
2735
+ "description": "Drive identifier such as drive8, drive9, or unit name defined in the Ultimate UI.",
2736
+ "minLength": 1
2737
+ },
2738
+ "mode": {
2739
+ "type": "string",
2740
+ "description": "Drive hardware profile to emulate.",
2741
+ "enum": [
2742
+ "1541",
2743
+ "1571",
2744
+ "1581"
2745
+ ]
2746
+ },
2747
+ "op": {
2748
+ "const": "set_mode"
2749
+ }
2750
+ },
2751
+ "required": [
2752
+ "drive",
2753
+ "mode",
2754
+ "op"
2755
+ ],
2756
+ "additionalProperties": false
2757
+ }
2758
+ ],
2759
+ "discriminator": {
2760
+ "propertyName": "op"
2761
+ }
2762
+ },
2763
+ "_meta": {
2764
+ "domain": "drive",
2765
+ "summary": "Power cycle drive slots, reset IEC state, switch emulation modes, or load custom ROMs.",
2766
+ "lifecycle": "request-response",
2767
+ "resources": [
2768
+ "c64://context/bootstrap"
2769
+ ],
2770
+ "prompts": [],
2771
+ "examples": [
2772
+ {
2773
+ "name": "Power on drive",
2774
+ "description": "Enable drive8",
2775
+ "arguments": {
2776
+ "op": "power_on",
2777
+ "drive": "drive8"
2778
+ }
2779
+ },
2780
+ {
2781
+ "name": "Set 1581 mode",
2782
+ "description": "Switch emulation mode",
2783
+ "arguments": {
2784
+ "op": "set_mode",
2785
+ "drive": "drive8",
2786
+ "mode": "1581"
2787
+ }
2788
+ }
2789
+ ],
2790
+ "tags": [
2791
+ "drive",
2792
+ "hardware",
2793
+ "grouped"
2794
+ ],
2795
+ "workflowHints": [
2796
+ "State the resulting power/mode/ROM so the user can reconcile IEC behaviour.",
2797
+ "Suggest running c64_disk (op list_drives) to confirm status when appropriate."
2798
+ ],
2799
+ "platforms": [
2800
+ "c64u",
2801
+ "vice"
2802
+ ],
2803
+ "operationPlatforms": {
2804
+ "load_rom": [
2805
+ "c64u"
2806
+ ]
2807
+ }
2808
+ }
2809
+ },
2810
+ {
2811
+ "name": "c64_printer",
2812
+ "title": "Print text or bitmaps and define custom characters for Commodore or Epson printers.",
2813
+ "description": "Grouped entry point for Commodore and Epson printing helpers.",
2814
+ "inputSchema": {
2815
+ "type": "object",
2816
+ "description": "Printer operations available via the c64_printer tool.",
2817
+ "oneOf": [
2818
+ {
2819
+ "type": "object",
2820
+ "description": "Generate BASIC that prints text to device 4.",
2821
+ "properties": {
2822
+ "text": {
2823
+ "type": "string",
2824
+ "description": "Text to print on the connected printer.",
2825
+ "minLength": 1
2826
+ },
2827
+ "target": {
2828
+ "description": "Printer target: Commodore MPS (PETSCII) or Epson FX (ESC/P).",
2829
+ "type": "string",
2830
+ "enum": [
2831
+ "commodore",
2832
+ "epson"
2833
+ ],
2834
+ "default": "commodore"
2835
+ },
2836
+ "secondaryAddress": {
2837
+ "description": "Secondary address for device 4 (0 = upper/graphics, 7 = lowercase).",
2838
+ "type": [
2839
+ "integer",
2840
+ "null"
2841
+ ],
2842
+ "enum": [
2843
+ 0,
2844
+ 7
2845
+ ]
2846
+ },
2847
+ "formFeed": {
2848
+ "type": "boolean",
2849
+ "description": "Emit a form-feed (CHR$(12)) at the end of the job.",
2850
+ "default": false
2851
+ },
2852
+ "op": {
2853
+ "const": "print_text"
2854
+ }
2855
+ },
2856
+ "required": [
2857
+ "text",
2858
+ "op"
2859
+ ],
2860
+ "additionalProperties": false
2861
+ },
2862
+ {
2863
+ "type": "object",
2864
+ "description": "Print a bitmap row via Commodore (BIM) or Epson ESC/P workflows.",
2865
+ "properties": {
2866
+ "printer": {
2867
+ "type": "string",
2868
+ "description": "Target printer family.",
2869
+ "enum": [
2870
+ "commodore",
2871
+ "epson"
2872
+ ],
2873
+ "default": "commodore"
2874
+ },
2875
+ "columns": {
2876
+ "type": "array",
2877
+ "description": "Sequence of bitmap columns.",
2878
+ "items": {
2879
+ "type": "integer",
2880
+ "description": "Bitmap column byte (0-255).",
2881
+ "minimum": 0,
2882
+ "maximum": 255
2883
+ },
2884
+ "minItems": 1
2885
+ },
2886
+ "repeats": {
2887
+ "type": [
2888
+ "integer",
2889
+ "null"
2890
+ ],
2891
+ "description": "Number of times to repeat the row (1-255).",
2892
+ "minimum": 1,
2893
+ "maximum": 255
2894
+ },
2895
+ "useSubRepeat": {
2896
+ "type": [
2897
+ "integer",
2898
+ "null"
2899
+ ],
2900
+ "description": "Repeat the next byte this many times (Commodore BIM SUB).",
2901
+ "minimum": 1,
2902
+ "maximum": 255
2903
+ },
2904
+ "secondaryAddress": {
2905
+ "type": [
2906
+ "integer",
2907
+ "null"
2908
+ ],
2909
+ "description": "Secondary address for device 4 (0 or 7).",
2910
+ "minimum": 0,
2911
+ "maximum": 7
2912
+ },
2913
+ "ensureMsb": {
2914
+ "type": "boolean",
2915
+ "description": "Ensure MSB set for Commodore printers.",
2916
+ "default": true
2917
+ },
2918
+ "mode": {
2919
+ "type": [
2920
+ "string",
2921
+ "null"
2922
+ ],
2923
+ "description": "Epson ESC/P graphics mode (K/L/Y/Z/*).",
2924
+ "minLength": 1,
2925
+ "maxLength": 1
2926
+ },
2927
+ "density": {
2928
+ "type": [
2929
+ "integer",
2930
+ "null"
2931
+ ],
2932
+ "description": "Density parameter when using Epson mode '*'.",
2933
+ "minimum": 0,
2934
+ "maximum": 3
2935
+ },
2936
+ "timesPerLine": {
2937
+ "type": [
2938
+ "integer",
2939
+ "null"
2940
+ ],
2941
+ "description": "Number of times to print the row per line (1-10).",
2942
+ "minimum": 1,
2943
+ "maximum": 10
2944
+ },
2945
+ "op": {
2946
+ "const": "print_bitmap"
2947
+ }
2948
+ },
2949
+ "required": [
2950
+ "printer",
2951
+ "columns",
2952
+ "op"
2953
+ ],
2954
+ "additionalProperties": false
2955
+ },
2956
+ {
2957
+ "type": "object",
2958
+ "description": "Define custom printer characters (Commodore DLL mode).",
2959
+ "properties": {
2960
+ "firstChar": {
2961
+ "type": "integer",
2962
+ "description": "PETSCII code of first character to redefine (33-126).",
2963
+ "minimum": 33,
2964
+ "maximum": 126
2965
+ },
2966
+ "chars": {
2967
+ "type": "array",
2968
+ "description": "Character definitions to upload (1-32).",
2969
+ "items": {
2970
+ "type": "object",
2971
+ "description": "Commodore MPS DLL character definition (11 columns).",
2972
+ "properties": {
2973
+ "a": {
2974
+ "description": "Attribute flag (0=normal, 1=graphics).",
2975
+ "type": [
2976
+ "integer",
2977
+ "null"
2978
+ ],
2979
+ "enum": [
2980
+ 0,
2981
+ 1
2982
+ ]
2983
+ },
2984
+ "columns": {
2985
+ "type": "array",
2986
+ "description": "11 column bytes describing the character.",
2987
+ "items": {
2988
+ "type": "integer",
2989
+ "description": "Column byte (0-255).",
2990
+ "minimum": 0,
2991
+ "maximum": 255
2992
+ },
2993
+ "minItems": 11,
2994
+ "maxItems": 11
2995
+ }
2996
+ },
2997
+ "required": [
2998
+ "columns"
2999
+ ],
3000
+ "additionalProperties": false
3001
+ },
3002
+ "minItems": 1,
3003
+ "maxItems": 32
3004
+ },
3005
+ "secondaryAddress": {
3006
+ "description": "Secondary address for device 4 (0 = upper/graphics, 7 = lowercase).",
3007
+ "type": [
3008
+ "integer",
3009
+ "null"
3010
+ ],
3011
+ "enum": [
3012
+ 0,
3013
+ 7
3014
+ ]
3015
+ },
3016
+ "op": {
3017
+ "const": "define_chars"
3018
+ }
3019
+ },
3020
+ "required": [
3021
+ "firstChar",
3022
+ "chars",
3023
+ "op"
3024
+ ],
3025
+ "additionalProperties": false
3026
+ }
3027
+ ],
3028
+ "discriminator": {
3029
+ "propertyName": "op"
3030
+ }
3031
+ },
3032
+ "_meta": {
3033
+ "domain": "printer",
3034
+ "summary": "Print text or bitmaps and define custom characters for Commodore or Epson printers.",
3035
+ "lifecycle": "request-response",
3036
+ "resources": [
3037
+ "c64://context/bootstrap"
3038
+ ],
3039
+ "prompts": [],
3040
+ "examples": [
3041
+ {
3042
+ "name": "Print text",
3043
+ "description": "Generate BASIC for device 4",
3044
+ "arguments": {
3045
+ "op": "print_text",
3046
+ "text": "HELLO",
3047
+ "ensureReturn": true
3048
+ }
3049
+ },
3050
+ {
3051
+ "name": "Print bitmap",
3052
+ "description": "Send Epson graphics row",
3053
+ "arguments": {
3054
+ "op": "print_bitmap",
3055
+ "printer": "epson",
3056
+ "columns": [
3057
+ 0,
3058
+ 255,
3059
+ 0
3060
+ ],
3061
+ "mode": "*",
3062
+ "density": 3
3063
+ }
3064
+ }
3065
+ ],
3066
+ "tags": [
3067
+ "printer",
3068
+ "device",
3069
+ "grouped"
3070
+ ],
3071
+ "workflowHints": [
3072
+ "Mention device/secondary addresses so the user knows which printer workflow ran.",
3073
+ "When defining characters, remind the user to send the BASIC program returned in the payload."
3074
+ ],
3075
+ "platforms": [
3076
+ "c64u"
3077
+ ]
3078
+ }
3079
+ },
3080
+ {
3081
+ "name": "c64_config",
3082
+ "title": "List or update settings, access firmware info, take snapshots, and run program shuffle workflows.",
3083
+ "description": "Grouped entry point for configuration reads/writes, diagnostics, and snapshots.",
3084
+ "inputSchema": {
3085
+ "type": "object",
3086
+ "description": "Configuration operations available via the c64_config tool.",
3087
+ "oneOf": [
3088
+ {
3089
+ "type": "object",
3090
+ "description": "List configuration categories reported by the firmware.",
3091
+ "properties": {
3092
+ "op": {
3093
+ "const": "list"
3094
+ }
3095
+ },
3096
+ "additionalProperties": false,
3097
+ "required": [
3098
+ "op"
3099
+ ]
3100
+ },
3101
+ {
3102
+ "type": "object",
3103
+ "description": "Read a configuration category or specific item.",
3104
+ "properties": {
3105
+ "category": {
3106
+ "type": "string",
3107
+ "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio').",
3108
+ "minLength": 1
3109
+ },
3110
+ "item": {
3111
+ "type": [
3112
+ "string",
3113
+ "null"
3114
+ ],
3115
+ "description": "Specific configuration item inside the selected category (e.g. 'Volume').",
3116
+ "minLength": 1
3117
+ },
3118
+ "op": {
3119
+ "const": "get"
3120
+ }
3121
+ },
3122
+ "required": [
3123
+ "category",
3124
+ "op"
3125
+ ],
3126
+ "additionalProperties": false
3127
+ },
3128
+ {
3129
+ "type": "object",
3130
+ "description": "Write a configuration value in the selected category.",
3131
+ "properties": {
3132
+ "category": {
3133
+ "type": "string",
3134
+ "description": "Configuration category reported by the Ultimate firmware (e.g. 'Audio').",
3135
+ "minLength": 1
3136
+ },
3137
+ "item": {
3138
+ "type": "string",
3139
+ "description": "Configuration item name inside the category.",
3140
+ "minLength": 1
3141
+ },
3142
+ "value": {
3143
+ "description": "Primitive configuration value (string, number, or boolean).",
3144
+ "type": [
3145
+ "string",
3146
+ "number",
3147
+ "boolean"
3148
+ ]
3149
+ },
3150
+ "op": {
3151
+ "const": "set"
3152
+ }
3153
+ },
3154
+ "required": [
3155
+ "category",
3156
+ "item",
3157
+ "value",
3158
+ "op"
3159
+ ],
3160
+ "additionalProperties": false
3161
+ },
3162
+ {
3163
+ "description": "Apply multiple configuration updates in a single request.",
3164
+ "type": "object",
3165
+ "additionalProperties": {
3166
+ "type": "object",
3167
+ "additionalProperties": {
3168
+ "type": [
3169
+ "string",
3170
+ "number",
3171
+ "boolean"
3172
+ ]
3173
+ }
3174
+ },
3175
+ "properties": {
3176
+ "op": {
3177
+ "const": "batch_update"
3178
+ }
3179
+ },
3180
+ "required": [
3181
+ "op"
3182
+ ]
3183
+ },
3184
+ {
3185
+ "type": "object",
3186
+ "description": "Load configuration from flash storage.",
3187
+ "properties": {
3188
+ "op": {
3189
+ "const": "load_flash"
3190
+ }
3191
+ },
3192
+ "additionalProperties": false,
3193
+ "required": [
3194
+ "op"
3195
+ ]
3196
+ },
3197
+ {
3198
+ "type": "object",
3199
+ "description": "Persist the current configuration to flash storage.",
3200
+ "properties": {
3201
+ "op": {
3202
+ "const": "save_flash"
3203
+ }
3204
+ },
3205
+ "additionalProperties": false,
3206
+ "required": [
3207
+ "op"
3208
+ ]
3209
+ },
3210
+ {
3211
+ "type": "object",
3212
+ "description": "Reset firmware configuration to factory defaults.",
3213
+ "properties": {
3214
+ "op": {
3215
+ "const": "reset_defaults"
3216
+ }
3217
+ },
3218
+ "additionalProperties": false,
3219
+ "required": [
3220
+ "op"
3221
+ ]
3222
+ },
3223
+ {
3224
+ "type": "object",
3225
+ "description": "Read the Ultimate debug register ($D7FF).",
3226
+ "properties": {
3227
+ "op": {
3228
+ "const": "read_debugreg"
3229
+ }
3230
+ },
3231
+ "additionalProperties": false,
3232
+ "required": [
3233
+ "op"
3234
+ ]
3235
+ },
3236
+ {
3237
+ "type": "object",
3238
+ "description": "Write a hex value to the Ultimate debug register ($D7FF).",
3239
+ "properties": {
3240
+ "value": {
3241
+ "type": "string",
3242
+ "description": "Hex value (00-FF) to write to the debug register.",
3243
+ "minLength": 1,
3244
+ "maxLength": 2,
3245
+ "pattern": "^[0-9A-Fa-f]{1,2}$"
3246
+ },
3247
+ "op": {
3248
+ "const": "write_debugreg"
3249
+ }
3250
+ },
3251
+ "required": [
3252
+ "value",
3253
+ "op"
3254
+ ],
3255
+ "additionalProperties": false
3256
+ },
3257
+ {
3258
+ "type": "object",
3259
+ "description": "Retrieve Ultimate hardware information and status.",
3260
+ "properties": {
3261
+ "op": {
3262
+ "const": "info"
3263
+ }
3264
+ },
3265
+ "additionalProperties": false,
3266
+ "required": [
3267
+ "op"
3268
+ ]
3269
+ },
3270
+ {
3271
+ "type": "object",
3272
+ "description": "Fetch firmware version details.",
3273
+ "properties": {
3274
+ "op": {
3275
+ "const": "version"
3276
+ }
3277
+ },
3278
+ "additionalProperties": false,
3279
+ "required": [
3280
+ "op"
3281
+ ]
3282
+ },
3283
+ {
3284
+ "type": "object",
3285
+ "description": "Snapshot configuration to disk for later restore or diff.",
3286
+ "properties": {
3287
+ "path": {
3288
+ "type": "string",
3289
+ "description": "Absolute or workspace-relative path where the snapshot file will be written.",
3290
+ "minLength": 1
3291
+ },
3292
+ "op": {
3293
+ "const": "snapshot"
3294
+ }
3295
+ },
3296
+ "required": [
3297
+ "path",
3298
+ "op"
3299
+ ],
3300
+ "additionalProperties": false
3301
+ },
3302
+ {
3303
+ "type": "object",
3304
+ "description": "Restore configuration from a snapshot file.",
3305
+ "properties": {
3306
+ "path": {
3307
+ "type": "string",
3308
+ "description": "Snapshot file to read (must contain categories payload).",
3309
+ "minLength": 1
3310
+ },
3311
+ "applyToFlash": {
3312
+ "type": [
3313
+ "boolean",
3314
+ "null"
3315
+ ],
3316
+ "description": "When true, save the restored configuration to flash immediately.",
3317
+ "default": false
3318
+ },
3319
+ "op": {
3320
+ "const": "restore"
3321
+ }
3322
+ },
3323
+ "required": [
3324
+ "path",
3325
+ "op"
3326
+ ],
3327
+ "additionalProperties": false
3328
+ },
3329
+ {
3330
+ "type": "object",
3331
+ "description": "Compare the current configuration with a snapshot.",
3332
+ "properties": {
3333
+ "path": {
3334
+ "type": "string",
3335
+ "description": "Snapshot file to compare with.",
3336
+ "minLength": 1
3337
+ },
3338
+ "op": {
3339
+ "const": "diff"
3340
+ }
3341
+ },
3342
+ "required": [
3343
+ "path",
3344
+ "op"
3345
+ ],
3346
+ "additionalProperties": false
3347
+ },
3348
+ {
3349
+ "type": "object",
3350
+ "description": "Discover PRG/CRT files and run each with optional screen capture.",
3351
+ "properties": {
3352
+ "root": {
3353
+ "type": [
3354
+ "string",
3355
+ "null"
3356
+ ],
3357
+ "description": "Root path to search for programs",
3358
+ "minLength": 1,
3359
+ "default": "/"
3360
+ },
3361
+ "extensions": {
3362
+ "type": [
3363
+ "array",
3364
+ "null"
3365
+ ],
3366
+ "items": {
3367
+ "type": "string",
3368
+ "description": "File extensions to include (without dot)",
3369
+ "minLength": 1
3370
+ },
3371
+ "default": [
3372
+ "prg",
3373
+ "crt"
3374
+ ]
3375
+ },
3376
+ "durationMs": {
3377
+ "type": [
3378
+ "integer",
3379
+ "null"
3380
+ ],
3381
+ "description": "Duration to run each program in milliseconds",
3382
+ "minimum": 1,
3383
+ "default": 5000
3384
+ },
3385
+ "captureScreen": {
3386
+ "type": [
3387
+ "boolean",
3388
+ "null"
3389
+ ],
3390
+ "description": "Capture screen after each run",
3391
+ "default": true
3392
+ },
3393
+ "maxPrograms": {
3394
+ "type": [
3395
+ "integer",
3396
+ "null"
3397
+ ],
3398
+ "description": "Maximum number of programs to run",
3399
+ "minimum": 1,
3400
+ "default": 10
3401
+ },
3402
+ "outputPath": {
3403
+ "type": [
3404
+ "string",
3405
+ "null"
3406
+ ],
3407
+ "description": "Output directory for run logs and captures",
3408
+ "minLength": 1
3409
+ },
3410
+ "resetDelayMs": {
3411
+ "type": [
3412
+ "integer",
3413
+ "null"
3414
+ ],
3415
+ "description": "Delay after reset operations to allow the platform to settle.",
3416
+ "minimum": 0,
3417
+ "maximum": 1000,
3418
+ "default": 100
3419
+ },
3420
+ "op": {
3421
+ "const": "shuffle"
3422
+ }
3423
+ },
3424
+ "additionalProperties": false,
3425
+ "required": [
3426
+ "op"
3427
+ ]
3428
+ }
3429
+ ],
3430
+ "discriminator": {
3431
+ "propertyName": "op"
3432
+ }
3433
+ },
3434
+ "_meta": {
3435
+ "domain": "config",
3436
+ "summary": "List or update settings, access firmware info, take snapshots, and run program shuffle workflows.",
3437
+ "lifecycle": "request-response",
3438
+ "resources": [
3439
+ "c64://context/bootstrap",
3440
+ "c64://docs/index"
3441
+ ],
3442
+ "prompts": [
3443
+ "memory-debug"
3444
+ ],
3445
+ "examples": [
3446
+ {
3447
+ "name": "List categories",
3448
+ "description": "Enumerate configuration categories",
3449
+ "arguments": {
3450
+ "op": "list"
3451
+ }
3452
+ },
3453
+ {
3454
+ "name": "Set volume",
3455
+ "description": "Adjust audio volume to 70",
3456
+ "arguments": {
3457
+ "op": "set",
3458
+ "category": "Audio",
3459
+ "item": "Volume",
3460
+ "value": 70
3461
+ }
3462
+ },
3463
+ {
3464
+ "name": "Snapshot config",
3465
+ "description": "Write configuration snapshot to disk",
3466
+ "arguments": {
3467
+ "op": "snapshot",
3468
+ "path": "./snapshots/c64_json"
3469
+ }
3470
+ }
3471
+ ],
3472
+ "tags": [
3473
+ "config",
3474
+ "diagnostics",
3475
+ "grouped"
3476
+ ],
3477
+ "workflowHints": [
3478
+ "List categories before changing values so users can confirm firmware-provided names.",
3479
+ "Mention when operations persist to flash or modify debug registers to highlight impacts.",
3480
+ "Call out snapshot file paths so users can version-control or reuse them later."
3481
+ ],
3482
+ "platforms": [
3483
+ "c64u",
3484
+ "vice"
3485
+ ],
3486
+ "operationPlatforms": {
3487
+ "load_flash": [
3488
+ "c64u"
3489
+ ],
3490
+ "save_flash": [
3491
+ "c64u"
3492
+ ],
3493
+ "reset_defaults": [
3494
+ "c64u"
3495
+ ],
3496
+ "read_debugreg": [
3497
+ "c64u"
3498
+ ],
3499
+ "write_debugreg": [
3500
+ "c64u"
3501
+ ],
3502
+ "shuffle": [
3503
+ "c64u"
3504
+ ]
3505
+ }
3506
+ }
3507
+ },
3508
+ {
3509
+ "name": "c64_extract",
3510
+ "title": "Export sprites or charsets, dump RAM, compute filesystem stats, or run firmware health checks.",
3511
+ "description": "Grouped entry point for sprite/charset extraction, memory dumps, filesystem stats, and firmware health checks.",
3512
+ "inputSchema": {
3513
+ "type": "object",
3514
+ "description": "Extraction operations available via the c64_extract tool.",
3515
+ "oneOf": [
3516
+ {
3517
+ "type": "object",
3518
+ "description": "Scan RAM for sprites and optionally export .spr files.",
3519
+ "properties": {
3520
+ "address": {
3521
+ "type": "string",
3522
+ "description": "Start address ($HHHH or decimal)",
3523
+ "minLength": 1
3524
+ },
3525
+ "length": {
3526
+ "type": "integer",
3527
+ "description": "Number of bytes to scan",
3528
+ "minimum": 63,
3529
+ "maximum": 65536
3530
+ },
3531
+ "stride": {
3532
+ "type": [
3533
+ "integer",
3534
+ "null"
3535
+ ],
3536
+ "description": "Stride between sprite candidates in bytes",
3537
+ "minimum": 1,
3538
+ "default": 64
3539
+ },
3540
+ "maxSprites": {
3541
+ "type": [
3542
+ "integer",
3543
+ "null"
3544
+ ],
3545
+ "description": "Maximum sprites to return",
3546
+ "minimum": 1,
3547
+ "maximum": 256,
3548
+ "default": 16
3549
+ },
3550
+ "minNonZeroRows": {
3551
+ "type": [
3552
+ "integer",
3553
+ "null"
3554
+ ],
3555
+ "description": "Minimum non-empty rows required",
3556
+ "minimum": 1,
3557
+ "maximum": 21,
3558
+ "default": 4
3559
+ },
3560
+ "minSetBits": {
3561
+ "type": [
3562
+ "integer",
3563
+ "null"
3564
+ ],
3565
+ "description": "Minimum number of set bits required",
3566
+ "minimum": 1,
3567
+ "maximum": 504,
3568
+ "default": 12
3569
+ },
3570
+ "includeBase64": {
3571
+ "type": [
3572
+ "boolean",
3573
+ "null"
3574
+ ],
3575
+ "description": "Include base64 data in response",
3576
+ "default": true
3577
+ },
3578
+ "outputDir": {
3579
+ "type": [
3580
+ "string",
3581
+ "null"
3582
+ ],
3583
+ "description": "Directory to write .spr files",
3584
+ "minLength": 1
3585
+ },
3586
+ "pauseDuringRead": {
3587
+ "type": [
3588
+ "boolean",
3589
+ "null"
3590
+ ],
3591
+ "description": "Pause the machine during memory read",
3592
+ "default": true
3593
+ },
3594
+ "op": {
3595
+ "const": "sprites"
3596
+ }
3597
+ },
3598
+ "required": [
3599
+ "address",
3600
+ "length",
3601
+ "op"
3602
+ ],
3603
+ "additionalProperties": false
3604
+ },
3605
+ {
3606
+ "type": "object",
3607
+ "description": "Locate and extract 2KB character sets from RAM.",
3608
+ "properties": {
3609
+ "address": {
3610
+ "type": [
3611
+ "string",
3612
+ "null"
3613
+ ],
3614
+ "description": "Start address to scan ($HHHH or decimal). If not provided, scans common locations.",
3615
+ "minLength": 1
3616
+ },
3617
+ "scanRange": {
3618
+ "type": [
3619
+ "string",
3620
+ "null"
3621
+ ],
3622
+ "description": "Range to scan if address not provided: 'common' or 'full'",
3623
+ "enum": [
3624
+ "common",
3625
+ "full"
3626
+ ],
3627
+ "default": "common"
3628
+ },
3629
+ "outputPath": {
3630
+ "type": [
3631
+ "string",
3632
+ "null"
3633
+ ],
3634
+ "description": "File path to write charset binary",
3635
+ "minLength": 1
3636
+ },
3637
+ "pauseDuringRead": {
3638
+ "type": [
3639
+ "boolean",
3640
+ "null"
3641
+ ],
3642
+ "description": "Pause the machine during memory read",
3643
+ "default": true
3644
+ },
3645
+ "minNonEmptyChars": {
3646
+ "type": [
3647
+ "integer",
3648
+ "null"
3649
+ ],
3650
+ "description": "Minimum non-empty characters required",
3651
+ "minimum": 1,
3652
+ "maximum": 256,
3653
+ "default": 32
3654
+ },
3655
+ "minEntropy": {
3656
+ "type": [
3657
+ "number",
3658
+ "null"
3659
+ ],
3660
+ "description": "Minimum average entropy threshold",
3661
+ "minimum": 0,
3662
+ "maximum": 1,
3663
+ "default": 0.3
3664
+ },
3665
+ "op": {
3666
+ "const": "charset"
3667
+ }
3668
+ },
3669
+ "additionalProperties": false,
3670
+ "required": [
3671
+ "op"
3672
+ ]
3673
+ },
3674
+ {
3675
+ "type": "object",
3676
+ "description": "Dump a RAM range to hex or binary files with manifest metadata.",
3677
+ "properties": {
3678
+ "address": {
3679
+ "type": "string",
3680
+ "description": "Start address ($HHHH or decimal)",
3681
+ "minLength": 1
3682
+ },
3683
+ "length": {
3684
+ "type": "integer",
3685
+ "description": "Number of bytes to dump",
3686
+ "minimum": 1,
3687
+ "maximum": 65536
3688
+ },
3689
+ "outputPath": {
3690
+ "type": "string",
3691
+ "description": "Destination file path",
3692
+ "minLength": 1
3693
+ },
3694
+ "format": {
3695
+ "type": [
3696
+ "string",
3697
+ "null"
3698
+ ],
3699
+ "description": "Output format: hex|binary",
3700
+ "enum": [
3701
+ "hex",
3702
+ "binary"
3703
+ ],
3704
+ "default": "hex"
3705
+ },
3706
+ "chunkSize": {
3707
+ "type": [
3708
+ "integer",
3709
+ "null"
3710
+ ],
3711
+ "description": "Chunk size for reads",
3712
+ "minimum": 1,
3713
+ "maximum": 4096,
3714
+ "default": 512
3715
+ },
3716
+ "pauseDuringRead": {
3717
+ "type": [
3718
+ "boolean",
3719
+ "null"
3720
+ ],
3721
+ "description": "Pause/resume around dump",
3722
+ "default": true
3723
+ },
3724
+ "retries": {
3725
+ "type": [
3726
+ "integer",
3727
+ "null"
3728
+ ],
3729
+ "description": "Retries per chunk on failure",
3730
+ "minimum": 0,
3731
+ "default": 1
3732
+ },
3733
+ "op": {
3734
+ "const": "memory_dump"
3735
+ }
3736
+ },
3737
+ "required": [
3738
+ "address",
3739
+ "length",
3740
+ "outputPath",
3741
+ "op"
3742
+ ],
3743
+ "additionalProperties": false
3744
+ },
3745
+ {
3746
+ "type": "object",
3747
+ "description": "Walk the filesystem and aggregate counts/bytes by extension.",
3748
+ "properties": {
3749
+ "root": {
3750
+ "type": [
3751
+ "string",
3752
+ "null"
3753
+ ],
3754
+ "description": "Root path to scan",
3755
+ "minLength": 1,
3756
+ "default": "/"
3757
+ },
3758
+ "extensions": {
3759
+ "type": [
3760
+ "array",
3761
+ "null"
3762
+ ],
3763
+ "items": {
3764
+ "type": "string",
3765
+ "description": "Limit to these extensions (without dot)",
3766
+ "minLength": 1
3767
+ }
3768
+ },
3769
+ "includeContainers": {
3770
+ "type": [
3771
+ "boolean",
3772
+ "null"
3773
+ ],
3774
+ "description": "Include container images (d64/d81/etc.) in extension stats",
3775
+ "default": true
3776
+ },
3777
+ "maxSamplesPerExtension": {
3778
+ "type": [
3779
+ "integer",
3780
+ "null"
3781
+ ],
3782
+ "description": "Number of sample paths to keep per extension",
3783
+ "minimum": 1,
3784
+ "maximum": 10,
3785
+ "default": 3
3786
+ },
3787
+ "op": {
3788
+ "const": "fs_stats"
3789
+ }
3790
+ },
3791
+ "additionalProperties": false,
3792
+ "required": [
3793
+ "op"
3794
+ ]
3795
+ },
3796
+ {
3797
+ "type": "object",
3798
+ "description": "Run firmware readiness checks and report status metrics.",
3799
+ "properties": {
3800
+ "op": {
3801
+ "const": "firmware_health"
3802
+ }
3803
+ },
3804
+ "additionalProperties": false,
3805
+ "required": [
3806
+ "op"
3807
+ ]
3808
+ }
3809
+ ],
3810
+ "discriminator": {
3811
+ "propertyName": "op"
3812
+ }
3813
+ },
3814
+ "_meta": {
3815
+ "domain": "extract",
3816
+ "summary": "Export sprites or charsets, dump RAM, compute filesystem stats, or run firmware health checks.",
3817
+ "lifecycle": "request-response",
3818
+ "resources": [
3819
+ "c64://context/bootstrap",
3820
+ "c64://specs/basic",
3821
+ "c64://specs/assembly"
3822
+ ],
3823
+ "prompts": [],
3824
+ "examples": [
3825
+ {
3826
+ "name": "Dump RAM to file",
3827
+ "description": "Write $0400-$07FF to hex file",
3828
+ "arguments": {
3829
+ "op": "memory_dump",
3830
+ "address": "$0400",
3831
+ "length": 1024,
3832
+ "outputPath": "./dumps/screen.hex"
3833
+ }
3834
+ },
3835
+ {
3836
+ "name": "Scan sprites",
3837
+ "description": "Scan $2000 for sprites",
3838
+ "arguments": {
3839
+ "op": "sprites",
3840
+ "address": "$2000",
3841
+ "length": 2048
3842
+ }
3843
+ }
3844
+ ],
3845
+ "tags": [
3846
+ "extract",
3847
+ "diagnostics",
3848
+ "grouped"
3849
+ ],
3850
+ "workflowHints": [
3851
+ "Pause the machine when advised so dumps and sprite scans remain stable.",
3852
+ "Summarise output file paths or sample counts so users can inspect artifacts quickly."
3853
+ ],
3854
+ "platforms": [
3855
+ "c64u"
3856
+ ]
3857
+ }
3858
+ },
3859
+ {
3860
+ "name": "c64_stream",
3861
+ "title": "Start or stop audio/video/debug streaming in a single tool.",
3862
+ "description": "Grouped entry point for starting and stopping Ultimate streaming sessions.",
3863
+ "inputSchema": {
3864
+ "type": "object",
3865
+ "description": "Streaming operations available via the c64_stream tool.",
3866
+ "oneOf": [
3867
+ {
3868
+ "type": "object",
3869
+ "description": "Start an Ultimate streaming session toward a host:port target.",
3870
+ "properties": {
3871
+ "stream": {
3872
+ "type": "string",
3873
+ "description": "Stream type to control (video/audio/debug).",
3874
+ "enum": [
3875
+ "video",
3876
+ "audio",
3877
+ "debug"
3878
+ ]
3879
+ },
3880
+ "target": {
3881
+ "type": "string",
3882
+ "description": "Destination host:port or UDP target understood by the firmware.",
3883
+ "minLength": 3
3884
+ },
3885
+ "op": {
3886
+ "const": "start"
3887
+ }
3888
+ },
3889
+ "required": [
3890
+ "stream",
3891
+ "target",
3892
+ "op"
3893
+ ],
3894
+ "additionalProperties": false
3895
+ },
3896
+ {
3897
+ "type": "object",
3898
+ "description": "Stop an active Ultimate streaming session.",
3899
+ "properties": {
3900
+ "stream": {
3901
+ "type": "string",
3902
+ "description": "Stream type to control (video/audio/debug).",
3903
+ "enum": [
3904
+ "video",
3905
+ "audio",
3906
+ "debug"
3907
+ ]
3908
+ },
3909
+ "op": {
3910
+ "const": "stop"
3911
+ }
3912
+ },
3913
+ "required": [
3914
+ "stream",
3915
+ "op"
3916
+ ],
3917
+ "additionalProperties": false
3918
+ }
3919
+ ],
3920
+ "discriminator": {
3921
+ "propertyName": "op"
3922
+ }
3923
+ },
3924
+ "_meta": {
3925
+ "domain": "stream",
3926
+ "summary": "Start or stop audio/video/debug streaming in a single tool.",
3927
+ "lifecycle": "request-response",
3928
+ "resources": [
3929
+ "c64://docs/index",
3930
+ "c64://specs/sid"
3931
+ ],
3932
+ "prompts": [
3933
+ "sid-music"
3934
+ ],
3935
+ "examples": [
3936
+ {
3937
+ "name": "Start audio stream",
3938
+ "description": "Send audio to localhost",
3939
+ "arguments": {
3940
+ "op": "start",
3941
+ "stream": "audio",
3942
+ "target": "127.0.0.1:9000"
3943
+ }
3944
+ },
3945
+ {
3946
+ "name": "Stop audio stream",
3947
+ "description": "Stop streaming",
3948
+ "arguments": {
3949
+ "op": "stop",
3950
+ "stream": "audio"
3951
+ }
3952
+ }
3953
+ ],
3954
+ "tags": [
3955
+ "stream",
3956
+ "monitor",
3957
+ "grouped"
3958
+ ],
3959
+ "workflowHints": [
3960
+ "Confirm stream targets for the user so they can connect their tooling.",
3961
+ "Remind users to stop streams when capture completes to free resources."
3962
+ ],
3963
+ "platforms": [
3964
+ "c64u"
3965
+ ]
3966
+ }
3967
+ },
3968
+ {
3969
+ "name": "c64_debug",
3970
+ "title": "Manage breakpoints, inspect registers, and step through code on the VICE backend.",
3971
+ "description": "Grouped entry point for VICE debugger operations (breakpoints, registers, stepping).",
3972
+ "inputSchema": {
3973
+ "type": "object",
3974
+ "description": "Available debugger operations.",
3975
+ "oneOf": [
3976
+ {
3977
+ "type": "object",
3978
+ "description": "List all active VICE checkpoints (breakpoints).",
3979
+ "properties": {
3980
+ "op": {
3981
+ "const": "list_checkpoints"
3982
+ }
3983
+ },
3984
+ "required": [
3985
+ "op"
3986
+ ],
3987
+ "additionalProperties": false
3988
+ },
3989
+ {
3990
+ "type": "object",
3991
+ "description": "Fetch a single checkpoint by id.",
3992
+ "properties": {
3993
+ "op": {
3994
+ "const": "get_checkpoint"
3995
+ },
3996
+ "id": {
3997
+ "type": "integer",
3998
+ "description": "Debugger checkpoint identifier.",
3999
+ "minimum": 1
4000
+ }
4001
+ },
4002
+ "required": [
4003
+ "op",
4004
+ "id"
4005
+ ],
4006
+ "additionalProperties": false
4007
+ },
4008
+ {
4009
+ "type": "object",
4010
+ "description": "Create a new checkpoint (breakpoint) in VICE.",
4011
+ "properties": {
4012
+ "op": {
4013
+ "const": "create_checkpoint"
4014
+ },
4015
+ "address": {
4016
+ "type": "string",
4017
+ "description": "Start address (e.g. $0801).",
4018
+ "minLength": 1
4019
+ },
4020
+ "endAddress": {
4021
+ "type": [
4022
+ "string",
4023
+ "null"
4024
+ ],
4025
+ "description": "Optional end address for range.",
4026
+ "minLength": 1
4027
+ },
4028
+ "stopOnHit": {
4029
+ "type": [
4030
+ "boolean",
4031
+ "null"
4032
+ ],
4033
+ "description": "Pause execution when hit (default true).",
4034
+ "default": true
4035
+ },
4036
+ "enabled": {
4037
+ "type": [
4038
+ "boolean",
4039
+ "null"
4040
+ ],
4041
+ "description": "Whether the checkpoint is enabled (default true).",
4042
+ "default": true
4043
+ },
4044
+ "temporary": {
4045
+ "type": [
4046
+ "boolean",
4047
+ "null"
4048
+ ],
4049
+ "description": "Automatically remove after first hit.",
4050
+ "default": false
4051
+ },
4052
+ "operations": {
4053
+ "type": [
4054
+ "object",
4055
+ "null"
4056
+ ],
4057
+ "description": "Checkpoint operation filters.",
4058
+ "properties": {
4059
+ "execute": {
4060
+ "type": [
4061
+ "boolean",
4062
+ "null"
4063
+ ],
4064
+ "description": "Trigger on execute (default true).",
4065
+ "default": true
4066
+ },
4067
+ "load": {
4068
+ "type": [
4069
+ "boolean",
4070
+ "null"
4071
+ ],
4072
+ "description": "Trigger on memory load.",
4073
+ "default": false
4074
+ },
4075
+ "store": {
4076
+ "type": [
4077
+ "boolean",
4078
+ "null"
4079
+ ],
4080
+ "description": "Trigger on memory store.",
4081
+ "default": false
4082
+ }
4083
+ },
4084
+ "additionalProperties": false
4085
+ },
4086
+ "memspace": {
4087
+ "type": [
4088
+ "integer",
4089
+ "null"
4090
+ ],
4091
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
4092
+ "minimum": 0,
4093
+ "maximum": 4
4094
+ }
4095
+ },
4096
+ "required": [
4097
+ "op",
4098
+ "address"
4099
+ ],
4100
+ "additionalProperties": false
4101
+ },
4102
+ {
4103
+ "type": "object",
4104
+ "description": "Remove a checkpoint by id.",
4105
+ "properties": {
4106
+ "op": {
4107
+ "const": "delete_checkpoint"
4108
+ },
4109
+ "id": {
4110
+ "type": "integer",
4111
+ "description": "Debugger checkpoint identifier.",
4112
+ "minimum": 1
4113
+ }
4114
+ },
4115
+ "required": [
4116
+ "op",
4117
+ "id"
4118
+ ],
4119
+ "additionalProperties": false
4120
+ },
4121
+ {
4122
+ "type": "object",
4123
+ "description": "Enable or disable a checkpoint by id.",
4124
+ "properties": {
4125
+ "op": {
4126
+ "const": "toggle_checkpoint"
4127
+ },
4128
+ "id": {
4129
+ "type": "integer",
4130
+ "description": "Debugger checkpoint identifier.",
4131
+ "minimum": 1
4132
+ },
4133
+ "enabled": {
4134
+ "type": "boolean",
4135
+ "description": "Set to true to enable, false to disable."
4136
+ }
4137
+ },
4138
+ "required": [
4139
+ "op",
4140
+ "id",
4141
+ "enabled"
4142
+ ],
4143
+ "additionalProperties": false
4144
+ },
4145
+ {
4146
+ "type": "object",
4147
+ "description": "Attach a conditional expression to a checkpoint.",
4148
+ "properties": {
4149
+ "op": {
4150
+ "const": "set_condition"
4151
+ },
4152
+ "id": {
4153
+ "type": "integer",
4154
+ "description": "Debugger checkpoint identifier.",
4155
+ "minimum": 1
4156
+ },
4157
+ "expression": {
4158
+ "type": "string",
4159
+ "description": "VICE monitor conditional expression.",
4160
+ "minLength": 1
4161
+ }
4162
+ },
4163
+ "required": [
4164
+ "op",
4165
+ "id",
4166
+ "expression"
4167
+ ],
4168
+ "additionalProperties": false
4169
+ },
4170
+ {
4171
+ "type": "object",
4172
+ "description": "List available registers (metadata).",
4173
+ "properties": {
4174
+ "op": {
4175
+ "const": "list_registers"
4176
+ },
4177
+ "memspace": {
4178
+ "type": [
4179
+ "integer",
4180
+ "null"
4181
+ ],
4182
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
4183
+ "minimum": 0,
4184
+ "maximum": 4
4185
+ }
4186
+ },
4187
+ "required": [
4188
+ "op"
4189
+ ],
4190
+ "additionalProperties": false
4191
+ },
4192
+ {
4193
+ "type": "object",
4194
+ "description": "Read register values, optionally filtered by name or id.",
4195
+ "properties": {
4196
+ "op": {
4197
+ "const": "get_registers"
4198
+ },
4199
+ "memspace": {
4200
+ "type": [
4201
+ "integer",
4202
+ "null"
4203
+ ],
4204
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
4205
+ "minimum": 0,
4206
+ "maximum": 4
4207
+ },
4208
+ "registers": {
4209
+ "type": [
4210
+ "array",
4211
+ "null"
4212
+ ],
4213
+ "description": "Registers to include.",
4214
+ "items": {
4215
+ "type": "object",
4216
+ "description": "Selects a register by id or name.",
4217
+ "properties": {
4218
+ "name": {
4219
+ "type": [
4220
+ "string",
4221
+ "null"
4222
+ ],
4223
+ "description": "Register name (case-insensitive)."
4224
+ },
4225
+ "id": {
4226
+ "type": [
4227
+ "integer",
4228
+ "null"
4229
+ ],
4230
+ "description": "Register id.",
4231
+ "minimum": 0
4232
+ }
4233
+ },
4234
+ "additionalProperties": false
4235
+ }
4236
+ }
4237
+ },
4238
+ "required": [
4239
+ "op"
4240
+ ],
4241
+ "additionalProperties": false
4242
+ },
4243
+ {
4244
+ "type": "object",
4245
+ "description": "Write register values.",
4246
+ "properties": {
4247
+ "op": {
4248
+ "const": "set_registers"
4249
+ },
4250
+ "memspace": {
4251
+ "type": [
4252
+ "integer",
4253
+ "null"
4254
+ ],
4255
+ "description": "VICE memory space (0=CPU, 1=Drive8, etc.).",
4256
+ "minimum": 0,
4257
+ "maximum": 4
4258
+ },
4259
+ "writes": {
4260
+ "type": "array",
4261
+ "description": "Register writes to apply.",
4262
+ "items": {
4263
+ "type": "object",
4264
+ "description": "Register write descriptor.",
4265
+ "properties": {
4266
+ "name": {
4267
+ "type": [
4268
+ "string",
4269
+ "null"
4270
+ ],
4271
+ "description": "Register name (case-insensitive)."
4272
+ },
4273
+ "id": {
4274
+ "type": [
4275
+ "integer",
4276
+ "null"
4277
+ ],
4278
+ "description": "Register id.",
4279
+ "minimum": 0
4280
+ },
4281
+ "value": {
4282
+ "type": "integer",
4283
+ "description": "Value to write.",
4284
+ "minimum": 0
4285
+ }
4286
+ },
4287
+ "required": [
4288
+ "value"
4289
+ ],
4290
+ "additionalProperties": false
4291
+ },
4292
+ "minItems": 1
4293
+ }
4294
+ },
4295
+ "required": [
4296
+ "op",
4297
+ "writes"
4298
+ ],
4299
+ "additionalProperties": false
4300
+ },
4301
+ {
4302
+ "type": "object",
4303
+ "description": "Single-step CPU execution.",
4304
+ "properties": {
4305
+ "op": {
4306
+ "const": "step"
4307
+ },
4308
+ "count": {
4309
+ "type": [
4310
+ "integer",
4311
+ "null"
4312
+ ],
4313
+ "description": "Number of instructions to step.",
4314
+ "minimum": 1,
4315
+ "default": 1
4316
+ },
4317
+ "mode": {
4318
+ "type": [
4319
+ "string",
4320
+ "null"
4321
+ ],
4322
+ "description": "Step mode (into or over).",
4323
+ "enum": [
4324
+ "into",
4325
+ "over"
4326
+ ]
4327
+ }
4328
+ },
4329
+ "required": [
4330
+ "op"
4331
+ ],
4332
+ "additionalProperties": false
4333
+ },
4334
+ {
4335
+ "type": "object",
4336
+ "description": "Continue execution until the current routine returns.",
4337
+ "properties": {
4338
+ "op": {
4339
+ "const": "step_return"
4340
+ }
4341
+ },
4342
+ "required": [
4343
+ "op"
4344
+ ],
4345
+ "additionalProperties": false
4346
+ }
4347
+ ],
4348
+ "discriminator": {
4349
+ "propertyName": "op"
4350
+ }
4351
+ },
4352
+ "_meta": {
4353
+ "domain": "debug",
4354
+ "summary": "Manage breakpoints, inspect registers, and step through code on the VICE backend.",
4355
+ "lifecycle": "request-response",
4356
+ "resources": [
4357
+ "c64://specs/assembly",
4358
+ "c64://specs/memory-map"
4359
+ ],
4360
+ "prompts": [
4361
+ "assembly-program",
4362
+ "memory-debug"
4363
+ ],
4364
+ "examples": [
4365
+ {
4366
+ "name": "List checkpoints",
4367
+ "description": "Show all breakpoints defined in the emulator.",
4368
+ "arguments": {
4369
+ "op": "list_checkpoints"
4370
+ }
4371
+ },
4372
+ {
4373
+ "name": "Step over instruction",
4374
+ "description": "Advance one instruction without entering subroutines.",
4375
+ "arguments": {
4376
+ "op": "step",
4377
+ "mode": "over"
4378
+ }
4379
+ },
4380
+ {
4381
+ "name": "Inspect registers",
4382
+ "description": "Read CPU registers from memspace 0 (default).",
4383
+ "arguments": {
4384
+ "op": "get_registers"
4385
+ }
4386
+ }
4387
+ ],
4388
+ "tags": [
4389
+ "debug",
4390
+ "vice",
4391
+ "breakpoint",
4392
+ "registers",
4393
+ "grouped"
4394
+ ],
4395
+ "workflowHints": [
4396
+ "Use debugger tools after pausing execution so memory and screen reads remain stable.",
4397
+ "Communicate breakpoint effects clearly and restore original state when toggling them."
4398
+ ],
4399
+ "platforms": [
4400
+ "vice"
4401
+ ]
4402
+ }
4403
+ },
4404
+ {
4405
+ "name": "c64_vice",
4406
+ "title": "Reads or updates selected VICE resources that are safe to expose through MCP.",
4407
+ "description": "Grouped entry point for reading and updating selected VICE resources.",
4408
+ "inputSchema": {
4409
+ "type": "object",
4410
+ "description": "VICE emulator operations available via the c64_vice tool.",
4411
+ "oneOf": [
4412
+ {
4413
+ "type": "object",
4414
+ "description": "Read a VICE configuration resource (safe prefixes only).",
4415
+ "properties": {
4416
+ "op": {
4417
+ "const": "resource_get"
4418
+ },
4419
+ "name": {
4420
+ "type": "string",
4421
+ "description": "VICE resource name (example: SidEngine, C64Model).",
4422
+ "minLength": 1,
4423
+ "maxLength": 64,
4424
+ "pattern": "^[A-Z][A-Za-z0-9_.-]{0,63}$"
4425
+ }
4426
+ },
4427
+ "required": [
4428
+ "op",
4429
+ "name"
4430
+ ],
4431
+ "additionalProperties": false
4432
+ },
4433
+ {
4434
+ "type": "object",
4435
+ "description": "Write a VICE configuration resource (safe prefixes only).",
4436
+ "properties": {
4437
+ "op": {
4438
+ "const": "resource_set"
4439
+ },
4440
+ "name": {
4441
+ "type": "string",
4442
+ "description": "VICE resource name (example: SidEngine, C64Model).",
4443
+ "minLength": 1,
4444
+ "maxLength": 64,
4445
+ "pattern": "^[A-Z][A-Za-z0-9_.-]{0,63}$"
4446
+ },
4447
+ "value": {
4448
+ "description": "VICE resource value (string or integer).",
4449
+ "oneOf": [
4450
+ {
4451
+ "type": "string"
4452
+ },
4453
+ {
4454
+ "type": "integer"
4455
+ }
4456
+ ]
4457
+ }
4458
+ },
4459
+ "required": [
4460
+ "op",
4461
+ "name",
4462
+ "value"
4463
+ ],
4464
+ "additionalProperties": false
4465
+ }
4466
+ ],
4467
+ "discriminator": {
4468
+ "propertyName": "op"
4469
+ }
4470
+ },
4471
+ "_meta": {
4472
+ "domain": "vice",
4473
+ "summary": "Reads or updates selected VICE resources that are safe to expose through MCP.",
4474
+ "lifecycle": "request-response",
4475
+ "resources": [
4476
+ "c64://specs/memory-map"
4477
+ ],
4478
+ "prompts": [
4479
+ "assembly-program",
4480
+ "memory-debug"
4481
+ ],
4482
+ "examples": [
4483
+ {
4484
+ "name": "Read SID engine",
4485
+ "description": "Inspect the active SID emulation mode.",
4486
+ "arguments": {
4487
+ "op": "resource_get",
4488
+ "name": "SidEngine"
4489
+ }
4490
+ },
4491
+ {
4492
+ "name": "Set SID engine",
4493
+ "description": "Switch SID emulation to resid-fp (value 2).",
4494
+ "arguments": {
4495
+ "op": "resource_set",
4496
+ "name": "SidEngine",
4497
+ "value": 2
4498
+ }
4499
+ }
4500
+ ],
4501
+ "tags": [
4502
+ "vice",
4503
+ "emulator",
4504
+ "resource",
4505
+ "grouped"
4506
+ ],
4507
+ "workflowHints": [
4508
+ "Use emulator helpers when running on VICE to inspect or tweak safe runtime resources.",
4509
+ "Explain that resource changes only persist for the current emulator session unless saved in VICE manually."
4510
+ ],
4511
+ "platforms": [
4512
+ "vice"
4513
+ ]
4514
+ }
4515
+ }
4516
+ ]
4517
+ }