80mcp
80mcp is an MCP stdio server that runs and asserts on CP/M and DOS packages in Z80/x86 emulators, inspects guest files, and probes what a package needs.
Install/run:
pip install -e ., then80mcp doctoror80mcpfor MCP JSON-RPC over stdio.x80_profiles: list machine profiles, backends, tiers, capabilities, required images, readiness; call first.x80_cpm_run: run a CP/M package in a fresh sandbox; collect stdout, file manifest, termination reason, and assertions (noexit_code).x80_dos_run: run a DOS package in a fresh sandbox; supports meaningful exit codes, assertions, env, args, stdin.x80_diff_run: run inputs through a guest program and host reference, compare outputs byte-for-byte under declared normalization.x80_files: move/list files between host and guest, show guest open handles, resolve guest paths without running.x80_probe: run a package on the cheapest profile and report the OS/syscalls it actually needs, with a next call.x80_images: download and verify pinned disk images; never called implicitly and requires explicit fetch permission.Current scope: Phase 1 only, seven tools registered; only
cpm-hostedanddos-hostedrun today; hardware profiles reportready:false.
Click on "Deploy 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. The doctor output, backend discovery and protocol notes are in
docs/status.md.
Related MCP server: GDB MCP Server
What ships
Seven batch tools over two backends: x80_profiles, x80_cpm_run, x80_dos_run,
x80_diff_run, x80_files, x80_probe and x80_images. The other sixteen tools
are not registered. Two profiles run today: cpm-hosted (cpmemu) and dos-hosted
(dosiz). Every hardware profile reports ready:false with the phase that will
unblock the profile. The full tool and profile tables are in
docs/status.md.
For an agent that writes, assembles and single-steps a CP/M program on period 8080/Z80 hardware, use deltecent/altairsim alongside 80mcp. docs/background.md explains why.
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 | |
| |
prior art (altairsim, Spice86, DOSBox-X), what is missing, the mode matrix, and two design conclusions |
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 docs/background.md |
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.
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
Scored across 7 tools
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
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Cross-tool persistent memory and context for AI assistants over MCP.
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-
- 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.85MIT
- 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
- FlicenseNot gradedqualityBmaintenanceThis MCP server enables AI agents to inspect and control the native DOSBox-X debugger through bounded MCP tools, including breakpoint management, execution control, register/memory inspection, and disassembly for DOS program debugging and reverse engineering.1-