apitrace-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| APITRACE_MCP_TRACE_DIR | No | Sets where traces, logs and extracted files go. | %LOCALAPPDATA%\apitrace-mcp\traces |
| APITRACE_MCP_ROOT_WIN32 | No | Path to the win32 apitrace build. Overrides auto-discovery. | |
| APITRACE_MCP_ROOT_WIN64 | No | Path to the win64 apitrace build. Overrides auto-discovery. |
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
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| apitrace_statusA | Preflight: which apitrace builds are installed, where traces go, what is running. Call this before anything else. Unlike the GUI-backed RE servers, apitrace needs no host application running -- but it does need the build whose bitness matches the game you intend to trace. |
| list_tracesA | List trace files in the trace directory. |
| detect_targetA | Inspect a game executable: bitness, graphics API, and how to trace it. Reads the PE import table, so it answers "is this D3D8 or D3D9, and is it 32-bit" without launching anything. Delay-loaded imports are included -- older games often delay-load d3d9 behind a video-detection step. |
| trace_launchA | Launch a game under apitrace and start capturing. Returns a session id. This runs the game -- it does not block. Let the user play the part they want captured, then call trace_stop (ideally after they quit the game normally, so the trace is flushed cleanly). api: gl, d3d7, d3d8, d3d9, or dxgi (D3D10/11). Empty auto-detects from the PE. method: 'iat' (default) or 'mhook'. Try mhook when a game loads the graphics DLL dynamically and IAT patching misses it. |
| trace_statusA | Poll a trace or replay session: still running, trace size so far, log tail. |
| trace_stopA | Stop a session and report the resulting trace. Prefer quitting the game in-game first: a forced kill can lose the tail of the trace because apitrace never gets to flush. |
| list_sessionsA | All trace/replay sessions, including any still running from a previous server run. |
| install_wrapperA | Drop apitrace's wrapper DLL next to a game exe (the manual tracing route). Use this when trace_launch produces nothing -- typically because the exe you launched is a launcher that spawns the real game, or the game re-launches itself for DRM. The wrapper then loads whenever the game starts, however it was started (including from Steam). Any existing DLL of the same name -- ENB, ReShade, dgVoodoo, DXVK all use these filenames -- is backed up and restored by uninstall_wrapper. Always uninstall when you are done; a left-behind wrapper keeps tracing every run. |
| uninstall_wrapperB | Remove wrapper DLLs installed by install_wrapper and restore any backups. |
| trace_infoB | Summary of a trace file: API, call count, frame count (JSON from apitrace info). |
| dump_callsA | Human-readable call dump, exactly as |
| get_callsA | Structured calls with real argument values via |
| search_callsA | Regex search over function names across the trace; returns counts and call numbers. The cheapest way to find out whether a game uses fixed-function transforms or shader constants: search 'SetTransform|SetVertexShaderConstant'. |
| call_histogramB | Function-frequency profile over a call range -- the fastest way to see what a game does. Scanning the whole of a large trace is slow; |
| frame_summaryA | Break a frame down: draw calls, render-target switches, shader binds. Pass a callset covering one frame, e.g. calls='120000-125000'. Use trace_info(per_frame=True) or list_frames to find the boundaries. |
| list_framesB | Frame boundaries as call numbers, so you can scope other queries to one frame. |
| find_matricesA | Find and classify every 4x4 matrix the game sends to the driver. This is the core VR/camera-hacking tool. It covers:
Results are grouped by slot. Read them as: kind=projection -> the game's FOV, near and far planes kind=rigid + changes_per_frame -> camera candidate; confirm with track_camera kind=viewproj in vs_c[...] -> the register range a VR patch rewrites kind=viewproj at a buffer offset -> the bytes a VR patch rewrites kind=ortho -> HUD/UI or shadow pass Scope with |
| decode_matrixA | Decode 16 floats as a 4x4 matrix: FOV, near/far, handedness, camera position. Accepts whitespace-, comma- or newline-separated numbers -- paste them straight out of a memory dump, a Cheat Engine watch, or a shader constant. Both storage orders are tried, so you do not need to know whether the source was row- or column-major. |
| track_cameraA | Follow the camera across frames: world position, forward vector and FOV. Picks the most view-like matrix slot automatically, or pass |
| list_shadersB | List shader creation calls with a source preview or bytecode size. Use extract_blobs to write D3D shader bytecode out for disassembly. |
| extract_blobsA | Write binary arguments (shader bytecode, vertex/index/constant buffers) to files. Scope tightly with |
| dump_stateA | Replay up to a call and dump the full pipeline/device state as JSON. The apitrace equivalent of RenderDoc's pipeline view for OpenGL and D3D8/D3D9. DirectDraw and D3D7 traces are capture-only upstream and cannot be replayed for state inspection. Replay has to run the trace on this machine's GPU up to that call, so it is slow and it can fail on very old games whose resources the driver no longer likes. If it fails, trim_trace to a short range first. |
| dump_imagesB | Replay the trace and write PNG images (per frame, or per specified call). Useful for finding which draw call produces the HUD, the world, or the problem you are chasing -- dump images at every draw in a frame and look. |
| trim_traceA | Make a raw call/frame slice of a trace. A slice beginning at call/frame zero often remains replayable and makes every downstream tool faster. A mid-run OpenGL slice can omit setup/resources; use gltrim_trace when replayability matters. |
| gltrim_traceC | OpenGL-specific frame trim that preserves replay setup state. |
| leak_reportA | Run apitrace's object-leak checker against a trace. |
| repack_traceC | Repack a trace with Snappy, Brotli, Zstandard, or zlib compression. |
| diff_tracesA | Compare two traces with apitrace's semantic call-stream differ. |
| diff_stateB | Capture and compare complete retracer state at two calls. |
| diff_imagesA | Compare image sets and create an HTML report plus new diff/thumbnail sidecars. Upstream writes sidecars beside the source prefixes. This wrapper refuses to run if any potential sidecar already exists and never enables --overwrite. |
| sed_traceC | Stream-edit trace enum/string symbols or trace properties into a new trace. |
| replay_traceB | Replay a trace in the background (session-based). Returns a session id. profile: '', 'cpu', 'gpu', 'frames', 'pixels', 'memory', 'calls', 'frame_metrics', or 'draw_metrics'. Profiling output lands in the session log -- poll it with trace_status. |
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 32 tools
Every tool targets a distinct operation: capture, replay, status, session listing, call dumping, call searching, histogramming, frame analysis, matrix finding, state dumps, and diffing are all cleanly separated. Even close neighbors like dump_calls/get_calls and diff_traces/diff_state are explicitly differentiated by their descriptions.
The set predominantly follows snake_case verb_noun naming, e.g., list_traces, replay_trace, trace_stop, dump_state, extract_blobs, trim_trace. Minor deviations like apitrace_status, call_histogram, frame_summary, leak_report, and sed_trace break the pattern but remain readable and predictable.
32 tools is a heavy surface for an agent to reason over, and several could plausibly be consolidated, such as trace_status/list_sessions, list_frames/frame_summary, and trim_trace/gltrim_trace. While the tool count reflects the breadth of apitrace, it exceeds the practical range for a coherent MCP server.
The toolset covers the full apitrace workflow: preflight checks, capture methods, session control, replay, inspection, frame and matrix analysis, shader/blob extraction, state dumping, trimming, compression, leak detection, and diffing. There are no obvious dead ends—install_wrapper has uninstall_wrapper, trace_launch has trace_stop, and replay_trace has trace_status.