zandronum-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZANDRONUM_EXE | No | Path to the Zandronum executable (optional, required for launching the game) | |
| ZANDRONUM_BRIDGE_HOST | No | Host for the bridge server (default 127.0.0.1) | |
| ZANDRONUM_BRIDGE_PORT | No | Port for the bridge server (default 7777) |
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": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| run_commandB | Send a raw console command to a running, bridge-patched Zandronum instance and return its captured output. |
| list_actor_classesB | Run |
| summonB | Spawn an actor of the given class at the player's position. |
| giveC | Give an inventory item to the player. |
| takeC | Remove an inventory item from the player. |
| load_mapB | Load a map by its lump name (e.g. MAP01, E1M1). |
| list_running_scriptsB | Run |
| run_scriptC | Run (puke) an ACS script by number or name, with optional integer arguments. |
| screenshotC | Take a screenshot of the game and return it as an image so it can be viewed. |
| menu_keyC | Send a single menu navigation key (GUI key event) to the active menu. |
| menu_navB | Send a sequence of menu keys (e.g. ["down","down","enter"]) with a small delay between each. |
| menu_textB | Type a string into the active menu text-entry field (e.g. the player name box after pressing enter on it), one character at a time. |
| mouse_moveA | Move the pointer to a screen position, in pixels from the top-left of the game window. Drives hover-only UI -- tooltips, hot states -- which nothing else here can reach. |
| mouse_clickA | Press and release the left button at a position. Give toX/toY to DRAG: press at the first point, move through it, release at the second. |
| mouse_wheelA | Wheel notches at the current pointer position. Positive scrolls up, negative down. |
| verify_menuC | Open a menu (via a console command like |
| set_pauseA | Set the engine's master pause flag directly. Use this to resume a backgrounded instance that auto-paused on focus loss, so the simulation keeps advancing while the MCP drives it. |
| stepA | Resume the game, let it run for the given number of tics (35 tics = 1 second), then pause again. Lets you advance the simulation a deterministic-ish amount to observe time-based effects (charging, projectiles, animations) without keeping the window focused. |
| get_acs_varB | Read an ACS world or global variable by index. |
| set_acs_varB | Write an ACS world or global variable by index. |
| list_acs_varsB | Run |
| acs_indexC | Parse a directory of .acs source files and return symbol counts (scripts, functions, numeric defines). Reads files directly; no game needed. |
| find_acs_symbolA | Resolve a script number or a script/function name to its symbol(s) — name, number, file:line. Turns a profiler 'script 1017' into a source location. |
| behavior_namesA | Read function and named-script names from a mod's compiled ACS (BEHAVIOR/library lumps) in a WAD or PK3 — for source-less mods. Numbered scripts have no names in bytecode (use find_acs_symbol with source for those). |
| list_savesA | List .zds savegames in the save directory with metadata (title, map, engine, game wad, creation time) read from each save's PNG text chunks. No running game needed. |
| save_gameA | Run |
| load_gameC | Run |
| play_demoB | Run |
| player_stateC | Run |
| actor_stateB | Run |
| read_hudC | Run |
| actors_nearA | Run |
| inspect_targetC | Run |
| list_scriptsA | Run |
| list_functionsC | Run |
| profile_scriptsB | Run |
| profile_windowA | Clear ACS profiling, wait N seconds, then return what ran during that window — |
| list_modulesB | Run |
| get_map_varC | Read a map-scope ACS variable by name (searched across loaded modules). |
| set_map_varB | Write a map-scope ACS variable by name. |
| get_map_arrayA | Read one element of a map-scope ACS array by name and index. |
| set_map_arrayC | Write one element of a map-scope ACS array by name and index. |
| renderer_infoC | Active backend (software/opengl), GL vendor/shader model, resolution, fullscreen/vsync. |
| viewport_infoC | The 3D view window rect (x/y/width/height) and screenblocks size. |
| hud_infoD | Status bar Y position, status bar / HUD scale, alt HUD, crosshair. |
| map_infoA | Read a map from a WAD and return its format (doom/hexen/udmf) and entity counts. Reads the file directly — the game need not be running. |
| get_sectorB | Return one sector's properties by index (all fields, format-native keys). |
| get_linedefB | Return one linedef by index, with its referenced sidedefs (textures + offsets) resolved. |
| find_sectors_by_tagA | Return all sectors whose tag/id matches (binary |
| launch_instanceB | Spawn a bridge-enabled Zandronum process with the given options and attach to it. Requires ZANDRONUM_EXE to be set. |
| attach_instanceA | Connect to a bridge-patched Zandronum that is ALREADY running — one you launched by hand, or from a terminal — and bind it to an instance number for the other tools. Only needed for engines this session didn't launch: launch_instance binds automatically. Defaults to this instance's conventional port. |
| kill_instanceA | Stop a launched instance and detach from it. Asks the engine to quit itself first (a hard kill mid-render can wedge macOS GPU teardown and leave an unkillable process), then force-kills if it doesn't exit. |
| resetA | Kill every instance this session launched, and reap engines ORPHANED by earlier sessions (whose launcher is gone) that could otherwise squat bridge ports. Engines belonging to another running editor window are left alone. Pass all:true to also kill those — only do that if you know no other session is using this engine build. |
| get_startup_errorsA | Read the engine's captured console log for an instance and surface DECORATE/ACS compile errors and fatal startup errors. Works even when the bridge never came up (e.g. the engine aborted on a bad script) — exactly when the other tools can't connect. |
| get_crashA | Return the signal, faulting address, and symbolized backtrace the bridge's crash handler captured the last time the engine crashed (segfault/abort/bus error/etc.). Use this when an instance dies unexpectedly — e.g. run_command reports the bridge closed. Empty if the instance has not crashed. |
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 55 tools
Each tool has a narrowly defined purpose with detailed descriptions, but the sheer number of similar variable/script/map inspection tools creates occasional close calls (e.g., list_scripts vs list_running_scripts, get_acs_var vs get_map_var). Overall, most tools are clearly distinct.
Many tools use verb_noun (get_*, set_*, list_*, run_*), but others are bare noun phrases (renderer_info, actor_state, screenshot) and a few use nonstandard names (step, reset, verify_menu). The groupings like menu_* and mouse_* help, but the overall pattern is inconsistent.
55 tools is far beyond the typical well-scoped range, even for a comprehensive engine bridge. While each tool is specific, the sheer count makes the surface overwhelming and likely contains redundancy.
The surface covers the full lifecycle: instance management, console, scripting, variables, profiling, saves/demos, input simulation, HUD reading, actor manipulation, and map inspection. Minor gaps exist—no map editing, no world-input key events, no direct camera control—but they are not fatal for the stated purpose.