ctxdebug
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCO_SERVERS | No | Comma-separated subset of servers to enable for the gateway. | |
| X64DBG_PATH | No | Path to x64dbg.exe. | |
| X64DBG_PIPE | No | Named pipe path for x64dbg. Default is '\\.\pipe\x64dbg_ai_agent'. | \\.\pipe\x64dbg_ai_agent |
| GROQ_API_KEY | No | API key for Groq. Only needed when using --llm groq. | |
| IDA_MCP_HOST | No | IDA HTTP host. Default is 'localhost'. | localhost |
| IDA_MCP_PORT | No | IDA HTTP port. Default is '2022'. | 2022 |
| WINDBG_MCP_CDB | No | Path to cdb.exe (WinDbg command line debugger). Default is 'C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe'. | |
| MCO_SESSIONS_DB | No | SQLite database path for session recording. | |
| ANTHROPIC_API_KEY | No | API key for Claude. Only needed when using --llm claude. |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| mco_gateway_statusA | Show status of all MCO sub-servers: running/stopped, PID, tool count, uptime. |
| mco_restart_serverA | Restart a crashed MCO sub-server by name (windbg / ida / x64dbg / orchestrator / sessions). |
| mco_list_serversA | List all configured MCO sub-servers with description and tool counts. |
| windbg_helpA | Show a quick orientation cheatsheet for this MCP: typical workflow, key concepts, address forms, and timeout semantics. Call this first if you are unsure how to drive the debugger. |
| windbg_start_executableA | Launch a Windows executable under cdb. The target starts SUSPENDED at the initial breakpoint — use windbg_continue to run it. |
| windbg_attachA | Attach cdb to a running process by PID. The process is paused on attach. |
| windbg_open_dumpA | Open a Windows crash dump (.dmp) for post-mortem analysis. Combine with windbg_analyze_crash. |
| windbg_stopA | Quit the cdb session and release the target. |
| windbg_statusA | Show whether a session is active, current target, RIP, nearest symbol, current process and thread. |
| windbg_io_statusA | Show MCP-side debugger I/O state: active cdb PID, buffered output lines, async command, and async age. |
| windbg_break_inA | Break into a running target (Ctrl+Break). Use this when the program is executing and you need to pause it. |
| windbg_run_commandA | Run an arbitrary cdb/WinDbg command verbatim. Optional regex filter keeps only matching lines; max_lines caps noisy output. |
| windbg_run_command_asyncA | Send a raw cdb command and return immediately without waiting for a prompt and without break-in. Use windbg_wait_for_event/read_output afterward. |
| windbg_continueA | Resume execution (cdb 'g'). Returns when the target hits a breakpoint, exception, or exits. On timeout the server auto-breaks the target so you can recover. |
| windbg_continue_asyncA | Resume execution with cdb 'g' and return immediately. Does not install a timeout and never sends break-in by itself. |
| windbg_goA | Recommended safe continue: send cdb 'g', then wait for event/output without ever sending break-in on timeout. |
| windbg_wait_for_eventA | Wait for output/prompt from an async command without sending break-in on timeout. Use after windbg_continue_async. |
| windbg_wait_exception_profileA | Wait for exception/crash output using a preset filter profile (default/tg/asan). Does not send break-in on timeout. |
| windbg_read_outputA | Drain currently buffered cdb output without blocking and without sending break-in. |
| windbg_step_inA | Single-step one instruction, stepping INTO calls (cdb 't'). |
| windbg_step_overA | Single-step one instruction, stepping OVER calls (cdb 'p'). |
| windbg_step_outA | Run until the current function returns (cdb 'gu'). |
| windbg_run_toA | Run until execution reaches a given address or symbol (cdb 'g '). |
| windbg_set_breakpointC | Set a software breakpoint at an address or symbol. Optional cdb-expression condition. |
| windbg_set_conditional_bpA | Build and set a conditional cdb breakpoint safely, including optional .printf logging and false-branch gc. |
| windbg_bp_templateA | Set a breakpoint from an AI-friendly template: log this/args, log expression, stop on signed-negative, pointer range, or stack log. |
| windbg_set_data_breakpointA | Set a hardware data breakpoint (cdb 'ba'). Triggers on read/write/execute access. |
| windbg_watch_memoryA | Set a hardware data breakpoint that logs IP, watched value, optional stack, then continues. Avoids hand-written ba/.printf escaping. |
| windbg_list_breakpointsA | List all configured breakpoints (cdb 'bl'). |
| windbg_save_breakpointsA | Persist current breakpoints using cdb .bpcmds into .windbg_mcp_breakpoints/.cmd. |
| windbg_load_breakpointsA | Restore a previously saved breakpoint set. Optionally clears existing breakpoints first. |
| windbg_clear_breakpointA | Delete one or all breakpoints (cdb 'bc'). |
| windbg_disable_breakpointA | Disable a breakpoint without deleting it (cdb 'bd'). |
| windbg_enable_breakpointA | Re-enable a previously disabled breakpoint (cdb 'be'). |
| windbg_registersA | Read the CPU registers. Output is parsed into a clean key=value table plus the raw cdb output. |
| windbg_set_registerB | Modify a CPU register, e.g. name='rax', value='0x42'. |
| windbg_evaluateA | Evaluate a cdb expression (cdb '?'). Useful for arithmetic, symbol lookup, and casting. |
| windbg_call_stackA | Show the call stack of the current thread. |
| windbg_stack_find_threadA | Search all thread stacks for a regex/module/SP/address and optionally switch to the matching thread. |
| windbg_shadow_stackA | Dump the CET hardware shadow stack using dps @ssp. Useful when HW-enforced stack protection is enabled. |
| windbg_shadow_stack_compareA | Dump normal stack and shadow stack side by side for quick return-address divergence checks. |
| windbg_shadow_stack_returnA | Resolve one shadow stack return slot: dps slot, nearest symbol, and disassembly at poi(slot). |
| windbg_run_to_shadow_returnB | Run to poi(@ssp+index*8). Async by default so long waits do not force break-in. |
| windbg_disassembleA | Disassemble code forward. By default shows N instructions at an address; with function=true disassembles the whole function (cdb 'uf'). |
| windbg_disassemble_backA | Disassemble N instructions BEFORE an address (cdb 'ub'). Useful for seeing what led to the current IP. |
| windbg_read_memoryA | Read memory in a chosen format (byte/word/dword/qword/ascii/unicode/pointer). |
| windbg_write_memoryA | Write memory in a chosen format (byte/word/dword/qword/ascii/unicode). |
| windbg_search_memoryA | Search a memory range for a byte/string/dword/qword pattern. |
| windbg_list_modulesA | List loaded modules. Optional name filter (cdb 'lm m '). |
| windbg_module_infoA | Show detailed info for one module (paths, version, symbols). |
| windbg_list_threadsA | List all threads in the current process. |
| windbg_switch_threadA | Switch debugger context to a specific thread index. |
| windbg_switch_thread_by_tidA | Switch debugger context by OS thread id using cdb ~~[tid]s. Accepts values like '43110', '0x43110', or 'pid.tid'. |
| windbg_list_processesA | List processes in the current debugger session (cdb '|'). |
| windbg_find_symbolsA | Search symbols by pattern across modules (cdb 'x'). Pattern: 'mod!func'. |
| windbg_address_to_symbolB | Find the nearest symbol to an address (cdb 'ln'). |
| windbg_localsA | Show local variables of the current frame (requires private symbols). |
| windbg_source_linesA | Show source code lines around an address (requires source path). |
| windbg_analyze_crashA | Run !analyze on the current state. Best after windbg_open_dump or on an unhandled exception. |
| windbg_pebA | Dump the Process Environment Block of the current process (cdb '!peb'). |
| windbg_tebA | Dump the Thread Environment Block of the current thread (cdb '!teb'). |
| windbg_heapB | Run !heap with optional arguments (e.g. '-s' for summary, '-p -a ' to inspect a block). |
| windbg_handleA | Run !handle to inspect kernel handles in the target. Empty args lists all handles. |
| windbg_addressB | Describe a virtual address with !address. Filters noisy 'Building memory map' progress lines and can cap output. |
| windbg_dtB | Dump a structure type with cdb 'dt'. Optionally apply to an address. |
| windbg_set_symbol_pathA | Set the symbol search path (cdb '.sympath') and reload symbols. Use 'srvc:\symhttps://msdl.microsoft.com/download/symbols' for the public store. |
| windbg_reload_symbolsA | Reload symbols (cdb '.reload'). Use force=true to discard cached symbols. |
| windbg_set_source_pathA | Set the source code search path (cdb '.srcpath'). |
| windbg_crash_triageA | Full crash triage in one call: !analyze -v + registers + call stack + exception record + fault address context. Best first tool after hitting a crash. |
| windbg_heap_block_infoA | Inspect a specific heap block: size, flags, neighbors, memory before/after. Use with ASAN crash addresses to understand overflow context. |
| windbg_heap_neighborsA | Inspect a heap block plus bytes and pointer/symbol view before and after it. |
| windbg_object_contextA | One-call object/heap context: address eval, symbol, !address, !heap, qwords, bytes/pointers around, potential vtable, optional VRle::Span decode. |
| windbg_thread_stacksA | Show call stacks for ALL threads simultaneously (cdb '~* kP'). Essential for race condition / UAF analysis. |
| windbg_exception_chainA | Show full exception chain: last event + exception record + context + stack at exception + SEH chain. |
| windbg_find_vtableA | Check if an address contains a vtable pointer and resolve it to a symbol + disassembly. Useful for type confusion / UAF analysis. |
| windbg_find_vtable_ownerA | Find heap object candidates whose first qword equals a vtable pointer. With heap_start+heap_length searches that range; otherwise parses heap ranges from !address -f:Heap and searches each range. |
| windbg_decode_spansA | Decode VRle::Span entries from memory. Layout assumed: {x:i16, y:i16, len:u16, cov:u8, raw7:u8}. |
| windbg_asan_parseA | Parse ASAN crash context: exception record + context record + call stack at exception. Use when debugging ASAN-instrumented binaries. |
| ida_statusA | Check if IDA Pro is connected and get binary info. Always call first. |
| ida_infoA | Get detailed binary info: path, arch, image base, entry point, size. |
| ida_functionsA | List functions in the binary. Supports pagination and name filtering. |
| ida_segmentsA | List all binary segments (.text, .data, .rdata, etc.) with addresses and permissions. |
| ida_importsA | Get the import table, optionally filtered by DLL name. |
| ida_exportsA | Get the export table (for DLLs/EXEs with exports). |
| ida_stringsB | Find all strings in the binary. Useful for IOC extraction. |
| ida_namesA | List all named addresses (functions, globals, labels) with optional pattern filter. |
| ida_disassembleA | Disassemble instructions at an address. Use function=true for entire function. |
| ida_decompileB | Decompile function to pseudocode using Hex-Rays decompiler. |
| ida_analyze_functionA | Deep function analysis: calls, string refs, xrefs, decompile. Best starting point. |
| ida_xrefs_toA | Get all cross-references TO an address (who calls/references this). |
| ida_xrefs_fromA | Get all cross-references FROM an address (what this calls/references). |
| ida_renameB | Rename a function, label, or global variable at an address. |
| ida_commentC | Add a comment at an address. Kinds: regular, repeatable, anterior, posterior. |
| ida_set_typeB | Set the type signature for a function or variable (C declaration syntax). |
| ida_get_typeB | Get the type signature of a function or variable. |
| ida_read_bytesA | Read raw bytes at an address and show a hex+ASCII dump. |
| ida_searchC | Search the binary for a byte pattern or string. kind: bytes|string|unicode |
| ida_entry_pointsA | List binary entry points (start address + DLL exports if applicable). |
| ida_structA | Get struct definition from IDA's type library (name, members, offsets, sizes). |
| ida_make_functionA | Force-create a function at an address (useful for undefined code regions). |
| ida_scan_bossixA | Scan the binary for bossix imports, string indicators, and techniques. |
| ida_find_cryptoA | Scan for cryptographic algorithm indicators (constants, XOR patterns, S-boxes). |
| ida_apply_signatureA | Apply a FLIRT .sig signature file to auto-identify library functions. |
| ida_run_scriptA | Execute raw IDAPython code inside IDA Pro. Escape hatch for any operation not covered by other tools. |
| ida_diff_functionsA | Compare two functions side-by-side: disasm, instruction count, size delta. Useful for spotting obfuscation differences or comparing similar routines. |
| ida_call_treeA | Build a recursive call tree from a function up to |
| ida_patch_bytesA | Write bytes to the IDA database at an address using idc.patch_byte(). Does NOT modify the original file — only the IDA database. Useful for NOP-ing bossix checks found by ida_scan_bossix. |
| ida_list_patchesA | List all patches applied to the IDA database. Shows address, original byte value, and patched byte value for each changed byte. |
| ida_export_idb_infoA | Export a comprehensive IDA database summary: input file path, MD5, SHA256, image base, entry point count, function count, segment count, string count, import module count, and patch count. Good for a session overview. |
| ida_find_string_refsA | Find all strings matching a regex pattern, then for each string list every function that references it. Great for finding where 'admin', 'password', 'cmd.exe', or C2 URLs are used. |
| ida_get_pseudocode_all_functionsA | Decompile up to |
| agent_analyzeA | AUTONOMOUS ANALYSIS: Ask the AI agent to plan, execute, and report on a debugging goal. The agent runs a ReAct loop, calls multiple debugging skills, and returns findings. USE WHEN: open-ended exploration — 'find unpacking loop', 'identify anti-debug', 'trace execution from main'. DO NOT USE for single specific operations — call the dedicated tool instead. |
| agent_get_contextA | Get the agent's current debugging context: target process, current RIP, breakpoints, discovered functions, found patterns, current goal. USE WHEN: you need to know what the agent already knows before deciding next steps. |
| memory_recallA | Recall insights from past debugging sessions. Searches the agent's persistent memory (~/.x64ai/) for matching patterns and insights. USE WHEN: starting analysis on a new binary — past insights may apply. |
| list_known_patternsA | List the agent's known binary patterns: packer signatures, anti-debug checks, crypto routines, syscall stubs, Heaven's Gate, etc. USE WHEN: deciding what to search for, or to understand what the agent recognizes. |
| execution_controlA | Control execution: run, pause, single-step, run-to-address. TIP: Use 'run_to' instead of breakpoint(action='set')+run for one-shot stops (auto-cleans the BP). |
| get_registersA | Get all CPU registers (GPRs + flags + RIP/RSP). Updates the agent's current_rip context. |
| set_registerA | Set a CPU register to a specific value. Useful for bypassing checks (set RAX=0 after IsDebuggerPresent), redirecting execution (change RIP), or modifying function arguments. |
| disassembleA | Disassemble instructions with auto call/jump analysis. Returns instructions plus categorized lists of CALLs and JMPs. |
| analyze_functionA | Deep function analysis: disassembly, xrefs in/out, API calls, string refs, crypto indicators (xor/rol/ror/shl/shr). |
| get_xrefsB | Get cross-references to or from an address (callers / callees). |
| evaluate_expressionA | Evaluate an x64dbg expression. Resolves API names, registers, arithmetic, pointer dereferences. TIP: Use [address] syntax to read a pointer value, e.g. '[rsp]' reads the QWORD at RSP. This is faster than read_memory for single values. |
| get_call_stackB | Get the current thread's call stack with module + function names per frame. |
| process_infoA | Get comprehensive process info: main module, base address, entry point, threads, PEB. USE WHEN: starting analysis — typically the first call to orient yourself. |
| list_modulesA | List all loaded modules (DLLs/EXE) with bases, sizes, entry points. |
| list_importsB | Get import table grouped by DLL. Network imports → C2; crypto imports → ransomware; anti-debug imports → evasion. |
| list_exportsB | Get the export table of a module — exported function names + addresses + ordinals. |
| get_threadsB | List threads with TID, entry, state, priority. |
| get_pebA | Get FULL PEB (Process Environment Block) dump with anti-debug flag analysis. Returns ALL fields. Use process_info for a quick overview; use this for deep PEB inspection. |
| get_handlesA | List process handles grouped by type (File, Mutant, Event, Thread, etc.). |
| memory_mapA | Get the process virtual memory map. AUTOMATICALLY FLAGS RWX regions (unpacking indicator). |
| read_memoryB | Read memory and return as hex+ASCII dump. |
| write_memoryB | Write hex bytes to memory. ⚠ Modifies process state. |
| read_stringB | Read a null-terminated string from memory (ASCII). |
| search_patternA | Search memory for a byte pattern with ?? wildcards. Examples: 'CC' (INT3), '0F 31' (RDTSC), 'E9 ?? ?? ?? ??' (JMP rel32). |
| search_stringsA | Find readable strings in ALL loaded modules, AUTO-CATEGORIZED into urls/paths/registry/apis/other. Great for IOCs and hardcoded URLs/paths. May be slow on large processes. |
| allocate_memoryA | Allocate memory in the target process. Returns the allocated address. |
| breakpointA | Set, list, or delete a breakpoint. Supports software, hardware, memory, conditional, and API-by-name. USE 'set' WITH 'api' to break on an imported function by name (no need to resolve address). USE 'set_conditional' to break only when expression is true (e.g., 'rcx == 0x1000'). USE 'set_hw' for hardware breakpoints (no code modification, useful when scanning for INT3). USE 'list' to see all currently active breakpoints. For a single API, use action='set' + 'api'. For bulk API groups (all memory/network/etc.), use breakpoint_on_api_group instead. |
| breakpoint_on_api_groupA | Set breakpoints on all APIs in a category at once. Saves many calls vs setting each manually. |
| bossix_scanA | COMPREHENSIVE bossix scan: PEB flags, API imports, byte patterns, RDTSC. Returns detected techniques + targeted bypass suggestions per finding. |
| bossix_hideA | Hide debugger via PEB patches: zero BeingDebugged, clear NtGlobalFlag, x64dbg built-in hide. |
| bossix_patchA | Auto-patch a bossix check at an address. Picks the right patch based on instruction: flips conditional jumps, NOPs test/cmp, replaces CALL with xor eax,eax. |
| execute_commandA | Execute a raw x64dbg command. ESCAPE HATCH for operations not covered by other tools. USE SPARINGLY — prefer the dedicated tool when one exists. |
| dump_moduleA | Dump a loaded module to disk (post-unpacking, etc.). |
| run_scriptA | Execute a multi-line x64dbg script (commands run atomically). One command per line. Example: 'bp VirtualAlloc\nrun\nlog "hit VirtualAlloc"'. |
| x64dbg_launchA | Launch x64dbg debugger (with optional target EXE). USE WHEN: x64dbg is not yet running and you need to start a debug session. Waits for the AI Agent plugin to become connectable after launch. |
| x64dbg_statusA | Get x64dbg connection status, process state, and bridge info. |
| x64dbg_connectA | Attempt to (re)connect to a running x64dbg instance. USE WHEN: x64dbg is already running but Claude is not connected. |
| x64dbg_eval_expressionA | Evaluate a debugger expression and return the numeric result. Sends the eval_expression command directly to the x64dbg plugin for extended expression support. Resolves register names, API addresses, arithmetic, pointer dereferences. USE WHEN: you need to resolve a symbol address or compute a pointer value. Examples: 'kernel32.VirtualAlloc', 'rax+8', '[rsp+0x28]', 'ntdll.NtQueryInformationProcess'. |
| mco_statusA | Check which debuggers (WinDbg, IDA Pro, x64dbg) are currently available and connected. |
| mco_crash_to_sourceA | Full crash analysis pipeline: open a .dmp in WinDbg, extract the crashing address, then pivot to IDA Pro to decompile the crashing function and show callers. Returns a combined report with WinDbg !analyze output + IDA pseudocode. |
| mco_bossix_reportA | Cross-debugger bossix detection: IDA Pro static scan for IsDebuggerPresent/NtQueryInformationProcess/etc. + x64dbg dynamic PEB check. Returns combined findings. |
| mco_pivot_to_idaA | Take an address from WinDbg or x64dbg and analyze it in IDA Pro. Returns: function name, decompiled pseudocode, callers, callees. Use when you have a suspicious address from dynamic analysis. |
| mco_w_auditA | Quick w audit using all available debuggers: IDA static analysis (suspicious APIs, strings, crypto) + x64dbg runtime state (modules, threads). Returns a unified threat intelligence report with severity ratings. |
| mco_compare_functionsA | Binary diff two functions in IDA Pro. Compare instruction sequences, calculate similarity percentage, show added/removed operations. Useful for patch diffing between clean and infected binaries. |
| mco_heap_spray_analysisA | Detect heap spray attacks: WinDbg !heap -s summary + IDA Pro heap allocation site mapping. Identifies suspicious allocation patterns and size anomalies. |
| session_startA | Start a new named debug session. Sets it as the current active session for recording. |
| session_endA | End the current (or specified) session and save notes. |
| session_listA | List recent debug sessions with stats (duration, tool calls, debugger). |
| session_deleteA | Permanently delete a session and all its recorded events. |
| session_recordA | Record a tool call into the current session. Call this after every MCP tool call you want to track. |
| session_searchA | Full-text search across all recorded tool outputs. Returns matching sessions with context snippets. |
| session_replayB | Return all tool calls from a session in chronological order with timestamps. |
| session_find_addressA | Find all sessions that mention a specific hex address in any tool output. |
| session_find_functionA | Find all sessions that mention a specific function name (e.g. 'NtUserSetWindowPos' or 'win32k!NtUser'). |
| session_summaryB | Get an AI-readable summary of a session: top tools, key addresses found, critical findings. |
| session_export_markdownA | Export a full Markdown report of a session — timeline of tool calls, key addresses, tools table. Ready to share. |
| session_statsA | Global MCO stats: total sessions, total tool calls, most used tools, most analyzed targets. |
| session_diffA | Compare two sessions: which tools were used in one but not the other, call count differences, similarity %. |
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 169 tools
While tools are prefixed by backend (ida_, windbg_, x64dbg_), there are multiple near-duplicates across backends (evaluate_expression vs x64dbg_eval_expression, read_memory vs windbg_read_memory vs ida_read_bytes) and unprefixed tools lack clear backend identification. The sheer 169-tool volume makes it easy to select the wrong tool, especially for similar operations like continue, step, and breakpoint across three debuggers.
Naming mixes verb_noun, noun_verb, bare verbs, and nouns (disassemble, breakpoint, process_info, memory_recall). Each backend prefix has its own internal inconsistency (e.g., ida_functions vs ida_decompile, windbg_status vs windbg_start_executable). The unprefixed tools are particularly inconsistent, mixing styles and using generic names.
With 169 tools, the server far exceeds reasonable scoping even for a multi-debugger orchestration layer. Many tools duplicate similar functionality across backends, and there are multiple escape-hatch raw command tools that add to the bloat.
The tool set is extremely comprehensive, covering process/execution control, memory/breakpoints, disassembly/decompilation, symbol/string/xref analysis, session lifecycle, and cross-debugger composite pipelines. Raw command escape hatches for all three backends fill any residual gaps, so agents are unlikely to hit dead ends.