@henols/vice-mcp 0.1.9 → 0.1.11

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.
@@ -0,0 +1,841 @@
1
+ {
2
+ "generated_at": "2026-08-14T00:00:00.000Z",
3
+ "endpoint": "stock-binary-monitor",
4
+ "tools": [
5
+ {
6
+ "name": "vice_ping",
7
+ "description": "Check if VICE is responding",
8
+ "inputSchema": {
9
+ "type": "object",
10
+ "additionalProperties": false
11
+ },
12
+ "outputSchema": {
13
+ "type": "object",
14
+ "properties": {
15
+ "status": { "type": "string" },
16
+ "backend": { "type": "string" },
17
+ "viceVersion": { "type": "string" },
18
+ "resolvedBinaryPath": { "type": "string" },
19
+ "resolvedBinaryPathIsResolved": { "type": "boolean" },
20
+ "capabilities": { "type": "object" },
21
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
22
+ },
23
+ "required": ["status", "backend", "viceVersion", "resolvedBinaryPath", "resolvedBinaryPathIsResolved", "capabilities", "runState"]
24
+ }
25
+ },
26
+ {
27
+ "name": "vice_memory_read",
28
+ "description": "Read a memory range (with optional bank selection). On stock this halts the machine (D-05); the answer's runState reports it. sideEffects defaults to false (DIRECT-01) -- side-effect-reading registers like $D019 requires opting in explicitly.",
29
+ "inputSchema": {
30
+ "type": "object",
31
+ "properties": {
32
+ "address": {
33
+ "type": "string",
34
+ "description": "Address: number, hex string ($1000), or symbol name"
35
+ },
36
+ "size": {
37
+ "type": "number",
38
+ "description": "Bytes to read (1-65535)"
39
+ },
40
+ "bank": {
41
+ "type": "string",
42
+ "description": "Optional: Memory bank name (e.g., 'ram' to read RAM under ROM). Use vice_memory_banks to list available banks."
43
+ },
44
+ "encoding": {
45
+ "type": "string",
46
+ "description": "Optional: 'array' for legacy per-byte hex strings, or 'hex' for one compact hex string."
47
+ },
48
+ "sideEffects": {
49
+ "type": "boolean",
50
+ "description": "Stock-only, optional, default false: whether the read is permitted to have side effects (e.g. reading $D019 clears pending VIC-II IRQ flags). Defaults to side-effect-free."
51
+ }
52
+ },
53
+ "required": ["address", "size"]
54
+ },
55
+ "outputSchema": {
56
+ "type": "object",
57
+ "properties": {
58
+ "address": { "type": "number" },
59
+ "size": { "type": "number" },
60
+ "encoding": { "type": "string" },
61
+ "sideEffects": { "type": "boolean" },
62
+ "bank": {},
63
+ "memspace": { "type": "string" },
64
+ "hex": { "type": "string" },
65
+ "bytes": { "type": "array", "items": { "type": "number" } },
66
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
67
+ },
68
+ "required": ["address", "size", "encoding", "sideEffects", "bank", "memspace", "runState"]
69
+ }
70
+ },
71
+ {
72
+ "name": "vice_memory_write",
73
+ "description": "Write to memory",
74
+ "inputSchema": {
75
+ "type": "object",
76
+ "properties": {
77
+ "address": {
78
+ "type": "string",
79
+ "description": "Address: number, hex string ($1000), or symbol name"
80
+ },
81
+ "data": {
82
+ "type": "array",
83
+ "description": "Bytes to write (0-255 each)",
84
+ "items": {
85
+ "type": "number"
86
+ }
87
+ }
88
+ },
89
+ "required": ["address", "data"]
90
+ },
91
+ "outputSchema": {
92
+ "type": "object",
93
+ "properties": {
94
+ "address": { "type": "number" },
95
+ "bytesWritten": { "type": "number" },
96
+ "bank": {},
97
+ "memspace": { "type": "string" },
98
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
99
+ },
100
+ "required": ["address", "bytesWritten", "bank", "memspace", "runState"]
101
+ }
102
+ },
103
+ {
104
+ "name": "vice_memory_banks",
105
+ "description": "List available memory banks",
106
+ "inputSchema": {
107
+ "type": "object",
108
+ "additionalProperties": false
109
+ },
110
+ "outputSchema": {
111
+ "type": "object",
112
+ "properties": {
113
+ "banks": {
114
+ "type": "array",
115
+ "items": {
116
+ "type": "object",
117
+ "properties": {
118
+ "id": { "type": "number" },
119
+ "name": { "type": "string" }
120
+ },
121
+ "required": ["id", "name"]
122
+ }
123
+ },
124
+ "count": { "type": "number" },
125
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
126
+ },
127
+ "required": ["banks", "count", "runState"]
128
+ }
129
+ },
130
+ {
131
+ "name": "vice_registers_get",
132
+ "description": "Get CPU registers",
133
+ "inputSchema": {
134
+ "type": "object",
135
+ "additionalProperties": false
136
+ },
137
+ "outputSchema": {
138
+ "type": "object",
139
+ "properties": {
140
+ "registers": { "type": "object" },
141
+ "unknownIds": { "type": "array" },
142
+ "memspace": { "type": "string" },
143
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
144
+ },
145
+ "required": ["registers", "unknownIds", "memspace", "runState"]
146
+ }
147
+ },
148
+ {
149
+ "name": "vice_registers_set",
150
+ "description": "Set CPU register value",
151
+ "inputSchema": {
152
+ "type": "object",
153
+ "properties": {
154
+ "register": {
155
+ "type": "string",
156
+ "description": "Register name: PC|A|X|Y|SP|N|V|B|D|I|Z|C"
157
+ },
158
+ "value": {
159
+ "type": "number",
160
+ "description": "Register value"
161
+ }
162
+ },
163
+ "required": ["register", "value"]
164
+ },
165
+ "outputSchema": {
166
+ "type": "object",
167
+ "properties": {
168
+ "register": { "type": "string" },
169
+ "id": { "type": "number" },
170
+ "requestedValue": { "type": "number" },
171
+ "observedValue": {},
172
+ "memspace": { "type": "string" },
173
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
174
+ },
175
+ "required": ["register", "id", "requestedValue", "observedValue", "memspace", "runState"]
176
+ }
177
+ },
178
+ {
179
+ "name": "vice_registers_available",
180
+ "description": "Stock-only, no fork counterpart -- the fork surface has no register-enumeration tool. Lists every register the connected VICE build enumerates via REGISTERS_AVAILABLE, with each register's wire id, name, and width -- the width the emulator itself reports, in BITS (8 or 16 on a 6510), taken verbatim from REGISTERS_AVAILABLE's size byte.",
181
+ "inputSchema": {
182
+ "type": "object",
183
+ "additionalProperties": false
184
+ },
185
+ "outputSchema": {
186
+ "type": "object",
187
+ "properties": {
188
+ "registers": {
189
+ "type": "array",
190
+ "items": {
191
+ "type": "object",
192
+ "properties": {
193
+ "id": { "type": "number" },
194
+ "name": { "type": "string" },
195
+ "sizeBits": { "type": "number" }
196
+ },
197
+ "required": ["id", "name", "sizeBits"]
198
+ }
199
+ },
200
+ "count": { "type": "number" },
201
+ "memspace": { "type": "string" },
202
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
203
+ },
204
+ "required": ["registers", "count", "memspace", "runState"]
205
+ }
206
+ },
207
+ {
208
+ "name": "vice_execution_pause",
209
+ "description": "Pause execution",
210
+ "inputSchema": {
211
+ "type": "object",
212
+ "additionalProperties": false
213
+ },
214
+ "outputSchema": {
215
+ "type": "object",
216
+ "properties": {
217
+ "requested": { "type": "string" },
218
+ "sent": { "type": "boolean" },
219
+ "alreadyStopped": { "type": "boolean" },
220
+ "stateBefore": { "type": "string" },
221
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
222
+ },
223
+ "required": ["requested", "sent", "alreadyStopped", "stateBefore", "runState"]
224
+ }
225
+ },
226
+ {
227
+ "name": "vice_execution_run",
228
+ "description": "Resume execution",
229
+ "inputSchema": {
230
+ "type": "object",
231
+ "additionalProperties": false
232
+ },
233
+ "outputSchema": {
234
+ "type": "object",
235
+ "properties": {
236
+ "requested": { "type": "string" },
237
+ "sent": { "type": "boolean" },
238
+ "alreadyRunning": { "type": "boolean" },
239
+ "stateBefore": { "type": "string" },
240
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
241
+ },
242
+ "required": ["requested", "sent", "alreadyRunning", "stateBefore", "runState"]
243
+ }
244
+ },
245
+ {
246
+ "name": "vice_execution_step",
247
+ "description": "Step one or more instructions. Refuses while runState is \"unknown\" (D-07) -- call vice_execution_pause or vice_execution_run first to establish a known state.",
248
+ "inputSchema": {
249
+ "type": "object",
250
+ "properties": {
251
+ "count": {
252
+ "type": "number",
253
+ "description": "Number of instructions to step"
254
+ },
255
+ "stepOver": {
256
+ "type": "boolean",
257
+ "description": "Step over subroutines"
258
+ }
259
+ }
260
+ },
261
+ "outputSchema": {
262
+ "type": "object",
263
+ "properties": {
264
+ "requested": { "type": "string" },
265
+ "count": { "type": "number" },
266
+ "stepOver": { "type": "boolean" },
267
+ "stateBefore": { "type": "string" },
268
+ "programCounter": { "type": "number" },
269
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
270
+ },
271
+ "required": ["requested", "count", "stepOver", "stateBefore", "runState"]
272
+ }
273
+ },
274
+ {
275
+ "name": "vice_execution_until_return",
276
+ "description": "Stock-only, no fork counterpart. Runs until the current subroutine returns (EXECUTE_UNTIL_RETURN). This is a different operation from vice_execution_step's stepOver, which steps over a single call rather than running out of the current one. Refuses while runState is \"unknown\" (D-07), identically to vice_execution_step.",
277
+ "inputSchema": {
278
+ "type": "object",
279
+ "additionalProperties": false
280
+ },
281
+ "outputSchema": {
282
+ "type": "object",
283
+ "properties": {
284
+ "requested": { "type": "string" },
285
+ "stateBefore": { "type": "string" },
286
+ "programCounter": { "type": "number" },
287
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
288
+ },
289
+ "required": ["requested", "stateBefore", "runState"]
290
+ }
291
+ },
292
+ {
293
+ "name": "vice_checkpoint_add",
294
+ "description": "Add checkpoint/breakpoint. stop:false requires acknowledgeTraceRisk:true -- a non-stopping checkpoint emits a CHECKPOINT_INFO frame per hit synchronously from inside the emulator's CPU loop and can stall the emulator on a hot address (D-11). No condition property here -- D-12 keeps the fork's add-then-vice_checkpoint_set_condition split.",
295
+ "inputSchema": {
296
+ "type": "object",
297
+ "properties": {
298
+ "start": {
299
+ "type": "string",
300
+ "description": "Start address: number, hex string ($1000), or symbol name"
301
+ },
302
+ "end": {
303
+ "type": "string",
304
+ "description": "End address: number, hex, or symbol (optional, default=start)"
305
+ },
306
+ "stop": {
307
+ "type": "boolean",
308
+ "description": "Stop execution when hit (default=true)"
309
+ },
310
+ "load": {
311
+ "type": "boolean",
312
+ "description": "Break on memory read (default=false)"
313
+ },
314
+ "store": {
315
+ "type": "boolean",
316
+ "description": "Break on memory write (default=false)"
317
+ },
318
+ "exec": {
319
+ "type": "boolean",
320
+ "description": "Break on execution (default=true)"
321
+ },
322
+ "acknowledgeTraceRisk": {
323
+ "type": "boolean",
324
+ "description": "Stock-only, optional, default false: required (set true) when stop:false -- a non-stopping checkpoint emits one CHECKPOINT_INFO frame per hit synchronously from inside the emulator's CPU loop, over the blocking monitor socket, and can stall the emulator on a hot address. The client rate-limits hits per second and auto-disables the checkpoint if the limit is exceeded."
325
+ }
326
+ },
327
+ "required": ["start"]
328
+ },
329
+ "outputSchema": {
330
+ "type": "object",
331
+ "properties": {
332
+ "id": { "type": "number" },
333
+ "start": { "type": "number" },
334
+ "end": { "type": "number" },
335
+ "stop": { "type": "boolean" },
336
+ "enabled": { "type": "boolean" },
337
+ "operation": {
338
+ "type": "object",
339
+ "properties": {
340
+ "value": { "type": "number" },
341
+ "flags": { "type": "array", "items": { "type": "string" } },
342
+ "defaulted": { "type": "boolean" }
343
+ },
344
+ "required": ["value", "flags", "defaulted"]
345
+ },
346
+ "temporary": { "type": "boolean" },
347
+ "hitCount": { "type": "number" },
348
+ "ignoreCount": { "type": "number" },
349
+ "hasCondition": { "type": "boolean" },
350
+ "traceMode": { "type": "boolean" },
351
+ "autoDisables": { "type": "array" },
352
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
353
+ },
354
+ "required": ["id", "start", "end", "stop", "enabled", "operation", "temporary", "hitCount", "ignoreCount", "hasCondition", "traceMode", "runState"]
355
+ }
356
+ },
357
+ {
358
+ "name": "vice_checkpoint_delete",
359
+ "description": "Delete checkpoint",
360
+ "inputSchema": {
361
+ "type": "object",
362
+ "properties": {
363
+ "checkpoint_num": {
364
+ "type": "number",
365
+ "description": "Checkpoint number to delete"
366
+ }
367
+ },
368
+ "required": ["checkpoint_num"]
369
+ },
370
+ "outputSchema": {
371
+ "type": "object",
372
+ "properties": {
373
+ "checkpointNum": { "type": "number" },
374
+ "deleted": { "type": "boolean" },
375
+ "autoDisables": { "type": "array" },
376
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
377
+ },
378
+ "required": ["checkpointNum", "deleted", "runState"]
379
+ }
380
+ },
381
+ {
382
+ "name": "vice_checkpoint_list",
383
+ "description": "List all checkpoints",
384
+ "inputSchema": {
385
+ "type": "object",
386
+ "additionalProperties": false
387
+ },
388
+ "outputSchema": {
389
+ "type": "object",
390
+ "properties": {
391
+ "checkpoints": {
392
+ "type": "array",
393
+ "items": {
394
+ "type": "object",
395
+ "properties": {
396
+ "id": { "type": "number" },
397
+ "start": { "type": "number" },
398
+ "end": { "type": "number" },
399
+ "stop": { "type": "boolean" },
400
+ "enabled": { "type": "boolean" },
401
+ "operation": { "type": "object" },
402
+ "temporary": { "type": "boolean" },
403
+ "hitCount": { "type": "number" },
404
+ "ignoreCount": { "type": "number" },
405
+ "hasCondition": { "type": "boolean" },
406
+ "traceMode": { "type": "boolean" },
407
+ "condition": {},
408
+ "conditionTextKnown": { "type": "boolean" },
409
+ "conditionNote": { "type": "string" },
410
+ "autoDisabled": { "type": "object" }
411
+ },
412
+ "required": ["id", "start", "end", "stop", "enabled", "operation", "temporary", "hitCount", "ignoreCount", "hasCondition", "traceMode", "conditionTextKnown"]
413
+ }
414
+ },
415
+ "totalReported": { "type": "number" },
416
+ "entriesReceived": { "type": "number" },
417
+ "autoDisables": { "type": "array" },
418
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
419
+ },
420
+ "required": ["checkpoints", "totalReported", "entriesReceived", "runState"]
421
+ }
422
+ },
423
+ {
424
+ "name": "vice_checkpoint_toggle",
425
+ "description": "Enable/disable checkpoint",
426
+ "inputSchema": {
427
+ "type": "object",
428
+ "properties": {
429
+ "checkpoint_num": {
430
+ "type": "number",
431
+ "description": "Checkpoint number"
432
+ },
433
+ "enabled": {
434
+ "type": "boolean",
435
+ "description": "Enable (true) or disable (false)"
436
+ }
437
+ },
438
+ "required": ["checkpoint_num", "enabled"]
439
+ },
440
+ "outputSchema": {
441
+ "type": "object",
442
+ "properties": {
443
+ "checkpointNum": { "type": "number" },
444
+ "enabled": { "type": "boolean" },
445
+ "autoDisableCleared": { "type": "boolean" },
446
+ "autoDisables": { "type": "array" },
447
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
448
+ },
449
+ "required": ["checkpointNum", "enabled", "runState"]
450
+ }
451
+ },
452
+ {
453
+ "name": "vice_checkpoint_set_condition",
454
+ "description": "Set checkpoint condition. Stock accepts EITHER a condition string (e.g. 'A == $42', using pseudo-registers RL/CY where relevant) OR a structured condition object with a 'kind' discriminator field -- see stock-condition.ts. Conditions are immutable once set: stock VICE cannot clear or replace one, so re-setting an existing checkpoint's condition is refused.",
455
+ "inputSchema": {
456
+ "type": "object",
457
+ "properties": {
458
+ "checkpoint_num": {
459
+ "type": "number",
460
+ "description": "Checkpoint number"
461
+ },
462
+ "condition": {
463
+ "description": "EITHER a condition expression string (e.g. 'A == $42') OR a structured condition object with a 'kind' discriminator field. This is the one inputSchema property in this manifest that deliberately omits \"type\" rather than contradicting the fork's own \"type\": \"string\" declaration -- the checker's supported subset has no union keyword (no oneOf/anyOf) to express \"string or object\"."
464
+ }
465
+ },
466
+ "required": ["checkpoint_num", "condition"]
467
+ },
468
+ "outputSchema": {
469
+ "type": "object",
470
+ "properties": {
471
+ "checkpointNum": { "type": "number" },
472
+ "condition": { "type": "string" },
473
+ "immutable": { "type": "boolean" },
474
+ "autoDisables": { "type": "array" },
475
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
476
+ },
477
+ "required": ["checkpointNum", "condition", "immutable", "runState"]
478
+ }
479
+ },
480
+ {
481
+ "name": "vice_watch_add",
482
+ "description": "Add memory watchpoint with optional condition (shorthand for checkpoint with store/load). stop:false requires acknowledgeTraceRisk:true, identically to vice_checkpoint_add (D-11).",
483
+ "inputSchema": {
484
+ "type": "object",
485
+ "properties": {
486
+ "address": {
487
+ "type": "string",
488
+ "description": "Address: number, hex string ($1000), or symbol name"
489
+ },
490
+ "size": {
491
+ "type": "number",
492
+ "description": "Number of bytes to watch (default: 1)"
493
+ },
494
+ "type": {
495
+ "type": "string",
496
+ "description": "Watch type: 'read', 'write', or 'both' (default: 'write')"
497
+ },
498
+ "condition": {
499
+ "type": "string",
500
+ "description": "Condition expression for conditional watchpoint. Supported: 'A == $xx', 'X == $xx', 'Y == $xx', 'PC == $xxxx', 'SP == $xx'. For store watches, condition is evaluated after the store completes."
501
+ },
502
+ "stop": {
503
+ "type": "boolean",
504
+ "description": "Stock-only, optional, default true: stop execution when hit. Set false (with acknowledgeTraceRisk:true) for a non-stopping trace watchpoint."
505
+ },
506
+ "acknowledgeTraceRisk": {
507
+ "type": "boolean",
508
+ "description": "Stock-only, optional, default false: required (set true) when stop:false, identically to vice_checkpoint_add's acknowledgeTraceRisk."
509
+ }
510
+ },
511
+ "required": ["address"]
512
+ },
513
+ "outputSchema": {
514
+ "type": "object",
515
+ "properties": {
516
+ "id": { "type": "number" },
517
+ "start": { "type": "number" },
518
+ "end": { "type": "number" },
519
+ "watchType": { "type": "string" },
520
+ "size": { "type": "number" },
521
+ "operation": { "type": "object" },
522
+ "stop": { "type": "boolean" },
523
+ "enabled": { "type": "boolean" },
524
+ "condition": {},
525
+ "hitCount": { "type": "number" },
526
+ "hasCondition": { "type": "boolean" },
527
+ "traceMode": { "type": "boolean" },
528
+ "autoDisables": { "type": "array" },
529
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
530
+ },
531
+ "required": ["id", "start", "end", "watchType", "size", "operation", "stop", "enabled", "condition", "hitCount", "hasCondition", "traceMode", "runState"]
532
+ }
533
+ },
534
+ {
535
+ "name": "vice_machine_reset",
536
+ "description": "Reset the machine (soft or hard reset). run_after defaults to false on stock (the fork defaults it true) -- D-05 forbids resuming a machine nobody asked to resume; pass run_after:true to resume explicitly after the reset.",
537
+ "inputSchema": {
538
+ "type": "object",
539
+ "properties": {
540
+ "mode": {
541
+ "type": "string",
542
+ "description": "Reset mode: 'soft' (CPU reset, default) or 'hard' (power cycle)"
543
+ },
544
+ "run_after": {
545
+ "type": "boolean",
546
+ "description": "Stock default is FALSE (diverges from the fork's default of true) -- resume execution after reset only if explicitly requested (D-05)."
547
+ }
548
+ }
549
+ },
550
+ "outputSchema": {
551
+ "type": "object",
552
+ "properties": {
553
+ "mode": { "type": "string" },
554
+ "runAfter": { "type": "boolean" },
555
+ "resumed": { "type": "boolean" },
556
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
557
+ },
558
+ "required": ["mode", "runAfter", "resumed", "runState"]
559
+ }
560
+ },
561
+ {
562
+ "name": "vice_autostart",
563
+ "description": "Autostart a PRG or disk image. On stock, program (load-by-name) is refused -- AUTOSTART supports only a numeric index field and has no load-by-name field; use index to select a program by position instead.",
564
+ "inputSchema": {
565
+ "type": "object",
566
+ "properties": {
567
+ "path": {
568
+ "type": "string",
569
+ "description": "Path to PRG file or disk image (.d64, .g64, .prg)"
570
+ },
571
+ "program": {
572
+ "type": "string",
573
+ "description": "Refused on stock: AUTOSTART has no load-by-name field. Use index instead."
574
+ },
575
+ "run": {
576
+ "type": "boolean",
577
+ "description": "Run after loading (default: true)"
578
+ },
579
+ "index": {
580
+ "type": "number",
581
+ "description": "Program index on disk, 0-based (default: 0)"
582
+ }
583
+ },
584
+ "required": ["path"]
585
+ },
586
+ "outputSchema": {
587
+ "type": "object",
588
+ "properties": {
589
+ "path": { "type": "string" },
590
+ "sentPath": { "type": "string" },
591
+ "run": { "type": "boolean" },
592
+ "index": { "type": "number" },
593
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
594
+ },
595
+ "required": ["path", "sentPath", "run", "index", "runState"]
596
+ }
597
+ },
598
+ {
599
+ "name": "vice_disk_attach",
600
+ "description": "Attach disk image to drive. Only unit 8 is reachable on stock -- AUTOSTART (the only wire route to attaching an image) has no drive-unit field, so units 9-11 are refused rather than silently retargeted to unit 8 (D-14). The attach is AUTOSTART with the run flag clear.",
601
+ "inputSchema": {
602
+ "type": "object",
603
+ "properties": {
604
+ "unit": {
605
+ "type": "number",
606
+ "description": "Drive unit (8-11). Only unit 8 is reachable on stock; units 9-11 are refused."
607
+ },
608
+ "path": {
609
+ "type": "string",
610
+ "description": "Path to disk image (.d64, .g64, etc)"
611
+ }
612
+ },
613
+ "required": ["unit", "path"]
614
+ },
615
+ "outputSchema": {
616
+ "type": "object",
617
+ "properties": {
618
+ "unit": { "type": "number" },
619
+ "path": { "type": "string" },
620
+ "sentPath": { "type": "string" },
621
+ "approximation": { "type": "string" },
622
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
623
+ },
624
+ "required": ["unit", "path", "sentPath", "approximation", "runState"]
625
+ }
626
+ },
627
+ {
628
+ "name": "vice_snapshot_save",
629
+ "description": "Save complete emulator state to a named snapshot (DUMP). Use this to capture a debugging checkpoint that can be restored later with vice_snapshot_load. A JSON metadata sidecar is written alongside the snapshot as this client's own bookkeeping.",
630
+ "inputSchema": {
631
+ "type": "object",
632
+ "properties": {
633
+ "name": {
634
+ "type": "string",
635
+ "description": "Unique name for this snapshot (alphanumeric, underscore, hyphen only). Choose descriptive names like 'before_crash' or 'level3_boss_fight'."
636
+ },
637
+ "description": {
638
+ "type": "string",
639
+ "description": "Human-readable description of what state this snapshot captures."
640
+ },
641
+ "include_roms": {
642
+ "type": "boolean",
643
+ "description": "Include ROM images in snapshot (default: false)."
644
+ },
645
+ "include_disks": {
646
+ "type": "boolean",
647
+ "description": "Include disk drive state in snapshot (default: false)."
648
+ }
649
+ },
650
+ "required": ["name"]
651
+ },
652
+ "outputSchema": {
653
+ "type": "object",
654
+ "properties": {
655
+ "name": { "type": "string" },
656
+ "path": { "type": "string" },
657
+ "sentPath": { "type": "string" },
658
+ "includeRoms": { "type": "boolean" },
659
+ "includeDisks": { "type": "boolean" },
660
+ "metadataWritten": { "type": "boolean" },
661
+ "metadataFailureReason": { "type": "string" },
662
+ "metadataPath": { "type": "string" },
663
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
664
+ },
665
+ "required": ["name", "path", "sentPath", "includeRoms", "includeDisks", "metadataWritten", "metadataPath", "runState"]
666
+ }
667
+ },
668
+ {
669
+ "name": "vice_snapshot_load",
670
+ "description": "Restore emulator state from a previously saved snapshot (UNDUMP). A missing snapshot refuses, naming the available snapshots found on disk (D-16 removed the separate enumeration tool).",
671
+ "inputSchema": {
672
+ "type": "object",
673
+ "properties": {
674
+ "name": {
675
+ "type": "string",
676
+ "description": "Name of the snapshot to load. Must match the name previously given to vice_snapshot_save."
677
+ }
678
+ },
679
+ "required": ["name"]
680
+ },
681
+ "outputSchema": {
682
+ "type": "object",
683
+ "properties": {
684
+ "name": { "type": "string" },
685
+ "path": { "type": "string" },
686
+ "sentPath": { "type": "string" },
687
+ "programCounter": {},
688
+ "metadata": {},
689
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
690
+ },
691
+ "required": ["name", "path", "sentPath", "programCounter", "metadata", "runState"]
692
+ }
693
+ },
694
+ {
695
+ "name": "vice_keyboard_type",
696
+ "description": "Type text (uppercase ASCII displays as uppercase on C64 by default). Bytes queue in the keyboard buffer of a now-halted machine (D-05) -- nothing consumes them until the agent explicitly resumes.",
697
+ "inputSchema": {
698
+ "type": "object",
699
+ "properties": {
700
+ "text": {
701
+ "type": "string",
702
+ "description": "Text to type (converts to PETSCII). Use \\n for Return."
703
+ },
704
+ "petscii_upper": {
705
+ "type": "boolean",
706
+ "description": "Default true: uppercase ASCII displays as uppercase on C64. Set false for raw PETSCII (uppercase ASCII maps to graphics)"
707
+ }
708
+ },
709
+ "required": ["text"]
710
+ },
711
+ "outputSchema": {
712
+ "type": "object",
713
+ "properties": {
714
+ "text": { "type": "string" },
715
+ "petsciiUpper": { "type": "boolean" },
716
+ "byteCount": { "type": "number" },
717
+ "petsciiHex": { "type": "string" },
718
+ "note": { "type": "string" },
719
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
720
+ },
721
+ "required": ["text", "petsciiUpper", "byteCount", "petsciiHex", "note", "runState"]
722
+ }
723
+ },
724
+ {
725
+ "name": "vice_keyboard_petscii",
726
+ "description": "Feed exact PETSCII bytes into the KERNAL keyboard buffer",
727
+ "inputSchema": {
728
+ "type": "object",
729
+ "properties": {
730
+ "data": {
731
+ "type": "array",
732
+ "description": "Exact PETSCII bytes to feed to the KERNAL keyboard buffer (1-255 each; 13 is Return)",
733
+ "items": {
734
+ "type": "number"
735
+ }
736
+ }
737
+ },
738
+ "required": ["data"]
739
+ },
740
+ "outputSchema": {
741
+ "type": "object",
742
+ "properties": {
743
+ "byteCount": { "type": "number" },
744
+ "petsciiHex": { "type": "string" },
745
+ "note": { "type": "string" },
746
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
747
+ },
748
+ "required": ["byteCount", "petsciiHex", "note", "runState"]
749
+ }
750
+ },
751
+ {
752
+ "name": "vice_joystick_set",
753
+ "description": "Set joystick state. vice_joystick_tap is absent on stock: a tap needs the machine to run for a measured interval, which requires an unrequested resume (forbidden by D-05) plus a timing route stock does not have until Phase 7.",
754
+ "inputSchema": {
755
+ "type": "object",
756
+ "properties": {
757
+ "port": {
758
+ "type": "number",
759
+ "description": "Joystick port 1 or 2 (default=1)"
760
+ },
761
+ "direction": {
762
+ "type": "string",
763
+ "description": "Direction: up, down, left, right, center, or array for diagonals"
764
+ },
765
+ "fire": {
766
+ "type": "boolean",
767
+ "description": "Fire button state (default=false)"
768
+ }
769
+ }
770
+ },
771
+ "outputSchema": {
772
+ "type": "object",
773
+ "properties": {
774
+ "port": { "type": "number" },
775
+ "directions": { "type": "array", "items": { "type": "string" } },
776
+ "fire": { "type": "boolean" },
777
+ "value": { "type": "number" },
778
+ "valueBits": { "type": "array", "items": { "type": "string" } },
779
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
780
+ },
781
+ "required": ["port", "directions", "fire", "value", "valueBits", "runState"]
782
+ }
783
+ },
784
+ {
785
+ "name": "vice_disassemble",
786
+ "description": "Disassemble memory to 6502 instructions, computed client-side (DERIV-07) -- the binary monitor has no disassemble opcode. Stock divergences from the fork: reading memory halts the machine and runState reports it (D-05); an illegal opcode ACME's !cpu 6510 cannot express renders as !byte with the mnemonic moved into a comment (D-09); listing formatting diverges from the fork by design (docs/stock-vice-parity.md Section A.7).",
787
+ "inputSchema": {
788
+ "type": "object",
789
+ "properties": {
790
+ "address": {
791
+ "type": "string",
792
+ "description": "Start address: number, hex string ($1000), or symbol name"
793
+ },
794
+ "count": {
795
+ "type": "number",
796
+ "description": "Number of instructions (default 10, max 100). Mutually exclusive with end."
797
+ },
798
+ "end": {
799
+ "type": "string",
800
+ "description": "Stock-only, optional: last address of the range. Mutually exclusive with count."
801
+ },
802
+ "show_symbols": {
803
+ "type": "boolean",
804
+ "description": "Show symbol names where the operand's role and width prove substitution cannot change the encoding (default true). With no symbol store loaded this is a no-op and the answer says so."
805
+ }
806
+ },
807
+ "required": ["address"]
808
+ },
809
+ "outputSchema": {
810
+ "type": "object",
811
+ "properties": {
812
+ "address": { "type": "number" },
813
+ "end": { "type": "number" },
814
+ "count": { "type": "number" },
815
+ "instructions": {
816
+ "type": "array",
817
+ "items": {
818
+ "type": "object",
819
+ "properties": {
820
+ "address": { "type": "number" },
821
+ "bytes": { "type": "array", "items": { "type": "number" } },
822
+ "mnemonic": { "type": "string" },
823
+ "operand": { "type": "string" },
824
+ "resolvedTarget": { "type": "number" },
825
+ "notes": { "type": "array", "items": { "type": "string" } }
826
+ },
827
+ "required": ["address", "bytes", "mnemonic", "operand", "notes"]
828
+ }
829
+ },
830
+ "listing": { "type": "string" },
831
+ "symbolsApplied": { "type": "boolean" },
832
+ "symbolNote": { "type": "string" },
833
+ "limitReached": { "type": "boolean" },
834
+ "nextAddress": { "type": "number" },
835
+ "runState": { "type": "string", "enum": ["running", "stopped", "unknown"] }
836
+ },
837
+ "required": ["address", "count", "instructions", "listing", "symbolsApplied", "limitReached", "runState"]
838
+ }
839
+ }
840
+ ]
841
+ }