MCP server for PHP Xdebug debugging with breakpoints, stepping, and variable inspection
io.github.kpanuragh/xdebug MCP Server
MCP server for PHP debugging using Xdebugβs DBGp protocol. It supports breakpoint-based debugging and interactive execution controls (step, continue, stop) and is intended to connect debugging workflows to AI assistants such as Claude through MCP.
An MCP (Model Context Protocol) server that provides PHP debugging capabilities through Xdebug's DBGp protocol. This allows AI assistants like Claude to directly debug PHP applications.
[xdebug]zend_extension=xdebug
; Enable step debuggingxdebug.mode=debug
; Start debugging on every requestxdebug.start_with_request=yes; Host where MCP server is running; For Docker: use host.docker.internal; For local PHP: use 127.0.0.1xdebug.client_host=host.docker.internal
; Port where MCP server listensxdebug.client_port=9003; IDE key (optional, for filtering)xdebug.idekey=mcp
Docker Compose
yaml
version:'3.8'services:php:image:php:8.2-apachevolumes:-./src:/var/www/html-./xdebug.ini:/usr/local/etc/php/conf.d/99-xdebug.iniextra_hosts:-"host.docker.internal:host-gateway"# Required for Linuxenvironment:-XDEBUG_MODE=debug-XDEBUG_CONFIG=client_host=host.docker.internalclient_port=9003
Using Unix Domain Sockets
For improved performance and simplified setup on local systems, you can use Unix domain sockets instead of TCP. Unix sockets eliminate network stack overhead and are ideal for debugging on the same machine.
Benefits:
β‘ Lower latency (no TCP/IP stack overhead)
π Better security (file permissions instead of port binding)
The socket file is created with default permissions. To restrict access, you can:
bash
# After MCP server startschmod 600 /tmp/xdebug.sock
# Or use a secure directorymkdir -p ~/.xdebug && chmod 700 ~/.xdebug
# Then set XDEBUG_SOCKET_PATH=$HOME/.xdebug/xdebug.sock
Automatic Cleanup:
When XDEBUG_SOCKET_PATH is set, the server will:
Listen on the specified Unix socket instead of TCP port
Automatically clean up stale socket files on startup (prevents "address in use" errors)
Automatically clean up socket files on shutdown
Use the same debugging tools and features as TCP mode
Set a line or conditional breakpoint (supports pending breakpoints)
set_exception_breakpoint
Break on exceptions (supports pending breakpoints)
set_call_breakpoint
Break on function calls (supports pending breakpoints)
remove_breakpoint
Remove a breakpoint (works with pending breakpoints)
update_breakpoint
Enable/disable or modify a breakpoint
list_breakpoints
List all breakpoints including pending
Pending Breakpoints: You can set breakpoints before a debug session starts. These are stored as "pending breakpoints" and automatically applied when a PHP script connects with Xdebug. This is useful for setting up breakpoints before triggering a page load or script execution.
Execution Control
Tool
Description
continue
Continue to next breakpoint
step_into
Step into function calls
step_over
Step over (skip function internals)
step_out
Step out of current function
stop
Stop debugging
detach
Detach and let script continue
Inspection
Tool
Description
get_stack_trace
Get the call stack
get_contexts
Get available variable contexts
get_variables
Get all variables in scope
get_variable
Get a specific variable
set_variable
Set a variable's value
evaluate
Evaluate a PHP expression
get_source
Get source code
Watch Expressions
Tool
Description
add_watch
Add a persistent watch expression
remove_watch
Remove a watch expression
evaluate_watches
Evaluate all watches and detect changes
list_watches
List all active watches
Logpoints
Tool
Description
add_logpoint
Add a logpoint with message template
remove_logpoint
Remove a logpoint
get_logpoint_history
View log output and hit statistics
Profiling
Tool
Description
start_profiling
Start memory/time profiling
stop_profiling
Stop profiling and get results
get_profile_stats
Get current profiling statistics
get_memory_timeline
View memory usage over time
Code Coverage
Tool
Description
start_coverage
Start tracking code coverage
stop_coverage
Stop and get coverage report
get_coverage_report
View coverage statistics
Debug Profiles
Tool
Description
save_debug_profile
Save current configuration as a profile
load_debug_profile
Load a saved debug profile
list_debug_profiles
List all saved profiles
Additional Tools
Tool
Description
capture_request_context
Capture HTTP request context
add_step_filter
Add filter to skip files during stepping
list_step_filters
List step filter rules
get_function_history
View function call history
export_session
Export session as JSON/HTML report
capture_snapshot
Capture debug state snapshot
Usage Examples
Setting a Breakpoint
code
Use set_breakpoint with file="/var/www/html/index.php" and line=25
Conditional Breakpoint
code
Use set_breakpoint with file="/var/www/html/api.php", line=42, condition="$userId > 100"
Watch Expression
code
Use add_watch with expression="$user->email"
Use add_watch with expression="count($items)"
Logpoint
code
Use add_logpoint with file="/var/www/html/api.php", line=50, message="User {$userId} accessed {$endpoint}"
Inspecting Variables
code
Use get_variables to see all local variables
Use get_variable with name="$user" to inspect a specific variable
Use evaluate with expression="count($items)" to evaluate an expression
Capture Request Context
code
Use capture_request_context to see $_GET, $_POST, $_SESSION, cookies, and headers
Environment Variables
Variable
Default
Description
XDEBUG_PORT
9003
Port to listen for Xdebug connections (TCP mode)
XDEBUG_HOST
0.0.0.0
Host to bind (TCP mode)
XDEBUG_SOCKET_PATH
-
Unix domain socket path (e.g., /tmp/xdebug.sock). When set, uses Unix socket instead of TCP
COMMAND_TIMEOUT
30000
Command timeout in milliseconds
PATH_MAPPINGS
-
JSON object mapping container to host paths
MAX_DEPTH
3
Max depth for variable inspection
MAX_CHILDREN
128
Max children to return for arrays/objects
MAX_DATA
2048
Max data size per variable
LOG_LEVEL
info
Log level: debug, info, warn, error
Connection Modes: TCP vs Unix Socket
Feature
TCP
Unix Socket
Setup
Easy (default)
Simple (one env var)
Performance
Good
Excellent (lower latency)
Security
Port accessible to network
File-based permissions
Remote Debugging
β Supported
β Local only
Docker
β Works with host.docker.internal
β Requires volume mount
Stale Socket
Manual port cleanup
Auto-cleanup
Default
XDEBUG_PORT=9003
Disabled (use TCP)
Quick Decision Guide:
π Local development? β Use Unix socket for best performance
π³ Docker on same machine? β Use Unix socket with volume mount
π Remote server? β Use TCP
π Maximum speed? β Use Unix socket
π Don't know? β Start with TCP (default), switch to Unix socket if needed
How It Works
MCP Server starts and listens for Xdebug connections (TCP port 9003 or Unix socket)
PHP script runs with Xdebug enabled
Xdebug connects to the MCP server via DBGp protocol
AI uses MCP tools to control debugging (set breakpoints, step, inspect)
DBGp commands are sent to Xdebug, responses parsed and returned
code
βββββββββββββββ MCP/stdio βββββββββββββββ DBGp/TCP or βββββββββββββββ
β Claude β ββββββββββββββββββΊ β xdebug-mcp β ββ Unix Socket βββΊ β Xdebug β
β (AI Agent) β β Server β β (in PHP) β
βββββββββββββββ βββββββββββββββ βββββββββββββββ