一个 MCP(模型上下文协议)服务器,可将所有 pybag Windows 调试器功能转换为原生 MCP 工具。它允许兼容 MCP 的客户端(Claude Desktop、Claude Code、Cowork、OpenAI Codex CLI、Cursor 以及自定义代理)通过结构化 JSON 调用控制用户模式进程、内核会话和崩溃转储分析。
一个 MCP(模型上下文协议)服务器,将 pybag 的每一个 Windows 调试器功能暴露为原生 MCP 工具。它允许任何兼容 MCP 的客户端(Claude Desktop、Claude Code、Cowork、OpenAI Codex CLI、Cursor 以及自定义代理)全面控制用户态进程、内核会话和崩溃转储分析——全部通过类型化工具调用和结构化 JSON 响应完成。
git clone https://github.com/your-username/windbg-mcp.git cd windbg-mcp
### 2. 安装 Python 依赖```bat
pip install pybag mcp
下载 Windows SDK,并在安装过程中选择 Debugging Tools for Windows: https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/
服务器作为本地 stdio 进程运行。以下所有客户端都以相同方式启动它——
python <path-to>/windbg_mcp.py——但每个客户端有自己的配置格式。
编辑 Claude Desktop 配置文件并添加 windbg-mcp 条目:
配置文件位置:
%APPDATA%\Claude\claude_desktop_config.json重启 Claude Desktop。所有 55 个调试工具将自动显示。
---
### Claude Code(命令行界面)
运行以下命令一次以注册服务器。Claude Code 将条目存储在其自己的 MCP 配置中,并在每次后续会话中使这些工具可用。```bash
claude mcp add windbg-mcp python C:\path\to\windbg-mcp\windbg_mcp.py
要验证服务器已注册:```bash claude mcp list
稍后删除:```bash
claude mcp remove windbg-mcp
有两种方式可将 WinDbg MCP 添加到 Cowork:通过 JSON 配置(快速)或
安装为 .mcpb 插件包(可移植、可共享)。
3. 保存并重启 Cowork。这些工具将在您下次会话中可用。
#### Option B — 安装为 `.mcpb` 插件包
`.mcpb` 文件是插件目录的压缩包,Cowork 可以直接安装。这是在团队间或跨机器分享服务器时的推荐方式。
**步骤 1 — 构建 `.mcpb` 文件**
从克隆仓库的根目录运行:```bat
powershell -Command "Compress-Archive -Path '.\*' -DestinationPath 'windbg-mcp.zip'; Rename-Item 'windbg-mcp.zip' 'windbg-mcp.mcpb'"
这会创建 windbg-mcp.mcpb 到当前目录,打包了 windbg_mcp.py、manifest.json 以及其他项目文件。
步骤 2 — 在 Cowork 中安装
windbg-mcp.mcpb。manifest.json,注册 MCP 服务器,然后所有工具即可立即使用 —— 无需手动配置路径。本仓库中捆绑的 manifest.json 已正确配置:```json
{
"manifest_version": "0.2",
"name": "windbg-mcp",
"version": "1.0.0",
"description": "WinDbg MCP — full Windows debugger control via MCP tools",
"server": {
"type": "python",
"entry_point": "windbg_mcp.py",
"mcp_config": {
"command": "python",
"args": ["${__dirname}/windbg_mcp.py"]
}
}
}
`${__dirname}` 在安装时解析为 Cowork 解压包的目录,因此您无需硬编码任何路径。
---
### OpenAI Codex CLI
将服务器添加到您的 Codex CLI 配置文件中。该文件通常位于 `~/.codex/config.json`(Linux/macOS)或 `%USERPROFILE%\.codex\config.json`(Windows)。```json
{
"mcpServers": {
"windbg-mcp": {
"command": "python",
"args": ["C:\\path\\to\\windbg-mcp\\windbg_mcp.py"]
}
}
}
保存后,启动一个新的Codex会话。WinDbg工具将可供模型调用。
4. 保存。Cursor 将在下一次 Composer 会话时连接到服务器。
---
### Continue.dev
在你的 `~/.continue/config.json`(或工作区级别的 `.continue/config.json`)中添加以下内容:```json
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "python",
"args": ["C:\\path\\to\\windbg-mcp\\windbg_mcp.py"]
}
}
]
}
}
重新加载 Continue 扩展。55 个调试器工具将出现在工具列表中。
如果您正在构建自己的代理或自动化流水线,可以通过标准的 MCP stdio 传输连接到 WinDbg MCP。该服务器通过 stdin/stdout 使用 JSON-RPC 2.0 协议进行通信。
mcp SDK)```pythonimport asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client
server_params = StdioServerParameters( command="python", args=[r"C:\path\to\windbg-mcp\windbg_mcp.py"], )
async def main(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize()
# List all available tools
tools = await session.list_tools()
print([t.name for t in tools.tools])
# Load a crash dump
result = await session.call_tool(
"load_dump",
arguments={"path": r"C:\crashes\crash.dmp"},
)
print(result.content)
# Read 64 bytes at RSP
result = await session.call_tool(
"read_mem",
arguments={"addr": "0x00000000001FF000", "size": 64},
)
print(result.content)
asyncio.run(main())
#### TypeScript / Node.js(使用 `@modelcontextprotocol/sdk` 包)```typescript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "python",
args: ["C:\\path\\to\\windbg-mcp\\windbg_mcp.py"],
});
const client = new Client({ name: "my-agent", version: "1.0.0" }, {});
await client.connect(transport);
// Call a tool
const result = await client.callTool({
name: "load_dump",
arguments: { path: "C:\\crashes\\crash.dmp" },
});
console.log(result.content);
await client.close();
from langchain_mcp_adapters.tools import load_mcp_tools from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client
server_params = StdioServerParameters( command="python", args=[r"C:\path\to\windbg-mcp\windbg_mcp.py"], )
async def get_tools(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() return await load_mcp_tools(session)
#### 通过 stdio 的直接 JSON-RPC(语言无关)
服务器通过换行分隔的 JSON-RPC 2.0 消息进行通信。你可以通过写入进程的标准输入并从标准输出读取,用任何语言驱动它:```
→ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0"}}}
← {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{...},"serverInfo":{"name":"WinDbg MCP","version":"1.0.0"}}}
→ {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"load_dump","arguments":{"path":"C:\\crashes\\crash.dmp"}}}
← {"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"{\"status\": \"ok\", ...}"}]}}
| 工具 | 参数 | 返回值 |
|---|---|---|
status | — | {connected, type, pid, bitness} |
list_processes | — | [{pid, name, description}] |
create | path(必需), args, initial_break | {status, pid, bitness} |
attach | pid 或 name(不能同时提供), initial_break | {status, pid, bitness} |
kernel_attach | connect_string(必需), initial_break | {status, type, connect_string} |
load_dump | path(必需) | {status, bitness, rip, symbol_at_rip} |
connect | options(必需) | {status, options} |
detach | — | {status} |
terminate | — | {status} |
create — 在调试器下启动一个新进程。设置 initial_break=True(默认)可在进程入口点中断。
attach — 附加到一个正在运行的进程。提供 pid(整数)或 name(进程文件名),不能同时提供两者。
kernel_attach — 连接到远程内核调试器。connect_string 使用 KD 语法,例如 "net:port=55000,key=1.2.3.4"。
load_dump — 打开一个 .dmp 文件进行事后分析。立即返回崩溃地址和最近的符号。
connect — 连接到进程服务器以进行远程用户模式调试。options 使用 DbgEng 连接语法,例如 "tcp:server=192.168.1.10,port=5555"。