Skip to main content
Glama

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 stdio

Python 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-hosted

Backends 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

x80_profiles

1

ships — the profile table, capabilities, fidelity divergences. Call it first

x80_cpm_run

1

ships — the batch verb. No exit_code field, deliberately

x80_dos_run

1

ships — and this one does carry an exit code

x80_diff_run

1

ships — guest vs host reference, byte for byte, under a declared normalization

x80_files

1

ships for list / to_guest / from_guest on a kept sandbox. handles and resolve return a structured unsupported

x80_probe

1

ships — which OS a package actually needs, from its syscalls, plus a literal next call

x80_images

1

ships — the pinned catalog. The only tool that touches the network

x80_open x80_session x80_run x80_send x80_recv x80_screen x80_regs x80_step x80_breakpoints x80_disasm x80_monitor x80_trace

2

not registered — need the pty adapter and the VT emulator

x80_consoles

3

not registered — needs the mpm2 SSH adapter

x80_mem_read x80_mem_write

4

not registered — need an upstream change (SPEC.md 6.9)

x80_syscall_break

5

not registered

profile

tier

backend

state

cpm-hosted

hosted

cpmemu

runnable

dos-hosted

hosted

dosiz

runnable

cpm22 cpm3 zsdos zsystem nzcom

hardware

romwbw_emu

described; blocked on the phase-2 adapter

z80-bare

hardware

romwbw_emu

blocked on phase 2 and on the absent --start=ADDR (SPEC.md 3.6)

mpm2

hardware

mpm2_emu

blocked on the phase-3 adapter

freedos x86-bare

hardware

emu88d

blocked on the phase-5 adapter; freedos has never booted headless

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

DRIVING-WITH-AI.md

an agent about to make a call. The seven tools, the profile decision tree, the two tiers, and twelve measured gotchas

examples/agent/80un/

a runnable end-to-end exercise: unpack an archive, prove it byte-correct, then break it four ways on purpose

tests/README.md

how to run the suite and which tests need which backend binary

SPEC.md

the full design: all 23 tools, the MBP boundary, and the measured-facts index in Appendix A

evidence/

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 Machine object 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-line docs/DRIVING-WITH-AI.md plus a worked "debug this broken HELLO.ASM" exercise. It was built and driven live while writing this spec: ctest 61/61, altair_tests 214,254 checks / 0 failed, and CP/M 2.2 reached the A> 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 its run{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_psp and 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:

  1. 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.

  2. 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."

  3. 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-bare — romwbw_emu ROM monitor

z80 CP/M

cpm-hosted — cpmemu

cpm22 cpm3 zsdos zsystem nzcom — romwbw_emu

z80 MP/M

mpm2 — mpm2_emu

x86 bare

x86-bare — emu88, needs a runner

x86 DOS

dos-hosted — dosiz

freedos — emu88 + freedos_hd.img

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

romwbw_emu

the Z80 + RomWBW HBIOS core, and the primary interactive backend. Already headless, pipe-driven, with a sim> debugger

cpmemu

BDOS-level CP/M 2.2 translator — the cpm-hosted batch backend. Also supplies qkz80, the CPU core the rest of the family compiles

mpm2

real MP/M II V2.1 with a banked XIOS, 60 Hz preemption and up to 8 SSH consoles — the mpm2 backend, and the unclaimed ground

dosiz

DOS-API translator (INT 21h/31h/67h → host C++) — the dos-hosted batch backend

qxDOS

owns emu88, the from-scratch 8088/286/386 whole PC — the x86-bare and freedos backend

romwbw_disks

the sha256-pinned ROM and disk-image catalog every profile resolves through

80un

not an emulator — the reference fixture. Ships the same unpacker as a CP/M .COM and as Python, so it validates both the batch verb and the differential verb

z80cpmw · ioscpm · cpmdroid

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 tools
x80_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cpuNoz80
argsNoThe CP/M command tail.
stdinNoBytes fed to the guest console.
assertNo
collectNo
profileYescpm-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.
programYesHost 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_inNo
timeout_msNoWall-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_convertNo
default_modeNoMUST 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_sandboxNo
boot_timeout_msNoHardware profiles only: give up waiting for the OS prompt after this long and return stopped:'boot_timeout' with whatever boot output arrived.

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestYes
inputsYes
compareNobytes
normalizeNoAn 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.
referenceYes
timeout_msNoCovers the guest run and the reference command together. Both are killed by process group.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
envNo
argsNo
stdinNo
assertNo
collectNo
profileYesdos-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.
programYesHost 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_inNo
timeout_msNo
keep_sandboxNo
boot_timeout_msNofreedos only.
expect_exit_codeNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_filesA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
opYesto_guest = host -> guest. from_guest = guest -> host. handles = what the guest has open right now. resolve = dry-run name resolution, runs nothing.
viaNosandbox: 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
hashNo
driveNoCP/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.
filesNoop:'to_guest' only.
namesNoop:'from_guest'/'list': guest names or globs. Omit to take everything created since the machine started.
sinceNoop:'list': filter to files created or modified since that point. Answers the question no emulator in the family reports today.never
handleNoA live machine from x80_open. Mutually exclusive with `sandbox`.
max_kbNo
consoleNoop:'handles' on mpm2: only handles owned by the process attached to this console.
sandboxNoA 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_toNoop:'from_guest': host directory to write into.
overwriteNoop:'to_guest': required true to replace an existing guest file. There is no elicitation; this returns isError instead of asking.
resolve_nameNoop:'resolve': the guest name to resolve, e.g. A:FOO.TXT.
return_contentNoinline_if_under_kb
idempotency_keyNoA 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_writeNoop:'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

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_imagesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNo
image_idsNoCatalog ids, e.g. hd1k_combo, hd1k_cpm3, emu_avw, mpm2_system, freedos_starter. Omit to list without fetching.
timeout_msNo
allow_fetchNoRequired true alongside dry_run:false to actually download. There is no elicitation; without it this returns isError.
romwbw_versionNoWhich 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

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
stdinNo
familyNoauto
programYes
files_inNo
timeout_msNo

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_profilesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
probeNoStat the backend binaries and images, run the ROM/disk version check, and check dynamic-library resolution. Set false for a cheap static answer.
familyNoall
profileNoReport on one profile only, with full detail.
only_readyNoOmit profiles whose backend binary or disk images are missing.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.0
    • First observedx80_cpm_run
    • First observedx80_diff_run
    • First observedx80_dos_run
    • First observedx80_files
    • First observedx80_images
    • First observedx80_probe
    • First observedx80_profiles

TDQS

A3.7/5.0
Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An 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.
    41
    5
    GPL 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to interact with GDB for debugging via the MCP protocol. Supports setting breakpoints, stepping through code, inspecting memory and registers, and more.
    86
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables 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.
    44
    1
    MIT

Latest Blog Posts

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