pet-tools-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pet_session_listA | List running emulated PET sessions (name, model, pid, monitor port). |
| pet_session_startA | Boot a fresh emulated PET (headless, warp). Models: pet2001-4k, pet2001, pet3032, pet4032, pet8032, pet8296. Optionally attach a d64/d80/d82 disk image. |
| pet_session_ensureA | Attach to a running PET session, or boot one (headless, warp) if none exists. Idempotent; "started" reports which happened. |
| pet_session_stopC | Stop a running PET session (the only one if name is omitted). |
| pet_session_resetC | Reset the PET (soft, or hard power-cycle). Leaves the machine running. |
| pet_statusB | The session and whether the machine is running or stopped right now. state is answered by the session daemon's own tracking (no emulator traffic); "unknown" without a daemon. Also reports the loaded program and any source files changed since it was loaded (stale binary!). |
| pet_screen_textA | Read the PET screen as plain text. This is the PREFERRED way to see program output — faster and more reliable than screenshots for AI use. Graphics decode to Unicode glyphs; style="ascii" restores the legacy conservative mapping. |
| pet_screen_codesA | Read the raw screen-code matrix (rows x cols of ints) — exact values for checking glyphs without decoding ambiguity. |
| pet_screenshotA | Save a PNG screenshot. Prefer pet_screen_text for reading output; use this only when pixel-level appearance matters. scale gives an integer nearest-neighbour upscale (small PET screens read better at 2-3x). |
| pet_mem_readA | Read emulated memory. addr accepts $hex, 0xhex, decimal, or a symbol from the loaded label file. Returns hex-encoded bytes plus "bytes" as a decimal int array. |
| pet_mem_findB | Search memory for a byte pattern (values: one or more $hex/decimal
bytes). Returns match addresses; "truncated" is true when |
| pet_mem_writeB | Write bytes to emulated memory. addr accepts $hex/0xhex/decimal/symbol. |
| pet_reg_getB | Read CPU registers. PC is annotated with the nearest symbol when a label file is loaded. |
| pet_reg_setC | Set a CPU register (e.g. PC, A, X, Y). value accepts $hex/0xhex/decimal. |
| pet_break_addA | Set a breakpoint at an address or symbol. Machine keeps running; use pet_wait_break to block until it fires. |
| pet_break_listB | List breakpoints/watchpoints with hit counts. |
| pet_break_removeC | Remove a breakpoint/watchpoint by id. |
| pet_break_clearA | Remove ALL breakpoints (exec checkpoints); watchpoints are kept. Checkpoints persist across pet_run/rebuilds — clear stale ones or duplicates accumulate. |
| pet_watch_clearA | Remove ALL watchpoints (load/store checkpoints); breakpoints are kept. |
| pet_watch_addC | Set a watchpoint on a memory range (default: both load and store). |
| pet_stepA | Execute N instructions. The machine STAYS STOPPED afterwards; use pet_continue to resume. |
| pet_finishC | Run until the current subroutine returns. Machine stays stopped. |
| pet_continueA | Resume execution after a breakpoint/step. |
| pet_untilB | Run until an address/symbol is executed count times; machine stays stopped there. count>1 = deterministic frame stepping on a loop label. On timeout: raises with the machine LEFT RUNNING and the checkpoint removed. |
| pet_wait_textA | Block until TEXT appears on the screen. A timeout returns {"fired": null, "screen": ...} (not an error) so you can inspect what the program actually displayed. |
| pet_wait_memB | Block until the byte at addr equals the value ($hex/decimal accepted). |
| pet_callA | JSR one routine in isolation (fake return address on the stack, optional A/X/Y on entry) and stop at its RTS — the unit-test primitive: poke inputs, call, then assert registers/memory. Machine ends STOPPED on success, RUNNING on timeout. |
| pet_wait_breakA | Block until a breakpoint/watchpoint fires; reports checkpoint id, PC, and registers. Machine is left stopped when it fires. On timeout the machine is LEFT RUNNING (your checkpoints remain set) and the result is {"fired": null, "machine": "running", ...} — data, not an error. |
| pet_buildB | Assemble 6502 source (ca65 syntax) to a .prg + VICE label file. |
| pet_packageA | Package a .s/.bas/.prg into an artifact any VICE user can run: a .prg,
or (when output ends in .d64/.d80/.d82) a disk image whose first file is
the program so |
| pet_runA | Build/tokenize a .bas/.s/.prg as needed, then load and RUN it on the running PET. Registers assembly symbols on the session automatically. |
| pet_loadA | Load a .prg via autostart (optionally without RUN); optionally register a VICE label file for symbolic debugging. |
| pet_basic_typeA | Type BASIC program text into the running PET via the keyboard (keywords may be upper or lower case; each line ends with \n). Set run=true to type RUN afterwards. |
| pet_key_typeA | Type text into the running PET's keyboard buffer (\n = RETURN). Buffered keys never touch the live key-down state — games reading $97 need pet_key_hold. |
| pet_key_holdA | Hold KEY down for N game ticks by re-poking $97 before each one,
running to the frame anchor |
| pet_disk_createC | Create a blank d64/d80/d82 disk image. |
| pet_disk_lsC | List the directory of a disk image. |
| pet_disk_putC | Copy a host file onto a disk image. |
| pet_disk_getC | Copy a file off a disk image to the host. |
| pet_disk_bootB | Attach a disk image to the running PET and LOAD+RUN its first file. |
| pet_rom_infoC | Identify the loaded ROM set (names + content hashes). |
| pet_rom_disasmB | Disassemble live memory with ROM + session symbol annotations. start accepts $hex/0xhex/decimal or a symbol (e.g. CHROUT). |
| pet_test_runC | Run a declarative YAML test (boots its own fresh PET; see spec §8). |
| pet_test_programsA | Run every example-program directory (program + expect.txt) as a test. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 44 tools
Each tool has a clear, distinct purpose with detailed descriptions. Tools like pet_session_start and pet_session_ensure are differentiated by idempotency, and pet_key_type vs pet_key_hold are clearly separate. There is no ambiguity or overlap.
All tools follow a consistent pattern: 'pet_' + domain + verb_noun (e.g., pet_break_add, pet_mem_read, pet_disk_ls). The naming is uniform and predictable across all 44 tools.
44 tools is on the high side, but the domain of PET emulation and debugging is complex, justifying many specific operations. However, it exceeds the 25+ threshold indicated in calibration, making it borderline.
The tool surface covers the full lifecycle: session management, memory/register access, break/watchpoints, stepping, waiting, disk operations, ROM analysis, and testing. Only a minor gap (no watchpoint list) is present, but overall very comprehensive.