
모든 pybag Windows 디버거 기능을 네이티브 MCP 도구로 전환하는 MCP(Model Context Protocol) 서버입니다. MCP 호환 클라이언트(Claude Desktop, Claude Code, Cowork, OpenAI Codex CLI, Cursor 및 사용자 지정 에이전트)가 구조화된 JSON 호출을 통해 사용자 모드 프로세스, 커널 세션 및 크래시 덤프 분석을 제어할 수 있게 해줍니다.
MCP (Model Context Protocol) 서버로, 모든 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.jsonClaude Desktop를 다시 시작하세요. 55개의 모든 디버거 도구가 자동으로 나타납니다.
---
### Claude Code (CLI)
다음 명령을 한 번 실행하여 서버를 등록하세요. Claude Code는 항목을 자체 MCP config에 저장하고 이후 모든 세션에서 도구를 사용할 수 있게 합니다.```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
Claude Cowork에 WinDbg MCP를 추가하는 방법은 두 가지입니다: JSON 구성(빠른 방법) 또는 .mcpb 플러그인 번들(이식 가능, 공유 가능)로 설치하는 방법입니다.
3. 저장하고 Cowork를 다시 시작하세요. 도구들은 다음 세션에서 사용할 수 있습니다.
#### 옵션 B — `.mcpb` 플러그인 번들로 설치
`.mcpb` 파일은 Cowork가 직접 설치할 수 있는 플러그인 디렉터리의 zip 아카이브입니다. 이는 팀이나 여러 머신 간에 서버를 공유할 때 권장되는 방법입니다.
**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)
#### Direct JSON-RPC over stdio (언어 독립적)
서버는 개행으로 구분된 JSON-RPC 2.0 메시지를 통해 통신합니다. 프로세스의 stdin에 쓰고 stdout에서 읽는 방식으로 모든 언어에서 구동할 수 있습니다:```
→ {"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} |