English | 中文
A Model Context Protocol (MCP) server implementation for x64dbg and x32dbg, enabling remote debugging through a JSON-RPC 2.0 interface. This plugin allows external applications and AI agents to interact with the debugger programmatically.
Now supports both x64 and x86 architectures!
-
Full MCP Specification Compliance: Implements all three core MCP building blocks
- Tools (79): AI-invokable debugging functions
- Resources (7 + 8 templates): Application-controlled context data sources
- Prompts (10): User-guided debugging workflow templates
-
JSON-RPC 2.0 Protocol: Standard, language-agnostic interface
-
Streamable HTTP transport (MCP 2025-03-26) on
/mcp, plus legacy HTTP+SSE on/ssefor older clients -
Tools - AI-Controlled Debugging (79 functions):
- Execution control (init/run/pause/step/run_to/restart/stop)
- Memory read/write/search/allocate
- Register access (50+ registers including GPR, SSE, AVX)
- Breakpoint management (software, hardware, memory, conditional, logging)
- Disassembly and symbol resolution
- Thread management (list, switch, suspend, resume)
- Stack trace and analysis
- Dump & Analysis (module dump, memory dump, packer detection, OEP detection)
- Script execution (execute x64dbg/x32dbg commands, batch operations)
- Context snapshots (capture and compare debugging state)
-
Resources - Context Providers (7 direct + 8 templates):
- Direct resources: debugger state, registers, modules, threads, memory map, breakpoints, stack
- Resource templates: memory content, disassembly, module info, symbol resolution, function analysis
- Read-only, application-controlled access
-
Prompts - Workflow Templates (10 prompts):
- Crash analysis, vulnerability hunting, function tracing
- Binary unpacking, algorithm reversing, execution comparison
- String hunting, code patching, API monitoring
- Debug session initialization
-
Security: Permission-based access control
-
Extensible: Plugin architecture for custom methods, resources, and prompts
- Windows 10/11 (64-bit host; supports building both x64 and x86 plugins)
- CMake 3.15 or higher
- Visual Studio 2022 with C++ Desktop Development workload
- vcpkg - Package manager for C++ libraries
- Git - For cloning the repository
The easiest way to build is using the provided build script:
# Clone the repository
git clone https://github.com/SetsunaYukiOvO/x64dbg-mcp.git
cd x64dbg-mcp
# Build both x64 and x86 architectures (recommended)
.\build.bat
# Build only x64 architecture
.\build.bat --x64-only
# Build only x86 architecture
.\build.bat --x86-only
# Clean rebuild
.\build.bat --clean
# The script will:
# 1. Automatically detect vcpkg installation
# 2. Download dependencies (nlohmann_json)
# 3. Configure CMake for both architectures
# 4. Build using Visual Studio with parallel compilation
# 5. Copy output files to dist/ directoryBuild script options:
.\build.bat # Build both x64 and x86 (Release)
.\build.bat --clean # Clean rebuild both architectures
.\build.bat --x64-only # Build x64 only
.\build.bat --x86-only # Build x86 only
.\build.bat --debug # Debug build (future support)Output files (in dist/ directory):
- x64 plugin:
dist\x64dbg_mcp.dp64(~837 KB) - x86 plugin:
dist\x32dbg_mcp.dp32(~800 KB)
If you prefer manual control:
- Install vcpkg (if not already installed):
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
C:\vcpkg\bootstrap-vcpkg.bat
setx VCPKG_ROOT "C:\vcpkg"- Clone the repository:
git clone https://github.com/SetsunaYukiOvO/x64dbg-mcp.git
cd x64dbg-mcp- Configure with CMake:
# For x64 build
cmake -B build_x64 -G "Visual Studio 17 2022" -A x64 ^
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake ^
-DVCPKG_TARGET_TRIPLET=x64-windows ^
-DXDBG_ARCH=x64
# For x86 build
cmake -B build_x86 -G "Visual Studio 17 2022" -A Win32 ^
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake ^
-DVCPKG_TARGET_TRIPLET=x86-windows ^
-DXDBG_ARCH=x86- Build:
cmake --build build_x64 --config Release
cmake --build build_x86 --config Release- Output:
- x64 plugin:
build_x64\bin\Release\x64dbg_mcp.dp64 - x86 plugin:
build_x86\bin\Release\x32dbg_mcp.dp32
- Copy the compiled plugins to their respective debugger directories:
# For x64dbg (64-bit)
# Replace <x64dbg-path> with your actual x64dbg installation directory
copy dist\x64dbg_mcp.dp64 <x64dbg-path>\x64\plugins\
# For x32dbg (32-bit)
copy dist\x32dbg_mcp.dp32 <x64dbg-path>\x32\plugins\
# Example (if installed at C:\x64dbg):
# copy dist\x64dbg_mcp.dp64 C:\x64dbg\x64\plugins\
# copy dist\x32dbg_mcp.dp32 C:\x64dbg\x32\plugins\- (Optional) Copy the configuration file:
# For x64dbg
mkdir <x64dbg-path>\x64\plugins\x64dbg-mcp
copy config.json <x64dbg-path>\x64\plugins\x64dbg-mcp\
# For x32dbg
mkdir <x64dbg-path>\x32\plugins\x32dbg-mcp
copy config.json <x64dbg-path>\x32\plugins\x32dbg-mcp\- Restart x64dbg/x32dbg to load the plugin
- Open x64dbg for a 64-bit target or x32dbg for a 32-bit target
- Navigate to Plugins → MCP Server → Start MCP HTTP Server
- The server will start on the configured port (default: 3000)
- Access the server at
http://127.0.0.1:3000
Edit config.json to customize settings:
{
"version": "1.0.11",
"server": {
"address": "127.0.0.1",
"port": 3000
},
"permissions": {
"allow_memory_write": false,
"allow_register_write": false,
"allow_script_execution": false,
"allow_breakpoint_modification": true,
"allowed_methods": ["debug.*", "memory.*"]
},
"security": {
"origin_allowlist": [],
"host_allowlist": [],
"auth_enabled": false,
"auth_token": ""
},
"logging": {
"enabled": true,
"level": "info",
"file": "x64dbg_mcp.log",
"max_file_size_mb": 10,
"console_output": true
},
"timeout": {
"request_timeout_ms": 30000,
"step_timeout_ms": 10000,
"memory_read_timeout_ms": 5000
},
"features": {
"enable_notifications": true,
"enable_heartbeat": true,
"heartbeat_interval_seconds": 30,
"enable_batch_requests": true,
"auto_start_mcp_on_plugin_load": false
}
}Choose Plugins > MCP Server > Edit Config to edit the active configuration without manually changing JSON. The editor has pages for Server, Security, Permissions, Runtime, and Logging. It covers every runtime setting in the example above; the version field and any unknown future fields are preserved when saving.
For security allowlists, enter one Origin or Host per line. The Token field is masked and is required when Require Bearer token authentication is enabled. Saving a non-loopback listener without authentication requires confirmation. Restart the MCP HTTP server after saving for server settings to take effect.
The server listens on 127.0.0.1 by default. This is intentional: the debugger exposes powerful operations. security.origin_allowlist and security.host_allowlist validate browser origins and Host headers; they are not passwords or API keys. Use security.auth_enabled and security.auth_token to enable HTTP Bearer authentication.
Use 127.0.0.1:3000 and connect from the same Windows host. No firewall rule or port forwarding is required.
Only do this on a trusted network. Change the bind address and explicitly allow the address used by the client:
{
"server": { "address": "0.0.0.0", "port": 3000 },
"security": {
"origin_allowlist": ["http://192.168.1.50:3000"],
"host_allowlist": ["192.168.1.20", "debugger.example.test"]
}
}Use the actual client Origin, server hostname, or server IP. Do not add * as an Origin. Open TCP port 3000 only on the required Windows network profile, and configure the VM NAT/bridged adapter or router port forwarding separately. Restart the plugin after changing the file.
Endpoints:
- Streamable HTTP clients:
http://HOST:3000/mcp - Legacy HTTP+SSE clients:
http://HOST:3000/sse - JSON-RPC compatibility endpoint:
http://HOST:3000/rpc - Health check:
GET http://HOST:3000/
Do not publish the plugin directly to the Internet. Put it behind a VPN, SSH tunnel, or a reverse proxy that provides TLS, authentication, rate limiting, and IP allowlisting. Keep the plugin bound to 127.0.0.1 when the proxy runs on the same machine. A reverse proxy must preserve the MCP streaming response and forward Content-Type, Accept, Mcp-Protocol-Version, Mcp-Session-Id, and Last-Event-ID headers.
The plugin supports optional Authorization: Bearer validation but does not provide an OAuth authorization server. Never enable memory writes, register writes, or script execution on an unauthenticated public endpoint; these permissions are disabled by default and should remain disabled unless explicitly required.
To enable built-in Bearer authentication, store a high-entropy secret in the plugin configuration and restart the plugin:
{
"security": {
"auth_enabled": true,
"auth_token": "replace-with-a-long-random-secret"
}
}All HTTP endpoints except CORS OPTIONS preflight then require Authorization: Bearer <auth_token>. The server refuses to start if authentication is enabled with an empty token, and logs a security warning when a non-loopback listener starts without authentication. Store the configuration with restrictive filesystem permissions and do not commit the token.
Connection refused: verify the plugin server is started, the bind address/port, and VM NAT or firewall rules.403or rejected request: add the exact browserOrigintosecurity.origin_allowlistand the proxy/client Hostname tosecurity.host_allowlist.- MCP initialize succeeds but tools are missing: reconnect after
initialize; clients discover capabilities from the response. - SSE hangs or returns 404: use
/ssefor legacy SSE clients and/mcpfor Streamable HTTP clients. - Works through one proxy but not another: check that HTTP/1.1 streaming, long read timeouts, and SSE buffering are enabled.
For a first diagnostic, run curl http://127.0.0.1:3000/ on the debugger host, then test the same URL through each forwarding layer. Do not include debugger memory or credentials in issue logs.
Python client example using HTTP:
import requests
import json
class MCPClient:
def __init__(self, host='127.0.0.1', port=3000):
self.base_url = f"http://{host}:{port}"
self.request_id = 1
def call(self, method, params=None):
request = {
"jsonrpc": "2.0",
"id": self.request_id,
"method": method,
"params": params or {}
}
self.request_id += 1
response = requests.post(
f"{self.base_url}/rpc",
json=request,
headers={"Content-Type": "application/json"}
)
return response.json()
def subscribe_events(self):
"""Subscribe to SSE events"""
response = requests.get(
f"{self.base_url}/sse",
stream=True,
headers={"Accept": "text/event-stream"}
)
for line in response.iter_lines():
if line:
yield line.decode('utf-8')
# Usage
client = MCPClient()
print(client.call("initialize"))
print(client.call("tools/list"))
print(client.call("resources/list"))
print(client.call("prompts/list"))
# Subscribe to debug events
for event in client.subscribe_events():
print(f"Event: {event}")Cursor and other MCP clients usually decide which sections to show from the initialize response capabilities. This server advertises tools, resources, and prompts, so after reconnecting you should see all three categories in the client UI.
Configure in VS Code settings or MCP client config. Recommended (Streamable HTTP, MCP 2025-03-26):
{
"mcpServers": {
"x64dbg": {
"type": "http",
"url": "http://127.0.0.1:3000/mcp"
}
}
}Legacy HTTP+SSE clients (use the /sse path, not the root):
{
"mcpServers": {
"x64dbg": {
"type": "sse",
"url": "http://127.0.0.1:3000/sse"
}
}
}system.info- Get server informationsystem.ping- Test connectionsystem.methods- List all available methods
debug.run- Continue executiondebug.pause- Pause executiondebug.step_into- Step into instructiondebug.step_over- Step over instructiondebug.step_out- Step out of functiondebug.get_state- Get current debug statedebug.run_to- Run to specific addressdebug.restart- Restart debugging sessiondebug.stop- Stop debugging
register.get- Read single registerregister.set- Write register valueregister.list- List all registersregister.get_batch- Read multiple registers
memory.read- Read memory regionmemory.write- Write memory regionmemory.search- Search memory patternmemory.get_info- Get memory region infomemory.enumerate- List all memory regionsmemory.allocate- Allocate memorymemory.free- Free allocated memory
breakpoint.set- Set breakpointbreakpoint.delete- Remove breakpointbreakpoint.enable- Enable breakpointbreakpoint.disable- Disable breakpointbreakpoint.toggle- Toggle breakpoint statebreakpoint.list- List all breakpointsbreakpoint.get- Get breakpoint detailsbreakpoint.delete_all- Remove all breakpointsbreakpoint.set_condition- Set breakpoint conditionbreakpoint.set_log- Set breakpoint log messagebreakpoint.reset_hitcount- Reset breakpoint hit count
disassembly.at- Disassemble at addressdisassembly.range- Disassemble address rangedisassembly.function- Disassemble entire function
symbol.resolve- Resolve symbol to addresssymbol.from_address- Get symbol from addresssymbol.search- Search symbols by patternsymbol.list- List all symbolssymbol.modules- List loaded modulessymbol.set_label- Set symbol labelsymbol.set_comment- Set symbol commentsymbol.get_comment- Get symbol comment
module.list- List all loaded modulesmodule.get- Get module informationmodule.get_main- Get main module
thread.list- List all threadsthread.get_current- Get current threadthread.get- Get thread informationthread.switch- Switch to threadthread.suspend- Suspend threadthread.resume- Resume threadthread.get_count- Get thread count
stack.get_trace- Get stack tracestack.read_frame- Read stack framestack.get_pointers- Get stack pointers (RSP/RBP on x64, ESP/EBP on x86)stack.is_on_stack- Check if address is on stack
For complete method signatures and examples, see the inline documentation in the source code or use the system.methods API call.
The plugin is organized into four layers:
- Communication Layer: HTTP server with SSE support for real-time events
- Protocol Layer: JSON-RPC and MCP protocol parsing, validation, dispatching
- Business Layer: Debugging operations, memory management, symbol resolution
- Plugin Layer: x64dbg integration, event handling, callback management
- MCPHttpServer: HTTP server with SSE endpoint for event streaming
- MethodDispatcher: Routes JSON-RPC calls to appropriate handlers
- Business Managers: DebugController, MemoryManager, RegisterManager, etc.
- Event System: Real-time debugging event notifications via SSE
- By default, memory and register write operations are disabled
- Enable write permissions in
config.jsononly if needed - Server listens on localhost (127.0.0.1) by default
- Single client connection limit prevents resource exhaustion
- All operations require the debugger to be in a paused state
- Match the plugin to the debugger:
x64dbg_mcp.dp64inx64\plugins\for x64dbg, orx32dbg_mcp.dp32inx32\plugins\for x32dbg - Do not load a
.dp64plugin in x32dbg or a.dp32plugin in x64dbg - Check the corresponding x64dbg/x32dbg log for error messages
- Verify debugger version compatibility (requires x64dbg/x32dbg build 2023+)
- Check if port 3000 is already in use
- Verify config.json is valid JSON
- Check file permissions on the plugin directory
- Review the corresponding x64dbg/x32dbg log file for detailed error messages
- Ensure HTTP server is started via plugin menu ("Start MCP HTTP Server")
- Check firewall settings for port 3000
- Verify client is connecting to http://127.0.0.1:3000
- Try accessing http://127.0.0.1:3000 in a web browser to test
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes with clear commit messages
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
- x64dbg - The debugger this plugin extends
- nlohmann/json - JSON library
- Model Context Protocol specification
- GitHub Issues: For bug reports and feature requests
Note: This is experimental software. Use at your own risk. Always test in a safe environment before using with critical applications.