A headless, agentic debugger over MCP — let your AI agents debug running programs in six languages.
mcp-debugger is a Model Context Protocol (MCP) server that exposes step-through debugging as structured tool calls. It lets AI agents set breakpoints, inspect variables, evaluate expressions, and step through running programs across six languages — driving real language debuggers through the Debug Adapter Protocol (DAP).
🆕 v0.21.0 — the minimum runtime is now Node.js 22+ (Node 20 reached end-of-life). See the CHANGELOG for the full release history.
- 🌐 Multi-language support – Clean adapter pattern for any language
- 🐍 Python debugging via debugpy – Full DAP protocol support
- 🟨 JavaScript (Node.js) debugging via js-debug – VSCode's proven debugger
- 🦀 Rust debugging via CodeLLDB – Debug Rust & Cargo projects (Linux/macOS; Windows needs the GNU toolchain — see Rust on Windows)
- 🐹 Go debugging via Delve – Full DAP support for Go programs
- ☕ Java debugging via JDI bridge – Launch and attach modes with JDK 21+
- 🔷 .NET/C# debugging via netcoredbg – Debug .NET applications with full DAP support
- 🧪 Mock adapter for testing – Test without external dependencies
- 🛰️ Out-of-IDE & remote attach – Attach over host/port to a process on another machine or inside a container (Python via debugpy, Java via JDWP), with source-path mapping
- 🔌 STDIO and Streamable HTTP transports – Works with any MCP client (legacy SSE transport is deprecated)
- 📦 Zero-runtime dependencies – Self-contained bundles via esbuild + tsup
- ⚡ npx ready – Run directly with
npx @debugmcp/mcp-debugger- no installation needed - 🐳 Docker and npm packages – Deploy anywhere
- 🤖 Built for AI agents – Structured JSON responses for easy parsing
- 🛡️ Path validation – Prevents crashes from non-existent files
- 📝 AI-aware line context – Intelligent breakpoint placement with code context
- ✅ Comprehensive test suite – unit, integration, and end-to-end coverage across every adapter (CI status)
Requirements: Node.js 22+ for the server. Each language you debug also needs its own toolchain installed (Python + debugpy, Node.js, Go + Delve, JDK 21+, .NET SDK, or the Rust toolchain).
Add to your MCP settings configuration:
{
"mcpServers": {
"mcp-debugger": {
"command": "node",
"args": ["C:/path/to/mcp-debugger/dist/index.js", "stdio", "--log-level", "debug", "--log-file", "C:/path/to/logs/debug-mcp-server.log"],
"disabled": false,
"autoApprove": ["create_debug_session", "set_breakpoint", "get_variables"]
}
}
}For Claude Code users, we provide an automated installation script:
Prerequisite: The Claude CLI must be installed and available on your PATH before running the installation script. See Claude Code documentation for installation instructions.
# Clone the repository
git clone https://github.com/debugmcp/mcp-debugger.git
cd mcp-debugger
# Run the installation script
./scripts/install-claude-mcp.sh
# Verify the connection (use 'claude mcp list' if claude is on your PATH)
claude mcp listImportant: The stdio argument is required to prevent console output from corrupting the JSON-RPC protocol. See CLAUDE.md for detailed setup and troubleshooting.
docker run -v $(pwd):/workspace debugmcp/mcp-debugger:latest
⚠️ The Docker image ships Python, JavaScript, Go, Java, and .NET adapters. Rust debugging requires the local, SSE, or packed deployments where the adapter runs next to your toolchain. Note: adapters are loaded dynamically at runtime — only those whose toolchain is installed and detected will be reported as available bylist_supported_languages.
npm install -g @debugmcp/mcp-debugger
mcp-debugger --helpOr use without installation via npx:
npx @debugmcp/mcp-debugger --helpmcp-debugger exposes debugging operations as MCP tools that can be called with structured JSON parameters:
// Tool: create_debug_session
// Request:
{
"language": "python", // or "javascript", "rust", "go", "java", "dotnet", or "mock" for testing
"name": "My Debug Session"
}
// Response:
{
"success": true,
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"message": "Created python debug session: My Debug Session"
}| Tool | Description | Status |
|---|---|---|
create_debug_session |
Create a new debugging session | ✅ Implemented |
list_debug_sessions |
List all active sessions | ✅ Implemented |
list_supported_languages |
Show available language adapters | ✅ Implemented |
set_breakpoint |
Set a breakpoint in a file | ✅ Implemented |
start_debugging |
Start debugging a script | ✅ Implemented |
attach_to_process |
Attach debugger to a running process | ✅ Implemented |
detach_from_process |
Detach debugger from a process | ✅ Implemented |
get_stack_trace |
Get the current stack trace | ✅ Implemented |
list_threads |
List all threads in the debug session | ✅ Implemented |
get_scopes |
Get variable scopes for a frame | ✅ Implemented |
get_variables |
Get variables in a scope | ✅ Implemented |
get_local_variables |
Get local variables in current frame | ✅ Implemented |
step_over |
Step over the current line | ✅ Implemented |
step_into |
Step into a function | ✅ Implemented |
step_out |
Step out of a function | ✅ Implemented |
continue_execution |
Continue running | ✅ Implemented |
pause_execution |
Pause running execution | ✅ Implemented |
evaluate_expression |
Evaluate expressions in debug context | ✅ Implemented |
get_source_context |
Get source code context | ✅ Implemented |
close_debug_session |
Close a session | ✅ Implemented |
redefine_classes |
Hot-swap changed Java classes into a running JVM (Java only) | ✅ Implemented |
Version 0.10.0 introduces a clean adapter pattern that separates language-agnostic core functionality from language-specific implementations:
┌─────────────┐ ┌────────────────┐ ┌──────────────┐ ┌─────────────────┐
│ MCP Client │────▶│ DebugMcpServer │────▶│SessionManager│────▶│ AdapterRegistry │
└─────────────┘ └────────────────┘ └──────────────┘ └─────────────────┘
│ │
▼ ▼
┌──────────────┐ ┌─────────────────┐
│ ProxyManager │◀─────│ Language Adapter│
└──────────────┘ └─────────────────┘
│
┌──────────────┴──────────────────────────────────────────┐
│ │
┌───────────┼───────────┬───────────┬───────────┬───────────┐ │
│ │ │ │ │ │ │
┌─────▼────┐┌─────▼────┐┌─────▼────┐┌─────▼────┐┌─────▼────┐┌─────▼────┐
│Python ││JavaScript││Rust ││Go ││Java ││Dotnet ││Mock │
│Adapter ││Adapter ││Adapter ││Adapter ││Adapter ││Adapter ││Adapter │
└──────────┘└──────────┘└──────────┘└──────────┘└──────────┘└──────────┘└──────���───┘
Want to add debugging support for your favorite language? Check out the Adapter Development Guide!
Here's a complete debugging session example:
# buggy_swap.py
def swap_variables(a, b):
a = b # Bug: loses original value of 'a'
b = a # Bug: 'b' gets the new value of 'a'
return a, b// Tool: create_debug_session
// Request:
{
"language": "python",
"name": "Swap Bug Investigation"
}
// Response:
{
"success": true,
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"message": "Created python debug session: Swap Bug Investigation"
}// Tool: set_breakpoint
// Request:
{
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"file": "buggy_swap.py",
"line": 2
}
// Response:
{
"success": true,
"breakpointId": "28e06119-619e-43c0-b029-339cec2615df",
"file": "C:\\path\\to\\buggy_swap.py",
"line": 2,
"verified": false,
"message": "Breakpoint set at C:\\path\\to\\buggy_swap.py:2"
}// Tool: start_debugging
// Request:
{
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"scriptPath": "buggy_swap.py"
}
// Response:
{
"success": true,
"state": "paused",
"message": "Debugging started for buggy_swap.py. Current state: paused",
"data": {
"message": "Debugging started for buggy_swap.py. Current state: paused",
"reason": "breakpoint"
}
}First, get the scopes:
// Tool: get_scopes
// Request:
{
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"frameId": 3
}
// Response:
{
"success": true,
"scopes": [
{
"name": "Locals",
"variablesReference": 5,
"expensive": false,
"presentationHint": "locals",
"source": {}
},
{
"name": "Globals",
"variablesReference": 6,
"expensive": false,
"source": {}
}
]
}Then get the local variables:
// Tool: get_variables
// Request:
{
"sessionId": "a4d1acc8-84a8-44fe-a13e-28628c5b33c7",
"scope": 5
}
// Response:
{
"success": true,
"variables": [
{"name": "a", "value": "10", "type": "int", "variablesReference": 0, "expandable": false},
{"name": "b", "value": "20", "type": "int", "variablesReference": 0, "expandable": false}
],
"count": 2,
"variablesReference": 5
}- 📘 Tool Reference – Complete API documentation
- 🚦 Getting Started Guide – First-time setup
- 🏗️ Architecture Overview – Multi-language design
- 🔧 Adapter Development – Add new languages
- 🔌 Dynamic Loading Architecture – Runtime discovery, lazy loading, caching
- 🧩 Adapter API Reference – Adapter, factory, loader, and registry contracts
- 🔄 Migration Guide – Upgrading to v0.15.0 (dynamic loading)
- 🐍 Python Debugging Guide – Python-specific features
- 🟨 JavaScript Debugging Guide – JavaScript/TypeScript features
- 🐹 Go Debugging Guide – Go debugging with Delve
- ☕ Java Debugging Guide – Java debugging with JDI bridge
- Rust Debugging on Windows - Toolchain requirements and troubleshooting
- 🔧 Troubleshooting – Common issues & solutions
We welcome contributions! See CONTRIBUTING.md for guidelines.
# Development setup
git clone https://github.com/debugmcp/mcp-debugger.git
cd mcp-debugger
# Install dependencies and vendor debug adapters
pnpm install
# All debug adapters (JavaScript js-debug, Rust CodeLLDB) are automatically downloaded
# Build the project
pnpm build
# Run tests
pnpm test
# Check adapter vendoring status
pnpm vendor:status
# Force re-vendor all adapters (if needed)
pnpm vendor:forceThe project automatically vendors debug adapters during pnpm install:
- JavaScript: Downloads Microsoft's js-debug from GitHub releases
- Rust: Downloads CodeLLDB binaries for the current platform
- CI Environment: Set
SKIP_ADAPTER_VENDOR=trueto skip vendoring
To manually manage adapters:
# Check current vendoring status
pnpm vendor:status
# Re-vendor all adapters
pnpm vendor
# Clean and re-vendor (force)
pnpm vendor:force
# Clean vendor directories only
pnpm clean:vendorWe use Act to run GitHub Actions workflows locally:
# Build the Docker image first
docker build -t mcp-debugger:local .
# Run tests with Act (use WSL2 on Windows)
act -j build-and-test --matrix os:ubuntu-latestSee tests/README.md for detailed testing instructions.
- ✅ Production Ready: v0.21.0 with six language adapters and polished multi-language distribution
- ✅ Clean architecture with a dynamic adapter pattern
- ✅ Python · JavaScript/TypeScript · Go · Java · .NET/C#: Full step-through debugging
- 🦀 Rust: Full support on Linux/macOS/Windows (Windows requires the GNU toolchain; MSVC is not supported by CodeLLDB)
- 🟢 Runtime: Node.js 22+
- 📈 Active Development: Regular updates and improvements
MIT License - see LICENSE for details.
- @swinyx — Go adapter (Delve)
- @roofpig95008 — Java adapter (JDI bridge)
Built with:
- Model Context Protocol by Anthropic
- Debug Adapter Protocol by Microsoft
- debugpy for Python debugging
Give your AI agents a real debugger — in any language.
