zandronum-mcp (rc4l/ZandronumMCP) is an MCP server listed on the M8ven Trust Index. It scores 54 out of 100, grade D. It declares 48 tools. No publisher has claimed this listing.
Enables AI assistants to interact with the Zandronum game engine for development, including running commands, spawning actors, and loading maps.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
rc4l
Source: Glama
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
run_commandSend a raw console command to a running, bridge-patched Zandronum instance and return its captured output.
list_actor_classesRun `dumpactors` and return the registered DECORATE/actor classes as structured data.
summonSpawn an actor of the given class at the player's position.
giveGive an inventory item to the player.
takeRemove an inventory item from the player.
load_mapLoad a map by its lump name (e.g. MAP01, E1M1).
list_running_scriptsRun `scriptstat` and return the currently running ACS scripts and their states.
run_scriptRun (puke) an ACS script by number or name, with optional integer arguments.
screenshotTake a screenshot of the game and return it as an image so it can be viewed.
menu_keySend a single menu navigation key (GUI key event) to the active menu.
menu_navSend a sequence of menu keys (e.g. ["down","down","enter"]) with a small delay between each.
menu_textType 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.
verify_menuOpen a menu (via a console command like `menu_options`), apply navigation steps, then return a screenshot to verify it.
set_pauseSet 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.
stepResume 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_varRead an ACS world or global variable by index.
set_acs_varWrite an ACS world or global variable by index.
list_acs_varsRun `dumpacsvars` and return all non-zero ACS world/global variables, optionally filtered by scope.
acs_indexParse a directory of .acs source files and return symbol counts (scripts, functions, numeric defines). Reads files directly; no game needed.
find_acs_symbolResolve 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_namesRead 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_savesList .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_gameRun `save` to write a savegame (single-player / cooperative only). NOTE: saving heavily-scripted mods can crash the engine — All-out-War crashes on save; vanilla and simple maps save fine.
load_gameRun `load` to restore a savegame by name.
play_demoRun `playdemo` to play back a recorded .lmp demo. (Recording is via the -record launch arg, not a console command.)
player_stateRun `currentpos` and return the player's position, angle, floor height, sector, and light level.
actor_stateRun `dumpactor` and return an actor's live state: class, health, position, current DECORATE state (sprite/frame/tics, e.g. TNT1 A 0), inventory, and (for players) ready weapon + morph status. Defaults to the player; pass a TID for any actor.
read_hudRun `dumphud` and return everything the engine painted last frame: HUD text strings (with screen x/y), images (by texture name + position), and active ACS HUD messages (full composed text, layer, position, remaining tics). Captures menus too.
actors_nearRun `actorsnear` and return actors within a radius (map units, default 512) of the player: class, health, position, and current sprite.
inspect_targetRun `linetarget` and return the actor the player is aiming at (class, health, spawn health).
list_scriptsRun `dumpscripts` and return every script across loaded modules (module, number, name, type, arg count).
list_functionsRun `dumpfunctions` and return named ACS functions across loaded modules.
profile_scriptsRun `acsprofile` and return per-script/function execution stats (total instructions, runs, avg/min/max).
profile_windowClear ACS profiling, wait N seconds, then return what ran during that window — `what's hot right now` rather than cumulative since map start.
list_modulesRun `dumpmodules` and return the loaded ACS modules (id + name). Map vars live only while a map is loaded.
get_map_varRead a map-scope ACS variable by name (searched across loaded modules).
set_map_varWrite a map-scope ACS variable by name.
get_map_arrayRead one element of a map-scope ACS array by name and index.
set_map_arrayWrite one element of a map-scope ACS array by name and index.
renderer_infoActive backend (software/opengl), GL vendor/shader model, resolution, fullscreen/vsync.
viewport_infoThe 3D view window rect (x/y/width/height) and screenblocks size.
hud_infoStatus bar Y position, status bar / HUD scale, alt HUD, crosshair.
map_infoRead 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_sectorReturn one sector's properties by index (all fields, format-native keys).
get_linedefReturn one linedef by index, with its referenced sidedefs (textures + offsets) resolved.
find_sectors_by_tagReturn all sectors whose tag/id matches (binary `tag` or UDMF `id`).
launch_instanceSpawn a bridge-enabled Zandronum process with the given options and attach to it. Requires ZANDRONUM_EXE to be set.
kill_instanceStop a launched instance's process and detach from it.
Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.
When Vitest UI server is listening, arbitrary file can be read and executed
Vitest allows Remote Code Execution when accessing a malicious website while Vitest API server is listening
@modelcontextprotocol/sdk has cross-client data leak via shared server/transport instance reuse
Anthropic's MCP TypeScript SDK has a ReDoS vulnerability
Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protection by default
ZANDRONUM_ACS_SRCZANDRONUM_BRIDGE_HOSTZANDRONUM_BRIDGE_PORT"": "7777",ZANDRONUM_EXE"": "C:/path/to/zandronum.exe"ZANDRONUM_IWADZANDRONUM_SAVE_DIRZANDRONUM_SCREENSHOT_DIRTool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
48/48 tools missing one or more hints — run_command (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_actor_classes (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); summon (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +45 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool inputs are validated
32/48 tool handlers declare input schemas (67%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Tool handlers catch errors
Only 0/48 tool handlers wrap calls in try/catch (0%)
Wrap each tool handler body in try/catch and return a structured error response.
Tool test coverage
Only 3/48 tools referenced in tests (6%)
Write tests that reference each tool by name so every tool has at least one test.
Shell command execution
3 child_process calls — runs shell commands
Prefer library functions over shell-outs. If you must shell out, ensure all inputs are properly escaped.
Production dependencies are patched
0 critical, 3 high severity in production deps — @modelcontextprotocol/sdk@1.12.0 (high), @modelcontextprotocol/sdk@1.12.0 (high)
Run npm audit fix, or upgrade the affected packages to a non-vulnerable version.
Dev dependencies
2 critical/high in dev-only deps (does not ship to users)
Upgrade dev dependencies when convenient.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/rc4l/zandronummcp)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check