Skip to main content
Glama

Debug-MCP: Python Debugging via Model Context Protocol

A Python debugging tool that exposes breakpoint-based debugging capabilities through a clean API and CLI, designed for integration with AI assistants and development tools.

English | 日本語

Features

  • Advanced Debugging via DAP: Production-ready debugging using Microsoft's debugpy

    • Breakpoint Debugging: Set breakpoints and inspect local variables at runtime

    • Step Execution: True step-in, step-over, step-out operations

    • No Corruption: Isolated process execution prevents sys.modules issues

    • Environment-aware: Automatically uses target project's Python interpreter

  • Session Management: Isolated debug sessions with timeout protection

  • Dual Interface:

    • CLI: Interactive debugging with beautiful table output

    • MCP Server: Official MCP SDK-based integration for AI assistants

  • Safe Execution: Sandboxed subprocess execution with configurable limits

  • Type Safety: Pydantic v2 schemas for request/response validation

  • Async Support: Built on MCP SDK with full async/await support

  • Comprehensive Testing: 254 tests (119 unit + 122 integration + 13 exploration) covering DAP workflows, session management, and edge cases

  • Legacy Compatibility: Optional bdb mode for backward compatibility

Quick Start

Installation

# Clone repository
git clone https://github.com/your-org/Debug-MCP.git
cd Debug-MCP

# Create virtual environment
uv venv

# Install with CLI support
uv pip install -e ".[cli]"

VS Code Copilot Integration

To use this tool with GitHub Copilot in VS Code, set up the MCP server configuration.

See

Quick Setup (Using from Debug-MCP repository):

  1. Create MCP config directory (macOS/Linux):

    mkdir -p ~/Library/Application\ Support/Code/User/globalStorage/github.copilot-chat
  2. Edit mcp.json file:

    {
      "mcpServers": {
        "python-debug": {
          "command": "uv",
          "args": ["run", "mcp-debug-server", "--workspace", "${workspaceFolder}"],
          "env": {"PYTHONUNBUFFERED": "1"}
        }
      }
    }
  3. Restart VS Code

Using from Another Repository:

When using this tool from a different repository, specify the Debug-MCP installation path:

{
  "mcpServers": {
    "python-debug": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/Debug-MCP",
        "run",
        "mcp-debug-server",
        "--workspace",
        "${workspaceFolder}"
      ],
      "env": {
        "PYTHONUNBUFFERED": "1"
      }
    }
  }
}

Replace /absolute/path/to/Debug-MCP with the actual path to your Debug-MCP installation.

Using Copilot Chat:

@workspace Set a breakpoint at line 42 in src/main.py and 
show me the local variables at that point.

See mcp-config-example.json for a complete configuration example.

# Start a debug session
SESSION_ID=$(uv run mcp-debug start-session src/app.py | jq -r .sessionId)

# Run to breakpoint and inspect locals  
uv run mcp-debug run-to-breakpoint $SESSION_ID src/app.py 42 --format table

# Continue to next breakpoint
uv run mcp-debug continue $SESSION_ID src/app.py 100 --format table

# Check session state
uv run mcp-debug state $SESSION_ID --format table

# End session
uv run mcp-debug end $SESSION_ID

See Quickstart Guide for more CLI examples.

API Usage (Python Integration)

from pathlib import Path
from mcp_debug_tool.sessions import SessionManager
from mcp_debug_tool.schemas import StartSessionRequest, BreakpointRequest

# Initialize
workspace = Path.cwd()
manager = SessionManager(workspace)

# Create session
req = StartSessionRequest(entry="src/main.py", args=["--verbose"])
session = manager.create_session(req)

# Run to breakpoint
bp_req = BreakpointRequest(file="src/main.py", line=15)
result = manager.run_to_breakpoint(session.sessionId, bp_req)

if result.hit:
    print(f"Paused at {result.frameInfo.file}:{result.frameInfo.line}")
    print(f"Locals: {result.locals}")

# Continue execution
continue_result = manager.continue_execution(
    session.sessionId, 
    BreakpointRequest(file="src/main.py", line=42)
)

# Cleanup
manager.end_session(session.sessionId)

Safety & Constraints

Execution Limits

  • Timeout: 20 seconds per breakpoint operation (configurable)

  • Output Capture: 10MB maximum per session

  • Variable Depth: Max 2 levels of nesting in local variable inspection

  • Collection Size: Max 50 items shown in lists/dicts

  • String Length: Max 256 characters before truncation

Security

  • Path Validation: Only project-relative paths allowed (no .. traversal)

  • Subprocess Isolation: Debuggee runs in isolated subprocess

  • Working Directory: Locked to workspace root

  • No Network: Debuggee has no special network access (app code may still use network)

⚠️ Important: The debugger executes user code with minimal restrictions. Only debug trusted code.

Architecture

Current Implementation (v2 - DAP-based)

Debug-MCP now uses DAP (Debug Adapter Protocol) via debugpy for production debugging:

┌─────────────────────────────────────────────────┐
│ MCP Server (server.py)                          │
│ - Official MCP SDK (async)                      │
│ - Tool registration & routing                   │
└────────────────┬────────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────┐
│ Session Manager (sessions.py)                   │
│ - Lifecycle management                          │
│ - DAP/bdb mode selection                        │
└────────────────┬────────────────────────────────┘
                 │
                 ▼ (DAP mode - default)
┌─────────────────────────────────────────────────┐
│ DAPSyncWrapper (dap_wrapper.py)                 │
│ - Synchronous DAP interface                     │
│ - Event queue management                        │
│ - Timeout handling                              │
└────────────────┬────────────────────────────────┘
                 │ DAP Protocol (JSON-RPC)
                 ▼
┌─────────────────────────────────────────────────┐
│ debugpy Server (separate process)               │
│ - Microsoft's official DAP implementation       │
│ - Handles breakpoints, stepping, variables      │
│ - Manages target script execution               │
└────────────────┬────────────────────────────────┘
                 │
                 ▼
┌─────────────────────────────────────────────────┐
│ Target Python Script                            │
│ - Runs in isolated process                      │
│ - Full access to target dependencies            │
│ - No sys.modules corruption                     │
└─────────────────────────────────────────────────┘

Why DAP (debugpy)?

  • No sys.modules corruption - Runs in separate process

  • True step execution - Maintains execution state across steps

  • Automatic environment handling - Uses target Python interpreter

  • Industry standard - Microsoft's battle-tested implementation

  • Rich features - Step in/over/out, conditional breakpoints, watch expressions

  • Future-proof - Easy to extend with advanced debugging features

Communication Flow:

  1. MCP Client (VS Code Copilot) → MCP Server (tool call)

  2. Server → SessionManager (sync method via async wrapper)

  3. SessionManager → DAPSyncWrapper (manages DAP session)

  4. DAPSyncWrapper ↔ debugpy Server (DAP protocol over socket)

  5. debugpy captures locals → DAPSyncWrapper → SessionManager → Server → Client

Legacy bdb Mode

The bdb-based implementation is still available for compatibility (useDap=false):

SessionManager → runner_main.py (subprocess) → DebugController (bdb)

However, DAP is now the default and recommended for all use cases. The bdb mode has known issues:

  • sys.modules corruption with multiple runs

  • No true step execution (replay-based)

  • Complex PYTHONPATH management

File Organization (2025-11-03)

Active Files (Production):

  • server.py - MCP SDK server

  • sessions.py - Session lifecycle management

  • dap_wrapper.py - DAP synchronous wrapper (PRIMARY)

  • dap_client.py - Low-level DAP protocol client (PRIMARY)

  • schemas.py - Pydantic models

  • utils.py - Variable repr helpers and path utilities

Legacy Files (Compatibility):

  • ⚠️ debugger.py - bdb-based engine (legacy, use useDap=false)

  • ⚠️ runner_main.py - bdb subprocess runner (legacy)

Removed Files:

  • runner.py - Old multiprocessing approach (removed 2025-10-30)

Development

Setup

See docs/development.md for detailed setup instructions.

Quick commands:

# Run all tests (254 tests: 119 unit + 122 integration + 13 exploration)
uv run pytest

# Run only unit tests
uv run pytest tests/unit/

# Run only integration tests
uv run pytest tests/integration/

# Run tests with coverage
uv run pytest --cov=src/mcp_debug_tool --cov-report=html

# Lint
uv run ruff check .

# Format  
uv run ruff format .

# Auto-fix lint issues
uv run ruff check --fix .

Project Structure

Debug-MCP/
├── src/
│   ├── mcp_debug_tool/      # Core debugging engine
│   │   ├── server.py        # MCP SDK-based server (v2.0+)
│   │   ├── sessions.py      # Session management (DAP/bdb mode selection)
│   │   ├── dap_wrapper.py   # DAP synchronous wrapper (PRIMARY)
│   │   ├── dap_client.py    # DAP protocol client (PRIMARY)
│   │   ├── debugger.py      # bdb-based debugger (LEGACY, use useDap=false)
│   │   ├── runner_main.py   # bdb subprocess runner (LEGACY)
│   │   ├── schemas.py       # Pydantic models
│   │   └── utils.py         # Variable repr helpers
│   └── cli/
│       └── main.py          # Typer CLI
├── tests/
│   ├── unit/                # Unit tests (debugger, schemas, DAP, sessions)
│   └── integration/         # Integration tests (DAP workflows, bdb compat)
├── specs/
│   └── 001-python-debug-tool/  # Specification documents
└── docs/                    # Additional documentation
    ├── dap-phase*-*.md      # DAP integration documentation
    └── roadmap.md           # Future enhancements

Documentation

Current Status

v2.0 Released! DAP Integration Complete 🎉

  • ✅ Phase 1: Foundation (Complete - 6/6 tests passing)

  • ✅ Phase 2: Core Logic (Complete - 28/28 tests passing)

  • ✅ Phase 3: Session Lifecycle (Complete - 29/29 tests passing)

  • ✅ Phase 4: Breakpoint Operations (Complete - 41/41 tests passing)

  • ✅ Phase 5: Error Visibility (Complete - 71/71 tests passing)

  • ✅ Phase 6: MCP SDK Migration (Complete - SDK-based server with async support)

  • Phase 7: DAP Integration (Complete - Production-ready debugpy integration)

What's New in v2.0:

  • DAP (debugpy) is now the default - No more sys.modules corruption!

  • True step execution - Step in, step over, step out all working

  • Automatic environment handling - Uses target project's Python interpreter

  • Industry-standard protocol - Microsoft's battle-tested implementation

  • Enhanced reliability - Isolated process execution prevents crashes

  • Backward compatible - Legacy bdb mode still available with useDap=false

Migration from v1.x:

  • Existing code works as-is (DAP is opt-in by default)

  • To explicitly use bdb: StartSessionRequest(entry="...", useDap=False)

  • Recommended: Let it default to DAP for best results

Limitations (v2)

  • Script entry only: No module (python -m) or pytest target support (planned for v2.1)

  • Single-threaded: No support for multi-threaded debugging (planned for v2.1)

  • Line breakpoints: Conditional breakpoints not yet exposed via MCP (DAP supports it)

✅ Resolved from v1:

  • No steppingNow available: Step in, step over, step out

  • sys.modules corruptionFixed: DAP uses isolated processes

  • Python environment mismatchFixed: Uses target interpreter

See docs/roadmap.md for planned v2.1+ enhancements.

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Make your changes with tests

  4. Run tests and linting (uv run pytest && uv run ruff check .)

  5. Commit changes (git commit -m 'Add amazing feature')

  6. Push to branch (git push origin feature/amazing-feature)

  7. Open a Pull Request

License

MIT License - see LICENSE file for details

Acknowledgments

Built with:

  • debugpy - Microsoft's Python debugger (DAP implementation)

  • MCP SDK - Model Context Protocol Python SDK

  • bdb/pdb - Python's standard debugger framework (legacy mode)

  • Pydantic - Data validation using Python type annotations

  • Typer - CLI framework built on Click

  • Rich - Beautiful terminal formatting

  • pytest - Testing framework

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Kaina3/Debug-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server