dosbox-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DOSBOX_API_URL | No | The URL of the dosbox-automation API (loopback only) | |
| DOSBOX_API_TOKEN | No | The emulator's API token | |
| DOSBOX_TOKEN_FILE | No | Path to the file containing the emulator's API token |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| dosbox_statusA | Machine state: what program is running, mount status, version. One call answers 'what is the machine doing right now'. While a mount waits on an archive, status.archive says what the archive helper does (activity identifying or materializing, archive, bytes_done, bytes_total); the field is absent otherwise. |
| dosbox_shutdownA | Shut down the emulator. Irreversible. |
| session_infoA | Connection details for driving the REST API directly: base URL, token location, and a curl example that reads the token from its file. Use this when you need an endpoint the MCP tools don't wrap, such as saving a video frame to a file. The token value itself is never returned - it stays out of transcripts by design. |
| screen_textA | Read the DOS text-mode screen buffer as a string. Works only in text modes (CGA/EGA/VGA/Hercules text). |
| screen_captureA | Capture the current screen as a PNG image. Works in all video modes. |
| screen_infoB | Frame metadata: resolution, pixel format, palette status. |
| video_capture_startA | Start ZMBV video recording of the emulator screen. |
| video_capture_stopB | Stop ZMBV video recording. |
| video_capture_statusA | Check whether a video capture is in progress. |
| audio_capture_startB | Start WAV audio capture of the mixer output. |
| audio_capture_stopA | Stop WAV audio capture. |
| audio_capture_statusB | Check whether an audio capture is in progress. |
| mixer_statusA | Get mixer state: master volume, mute, all channels with volumes and sample rates. |
| mixer_volumeC | Set the master mixer volume. |
| mixer_muteA | Mute the master mixer output. |
| mixer_unmuteA | Unmute the master mixer output. |
| mixer_channel_volumeB | Set a mixer channel's user volume by name (SB, GUS, CDAUDIO, SPKR, etc.). |
| script_runA | Load and start a Lua script. The script runs sandboxed on the emulation thread. Any DOS automation capability without a dedicated tool is reachable through a Lua script. |
| script_statusA | Check the running script's state and read its output table. Scripts communicate results through dosbox.output['key'] = value. |
| script_stopB | Stop a running Lua script. |
| input_typeA | Type a string on the DOS keyboard. Characters are injected with pacing so the 8-slot i8042 buffer never overflows. Supports printable ASCII and common symbols (US layout). |
| input_keyA | Press or release a single key by its KBD_* name. Use for special keys (F1-F12, arrows, Escape, etc) that input_type cannot produce. |
| input_sequenceA | Inject a timed sequence of key, mouse, and wheel events. For complex input patterns or recorded replays. Mouse movement is RELATIVE (x_rel/y_rel deltas from the current cursor position); there is no absolute positioning. To reach a known position, sweep past a screen corner first (e.g. x_rel:-4000, y_rel:-4000 pins the cursor top-left), then move by the target offset. A click is a mouse_button press event followed by a release event. Unknown fields are rejected with an error naming the allowed ones. |
| mem_readA | Read bytes from guest physical memory. Returns base64 data and current CPU register state. |
| mem_writeC | Write bytes to guest physical memory. |
| mem_searchA | Scan a range of guest memory for a value. Returns matching physical addresses. Width is 1 (byte), 2 (word), or 4 (dword), little-endian. |
| dos_memory_mapA | Walk the DOS MCB chain and report which PSP owns which memory block. Shows the full conventional memory layout. |
| freeze_setA | Lock a memory address to a value. The value is rewritten every frame, trainer-style. Width is 1/2/4 bytes, little-endian. |
| freeze_listA | List all active memory freezes. |
| freeze_clearA | Remove a freeze. Pass an address to remove one, or omit to clear all freezes. |
| port_readA | Read an x86 I/O port. Width is 1 (byte) or 2 (word). Use for VGA registers, sound cards, HGC control ports. |
| port_writeB | Write to an x86 I/O port. Width is 1 (byte) or 2 (word). For Mode X unchaining, Hercules graphics, hardware config. |
| cpu_write_registerA | Write a CPU register. General registers (eax..ebp) accept 32-bit values. Segment registers (cs,ds,es,ss,fs,gs) accept 16-bit values and update the cached physical base. |
| debug_statusB | Debugger state: paused, breakpoints, current instruction. |
| debug_pauseB | Pause emulation at the current instruction. |
| debug_continueA | Resume emulation from the current pause point. |
| debug_stepA | Execute one instruction and pause again. |
| bridge_versionB | Bridge version and the protocol level it implements. |
| bridge_statusA | Bridge and connection state: engine version, effective protocol, enabled features, capability mode, managed instance, token presence (never the value). |
| bridge_helpA | One-call orientation: version, connection state, and every available tool with a one-line description. |
| bridge_connectA | Explicitly attach to the running dosbox instance: reads the token, probes the API, negotiates the protocol version. Reports a precise reason when it cannot. |
| bridge_disconnectA | Detach from the instance; it keeps running. |
| bridge_startA | Spawn the dosbox binary named in the human-edited config file (with an isolated config dir) and attach to it. Refuses while an instance is already managed. |
| bridge_stopA | Stop the instance this bridge spawned. Never stops an instance it merely attached to. |
| bridge_logsA | Tail of the spawned instance's output (untrusted machine output). Only covers an instance this bridge started. |
| bridge_setupA | Change safe bridge settings: port, headless, protocol pin. The binary path and the capability mode are human-edited only and are rejected here by design. |
| bridge_swaggerB | Digest of the instance's OpenAPI surface: route counts per group and routes unknown to the negotiated protocol. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 47 tools
Most tools are cleanly separated by resource prefix (video_, audio_, mixer_, mem_, port_, debug_, bridge_, script_, input_), so an agent can usually pick the right one. Some state-reporting tools overlap conceptually—bridge_status, dosbox_status, debug_status, bridge_version, session_info—but their descriptions clearly distinguish connection, machine, debugger, protocol, and REST details.
Names are overwhelmingly predictable snake_case with a group prefix and action suffix, e.g. mem_read, port_write, freeze_list, bridge_connect. Minor deviations like cpu_write_register and dosbox_status/session_info/bridge_help are still readable and do not create confusion.
47 tools is very heavy for an MCP surface, even for full emulator control. Many start/stop/status triplets and bridge-management tools could be consolidated without losing capability, making the set feel oversized rather than lean.
Coverage is broad: capture, input, memory, ports, CPU registers, debugger, mixer, and bridge lifecycle are all represented. Direct mount/save-state/config operations are not wrapped, but script_run explicitly provides an escape hatch to any Lua-reachable DOSBox capability, leaving only minor gaps.