gdb-mcp
Enables AI agents to debug C/C++ programs with GDB or LLDB, supporting breakpoints, stepping, variable inspection, and function calls.
README
gdb-mcp
An MCP server that lets an AI agent drive a full C/C++ debugging session — set breakpoints, step, inspect memory and variables, evaluate expressions, and call functions — using either GDB or LLDB behind one unified tool surface.
It works by speaking the Debug Adapter Protocol
(DAP) to the debugger that ships with your toolchain (gdb -i dap or
lldb-dap), so a single set of tools drives both debuggers.
Validated end-to-end with Claude Code, Codex CLI, and Cursor CLI — each agent independently used these tools to debug a live program and extract correct runtime state.
Features
- Three ways to start: launch a prebuilt binary, compile-then-debug a source file, or attach to a running process (by PID).
- Execution control:
continue,step(over / into / out, line or instruction granularity), and a lock-freepausethat can interrupt a running program. - Breakpoints: source (
file:line) and function breakpoints, with conditions, hit counts, and logpoints; data breakpoints (watchpoints); stable handles for reliable removal. - Inspection: backtraces, threads, stack frames, scopes, lazy variable
expansion (structs/arrays/STL), expression evaluation and function calls
(
foo(x)), set-variable, read-memory, and disassembly. - Source listing around the current stop, plus a raw-command escape hatch
(
dbg_raw_command) for anything the structured tools don't cover. - Agent-friendly output: verbose DAP payloads are trimmed to compact JSON, with stop-epoch guards so an agent can't accidentally read a stale frame or variable reference after the program advances.
Prerequisites
- Python 3.11+
- A DAP-capable debugger:
- GDB ≥ 14 (ships the
gdb -i dapinterpreter), or lldb-dap(bundled with LLVM / Xcode; on macOS it is found viaxcrun -f lldb-dap).
- GDB ≥ 14 (ships the
- A C/C++ toolchain (
cc/clang/gcc) for the compile-then-debug mode and to build debuggees with-g. uv(recommended) orpip.
Platform note. On Linux, run debuggers normally. On macOS, live debugging needs the debugserver attach permission — if
dbg_startreturns "Not allowed to attach", enable Developer Mode once:sudo DevToolsSecurity -enable. macOS arm64 GDB cannot debug native Mach-O binaries; use LLDB locally and GDB on Linux.
Installation
git clone https://github.com/birdeclipse/gdb-mcp.git
cd gdb-mcp
uv venv && uv pip install -e ".[dev]" # or: pip install -e ".[dev]"
Verify the server starts and advertises its tools:
uv run gdb-mcp # starts the MCP server on stdio (Ctrl-C to stop)
uv run pytest -m mcp # asserts the server advertises all 20 tools
Registering with an agent
The server runs over stdio. The robust invocation lets uv resolve the project
venv regardless of PATH (replace /path/to/gdb-mcp with your clone path):
command: uv
args: ["run", "--directory", "/path/to/gdb-mcp", "gdb-mcp"]
Ready-to-edit config snippets live in integrations/. Summary:
| Agent | How |
|---|---|
| Claude Code | claude mcp add gdb-mcp -- uv run --directory /path/to/gdb-mcp gdb-mcp — or merge integrations/mcp.claude.json into .mcp.json |
| Codex CLI | merge integrations/codex.config.toml into ~/.codex/config.toml |
| Cursor CLI | copy integrations/mcp.cursor.json to .cursor/mcp.json (project) or ~/.cursor/mcp.json |
If you pip install the package so gdb-mcp is on PATH, you can use
command: gdb-mcp with empty args instead.
Tools
All tools except dbg_start take a session_id.
| Tool | Purpose |
|---|---|
dbg_start |
Start a session: mode = launch / compile_launch / attach, debugger = gdb / lldb |
dbg_terminate |
Kill (launch) or detach (attach) and free the session |
dbg_continue |
Resume until the next stop / exit |
dbg_step |
Step over / into / out; line or instruction granularity |
dbg_pause |
Interrupt a running program (lock-free) |
dbg_set_breakpoint |
file:line or function; optional condition, hit_condition, log_message |
dbg_list_breakpoints |
List source / function / data breakpoints with handles |
dbg_remove_breakpoint |
Remove by stable handle |
dbg_set_watchpoint |
Data breakpoint on a variable (read / write / rw) |
dbg_backtrace |
Stack frames for a thread |
dbg_list_threads |
All threads |
dbg_select_frame |
Set the active frame for eval / scopes / variables |
dbg_scopes |
Variable scopes (Locals, …) for a frame |
dbg_variables |
Expand a variablesReference (lazy struct/array/STL expansion) |
dbg_evaluate |
Evaluate an expression or call a function (foo(x)) |
dbg_set_variable |
Set a variable to a new value |
dbg_read_memory |
Read raw memory (base64) |
dbg_disassemble |
Disassemble around an address |
dbg_source |
Source lines around a location |
dbg_raw_command |
Run a raw gdb/lldb command (escape hatch) |
Example: a debugging session
A typical agent flow against a program with a Point pt = {3, 7} local:
dbg_start(mode="launch", debugger="lldb", program="/path/to/a.out")→ stops at entry, returns asession_id.dbg_set_breakpoint(session_id, file="main.c", line=6)→ verified, handle1.dbg_continue(session_id)→{state: "stopped", reason: "breakpoint", frame: {function: "main", file: "main.c", line: 6}}.dbg_backtrace(session_id)→ frames.dbg_scopes(session_id)→ Locals;dbg_variables(session_id, ref=…)→pt(expandable) → expand →{x: 3, y: 7}.dbg_evaluate(session_id, "pt.x + pt.y")→10.dbg_terminate(session_id).
How it works
agent ──MCP tool call──▶ MCP server (Python, asyncio)
│ Session Manager (session_id → one debuggee)
│ DAP Client (Content-Length framing,
│ request/response + async events)
▼ spawns
gdb -i dap | lldb-dap
▼
debuggee process
Execution tools are event-driven: continue/step resolve on the debugger's
next stopped/exited event, not on the request response. See
docs/ARCHITECTURE.md for the design and
CONTRIBUTING.md for development.
Testing
uv run pytest # everything
uv run pytest tests/unit # offline (scripted fake adapter) — no debugger
uv run pytest -m mcp # MCP stdio handshake + tool advertisement
uv run pytest -m integration # live debugger on the C fixtures (auto-skips if none)
The integration suite probes for a working debugger and skips cleanly when none is available, so it is safe to run anywhere.
License
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.