qemu-mcp
Provides tools for booting and controlling QEMU virtual machines headlessly, including launching ISOs, kernels, and disks; sending keyboard and mouse input; capturing screenshots; reading and writing the serial console; waiting for boot markers; managing snapshots; running raw QMP commands; and managing multiple named VMs.
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., "@qemu-mcpBoot the ISO headless, wait for 'kernel ready', and take a screenshot."
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.
qemu-mcp
Let your AI agent boot an operating system and drive it.
qemu-mcp is an MCP server that gives AI agents (Claude Code, or any MCP client) hands on a QEMU virtual machine: boot an ISO or a raw kernel, press keys, take screenshots, read the serial console, and wait for boot markers — all headless, with zero cooperation from the guest. No SSH, no guest agent, no network. If it boots in QEMU, an agent can drive it.
This screenshot was taken by an AI agent: it booted MORT OS (a hobby kernel with no SSH, no agent, no TCP required) headless, pressed Esc, typed help, and captured the framebuffer — four tool calls.
Who this is for
OS developers and hobby kernel hackers. The osdev inner loop is: edit kernel → build → boot in QEMU → look at the screen → type something → read serial → repeat. An AI agent can already do the edit and build steps; qemu-mcp gives it the rest of the loop, so it can boot-test its own kernel changes and actually see the triple fault.
It's equally useful for anyone who needs an agent to poke at a VM below the OS level: bootloaders, installers, BIOS/UEFI menus, recovery consoles, firmware.
Related MCP server: Interactive Terminal MCP Server
Why another QEMU MCP server?
The existing ones assume a full, running guest OS — they exec commands over SSH or a guest agent. That's useless when your guest is a 40 KB kernel you wrote yourself, an installer ISO, or anything pre-boot. qemu-mcp is built for the boot-test loop instead:
Serial console capture — continuously logged to a file, readable at any time (
qemu_serial), and writable too (qemu_serial_send)qemu_wait_serial— block until"kernel ready"(or"login:", or your panic string) appears, the reliable way to sequence an automated boot test-kernelboot — boot a multiboot/bzImage kernel directly, withappend/initrdScreenshots of the VGA framebuffer — works headless, shows exactly what a monitor would
Raw QMP escape hatch — the full QEMU Machine Protocol when you need
memsave,system_reset,device_add…
Tools
Tool | What it does |
| Boot a VM headless from |
| Report the installed |
| Create a fresh disk image via |
| PNG of the guest's display, straight from the framebuffer |
| Type text as keyboard input ( |
| Press a key or chord: |
| Move the absolute pointer (fractions of screen width/height) and optionally click |
| Pause the VM's execution (QMP |
| Resume a VM previously paused with |
| Save a full RAM+device snapshot under a tag (needs a qcow2 disk). Reports failure if QEMU's savevm rejects it (e.g. a raw disk) instead of claiming success |
| Restore a VM to a previously saved snapshot tag. Reports failure if QEMU's loadvm rejects it (e.g. an unknown tag) instead of claiming success |
| Delete a previously saved snapshot tag, freeing its space in the qcow2 disk. Reports failure if QEMU's delvm rejects it (e.g. an unknown tag) instead of claiming success |
| List snapshot tags saved on the VM's qcow2 disk (raw |
| Swap the medium in a removable drive (e.g. a CD-ROM) without rebooting. |
| Tail the serial console (COM1) output — works after the VM has exited too, to see what it printed right before dying |
| Write text to the serial console (COM1) |
| Block until given text appears on serial, or timeout. Each wait only searches output after the previous match, so waiting for a prompt after a command finds the new one ( |
| Block until the display stops changing (for VGA-only guests with no serial output), or timeout. A blinking text cursor counts as settled ( |
| All managed VMs with state, arch, machine, hostfwd, pid, uptime |
| Graceful ACPI powerdown, or |
| Run any raw QMP command on the VM |
Multiple named VMs can run at once.
Every tool declares all four MCP behaviour hints, so your client knows which calls to
confirm with you. Only the waiting and reading tools (qemu_screenshot, qemu_serial,
qemu_wait_serial, qemu_wait_screen, qemu_snapshot_list, qemu_version) are
read-only. qemu_boot and qemu_list are marked destructive because they clean up VMs
that exited on their own, deleting their serial logs; read a crashed guest's output with
qemu_serial first. qemu_boot and qemu_qmp are open-world: extra_args and raw QMP
can reach anything QEMU can.
Install
Requirements: Python 3.10+, and QEMU on your PATH (on Windows, C:\Program Files\qemu is found automatically, or set QEMU_DIR).
pip install qemu-mcpClaude Code:
claude mcp add qemu -- qemu-mcpAny other MCP client (stdio transport):
{
"mcpServers": {
"qemu": {
"command": "qemu-mcp"
}
}
}Or without installing, via uv: claude mcp add qemu -- uvx qemu-mcp
Example session
you: boot build/os.iso and check the shell works
agent:
qemu_boot(name="test", iso="build/os.iso", arch="i386")→ bootedqemu_wait_serial(name="test", text="boot ok")→ FOUNDqemu_type(name="test", text="help\n")qemu_screenshot(name="test")→ sees the help output renderedqemu_stop(name="test", force=true)"Your ISO boots, the shell responds tohelp, and the new command is listed. Screenshot attached."
A typical kernel test the agent can run by itself:
qemu_boot(name="k", kernel="build/kernel.elf", arch="i386",
extra_args="-device rtl8139,netdev=n0 -netdev user,id=n0")
qemu_wait_serial(name="k", text="MORTNET READY", timeout_s=20)
qemu_serial_send(name="k", text="net\n") # guest has no keyboard driver, only a serial shell
qemu_serial(name="k") # did DHCP bind?
qemu_screenshot(name="k") # what does the console show?Non-x86 archs
x86_64 and i386 boot with no machine argument. Other archs have no
default machine in QEMU and need -M set explicitly, or they'll fail to
boot:
qemu_boot(name="a", kernel="build/kernel-aarch64.elf", arch="aarch64", machine="virt")
qemu_boot(name="r", kernel="build/kernel-riscv64.elf", arch="riscv64", machine="virt")Check qemu-system-<arch> -M help for the full list of machines an arch supports.
virt has no default display device — unlike the PC-family boards x86_64/
i386 boot with, it doesn't wire up VGA on its own. qemu_screenshot/
qemu_wait_screen against a virt VM will see an empty/black framebuffer (or
a QMP error, depending on QEMU version) unless the guest itself sets one up,
which most bare-metal aarch64/riscv64 kernels don't. Add a display device
explicitly if you need screenshots:
qemu_boot(name="a", kernel="build/kernel-aarch64.elf", arch="aarch64",
machine="virt", extra_args="-device virtio-gpu-pci")(This is documented QEMU virt-board behavior, not verified against a real
boot in this environment — no QEMU available here.)
Hardware acceleration
qemu_boot defaults to TCG (QEMU's software emulator) with no accel given -
correct on any host, but a real slowdown for anything beyond a trivial kernel.
Opt into your host's accelerator with accel, falling back to TCG if it's
unavailable so the boot doesn't hard-fail on a host without it:
qemu_boot(name="fast", kernel="build/kernel.elf", accel="kvm:tcg") # Linux
qemu_boot(name="fast", kernel="build/kernel.elf", accel="hvf:tcg") # macOS
qemu_boot(name="fast", kernel="build/kernel.elf", accel="whpx:tcg") # WindowsIf the requested accelerator genuinely isn't usable on the host (no /dev/kvm
permission, virtualization disabled in firmware, etc.) QEMU itself reports why
QEMU exited, and qemu_boot surfaces that in the error it raises.
CPU model
qemu_boot defaults to QEMU's own default CPU model for the arch/machine.
Pass cpu (QEMU -cpu) to test guest code against a specific model or
feature set instead:
qemu_boot(name="k", kernel="build/kernel.elf", cpu="qemu64,+avx") # base model + one extra feature
qemu_boot(name="k", kernel="build/kernel.elf", cpu="max") # every feature QEMU/TCG can emulate
qemu_boot(name="k", kernel="build/kernel.elf", accel="kvm", cpu="host") # pass the host CPU through under KVMCheck qemu-system-<arch> -cpu help for the full list of models/features an
arch supports.
CPU topology
smp alone sets a flat vCPU count. For guest code that cares about the
socket/core/thread shape (ACPI MADT entries, CPUID topology leaves,
per-socket vs. per-core scheduling), pass smp_cores/smp_threads/
smp_sockets/smp_maxcpus too - they're combined onto the same -smp flag:
qemu_boot(name="k", kernel="build/kernel.elf",
smp=8, smp_cores=4, smp_threads=2, smp_sockets=1)
# -> -smp 8,cores=4,threads=2,sockets=1smp itself is optional when the topology params are given - QEMU can infer
the total CPU count from cores/threads/sockets.
Host port forwarding
To reach a guest service (SSH, a web server under test) from the host without
needing QEMU's NIC/chipset flags, pass hostfwd (QEMU's hostfwd rule):
qemu_boot(name="k", disk="build/linux.qcow2", hostfwd="tcp::2222-:22")
# host:2222 -> guest:22, e.g. ssh -p 2222 user@localhostThis adds -netdev user,id=net0,hostfwd=... and -device e1000,netdev=net0
for you - the guest needs its own e1000 driver, which most general-purpose
OSes (Linux included) already have built in. For a bare-metal kernel with its
own NIC driver (like the rtl8139 example above), use extra_args instead -
hostfwd is for forwarding a port to a guest that already has working
networking, not for picking which NIC a from-scratch kernel talks to.
Debugging the kernel
qemu-mcp lets an agent see a crash. To find out why it happened, pair it with gdbstub-mcp. Boot with QEMU's gdbstub on and an interrupt log:
qemu_boot(name="k", kernel="build/kernel.elf",
extra_args="-s -S -d int,cpu_reset -D int.log -no-reboot")Then the agent can debug_connect with the kernel ELF, set breakpoints on symbols
or file.c:line, read registers and memory, and get backtraces. If the VM triple
faults, debug_explain_fault turns int.log into the exception chain and its root
cause. No gdb binary is needed.
Tests
Unit tests for the character/key-name -> QMP qcode translation in keys.py,
the screen-fraction -> QMP pointer-event translation in mouse.py, the
serial chardev args and reconnect logic in serial.py, the framebuffer
stability tracker in screen.py, the snapshot tag validation and HMP
command-line building in snapshot.py, the QMP client's error handling in
qmp.py, the missing-binary error path, the __version__/pyproject.toml
version-drift guard in test_version.py, the pinned tool behaviour hints
(readOnlyHint/destructiveHint/idempotentHint/openWorldHint) in
test_tool_hints.py, and an MCP stdio handshake smoke test all need no QEMU
install - this is what CI runs on every push:
pip install -e ".[test]"
ruff check src tests
mypy --strict src
pytest tests/test_keys.py tests/test_mouse.py tests/test_screen.py tests/test_snapshot.py tests/test_serial.py tests/test_qmp.py tests/test_vm.py tests/test_stdio_handshake.py tests/test_tool_hints.py tests/test_version.pyThere's also an end-to-end test that boots a real ISO and exercises every tool:
QEMU_MCP_TEST_ISO=path/to/anything-bootable.iso python tests/smoke_test.pyqemu_snapshot_save/qemu_snapshot_load need a qcow2 disk rather than an
ISO, so they're only exercised if you also set QEMU_MCP_TEST_QCOW2 to a
qcow2 disk image (booted as a second VM alongside the ISO one).
Notes
VMs run headless (
-display none); screenshots still work because QEMU keeps rendering the VGA framebuffer.Serial output requires the guest to write to COM1 (most hobby kernels and all Linux
console=ttyS0setups do). Guests that only draw to VGA are still fully drivable via screenshots + keys.qemu_stoptries ACPI powerdown first; hobby kernels usually ignore it and get killed after a grace period — useforce=trueto skip the wait, or raisegraceful_timeout_s(default 10s) for a guest that legitimately needs longer to shut down cleanly.qemu_stopwaits briefly (up to 5s, best-effort) for any in-flightqemu_wait_serial/qemu_wait_screen/qemu_screenshot/qemu_serial_send/qemu_qmp/qemu_change_media/qemu_type/qemu_key/qemu_mouse/qemu_pause/qemu_resume/qemu_snapshot_save/qemu_snapshot_load/qemu_snapshot_delete/qemu_snapshot_listcall against the same VM to finish before closing its QMP/serial connections and removing its temp directory, so a call racing a concurrent stop sees a clean result instead of an error from a handle closed out from under it.This server launches QEMU processes on your machine with files you point it at.
extra_argsis passed to QEMU verbatim — same trust level as running QEMU yourself.
Changelog
See CHANGELOG.md.
Contributing
See CONTRIBUTING.md for the exact local setup and checks CI runs.
License
MIT
Available Tools
21 toolsqemu_bootADestructive
Boot a QEMU VM headless and register it under name.
name identifies this VM in all later calls (qemu_screenshot, qemu_stop, etc.) - it must be non-empty and contain no "/" or "" (it also names a temp directory and is passed to QEMU's -name flag). Provide at least one of: iso (bootable CD image), kernel (multiboot/bzImage, optionally with append/initrd), or disk (raw or qcow2 disk image, auto-detected; qcow2 is required for qemu_snapshot_save/qemu_snapshot_load). append/initrd require kernel to also be given - QEMU itself rejects -append/-initrd without -kernel, so this is checked up front with a clear ValueError. Each of iso, kernel, initrd, and disk, if given, must already exist on disk - qemu_boot checks with a clear FileNotFoundError naming the param and path before any QEMU process starts, rather than letting a typo surface later as an opaque "QEMU exited immediately" failure; qemu_boot never creates a disk image for you, so disk must point at an existing image file. memory_mb must be positive. arch picks the qemu-system- binary (x86_64, i386, aarch64, riscv64...) and, like name, must contain no "/" or "" and not be "." or "..". machine is passed as QEMU's -M and is required on some archs - aarch64 and riscv64 have no default machine and need e.g. machine="virt". smp sets the number of virtual CPUs (QEMU -smp), for testing SMP-aware guest code; must be positive when given. smp_cores/smp_threads/smp_sockets/smp_maxcpus add QEMU's -smp CPU-topology qualifiers (cores=/threads=/sockets=/maxcpus=) onto the same -smp flag instead of a flat count - for guest code that cares about socket/core/thread shape (ACPI MADT entries, CPUID topology leaves, per-socket vs. per-core scheduling), not just a total vCPU number. Each must be positive when given; any of them (with or without smp itself) causes -smp to be emitted. accel is passed as QEMU's -accel (e.g. "kvm", "kvm:tcg" to fall back to software emulation if KVM isn't available, "hvf"/"hvf:tcg" on macOS, "whpx:tcg" on Windows) to opt into hardware acceleration; left unset, QEMU defaults to TCG (software emulation), which is correct but slow for anything beyond a trivial kernel. There's no host-capability probe for this - if the requested accelerator isn't available, QEMU itself fails immediately and that failure (including QEMU's own explanation) is surfaced the same way any other immediate boot failure is, in the raised error. cpu is passed as QEMU's -cpu (e.g. "qemu64,+avx", "max", "host" when accel="kvm"/"hvf") to select or customize the emulated CPU model - useful for testing guest code against a specific feature set (SSE4, AVX, a particular vendor's quirks) rather than whatever QEMU defaults to for the arch. extra_args is passed to QEMU verbatim, e.g. "-netdev user,id=n0 -device rtl8139,netdev=n0" (must be valid shell-style quoting, e.g. no unbalanced quotes). extra_args may not contain a flag qemu_boot already sets itself: -name, -m, -display, -qmp always; -M/-machine, -cdrom/-boot, -kernel, -append, -initrd, -smp, -accel, -cpu when the corresponding param above is also given (-smp collides when smp or any of the smp_* topology params is given). -drive is exempt from this check even when disk is given - QEMU allows repeated -drive flags, so extra_args can add further disks, e.g. extra_args="-drive file=data.img,format=raw" for a second drive alongside disk (pointing extra_args's -drive at the same file as disk will still fail, but as a QEMU image-locking error at boot, not a pre-flight one). -chardev/-serial are similarly exempt except for the exact chardev qemu_boot's own serial console uses (id=serial0 / chardev:serial0) - extra_args can add an unrelated -chardev or a second -serial (e.g. a COM2 backed by another chardev) freely, but reusing id=serial0 or pointing another -serial at chardev:serial0 is rejected, since that's the pair qemu_serial/qemu_serial_send depend on. hostfwd is a convenience for reaching a guest service (SSH, a web server under test) from the host, without needing QEMU-specific NIC/chipset knowledge: give it QEMU's hostfwd rule, e.g. hostfwd="tcp::2222-:22" to forward host port 2222 to guest port 22, and qemu_boot adds the "-netdev user,id=net0,hostfwd=..." / "-device e1000,netdev=net0" pair for you (the guest needs its own driver for an e1000 NIC - most general-purpose OSes, Linux included, have one built in). Must look like [tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport. -netdev/-device are similarly exempt from the extra_args conflict check except for the exact netdev hostfwd's own NIC uses (id=net0 / netdev=net0) - extra_args can add an unrelated NIC (e.g. for testing a guest driver) freely, but reusing id=net0 or pointing a -device at netdev=net0 is rejected. hostfwd's host port is probed pre-flight (a bind attempt on that exact port/address) so a collision - two VMs sharing a hostfwd port, or an unrelated process already bound to it - raises a clear ValueError naming the port instead of surfacing as QEMU's own confusing bind-failure output through the generic "QEMU exited immediately" path. qmp_connect_timeout_s bounds how long to retry connecting to QEMU's QMP socket after launch (raise it on a slow/loaded host where QEMU's first launch is slow, e.g. under AV scanning). qmp_read_timeout_s bounds how long any single QMP command (including ones issued by other qemu_* tools for this VM, like qemu_qmp or qemu_snapshot_save) waits for a response - raise it if you expect a command that can legitimately run long. Both timeouts must be positive. The VM keeps running until qemu_stop; serial output is captured continuously.
| Name | Required | Description | Default |
|---|---|---|---|
| cpu | No | ||
| iso | No | ||
| smp | No | ||
| arch | No | x86_64 | |
| disk | No | ||
| name | Yes | ||
| accel | No | ||
| append | No | ||
| initrd | No | ||
| kernel | No | ||
| hostfwd | No | ||
| machine | No | ||
| memory_mb | No | ||
| smp_cores | No | ||
| extra_args | No | ||
| smp_maxcpus | No | ||
| smp_sockets | No | ||
| smp_threads | No | ||
| qmp_read_timeout_s | No | ||
| qmp_connect_timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the supplied annotations (destructive/openWorld/non-idempotent), which say nothing about mechanics: the description discloses pre-flight validation behavior (FileNotFoundError naming param and path, ValueError for append/initrd without kernel, hostfwd port bind probe), that QEMU's own accelerator or image-locking failures surface through the generic boot-error path, and that serial output is captured continuously. It also gives the extra_args conflict rules in detail, including the deliberate exemptions for -drive, -chardev and -netdev. The only untold element is why the tool is flagged destructive, which is a minor omission against this volume of disclosure.
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 content is dense and largely earns its place, but it is delivered as a single undifferentiated wall of prose with heavy parenthetical nesting, making it hard to scan for a specific parameter. The extra_args conflict rules are restated three times in near-identical shape for -drive, -chardev/-serial and -netdev, which could be compressed into one rule plus a table of exceptions.
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 20-parameter tool with an output schema and annotations already present, the description covers the remaining gaps: prerequisites, cross-parameter validation, error surfacing, conflict rules, and lifetime/cleanup expectations. An agent has everything needed to invoke it correctly on the first attempt.
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% across 20 parameters, so the description carries the entire burden and does: name charset restrictions, iso/kernel/disk existence requirements, memory_mb and smp* positivity, arch-to-binary mapping, machine/-M semantics per arch, accel fallback syntax ('kvm:tcg'), cpu examples, hostfwd rule grammar, and what each timeout actually bounds. This is meaning well beyond type/default information.
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?
States a specific verb and resource ('Boot a QEMU VM headless and register it under `name`') and immediately establishes the registration role that links it to every other qemu_* sibling. An agent can tell this apart from qemu_disk_create (image creation) and qemu_stop (teardown) without opening any 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?
Gives concrete selection rules: at least one of iso/kernel/disk must be supplied, append/initrd require kernel, qcow2 is needed for snapshot save/load, and machine is required on aarch64/riscv64. It also implies the ordering contract ('identifies this VM in all later calls', 'keeps running until qemu_stop') and hints that disk images must be made elsewhere. It never explicitly names a sibling as the alternative for creating images, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_change_mediaADestructiveIdempotent
Swap the medium in a removable drive (e.g. a CD-ROM) without rebooting.
device is the block backend's id or QOM path, as shown by qemu_qmp(name, "query-block")'s "qdev" field - qemu-mcp can't guess it for you, since it depends on the machine type/QEMU version and whether the drive was given an explicit id (qemu_boot's iso/disk params don't set one). path must already exist. format defaults to auto-probing the new image. force=True ejects even a drive the guest has locked (its tray "closed" on the medium); the default refuses in that case instead of surprising the guest. Wraps QMP blockdev-change-medium.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| path | Yes | ||
| force | No | ||
| device | Yes | ||
| format | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare destructiveHint and idempotentHint, the description adds real behavior: force=True ejects despite a guest tray lock while the default refuses, format defaults to auto-probing, and the call wraps QMP blockdev-change-medium. It does not explain what happens to the previously attached medium or the failure mode if path is invalid.
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?
Purpose is front-loaded in one sentence, then parameter guidance follows in a logical order. Some phrasing is conversational and slightly padded ('qemu-mcp can't guess it for you, since it depends on the machine type/QEMU version'), but each clause still conveys actionable information.
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 QMP wrapper with an output schema already documenting return values, the description covers what the agent needs: device identification, path precondition, format default, and the safety-relevant force behavior. The unexplained 'name' parameter is the sole omission and is likely a cross-tool convention.
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%, so the description carries the burden, and it does well for four of five params: device sourcing, path existence requirement, format auto-probe default, and force semantics. The required 'name' parameter is never explained, which is the only notable gap.
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 opening sentence states a specific verb and resource ('swap the medium in a removable drive') plus an example and the key benefit ('without rebooting'). The parenthetical mention of qemu_boot's iso/disk params makes the distinction from the boot-time media path explicit, so an agent can separate this from qemu_boot or qemu_qmp without reading schemas.
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 gives concrete preconditions (path must already exist), tells the agent where to obtain the device value (query-block's 'qdev' field) and why it can't be guessed, and states the default vs forced behavior on guest-locked drives. What's missing is a crisp statement of when not to use this tool versus alternatives such as qemu_qmp blockdev-change-medium or rebooting via qemu_boot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_disk_createA
Create a fresh disk image via qemu-img create, ready for qemu_boot's disk param.
qemu_boot never creates a disk image itself - disk must already
point at an existing file. This closes that gap: create one here,
then boot straight into it.
size looks like qemu-img's own size grammar: a number optionally suffixed with k/K/M/G/T/P/E, e.g. "10G" or "512M". format must be "qcow2" (default - needed for qemu_snapshot_save/qemu_snapshot_load) or "raw" - qemu_boot's disk_format() auto-detection only tells these two apart, so any other qemu-img format would silently be treated as raw. Fails if path already exists, rather than overwriting it.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| size | Yes | ||
| format | No | qcow2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is non-read-only, non-idempotent and non-destructive; the description adds the crucial failure mode (fails if path already exists instead of overwriting, consistent with idempotentHint=false) and warns that qemu_boot's format auto-detection only distinguishes qcow2 from raw, so other formats silently degrade. That is real behavioral context beyond the annotation block.
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?
Front-loaded with purpose and the qemu_boot dependency, then parameters, then the failure mode. Slightly redundant in the middle - 'qemu_boot never creates a disk image itself' and 'This closes that gap: create one here, then boot straight into it' say overlapping things - but nothing is wasted overall.
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?
An output schema exists, so return values need not be described; with purpose, sibling relationship, parameter grammar, format constraints and the existing-path failure all covered, an agent has everything needed to invoke it correctly on the first attempt.
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 coverage is 0%, so the description carries the full burden and does: it spells out qemu-img size grammar with unit suffixes and examples ('10G', '512M'), restricts format to exactly two valid values with a default, and implies path must not exist. All three parameters gain meaning absent from the bare 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?
States a specific verb and resource ('Create a fresh disk image via qemu-img create') and immediately ties it to the sibling that needs it (qemu_boot's `disk` param), which lets an agent place it among the qemu_* tools without opening 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?
Explains exactly when to use it: qemu_boot never creates images, so create here first, then boot. It also routes the format choice to siblings - 'qcow2' is required for qemu_snapshot_save/qemu_snapshot_load, 'raw' otherwise - which is explicit alternative-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_keyADestructive
Press a key or chord: "enter", "esc", "f12", "ctrl-alt-f2", "ctrl-c"...
Parts are joined with "-" and pressed together. A literal "-" key is written "--" (e.g. "ctrl--" for ctrl + minus). Use qemu_type for plain text. "sysrq" sends the Linux Magic SysRq key (e.g. "alt-sysrq-s" to sync disks, "alt-sysrq-c" to force a crash dump on a guest kernel built with CONFIG_MAGIC_SYSRQ).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| combo | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is partly carried structurally. The description goes beyond them by explaining that 'sysrq' triggers the Linux Magic SysRq key and that 'alt-sysrq-c' can force a crash dump, implicitly warning that this can disrupt the guest kernel. It does not state error behavior for unrecognized key names, but the sysrq disclosure is substantive added context.
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 core concept and the sibling steer are front-loaded in the first two sentences, and the remaining text is dense with concrete syntax rules rather than filler. The multi-line layout is slightly harder to scan than a single tight paragraph, but no sentence is wasted.
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?
An output schema exists, so return values need not be described. For a two-parameter tool, the combo grammar and sysrq special case are well covered; the main remaining gap is that the description never says what 'name' identifies (the target VM), which an agent must infer from the qemu_ prefix.
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 coverage is 0%, so the description must carry parameter meaning, and it does this thoroughly for 'combo': parts joined with '-', pressed together, literal '-' written as '--', and a documented 'sysrq' token with examples. The 'name' parameter is never explained, leaving one of two parameters undocumented, which prevents a 5.
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+resource ('Press a key or chord') and immediately grounds it with concrete examples ('enter', 'ctrl-alt-f2', 'ctrl-c'). It also distinguishes itself from the sibling qemu_type by name, so an agent can pick the right tool without inspecting either 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?
It gives an explicit routing rule: use qemu_type for plain text, this tool for key/chord input. That is a real when-to-use signal against a sibling. It does not cover when-not-to-use in a risk sense (e.g. avoid combos that could interrupt the guest), which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_listADestructiveIdempotent
List all VMs managed by this server, with arch, machine, hostfwd, pid, uptime, and state.
A VM that exited on its own (guest panic, or quit via qemu_qmp) is
shown here once as exited(...), then reaped - its workdir and handles
are freed before this call returns, so it won't reappear next time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already indicating destructive behavior, the description adds important lifecycle detail: exited VMs appear once as exited(...), then are reaped and their workdir and handles are freed before the call returns. This explains a non-obvious side effect that annotations alone would not convey.
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 front-loaded with the main purpose, then adds a necessary caveat about exited VMs. Every sentence contributes useful information without unnecessary wording.
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 zero-parameter list tool with an output schema and annotations, the description is complete enough. It covers what is listed, the fields available, and the important reaping behavior before the call returns.
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?
There are zero parameters, so the baseline is 4. The description does not need to explain parameter semantics, and it appropriately stays focused on the result and lifecycle behavior.
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 and resource: 'List all VMs managed by this server,' and names the fields returned (arch, machine, hostfwd, pid, uptime, state). It is clearly distinguishable from snapshot-oriented siblings like qemu_snapshot_list, though it does not explicitly contrast with them.
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 is implied by the listing purpose, but the description does not state when to use qemu_list versus alternatives such as qemu_snapshot_list or qemu_version. There are no explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_mouseADestructive
Move the absolute pointer and optionally click.
x and y are fractions of the screen width/height (0.0 = left/top, 1.0 = right/bottom) - read them off a qemu_screenshot. button is "left", "right", or "middle" for a full click at that position; "wheel-up", "wheel-down", "wheel-left", or "wheel-right" to scroll a scrollable widget under the pointer instead; or "side"/"extra" for a 5-button mouse's extra side buttons (needs the guest's PS/2 mouse driver in IMEX mode to see them). Omit button to just move the pointer. Needs the guest to have an absolute pointer (USB tablet or PS/2 mouse) to track it - most GUIs have one by default.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| name | Yes | ||
| button | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description is not carrying the full burden. It still adds useful context the annotations cannot: the guest must expose an absolute pointer (USB tablet or PS/2 mouse), and side buttons require the guest's PS/2 driver in IMEX mode. What it does not do is warn that a click can trigger irreversible guest-side actions, which would explain the destructive flag.
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 purpose is front-loaded in the first sentence and the rest is dense, non-redundant detail about coordinates and button values. It is longer than average but nearly every clause carries information an agent needs; only the parenthetical driver caveat is borderline expendable.
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?
Return values are covered by the output schema, so the description needn't explain them. The remaining gap is the unexplained required 'name' parameter and the absence of any note on click irreversibility despite destructiveHint=true. For a 4-parameter input tool, that leaves the definition adequate but not complete.
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%, so the description has to compensate, and it does well for x, y (fractions of screen size) and button (enumerating left/right/middle, wheel directions, and side/extra). However, the required 'name' parameter is never mentioned, leaving one of three required inputs entirely unexplained.
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 opening sentence gives a specific verb and resource: 'Move the absolute pointer and optionally click.' It immediately separates the tool from siblings like qemu_key and qemu_type, which handle other input devices, so an agent can pick it without inspecting 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?
The description tells the agent to read x/y coordinates 'off a qemu_screenshot', which is a concrete workflow pointer to the sibling tool that produces the needed input. It also states that omitting button just moves the pointer. It stops short of explicit when-not guidance (e.g., use qemu_key for keystrokes), so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_pauseAIdempotent
Pause the VM's execution (QMP stop) without exiting QEMU.
The guest's CPUs stop running - RAM and device state stay exactly as they are until qemu_resume. Useful for inspecting a VM (qemu_screenshot, qemu_qmp query-*) without guest time advancing while you look, or for pairing with qemu_snapshot_save to get a guaranteed-consistent snapshot instead of one taken mid-instruction. qemu_stop still works on a paused VM.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false); the description adds real behavior: guest CPUs stop, RAM and device state are preserved unchanged, guest time does not advance, and that state persists until qemu_resume. It also discloses a useful side effect for snapshotting (guaranteed-consistent snapshot rather than one taken mid-instruction).
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?
Front-loads the core action in the first sentence and follows with use cases; every sentence carries information. It is slightly long, and the trailing "qemu_stop still works on a paused VM" sentence is a little ambiguous in placement rather than a crisp exclusion rule.
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?
With an output schema present, return values need not be explained, and the state/consistency semantics are covered well. The only real omission is the meaning of the `name` argument, which is a modest gap for an otherwise simple one-parameter tool.
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 single required parameter `name` is described nowhere in the description. The text never says whether `name` is the VM name, an instance label, or something else, so the description does not compensate for the schema gap.
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?
States a specific verb and resource ("Pause the VM's execution") and even names the underlying QMP primitive (`stop`). The clause "without exiting QEMU" immediately separates it from qemu_stop, so an agent can distinguish it from siblings without opening any 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?
Gives concrete when-to-use scenarios: inspecting a VM via qemu_screenshot or qemu_qmp query-* without guest time advancing, and pairing with qemu_snapshot_save for a consistent snapshot. The note that "qemu_stop still works on a paused VM" hints at the boundary with qemu_stop, but the description never states plainly what qemu_stop is for or when to prefer it, so the alternative routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_qmpBDestructive
Escape hatch: run a raw QMP command on the VM.
Examples: query-status, system_reset, memsave, device_add. See the QEMU QMP reference for commands and their arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| command | Yes | ||
| arguments | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuine context beyond that: this is an untyped pass-through whose behavior depends entirely on the caller-supplied command and its arguments, and the command grammar lives in an external reference. It still omits what state can be corrupted or whether errors are surfaced, so a 3 is warranted.
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 short sentences, front-loaded with the framing ('Escape hatch') before the examples. Every element earns its place, though the trailing 'See the QEMU QMP reference' is a pointer rather than substantive guidance.
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?
An output schema exists, so return values needn't be described, and the annotations cover the safety profile. For a maximally generic destructive tool, though, the description should steer the agent toward dedicated siblings first and note that arbitrary commands can alter or break VM state — neither is present, and one required parameter goes unexplained.
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%, so the description must carry the parameter burden, and it only partly does. It clarifies that 'command' is a QMP command name and that arguments are command-specific ('commands and their arguments'), but the required 'name' parameter is never explained as the VM identifier, leaving a required parameter ambiguous.
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 verb and resource ('run a raw QMP command on the VM') and frames it as an 'escape hatch', which distinguishes it from the typed siblings like qemu_pause or qemu_snapshot_save. Example commands (query-status, system_reset, memsave, device_add) make the scope concrete, though it never names the siblings it substitutes for.
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 word 'escape hatch' implies usage in cases the dedicated tools don't cover, and the pointer to the QEMU QMP reference implies the agent must look up syntax externally. However, there is no explicit statement of when to prefer a typed sibling tool over this one, nor any exclusion or warning about conditions where it should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_resumeAIdempotent
Resume a VM previously paused with qemu_pause (QMP cont).
A no-op (still returns success) if the VM wasn't paused.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing that the call silently succeeds when the VM was never paused — a behavior that idempotentHint only hints at, and which matters for verifying state. The QMP `cont` mapping also tells the agent what happens underneath. It does not describe the response payload, but annotations plus the output schema cover the 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 sentences, front-loaded with the primary action and the sibling reference, then the one caveat that changes agent behavior. Nothing is padded.
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 low-complexity state-transition tool with an output schema and rich annotations, the description covers the action, precondition, and no-op edge case. The only missing piece an agent needs is what `name` refers to.
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% for the single required `name` parameter, so the description carries the full burden and provides nothing: it never says whether `name` is the VM identifier from qemu_list, a domain name, or a UUID, nor whether it must match a running/paused VM. This is the definition's clearest gap.
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?
States a specific verb (resume) plus resource (a paused VM) and anchors it to the sibling that creates the state it undoes ('previously paused with qemu_pause'), even citing the underlying QMP command `cont`. An agent can distinguish this from qemu_boot and qemu_stop without opening any 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?
Gives a clear precondition (VM was paused via qemu_pause) and an edge case (no-op if not paused). It does not explicitly contrast with qemu_boot, the alternative for a non-running VM, but the pairing with qemu_pause makes the intended usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_screenshotARead-onlyIdempotent
Capture the VM's display as a PNG image.
Works headless - the guest's VGA framebuffer is captured via QMP screendump. Use it to see boot screens, kernel panics, GUIs, or a text console that doesn't write to serial. Raises a clear error (instead of an opaque image-decoding failure) if the VM exits while the screendump is in flight.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely useful behavior: it works headless via the VGA framebuffer, and it raises a clear error rather than an opaque decoding failure if the VM exits mid-capture. It does not say where the resulting image goes (returned inline vs. written to disk), which is the main remaining behavioral gap.
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 short sentences, front-loaded with the core action and output format, followed by usage cases and error behavior in descending priority. The parenthetical about error messaging is slightly verbose but still 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?
With no output schema, the description could say more about the return value (image content vs. file path), but "Capture the VM's display as a PNG image" implies an image is returned. For a single-parameter read-only tool, the coverage of purpose, use cases, and failure mode is close to complete.
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 coverage is 0%, so the description must carry the burden for the single "name" parameter — but it never mentions it. An agent can infer it identifies the target VM from the sibling qemu_* tools, but this is left to inference rather than stated.
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 verb and resource ("Capture the VM's display as a PNG image") and names the mechanism (QMP screendump), which distinguishes it from the adjacent qemu_serial / qemu_wait_screen tools. An agent can identify the tool's function without opening 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?
It gives concrete when-to-use cases: boot screens, kernel panics, GUIs, and a text console that doesn't write to serial. The serial-based alternative is implied but not named explicitly, and no when-not-to-use case is given, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_serialARead-onlyIdempotent
Read the tail of the VM's serial console output (COM1).
Works even after the VM has exited (guest crash, or quit via
qemu_qmp) so you can see what it printed right before dying - the
exited VM stays visible here until qemu_list's next call reaps it.
tail_lines must be positive.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| tail_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior, but the description adds real lifecycle context not present in them: the console remains readable after the VM has exited and stays visible only until qemu_list reaps it. That reaping dependency is the key behavioral fact an agent would otherwise miss; return format is left to the output 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?
Three short sentences, front-loaded with the operation, then the non-obvious lifecycle behavior, then the one parameter constraint. Nothing is redundant and nothing is buried.
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?
An output schema exists, so return values need not be described, and the description covers the non-obvious lifecycle and the tail_lines constraint. The remaining gap is what `name` refers to and how to obtain it, which matters for a required parameter with no schema description.
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%, so the description must carry parameter meaning. It does add a real constraint for tail_lines ('must be positive', beyond the schema's default of 50), but the required `name` parameter is never explained or tied to the VM identifiers returned by qemu_list.
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 verb and resource: reading the tail of the VM's serial console output on COM1, with the scope ('tail') made explicit. It implicitly separates itself from qemu_serial_send (writes) and qemu_wait_serial (blocks for a pattern), but never names those siblings, so the differentiation is left partly to inference.
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 gives a clear use case: retrieving output after a guest crash or `quit` via qemu_qmp, when the VM is no longer live. It does not state when to prefer qemu_wait_serial or qemu_screenshot instead, nor any exclusions, so the when-to-use guidance is strong but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_serial_sendADestructive
Write text to the guest's serial console (COM1).
For guests that only expose a shell over serial (no VGA console, or a kernel with a serial-only debug shell) - the bidirectional counterpart to qemu_serial's read-only tail. Sent exactly as given; include "\n" yourself for Enter. Kept on one persistent connection for the VM's lifetime - disconnecting and reconnecting would hang up the serial line. If the connection drops (e.g. the guest is mid-reboot) this reconnects once automatically; if that also fails, raises with a message saying so
retry the call once the guest's serial socket is back up.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is a non-idempotent, destructive write; the description adds substantially more: input is sent verbatim, the caller must supply "\n" for Enter, a single persistent connection is held for the VM's lifetime, reconnection happens once automatically, and failure raises with a retry-once-the-socket-is-back instruction. That is exactly the operational context an agent needs before invoking a destructive console write.
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 purpose and the discriminating condition are front-loaded in the first two sentences, and the reconnection/error guidance is grouped at the end where it belongs. The second paragraph is slightly meandering, but every sentence carries real operational information rather than 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?
Because an output schema exists, return values do not need explaining, and the description covers the behaviors that matter for a stateful serial write: verbatim transmission, line-persistence, single auto-reconnect, and failure semantics. The only real gap is the unexplained name parameter and nothing about size/throughput limits.
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%, so the description must supply meaning. It does explain the text parameter well (sent exactly as given, newline required) but never clarifies what the required name parameter refers to — presumably the VM identifier, but the agent must infer it. Partial compensation for a two-parameter schema with no field documentation.
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 first sentence states a precise verb and resource: write text to the guest's serial console (COM1). It explicitly positions itself as the bidirectional counterpart to the read-only qemu_serial sibling, so an agent can separate the two without consulting either 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?
It names the qualifying condition for use — guests that expose a shell only over serial, with no VGA console or a serial-only debug shell — and points at qemu_serial for the read-only case. It stops short of contrasting with qemu_type/qemu_key, which is the other plausible alternative for delivering input, so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_snapshot_deleteADestructiveIdempotent
Delete a snapshot previously saved with qemu_snapshot_save.
Frees the space it used inside the qcow2 disk. Reports failure if QEMU's delvm rejects it (e.g. an unknown tag) instead of claiming success.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered; the description earns credit for adding what is destroyed (space inside the qcow2 disk is freed) and the error contract (a failing delvm surfaces as failure rather than silent success). The mention of QEMU's delvm rejecting an unknown tag is real behavioral context not present in the annotations. It does not discuss the interaction between idempotentHint=true and erroring on an unknown tag, which is a minor omission.
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 short sentences with the action front-loaded and the effect and error behavior following. No filler, no restatement of the title.
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?
The tool is simple and an output schema exists, so return values need no explanation. However, with zero schema coverage, the unexplained 'name' parameter leaves an agent guessing about scope (which VM the snapshot belongs to), which is a meaningful gap for a destructive operation.
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%, so the description must carry parameter meaning, and it largely does not. "Unknown tag" hints that 'tag' identifies the snapshot, but the required 'name' parameter (presumably the VM name) is never explained, and there is no format guidance for either.
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?
Specific verb plus resource ("Delete a snapshot") with an explicit lineage tie to qemu_snapshot_save, so the agent knows this is the inverse of the save tool. It does not explicitly distinguish itself from qemu_snapshot_load or qemu_snapshot_list, so the sibling separation stops just short of a 5.
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 phrase "previously saved with qemu_snapshot_save" implies a precondition (the snapshot must already exist), and the failure note implies a guard, but there is no explicit when-not or direct comparison to qemu_snapshot_load for removing vs. reverting. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_snapshot_listARead-onlyIdempotent
List internal snapshots saved on the VM's qcow2 disk.
Wraps QEMU's HMP info snapshots so you can see what tags already exist
before calling qemu_snapshot_load or qemu_snapshot_delete, instead of
finding out only from a failure afterward. Returns QEMU's raw table
output as-is (its exact column layout isn't parsed here).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, but the description adds materially useful behavior: the result is QEMU's raw table output with the 'exact column layout isn't parsed here,' and the snapshots are 'internal' on the qcow2 disk rather than external. The one omission is what happens for a VM whose disk is not qcow2, so it falls just short of full transparency.
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: what it does, why it exists relative to the load/delete tools, and the return-format caveat. The purpose is front-loaded and 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?
An output schema exists, so the description needn't detail return fields, and the raw-HMP-output caveat covers the one thing the schema can't express. The remaining gap is the unstated meaning of the 'name' parameter for an otherwise very simple tool.
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% for the single required parameter 'name', so the description carries the burden, and it only implicitly conveys that 'name' identifies the VM via the phrase 'the VM's qcow2 disk.' It never says whether 'name' is a VM name, a disk path, or a libvirt domain, so the meaning is inferable but not stated.
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 ('List internal snapshots saved on the VM's qcow2 disk') and goes on to name the sibling tools it complements (qemu_snapshot_load, qemu_snapshot_delete) together with the implementation it wraps (HMP `info snapshots`). An agent can distinguish it from other snapshot tools without opening any 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?
It states exactly when to call it: 'so you can see what tags already exist before calling qemu_snapshot_load or qemu_snapshot_delete, instead of finding out only from a failure afterward.' That is an explicit precondition plus the alternatives it supports, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_snapshot_loadADestructiveIdempotent
Restore a VM to a snapshot previously saved with qemu_snapshot_save.
Requires the same qcow2 disk the snapshot was taken on.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so safety is covered structurally. The description supplies a genuinely non-obvious precondition, that the snapshot must be on the same qcow2 disk, which is not encoded anywhere in the schema and is the main reason a load would fail. It does not say what happens to current in-memory/disk state, though destructiveHint partially covers that.
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 short sentences, front-loaded with the action and followed by the prerequisite. Nothing redundant; every sentence carries information.
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?
An output schema exists, so return-value explanation is unnecessary, and the destructive/reversible profile is in annotations. However, with two required, fully undocumented parameters, the description leaves the agent guessing about argument semantics for a destructive operation, which is a substantial omission for a restore tool.
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 both parameters (name, tag) are bare strings with no titles beyond the field names. The description adds no meaning at all about what 'name' identifies versus what 'tag' identifies, or whether tag refers to the snapshot tag created by qemu_snapshot_save. This is the definition's largest gap.
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 gives a specific verb+resource ('Restore a VM to a snapshot') and names the complementary sibling qemu_snapshot_save, which distinguishes it from snapshot_save/delete/list. It stops short of explaining the difference from other state-changing siblings like qemu_boot or qemu_resume.
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 implies the tool is used after qemu_snapshot_save and pairs with it, which is useful sequencing context. It does not state when not to use it (e.g., paused/running VM, VM already in target state) or point to alternatives such as qemu_snapshot_list for discovering valid names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_snapshot_saveADestructive
Save a full VM snapshot (RAM + device state) under tag.
Uses QEMU's internal savevm mechanism, which stores the snapshot inside the disk image itself - the VM's disk must be qcow2 (raw images do not support internal snapshots). Saving again with the same tag overwrites it. tag may only contain letters, digits, '.', '_', '-'.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds the concrete behavior behind it: a repeated save with the same tag destroys the previous snapshot, and the snapshot lives inside the disk image via savevm. It stops short of saying whether the VM must be running/paused or how long a save blocks the guest, which matters for a live-save 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, front-loaded with the action, followed by mechanism/constraint and then the tag rule. No filler and every clause adds usable information.
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?
An output schema exists, so return values need no explanation, and the storage-location and format constraints are covered. The unexplained `name` parameter and the absence of any note about required VM state are the remaining gaps for a destructive snapshot operation.
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%, so the description carries the full burden. It defines `tag` well (allowed characters, overwrite semantics) but says nothing about the required `name` parameter, leaving half the inputs to inference.
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?
States a specific verb and resource (save a full VM snapshot of RAM + device state under `tag`) and implicitly separates itself from qemu_snapshot_load/delete/list by describing the save direction and the internal savevm mechanism.
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?
Gives a hard prerequisite (disk must be qcow2, raw images unsupported) and the overwrite condition, which tells the agent when the call is valid. It does not explicitly point at siblings such as qemu_snapshot_list to check existing tags or qemu_snapshot_load as the counterpart, so there are no named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_stopADestructiveIdempotent
Stop a VM. Tries graceful ACPI powerdown first; force=True kills it.
Guests without ACPI handling (most hobby kernels) will need force=True
or will be killed after the graceful_timeout_s grace period anyway.
graceful_timeout_s (default 10 s) bounds how long to wait for the guest
to shut down after ACPI powerdown before falling back to a kill; raise
it for a guest that legitimately needs longer (large RAM, a slow ACPI
handler). kill_timeout_s (default 3 s) bounds how long to wait for the
QEMU process to exit after quit/kill before it's force-killed. Both
must be positive.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| force | No | ||
| kill_timeout_s | No | ||
| graceful_timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description carries real behavioral information beyond the annotations: an ACPI powerdown is attempted first, then a kill fallback after graceful_timeout_s, then a process force-kill after kill_timeout_s. It also warns that many hobby kernels will end up force-killed, which is exactly the side-effect disclosure an agent needs for a destructiveHint=true tool.
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?
Front-loaded with the core action and the fallback behavior, then parameter detail. Slightly wordy in the parenthetical about large RAM and the "or will be killed ... anyway" clause, which partly repeats the timeout explanation, but 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?
An output schema exists, so return values needn't be described, and the behavioral and timeout semantics are thoroughly covered for a destructive stop operation. The only missing piece is the meaning of the required `name` argument, which leaves a small hole for a 4-parameter tool.
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 coverage is 0%, so the description must do the work, and it does for three of four parameters: force, graceful_timeout_s and kill_timeout_s each get defaults, meaning and a constraint ("both must be positive"). The required `name` parameter is never explained (presumably a VM name from qemu_list), which is the one remaining gap.
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?
Opens with a specific verb and resource: "Stop a VM." That is clearly distinguishable from qemu_pause/qemu_resume siblings, and the grace-then-kill detail further pins the semantics. It doesn't explicitly name an alternative tool, so it falls just short of a 5.
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?
Gives concrete when-to-use guidance: guests without ACPI handling need force=True, and graceful_timeout_s should be raised for large-RAM or slow-ACPI guests. It lacks an explicit when-not or a pointer to qemu_pause for a reversible suspend, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_typeADestructive
Type text into the guest as keyboard input. "\n" presses Enter.
Handles US-layout characters including shifted symbols. delay_ms is the gap between keystrokes - raise it (e.g. 80) if the guest drops characters during early boot. Must be non-negative.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| text | Yes | ||
| delay_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, readOnly=false and idempotent=false, so the safety profile is covered. The description adds genuinely new behavior: US keyboard layout only, shifted symbols supported, '\n' translates to Enter, and a documented failure mode (dropped characters during early boot) with the remedy. It stops short of saying that repeating the call types the text again.
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?
Front-loaded with the core action, then constraints, then parameter tuning — nothing superfluous. The escaped-quote rendering of the newline instruction ('"\n" presses Enter') is slightly garbled and costs a bit of readability.
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?
An output schema exists, so return values need not be described, and annotations cover the risk profile. Combined with the layout/keystroke/failure-mode detail, the definition is nearly complete for a typing tool; only the meaning of the required 'name' argument is left unexplained.
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%, so the description carries the burden, and it does well for two of three params: text semantics (layout, shifted symbols, newline behavior) and delay_ms (gap between keystrokes, default tuning advice, must be non-negative). The required 'name' parameter is never explained, which is the main remaining ambiguity.
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?
States a concrete verb and resource ('Type text into the guest as keyboard input') and implicitly separates itself from the sibling qemu_key by operating on whole text rather than single keys. It does not name qemu_key explicitly, so the differentiation is inferred rather than stated.
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 (typing strings rather than individual keystrokes) and there is useful conditional advice for delay_ms ('raise it ... if the guest drops characters during early boot'). However, it never explicitly says when to prefer qemu_key or qemu_serial_send, and gives no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_versionARead-onlyIdempotent
Report qemu-system-<arch> --version's own output, without booting a VM.
Useful when a QMP command or machine type behaves unexpectedly and you need to know what's actually installed - arch picks the same qemu-system- binary qemu_boot would use.
| Name | Required | Description | Default |
|---|---|---|---|
| arch | No | x86_64 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the important operational fact that no VM is booted, meaning the call is cheap and has no side effects on running guests. It does not mention output format, but an output schema exists.
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?
Front-loaded with the core action, then rationale, in two short sentences with no filler. The line wrapping is slightly awkward and the phrase 'its own output' is a touch redundant, but nothing wastes the reader's time.
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 simple, single-optional-parameter, read-only diagnostic tool with an output schema, so return values need no explanation. The description covers what it does, when it is useful, and how arch relates to the rest of the toolset, which is everything an agent needs to call it correctly.
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%, so the description must carry the meaning of 'arch', and it does partially: arch selects the qemu-system-<arch> binary, matching what qemu_boot would launch. However, it gives no hint at valid architecture values or the x86_64 default, leaving the agent to guess acceptable strings.
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?
States a specific verb and resource ('Report qemu-system-<arch> --version's own output') and immediately bounds the scope with 'without booting a VM'. This clearly separates it from the sibling qemu_boot, which is the tool an agent might otherwise confuse it with.
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?
Gives a concrete when-to-use scenario: diagnosing unexpected QMP command or machine type behavior by checking what is actually installed. It also links arch to 'the same qemu-system-<arch> binary qemu_boot would use.' No explicit when-not conditions are stated, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_wait_screenARead-onlyIdempotent
Block until the VM's display stops changing, or time out.
Polls screendumps every poll_interval_s and waits for stable_polls
consecutive frames that each differ from the previous one by at most
max_changed_pixels pixels (default 64: a blinking text-mode cursor flips
about 18, so identical frames never happen on a text console, while boot
output changes hundreds; use 0 to require identical frames) - the
reliable way to know a VGA-only
guest (no serial output) has finished a BIOS splash or boot animation
before you screenshot or type. For guests with serial output, prefer
qemu_wait_serial - it doesn't need a fixed number of polls to decide.
Always polls at least once, even if timeout_s is 0 or negative.
poll_interval_s must be positive.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| timeout_s | No | ||
| stable_polls | No | ||
| poll_interval_s | No | ||
| max_changed_pixels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds behavioral detail beyond the annotations: it polls at a set interval, requires consecutive stable frames, always polls at least once even with a zero or negative timeout, and rejects a non-positive poll_interval_s. The explanation of why max_changed_pixels defaults to 64 (a blinking cursor flips about 18 pixels, while boot output changes hundreds) is a concrete detail about how the tool behaves that the annotations do not provide.
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 purpose is front-loaded in one sentence, then the mechanism and the sibling routing follow in a logical order. The long parenthetical about pixel counts is dense but pays for itself by explaining the default, though the paragraph could be split for easier scanning.
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?
An output schema exists, so return values need not be described. For a five-parameter blocking wait tool, the description covers the mechanism, defaults, edge cases, and the sibling alternative, leaving nothing an agent needs in order to call it correctly.
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%, so the description has to carry the full load for parameter meaning, and it does for stable_polls, poll_interval_s (must be positive), timeout_s (edge case of zero or negative), and max_changed_pixels (default 64, use 0 for identical frames). The only gap is the required 'name' parameter, which is never described, though its meaning (VM name) is obvious from the qemu_* tool family.
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 first sentence gives a specific verb and resource: 'Block until the VM's display stops changing, or time out.' It also names the sibling it is not (qemu_wait_serial) and the condition that selects it, so the agent can distinguish it from alternatives without opening any 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?
The description states explicitly when to use this tool (a VGA-only guest with no serial output that must finish a BIOS splash or boot animation before screenshotting or typing) and when to use the alternative instead ('For guests with serial output, prefer qemu_wait_serial - it doesn't need a fixed number of polls to decide').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qemu_wait_serialARead-only
Block until text appears on the serial console, or time out.
The reliable way to know a guest reached a boot stage ("login:", "kernel ready", a shell prompt) before typing or screenshotting. Each wait searches only output after the previous successful wait's match, so waiting for "$ " after typing a command finds the NEW prompt, not the one already on screen. The first wait searches from the start of the log (so a marker printed before the call is still found); from_start=True searches the whole log again. Returns the serial tail either way, prefixed FOUND or TIMEOUT. Always checks at least once, even if timeout_s is 0 or negative. poll_interval_s (default 0.25s) must be positive. Each poll reads only the serial log bytes written since the previous poll, not the whole file, so a long wait against a chatty guest doesn't cost ever-more I/O per poll. text must be non-empty.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| text | Yes | ||
| timeout_s | No | ||
| from_start | No | ||
| poll_interval_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, non-destructive), and the description adds substantial behavior beyond them: incremental search cursor semantics, from_start reset, FOUND/TIMEOUT prefixing of the returned tail, guaranteed single check for non-positive timeouts, and per-poll incremental I/O. The main gap is that `name` (the target VM) is never explained, so the agent must infer which guest is being waited on.
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?
It is front-loaded with the core contract in the first line, then layers on cursor semantics and parameter constraints in short, purposeful sentences. The closing note on per-poll incremental I/O is informative but is the one sentence least relevant to deciding whether to call the tool.
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?
An output schema exists and the description still usefully signals the FOUND/TIMEOUT prefix shape, and it covers timeout and cursor behavior thoroughly for a blocking tool. The unexplained `name` parameter is the only meaningful omission for a 5-parameter definition.
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 coverage is 0%, so the description carries the load and does well: it constrains `text` to be non-empty, defines from_start as re-searching the whole log, clarifies that timeout_s of 0 or negative still yields one check, and pins poll_interval_s's default and positivity requirement. Only `name` receives no semantic explanation.
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 opening sentence states a specific verb and resource: block until `text` appears on the serial console, or time out. It is immediately distinguishable from the sibling qemu_serial (non-blocking read) and qemu_wait_screen (screen rather than console text) because the blocking-on-console-text behavior is explicit.
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 gives a clear when-to-use rule: the reliable way to know a guest reached a boot stage before typing or screenshotting. It does not explicitly name the alternative (e.g. qemu_serial for a non-blocking read) or state when not to use it, which keeps it below a 5.
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.
21 tool updates
v0.1.0- First observed
qemu_boot - First observed
qemu_change_media - First observed
qemu_disk_create - First observed
qemu_key - First observed
qemu_list - First observed
qemu_mouse - First observed
qemu_pause - First observed
qemu_qmp - First observed
qemu_resume - First observed
qemu_screenshot - First observed
qemu_serial - First observed
qemu_serial_send - First observed
qemu_snapshot_delete - First observed
qemu_snapshot_list - First observed
qemu_snapshot_load - First observed
qemu_snapshot_save - First observed
qemu_stop - First observed
qemu_type - First observed
qemu_version - First observed
qemu_wait_screen - First observed
qemu_wait_serial
TDQS
Scored across 21 tools
Each tool targets a clearly distinct action: boot/stop/pause/resume lifecycle, input (type/key/mouse), output (serial read/send, screenshot, waits), snapshots (save/load/delete/list), and disk/qmp utilities. The read-vs-write (qemu_serial vs qemu_serial_send) and serial-vs-screen wait pairs are explicitly distinguished in descriptions. qemu_qmp is a documented escape hatch that could overlap with pause/snapshot, but it's positioned as a raw fallback, not a primary path.
All tools consistently use the qemu_ prefix in snake_case throughout, which is highly predictable. There is minor variation in verb placement—qemu_disk_create is object_verb while most others lead with a verb (qemu_boot, qemu_list), and the snapshot_* group uses a shared object prefix. Still very readable and internally coherent.
21 tools is on the heavier side but each maps to a genuine VM-control concern (lifecycle, input, serial, snapshots, disk, version). The breadth is justified by the domain's surface area rather than being redundant. Slightly over the ideal but well-scoped.
Covers the full VM lifecycle: disk creation, boot, listing, pause/resume, graceful/forced stop, complete snapshot CRUD (save/load/delete/list), display and serial I/O, input injection, media swapping, version probe, and a raw QMP escape hatch. No obvious dead ends for agent-driven VM control.
Maintenance
Related MCP Connectors
Cloud desktops for AI agents: create a Linux computer, see its screen, click, type and run tasks.
Linux VMs for AI agents: create VMs, run commands, edit files and open preview URLs.
Disposable cloud Android emulators for coding agents: run an APK or PR build, tap, type, screenshot.
Persistent Linux microVMs for agents: root, internet, sub-second resume and a public URL.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables AI agents to capture high-quality screenshots from running QEMU virtual machines using the QEMU Machine Protocol (QMP), automatically discovering VMs and returning screenshots as PNG images.1-
- AlicenseNot gradedqualityDmaintenanceProvides AI agents with fully interactive terminal sessions, including TUI support, keyboard control, and screen capture across Windows, Linux, and Mac.MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that gives AI agents direct control over QEMU virtual machines.17 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control and automate Incus/QEMU virtual machines via SSH, supporting mouse/keyboard, screenshots, commands, and lifecycle management.MIT