80mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@80mcpRun the 1986 ARC test suite on cpm-hosted and show byte-exact diff vs reference"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
80mcp
A Model Context Protocol server over the Z80 and x86 emulator family in the sibling repos — so an agent can run a CP/M, MP/M or DOS package and assert on what came back, and debug the emulators themselves without a human doing it by mouse click and screen read.
Phase 1 ships. Phases 2-5 are still proposal. The full design is in SPEC.md; this file is the short version. If you are an agent about to make a call, read DRIVING-WITH-AI.md instead — it is the operating manual, and its Gotchas chapter is measured rather than remembered.
Install and run
pip install -e .
80mcp doctor # every backend and profile, exiting nonzero on any problem
80mcp # speak MCP JSON-RPC on stdioPython 3.11+, no third-party runtime dependencies. pytest and
jsonschema are dev-only: pip install -e ".[dev]".
Register it as an stdio server:
{"mcpServers": {"80mcp": {"command": "80mcp", "args": []}}}80mcp doctor is the first thing to run and the first thing to paste into a
bug report. On a machine with only cpmemu built it prints the backend table,
the pinned image catalog, and every profile with its blocking reason:
80mcp 0.1.0 phase 1 protocol 2026-07-28
backends
name status version path
cpmemu ok 4.8.0 /Users/…/cpmemu/src/cpmemu
dosiz not found - -
profiles
id family tier backend consoles ready
cpm-hosted z80 hosted cpmemu 1 yes
cpm3 z80 hardware romwbw_emu 1 no
…
cpm3 blocked:
- the romwbw_emu adapter ships in phase 2; this build is phase 1 and
ships the one-shot adapter only (SPEC.md 9)
1 of 11 profiles ready: cpm-hostedBackends are not vendored. cpmemu and dosiz are found at runtime in
$EIGHTYMCP_CPMEMU / $EIGHTYMCP_DOSIZ, in
$XDG_CONFIG_HOME/80mcp/config.json, on $PATH, or in a sibling checkout. A
missing one is a profile reporting ready:false with an actionable
blocked_by, never a crash.
The server speaks MCP 2026-07-28 (server/discover, _meta.protocolVersion,
resultType, ttlMs/cacheScope) and still accepts the legacy initialize
handshake from clients on 2025-11-25 or 2025-06-18, replying with the highest
revision both sides support and omitting the 2026-only envelope fields on that
connection. Every client shipping today still opens with initialize.
Related MCP server: MCPEmulate
What ships, and what does not
Seven batch tools over two backends. The other sixteen tools are not
registered — not stubbed, not erroring, absent — because a tool that is
listed and always fails is a lie in tools/list (SPEC.md 4.7).
tool | phase | state |
| 1 | ships — the profile table, capabilities, fidelity divergences. Call it first |
| 1 | ships — the batch verb. No |
| 1 | ships — and this one does carry an exit code |
| 1 | ships — guest vs host reference, byte for byte, under a declared normalization |
| 1 | ships for |
| 1 | ships — which OS a package actually needs, from its syscalls, plus a literal next call |
| 1 | ships — the pinned catalog. The only tool that touches the network |
| 2 | not registered — need the pty adapter and the VT emulator |
| 3 | not registered — needs the mpm2 SSH adapter |
| 4 | not registered — need an upstream change (SPEC.md 6.9) |
| 5 | not registered |
profile | tier | backend | state |
| hosted | cpmemu | runnable |
| hosted | dosiz | runnable |
| hardware | romwbw_emu | described; blocked on the phase-2 adapter |
| hardware | romwbw_emu | blocked on phase 2 and on the absent |
| hardware | mpm2_emu | blocked on the phase-3 adapter |
| hardware | emu88d | blocked on the phase-5 adapter; |
Measured end to end on cpm-hosted with a 23-member 1986 ARC and the real
cpmemu 4.8.0: pass:true, exit_reason:"jmp_0", 667 ms, 23 files,
B5-TIME.INF at exactly 1664 bytes, and x80_diff_run reporting 23 of 23
byte-identical against the Python reference under
normalize:["lowercase_names","pad_to_record"]. The whole exercise is
runnable: examples/agent/80un/.
Documentation
file | for |
an agent about to make a call. The seven tools, the profile decision tree, the two tiers, and twelve measured gotchas | |
a runnable end-to-end exercise: unpack an archive, prove it byte-correct, then break it four ways on purpose | |
how to run the suite and which tests need which backend binary | |
the full design: all 23 tools, the MBP boundary, and the measured-facts index in Appendix A | |
the raw transcripts every number in the spec traces back to |
Read this first: most of it already exists
The honest answer to "is there an MCP server for this?" is mostly yes, and the spec opens by saying so:
deltecent/altairsim has an MCP server compiled into the simulator — 31 tools over stdio, on the same
Machineobject as its monitor. It boots real CP/M 2.2 and CP/M 3 from a fresh clone with 36 disk images tracked in git, and ships a 606-linedocs/DRIVING-WITH-AI.mdplus a worked "debug this broken HELLO.ASM" exercise. It was built and driven live while writing this spec:ctest61/61,altair_tests214,254 checks / 0 failed, and CP/M 2.2 reached theA>prompt in 0.04 s over MCP. It has zero stars, which means nobody has found it — not that it is immature. If you want an agent that writes, assembles and single-steps a CP/M program on period 8080/Z80 hardware, use altairsim. This spec recommends registering it alongside 80mcp rather than competing with it, and borrows itsrun{from, input, until, timeout_ms, max_steps}expect-loop verbatim.DOS is covered six ways over. Spice86 (65+ tools, DOS-aware down to
read_dos_pspand the MCB chain) plus six independent DOSBox-X MCP servers that appeared between April and September 2026.Generic Z80 is saturated — Gearsystem and Gearcoleco at ~80 tools each, mcp-openmsx, and roughly eight ZX Spectrum servers.
What is actually missing
Three things, confirmed empty across GitHub, the official registry, Glama, PulseMCP, mcp.so and LobeHub:
A batch/package verb. "Here is a
.COM, here are some host files, run it, hand me back the files it created, byte-exact." altairsim declined host-filesystem passthrough in writing (DESIGN.md§12.2); its nearest substitute measured 7 tool calls with no deadline, no exit reason and no artifact manifest.MP/M. Zero MCP servers anywhere — also none for CP/M-86, MP/M-86 or Concurrent CP/M. No existing server has a concept that maps onto "which of my four terminals is this output for."
The BDOS / XDOS / INT 21h syscall layer. Every CP/M-adjacent server drives a console with an expect loop on
A>. Nothing answers "which host file did that FCB resolve to."
Plus two that are missing because they are yours: RomWBW HBIOS, which five shipping
products are built on, and x86 (altairsim's intel8259a.h:47 says outright that it
has no 8086 core).
The mode matrix
The proposal was z80: bare / cp/m / mp/m and x86: bare / freedos. That is right and
it misses a tier you already own — the one dosiz's own README names:
dosiz : FreeDOS-on-emu88 :: cpmemu : RomWBW-on-disk
One tier translates the OS API to the host filesystem (instant, no disk image, file-oriented — exactly what "just packages to be run" wants). The other runs the real OS on emulated hardware. So the grid is 3×2:
hosted (OS-API translation) | hardware (real OS on an emulated machine) | |
z80 bare | — |
|
z80 CP/M |
|
|
z80 MP/M | — |
|
x86 bare | — |
|
x86 DOS |
|
|
Demonstrated headless while writing this: CP/M 2.2, CP/M 3 (banked, 60K TPA), ZSDOS,
Z-System, NZCOM, MP/M II V2.1 (four consoles configured, seven 48K banks), and DOS
programs under dosiz (42/42 djgpp fixtures, exit codes propagating). Never
demonstrated: freedos booting headless, and z80-bare. Both are marked as such in the
spec rather than assumed.
That paragraph is about the emulators, driven by hand while the spec was written —
not about this server. Through 80mcp today, only the two hosted cells are reachable:
cpm-hosted and dos-hosted. Every hardware cell is described by x80_profiles and
reports ready:false with the phase that will unblock it.
SPEC.md §3.2 carries the full matrix with a per-profile validated by column, because
"it boots" and "a package runs correctly on it" are different claims.
The sibling repos
repo | role here |
the Z80 + RomWBW HBIOS core, and the primary interactive backend. Already headless, pipe-driven, with a | |
BDOS-level CP/M 2.2 translator — the | |
real MP/M II V2.1 with a banked XIOS, 60 Hz preemption and up to 8 SSH consoles — the | |
DOS-API translator (INT 21h/31h/67h → host C++) — the | |
owns | |
the sha256-pinned ROM and disk-image catalog every profile resolves through | |
not an emulator — the reference fixture. Ships the same unpacker as a CP/M | |
GUI clients. Explicitly not automation targets — see below |
Two conclusions worth knowing before reading the spec
Drive a headless core; do not drive the GUI. All three GUI clients are thin shells
over one C++ core that already has two working headless front ends. The blockers are hard
rather than soft: ioscpm's own MANUAL_CHECKS.md §3 records that synthetic key events
provably do not reach the app in the Simulator; adb shell input text drops characters
at speed; a WM_COMMAND + PrintWindow driver crashed z80cpmw twice inside comctl32.
The one GUI asset worth keeping is z80cpmw's TerminalView::cellAt() as a dialect
oracle, never as a driving target.
MP/M means mpm2, and never romwbw_emu. All four MP/M prerequisites are absent or
the wrong shape in romwbw_emu — 32K/0x8000 bank geometry where MP/M needs
48K/0xC000, no RTC tick (the only interrupt facility is a random fuzzing injector),
no XIOS at all, and SYSGET_CIOCNT hard-returns one console behind a 478-line contract
four shipping ports keep. Teaching it MP/M is months of work that would destabilise the
emulator five products compile in place.
Also found while writing this
romwbw_emu/disks/disks.xml:34 still describes CP/M Plus as "NOT WORKING, under
investigation." It boots banked and runs DIR. The corrected text exists downstream in
ioscpm/release_assets/disks.xml:39 and never propagated back — and that stale line is
where a tool-builder or an agent would look to decide whether to expose CP/M 3 at all.
License
GPL-3.0-or-later, matching the rest of the family.
Available Tools
7 toolsx80_cpm_runA
Run one CP/M package to completion in a fresh sandbox and return its console output, a manifest of the files it created, a termination reason, and your assertions. This tool deliberately has no exit_code field, because no CP/M backend has one: CP/M has no exit-status concept, cpmemu exit(0)s on every path including its runaway watchdog, romwbw_emu always returns 0, and a run that extracted 1 of 23 files and printed "Error" still exited 0 (measured). Success must be asserted from stdout plus the file manifest.
| Name | Required | Description | Default |
|---|---|---|---|
| cpu | No | z80 | |
| args | No | The CP/M command tail. | |
| stdin | No | Bytes fed to the guest console. | |
| assert | No | ||
| collect | No | ||
| profile | Yes | cpm-hosted (cpmemu) is instant and file-oriented. The others boot a real OS on emulated hardware and need the files staged into a disk image. | |
| program | Yes | Host path to the .COM for hosted profiles; a host path (staged onto the session image) or a bare guest-resident name for hardware profiles. | |
| files_in | No | ||
| timeout_ms | No | Wall-clock deadline for the guest run. Enforced by the server and killed by process group; no backend in this family has an internal wall clock. | |
| eol_convert | No | ||
| default_mode | No | MUST default to binary. cpmemu's auto mode never resolves on WRITE: the same 23-member ARC extracted 1 of 23, printed 'Error', truncated the one file it wrote, and exited 0 (measured). Only a config file can set this; the server synthesizes one. | binary |
| keep_sandbox | No | ||
| boot_timeout_ms | No | Hardware profiles only: give up waiting for the OS prompt after this long and return stopped:'boot_timeout' with whatever boot output arrived. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
All annotations are false booleans, so the description carries the full disclosure burden — and it delivers richly. It reveals that no exit_code field exists by design, explains why across three backends including a measured 1-of-23 file extraction failure that still exited 0, and instructs that success must be asserted from stdout plus the file manifest. This prevents a real, otherwise-invisible failure mode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose front-loaded with the critical behavioral warning bolded immediately after. The long second sentence is dense with concrete evidence that justifies the warning, so every clause earns its place; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with nested objects and no output schema, the description compensates for the missing output schema by defining the return envelope and covers the single most dangerous interpretation trap. Remaining gaps (eol_convert, keep_sandbox, cpu have no schema or description text) are largely self-explanatory from their names and enum values, so the definition is complete enough for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 54%, and the covered parameters (profile, program, timeout_ms, default_mode, args, stdin) already have high-quality descriptions, notably default_mode's warning about cpmemu auto mode. The description adds little parameter-level detail but does frame what assert and collect produce ("your assertions", "manifest of the files it created"). Net neutral: no harm, no major added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Run one CP/M package to completion in a fresh sandbox" and names the full return envelope (console output, file manifest, termination reason, assertions). The CP/M scope and intentional absence of exit_code clearly distinguish it from the DOS sibling x80_dos_run without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied rather than stated: the CP/M scoping and the sibling list (x80_dos_run, x80_diff_run) make the intended domain reasonably clear, but the description never says when to pick this over an alternative or gives exclusions. The exit_code warning is interpretation guidance for after the call, not selection guidance for before it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_diff_runA
Run the same inputs through a guest program and a host reference implementation and compare the outputs byte for byte under a declared normalization. Built for the case 80un proves: the same algorithm shipped as a CP/M .COM and as Python.
| Name | Required | Description | Default |
|---|---|---|---|
| guest | Yes | ||
| inputs | Yes | ||
| compare | No | bytes | |
| normalize | No | An ENUM, never a boolean. Measured on a 23-member ARC: without normalization, diff -rq reports 46 'Only in' lines and 0 matches. With ['lowercase_names','pad_to_record'], 23 of 23 match. | |
| reference | Yes | ||
| timeout_ms | No | Covers the guest run and the reference command together. Both are killed by process group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations set to false, the description carries the behavioral burden. It does disclose two meaningful traits: comparison is byte-for-byte, and normalization must be explicitly declared rather than automatic. However, it does not mention that guest and host programs are actually executed with potential side effects, how outputs are stored, or process-group kill behavior, leaving important behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact at three sentences, with the core operation in the first sentence and the motivating case in the second. The anecdote adds context without bloating the definition, though it is arguably not essential.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 6 top-level parameters, nested FileIn/GuestRun/reference objects, and no output schema, yet the description provides only a high-level summary. An agent would not know how to structure guest runs, supply file inputs via host_path vs content_b64, or interpret normalization and comparison options, so the description is incomplete for invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description maps the core roles—'same inputs' points to the inputs array, 'guest program' to guest, and 'host reference implementation' to reference—adding semantic value. But with schema description coverage at only 33%, it fails to clarify the remaining parameters: compare modes, normalization enum choices, reference.argv placeholders, and timeout semantics are left to the schema, which is sparse for them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action—'Run the same inputs through a guest program and a host reference implementation and compare the outputs byte for byte'—which clearly identifies the tool's function and differentiates it from sibling run tools like x80_cpm_run and x80_dos_run. The added context about the CP/M .COM versus Python case reinforces the intended differential-testing use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for differential testing—running the same inputs through guest and host—but never states explicitly when to prefer it over x80_cpm_run, x80_dos_run, or x80_probe. There are no exclusions or conditional routing statements, so an agent must infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_dos_runA
Run one DOS package to completion in a fresh sandbox. Unlike x80_cpm_run this does have a meaningful exit code — dosiz propagates the DOS AH=4Ch AL value (measured: rc 7) — but rc 1 is ambiguous between "the guest exited 1" and "dosiz failed to load the program", so exit_code_meaning disambiguates it from stderr.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | ||
| args | No | ||
| stdin | No | ||
| assert | No | ||
| collect | No | ||
| profile | Yes | dos-hosted (dosiz) traps INT 21h/31h/67h to the host filesystem: instant, no image, real exit codes. freedos boots a real FreeDOS kernel on emu88, needs an image, and has NO exit code - emu88 has no DOS and therefore no ERRORLEVEL, so it needs a result-file convention. | |
| program | Yes | Host path to the .EXE/.COM. The server chdirs into the sandbox and passes a RELATIVE name: an absolute path gives 'C:\PATH\PROG.EXE: can't open', rc 102, because argv[0] is built as 'C:' + the uppercased backslashed host path and DJGPP's go32 stub reopens it (measured). | |
| files_in | No | ||
| timeout_ms | No | ||
| keep_sandbox | No | ||
| boot_timeout_ms | No | freedos only. | |
| expect_exit_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses useful behavioral details beyond the annotations: fresh-sandbox isolation, propagation of the DOS AH=4Ch AL value as the exit code, a measured rc=7 example, and the ambiguity of rc=1. However, it references exit_code_meaning, which is not present in the input schema, creating potential confusion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core behavior, and the second adds the most important caveat and sibling differentiation. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 12 parameters, nested objects, no output schema, and sparse annotations, this description is too thin. It does not explain arguments, environment, file inputs, assertions, collection behavior, timeouts, sandbox retention, or return values. It captures the central exit-code nuance but leaves too much for the agent to infer or discover elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% with 12 parameters, so the description should compensate for undocumented parameters, but it does not. It introduces the vague term 'DOS package' and references a non-existent exit_code_meaning field, while core parameters like program and profile are already documented in the schema. It adds little semantic value for the many other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Run one DOS package to completion in a fresh sandbox.' It also explicitly contrasts itself with x80_cpm_run, making its role among siblings immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It directly differentiates from x80_cpm_run by noting that this tool has a meaningful exit code, and it explains the rc=1 ambiguity and how exit_code_meaning resolves it. This gives an agent a concrete selection criterion, though it does not discuss other sibling tools or state explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_filesADestructive
Move files between the host and a guest, list what the guest can see, show what it has open right now, and answer "where would A:FOO.TXT come from?" without running anything. The direction is in the op name, not in a flag, because the single most common agent failure in this domain is editing a host copy of a file instead of the one the guest can see.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | to_guest = host -> guest. from_guest = guest -> host. handles = what the guest has open right now. resolve = dry-run name resolution, runs nothing. | |
| via | No | sandbox: cpmemu/dosiz host-directory passthrough, instant. hostfile: HBIOS 0xE1-0xEA via R8/W8 (romwbw) or INT E0h via R.COM/W.COM (emu88) - byte-granular, no image surgery. image: cpm_disk.py with the pinned diskdef, requires the machine stopped or the disk flushed. | auto |
| hash | No | ||
| drive | No | CP/M profiles accept A-P; DOS profiles accept C-Z. The legal set per profile is in x80_profiles; an out-of-range letter returns isError naming the profile's actual drive set. | |
| files | No | op:'to_guest' only. | |
| names | No | op:'from_guest'/'list': guest names or globs. Omit to take everything created since the machine started. | |
| since | No | op:'list': filter to files created or modified since that point. Answers the question no emulator in the family reports today. | never |
| handle | No | A live machine from x80_open. Mutually exclusive with `sandbox`. | |
| max_kb | No | ||
| console | No | op:'handles' on mpm2: only handles owned by the process attached to this console. | |
| sandbox | No | A sandbox path returned by a batch verb with keep_sandbox:true, or by a dead machine's handle_expired error. Mutually exclusive with `handle`. | |
| export_to | No | op:'from_guest': host directory to write into. | |
| overwrite | No | op:'to_guest': required true to replace an existing guest file. There is no elicitation; this returns isError instead of asking. | |
| resolve_name | No | op:'resolve': the guest name to resolve, e.g. A:FOO.TXT. | |
| return_content | No | inline_if_under_kb | |
| idempotency_key | No | A client-supplied nonce, not a hash of these arguments. Supply it only to make a retry safe; two deliberate identical calls without a key are two calls. | |
| resolve_for_write | No | op:'resolve': resolution differs by direction. On cpm-hosted a *.EXT config mapping routes a READ but does NOT route a BDOS 22 Make, which lands in the drive directory or the cwd under a lowercased 8.3 name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already signal destructive behavior, and the schema documents overwrite semantics, so the description does not need to restate those. It adds two useful behavioral clarifiers—resolve runs nothing, and direction is intentionally in the op name to prevent editing the host copy—but it leaves backend side effects, via-mechanism tradeoffs, and error behavior to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, action-first, with no filler. The first sentence enumerates the full operation set, and the second explains the core design convention in a way that directly prevents a known agent failure mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, 5-op tool, the description provides a strong high-level map, and the detailed schema fills in op-scoped parameters, via options, overwrite behavior, and machine/sandbox requirements. The main residual gap is that there is no output schema and the description doesn't describe return shapes, but this is a minor omission given the richness of the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 82%, the input schema already carries most parameter meaning, including op-specific applicability and mutually exclusive fields. The description itself does not add parameter-level detail beyond its high-level operation mapping, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names concrete operations with specific verbs and resources: moving files between host and guest, listing guest-visible files, showing open handles, and performing dry-run name resolution. It also highlights a critical design convention—direction lives in the op name, not a flag—which makes the tool's purpose and correct use unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear op-level guidance: to_guest/from_guest encode direction, resolve is the no-side-effect 'where would this come from?' path, and list/handles map to guest visibility and open files. It does not explicitly name sibling tools like x80_cpm_run or x80_dos_run as alternatives, so it stops short of a full when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_imagesAIdempotent
Download and verify disk images from the pinned romwbw_disks catalog. Every other tool in this server is openWorldHint:false. Never called implicitly — no tool call may trigger a download.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| image_ids | No | Catalog ids, e.g. hd1k_combo, hd1k_cpm3, emu_avw, mpm2_system, freedos_starter. Omit to list without fetching. | |
| timeout_ms | No | ||
| allow_fetch | No | Required true alongside dry_run:false to actually download. There is no elicitation; without it this returns isError. | |
| romwbw_version | No | Which catalog generation, e.g. 3.5.1. Defaults to the version the installed romwbw_emu is pinned to: it emulates HBIOS v3.5.1 EXACTLY and emu_validate_rom_hcb refuses a mismatched ROM. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (openWorldHint:true, idempotentHint:true), the description adds genuinely useful behavioral context: the tool verifies as well as downloads, the catalog is pinned, and — most valuably — downloads can never be triggered implicitly by another tool call. Nothing contradicts the annotations: readOnlyHint:false aligns with 'download', and openWorldHint:true aligns with the description positioning this as the server's sole open-world operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler. The action is front-loaded in the first sentence, the server-wide contrast in the second, and the single most important operational constraint ('Never called implicitly') closes it. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For selecting and invoking the tool, the description plus schema is nearly sufficient. The notable gap is that there is no output schema and the description never hints at what the agent should expect after 'verify' succeeds or fails — no return shape, error behavior, or verification outcome semantics. Given the tool's five parameters and non-trivial download behavior, a sentence on expected results would complete the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 60% and the tool description itself says nothing directly about parameters; it only hints at them via 'pinned catalog' (tying to romwbw_version) and 'disk images' (tying to image_ids). The schema picks up the slack for image_ids (concrete catalog id examples), romwbw_version (pinning behavior), and the fifth boolean parameter requiring dry_run:false, but dry_run and timeout_ms remain undocumented anywhere. The description neither compensates for that gap nor repeats what the schema covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource pair — 'Download and verify disk images from the pinned romwbw_disks catalog' — which precisely states what the tool does. It also differentiates the tool from its siblings (x80_files, x80_probe, x80_profiles, x80_cpm_run, x80_dos_run, x80_diff_run) by noting that 'every other tool in this server is openWorldHint:false', marking this as the only download-capable tool in the set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description delivers a strong when-not rule: 'Never called implicitly — no tool call may trigger a download', which is critical operational guidance for an agent. It also frames the tool against the whole server ('Every other tool... is openWorldHint:false'). However, it stops short of naming specific sibling alternatives for common non-download scenarios (e.g., browsing files with x80_files or probing with x80_probe), so the full when-to-use mapping is left somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_probeC
Run a package on the cheapest profile and report what operating system it actually needs, from the syscalls it made — evidence instead of a screen read. Returns a literal next call to make.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| stdin | No | ||
| family | No | auto | |
| program | Yes | ||
| files_in | No | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond annotations: it executes a package, inspects syscalls, and returns 'a literal next call to make.' However, it does not disclose potential side effects of running an arbitrary package, failure modes, or what happens to the files_in inputs, which matters given the annotations are all false and don't carry a safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with no filler. The main action is front-loaded, the evidence-based intent is clarified, and the unusual return value is stated directly. The prose earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, no output schema, and uninformative annotations, the description is too thin. It doesn't explain the input file mechanism, timeout behavior, family selection, or the exact structure of the returned 'next call.' The concept is clear but operational detail is largely missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any of the six parameters. 'Package' vaguely maps to 'program', but args, stdin, family, files_in, and timeout_ms are completely unaddressed, leaving the agent without meaningful parameter guidance for a non-trivial schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action—run a package on the cheapest profile—and a distinct outcome: report the OS actually needed based on syscalls. This separates it from the sibling run tools conceptually, though it doesn't name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for OS-need detection from evidence, but gives no explicit when-to-use or when-not-to-use guidance. It does not reference any sibling tools or alternative approaches, so an agent must infer when this probe is preferable to x80_cpm_run, x80_dos_run, or x80_diff_run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
x80_profilesARead-onlyIdempotent
List the machine profiles this installation can actually run: backend, tier, capabilities, required disk images and whether they are present. Call this first. Capabilities differ enormously between backends, and a profile with a missing image or a ROM/disk version mismatch will fail x80_open.
| Name | Required | Description | Default |
|---|---|---|---|
| probe | No | Stat the backend binaries and images, run the ROM/disk version check, and check dynamic-library resolution. Set false for a cheap static answer. | |
| family | No | all | |
| profile | No | Report on one profile only, with full detail. | |
| only_ready | No | Omit profiles whose backend binary or disk images are missing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and destructiveHint=false in annotations, the safety profile is already clear. The description adds meaningful behavioral context: it reports runnable profiles, accounts for backend differences, and warns about conditions that will trip up x80_open. This goes beyond simply restating the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences deliver the core purpose, a direct call-to-action, and a concrete failure scenario. The most important guidance ('Call this first') is front-loaded and bolded, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with strong annotations and a parameter-rich schema, the description is complete: it names the returned fields, explains why the tool exists, and warns about the key operational risk. An agent can decide when to call it and what to expect without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents the parameters adequately. The description does not add much parameter-level meaning, but it also does not need to given the schema coverage; the listed output fields help explain what the family/profile/probe parameters influence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a clearly bounded resource ('the machine profiles this installation can actually run') and previews the key fields returned. It is immediately distinguishable from sibling tools like x80_files, x80_images, x80_probe, and the run tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The bold 'Call this first' instruction gives explicit timing guidance, and the explanation about missing images or ROM/disk version mismatches causing x80_open failures clarifies why this preflight step matters. However, it does not state when to skip this tool or name alternative tools for related concerns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
7 tool updates
v0.1.0- First observed
x80_cpm_run - First observed
x80_diff_run - First observed
x80_dos_run - First observed
x80_files - First observed
x80_images - First observed
x80_probe - First observed
x80_profiles
TDQS
The tools are mostly distinct: profiles, images, files, probe, CP/M run, DOS run, and diff run each target a different phase or concern. The run/probe/diff tools could be confused at a glance, but their descriptions clearly separate OS detection, full execution, and guest-vs-host comparison.
All tools share the x80_ prefix and use domain-specific suffixes, with the run tools following an <os>_run pattern. There is a minor mix of noun-style names like x80_files and x80_profiles with verb-style x80_probe, but the overall pattern remains predictable.
Seven tools is well within the ideal range and each tool earns its place by covering a distinct part of the emulation workflow: environment discovery, image provisioning, file transfer, probing, execution, and diffing. There is no obvious redundancy or bloat.
The set covers the core run-to-completion loop well: discover profiles, provision images, transfer files, run CP/M or DOS packages, probe OS requirements, and diff against a host reference. Minor gaps exist, such as no exposed x80_open/session tool and no package catalog listing, but agents can work around these.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Live browser debugging for AI assistants — DOM, console, network via MCP.
- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables autonomous debugging of Commodore 64 programs through the VICE emulator with semantic interpretation of C64-specific data structures, memory layouts, VIC-II states, and PETSCII encoding for AI-assisted 6502 assembly debugging.261-
- AlicenseBqualityDmaintenanceAn MCP server that provides CPU emulation, disassembly, and assembly tools for LLM agents across multiple architectures including x86, ARM, and RISC-V. It enables agents to manage isolated emulation sessions, perform memory analysis, hook syscalls, and trace execution through a standard tool interface.415GPL 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with GDB for debugging via the MCP protocol. Supports setting breakpoints, stepping through code, inspecting memory and registers, and more.86MIT
- AlicenseBqualityAmaintenanceEnables AI agents to code and debug Commodore PET software using the VICE emulator, with CLI and MCP tools for session control, screen reading, memory manipulation, and testing.441MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/avwohl/80mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server