Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
136 changes: 68 additions & 68 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,134 +1,134 @@
# RenderDoc MCP Server

RenderDoc UI拡張機能として動作するMCPサーバー。AIアシスタントがRenderDocのキャプチャデータにアクセスし、DirectX 11/12のグラフィックスデバッグを支援する。
An MCP server that runs as a RenderDoc UI extension, enabling AI assistants to access RenderDoc capture data and assist with DirectX 11/12 graphics debugging.

## アーキテクチャ
## Architecture

**ハイブリッドプロセス分離方式**:
**Hybrid Process Separation Approach**:

```
Claude/AI Client (stdio)
MCP Server Process (標準Python + FastMCP 2.0)
MCP Server Process (Standard Python + FastMCP 2.0)
│ File-based IPC (%TEMP%/renderdoc_mcp/)
RenderDoc Process (Extension + File Polling)
```

## プロジェクト構成
## Project Structure

```
RenderDocMCP/
├── mcp_server/ # MCPサーバー
│ ├── server.py # FastMCPエントリーポイント
│ ├── config.py # 設定
├── mcp_server/ # MCP Server
│ ├── server.py # FastMCP entry point
│ ├── config.py # Configuration
│ └── bridge/
│ └── client.py # ファイルベースIPCクライアント
│ └── client.py # File-based IPC client
├── renderdoc_extension/ # RenderDoc拡張機能
├── renderdoc_extension/ # RenderDoc Extension
│ ├── __init__.py # register()/unregister()
│ ├── extension.json # マニフェスト
│ ├── socket_server.py # ファイルベースIPCサーバー
│ ├── request_handler.py # リクエスト処理
│ └── renderdoc_facade.py # RenderDoc APIラッパー
│ ├── extension.json # Manifest
│ ├── socket_server.py # File-based IPC server
│ ├── request_handler.py # Request handler
│ └── renderdoc_facade.py # RenderDoc API wrapper
└── scripts/
└── install_extension.py # 拡張機能インストール
└── install_extension.py # Extension installer
```

## MCPツール

| ツール名 | 説明 |
|---------|------|
| `list_captures` | 指定ディレクトリ内の.rdcファイル一覧を取得 |
| `open_capture` | キャプチャファイルを開く(既存キャプチャは自動で閉じる) |
| `get_capture_status` | キャプチャ読込状態確認 |
| `get_draw_calls` | ドローコール一覧(階層構造、フィルタリング対応) |
| `get_frame_summary` | フレーム全体の統計情報(ドローコール数、マーカー一覧等) |
| `find_draws_by_shader` | シェーダー名でドローコールを逆引き検索 |
| `find_draws_by_texture` | テクスチャ名でドローコールを逆引き検索 |
| `find_draws_by_resource` | リソースIDでドローコールを逆引き検索 |
| `get_draw_call_details` | 特定ドローコールの詳細 |
| `get_action_timings` | アクションのGPU実行時間を取得 |
| `get_shader_info` | シェーダーソース/定数バッファ |
| `get_buffer_contents` | バッファデータ取得(オフセット/長さ指定可) |
| `get_texture_info` | テクスチャメタデータ |
| `get_texture_data` | テクスチャピクセルデータ取得(mip/slice/3Dスライス対応) |
| `get_pipeline_state` | パイプライン状態全体 |

### get_draw_calls フィルタリングオプション
## MCP Tools

| Tool Name | Description |
|-----------|-------------|
| `list_captures` | List .rdc files in specified directory |
| `open_capture` | Open capture file (closes existing capture automatically) |
| `get_capture_status` | Check capture load status |
| `get_draw_calls` | Get draw call list (hierarchical structure, filtering supported) |
| `get_frame_summary` | Get frame-wide statistics (draw call count, marker list, etc.) |
| `find_draws_by_shader` | Reverse search draw calls by shader name |
| `find_draws_by_texture` | Reverse search draw calls by texture name |
| `find_draws_by_resource` | Reverse search draw calls by resource ID |
| `get_draw_call_details` | Get specific draw call details |
| `get_action_timings` | Get GPU execution time for actions |
| `get_shader_info` | Get shader source/constant buffers |
| `get_buffer_contents` | Get buffer data (offset/length can be specified) |
| `get_texture_info` | Get texture metadata |
| `get_texture_data` | Get texture pixel data (mip/slice/3D slice supported) |
| `get_pipeline_state` | Get full pipeline state |

### get_draw_calls Filtering Options

```python
get_draw_calls(
include_children=True, # 子アクションを含める
marker_filter="Camera.Render", # このマーカー配下のみ取得
exclude_markers=["GUI.Repaint", "UIR.DrawChain"], # 除外するマーカー
event_id_min=7372, # event_id範囲の開始
event_id_max=7600, # event_id範囲の終了
only_actions=True, # マーカーを除外(ドローコールのみ)
flags_filter=["Drawcall", "Dispatch"], # 特定フラグのみ
include_children=True, # Include child actions
marker_filter="Camera.Render", # Only get actions under this marker
exclude_markers=["GUI.Repaint", "UIR.DrawChain"], # Exclude markers
event_id_min=7372, # event_id range start
event_id_max=7600, # event_id range end
only_actions=True, # Exclude markers (draw calls only)
flags_filter=["Drawcall", "Dispatch"], # Specific flags only
)
```

### キャプチャ管理ツール
### Capture Management Tools

```python
# ディレクトリ内のキャプチャファイルを列挙
# List capture files in directory
list_captures(directory="D:\\captures")
# → {"count": 3, "captures": [{"filename": "game.rdc", "path": "...", "size_bytes": 12345, "modified_time": "..."}, ...]}

# キャプチャファイルを開く(既存キャプチャは自動で閉じられる)
# Open capture file (existing capture is automatically closed)
open_capture(capture_path="D:\\captures\\game.rdc")
# → {"success": true, "filename": "game.rdc", "api": "D3D11"}
```

### 逆引き検索ツール
### Reverse Search Tools

```python
# シェーダー名で検索(部分一致)
# Search by shader name (partial match)
find_draws_by_shader(shader_name="Toon", stage="pixel")

# テクスチャ名で検索(部分一致)
# Search by texture name (partial match)
find_draws_by_texture(texture_name="CharacterSkin")

# リソースIDで検索(完全一致)
# Search by resource ID (exact match)
find_draws_by_resource(resource_id="ResourceId::12345")
```

### GPU タイミング取得
### GPU Timing Acquisition

```python
# 全アクションのタイミングを取得
# Get timing for all actions
get_action_timings()
# → {"available": true, "unit": "CounterUnit.Seconds", "timings": [...], "total_duration_ms": 12.5, "count": 150}

# 特定のイベントIDのみ取得
# Get timing for specific event IDs
get_action_timings(event_ids=[100, 200, 300])

# マーカーでフィルタリング
# Filter by marker
get_action_timings(marker_filter="Camera.Render", exclude_markers=["GUI.Repaint"])
```

**注意**: GPUタイミングカウンターはハードウェア/ドライバーによっては利用できない場合があります。
`available: false` が返された場合、そのキャプチャではタイミング情報を取得できません。
**Note**: GPU timing counters may not be available depending on hardware/driver.
If `available: false` is returned, timing information cannot be retrieved for that capture.

## 通信プロトコル
## Communication Protocol

ファイルベースIPC:
- IPCディレクトリ: `%TEMP%/renderdoc_mcp/`
- `request.json`: リクエスト(MCPサーバー → RenderDoc
- `response.json`: レスポンス(RenderDoc → MCPサーバー)
- `lock`: 書き込み中ロックファイル
- ポーリング間隔: 100ms(RenderDoc側)
File-based IPC:
- IPC directory: `%TEMP%/renderdoc_mcp/`
- `request.json`: Request (MCP Server → RenderDoc)
- `response.json`: Response (RenderDoc → MCP Server)
- `lock`: Lock file during write
- Polling interval: 100ms (RenderDoc side)

## 開発ノート
## Development Notes

- RenderDoc内蔵Pythonにはsocket/QtNetworkモジュールがないため、ファイルベースIPCを採用
- RenderDoc拡張機能はPython 3.6標準ライブラリのみ使用
- ReplayControllerへのアクセスは`BlockInvoke`経由で行う
- File-based IPC is used because RenderDoc's embedded Python doesn't have socket/QtNetwork modules
- RenderDoc extension uses only Python 3.6 standard library
- ReplayController is accessed via `BlockInvoke`

## 参考リンク
## References

- [FastMCP](https://github.com/jlowin/fastmcp)
- [RenderDoc Python API](https://renderdoc.org/docs/python_api/index.html)
Expand Down
160 changes: 160 additions & 0 deletions README.en.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# RenderDoc MCP Server

[日本語](README.md) | **[English]**

An MCP server that runs as a RenderDoc UI extension, enabling AI assistants to access RenderDoc capture data and assist with graphics debugging.

## Architecture

```
Claude/AI Client (stdio)
MCP Server Process (Python + FastMCP 2.0)
│ File-based IPC (%TEMP%/renderdoc_mcp/)
RenderDoc Process (Extension)
```

Communication is done via file-based IPC since RenderDoc's embedded Python doesn't have the socket module.

## Setup

### 1. Install RenderDoc Extension

```bash
python scripts/install_extension.py
```

The extension will be installed to `%APPDATA%\qrenderdoc\extensions\renderdoc_mcp_bridge`.

### 2. Enable Extension in RenderDoc

1. Launch RenderDoc
2. Tools > Manage Extensions
3. Enable "RenderDoc MCP Bridge"

### 3. Install MCP Server

```bash
uv tool install .
uv tool update-shell # Add to PATH
```

After restarting your shell, the `renderdoc-mcp` command will be available.

> **Note**: Use `--editable` flag for development to apply source code changes immediately.
> For stable installation, use `uv tool install .`.

### 4. Configure MCP Client

#### Claude Desktop

Add to `claude_desktop_config.json`:

```json
{
"mcpServers": {
"renderdoc": {
"command": "renderdoc-mcp"
}
}
}
```

#### Claude Code (Cursor)

Add to `.mcp.json`:

```json
{
"mcpServers": {
"renderdoc": {
"command": "renderdoc-mcp"
}
}
}
```

## Usage

1. Launch RenderDoc and open a capture file (.rdc)
2. Access RenderDoc data from MCP clients (Claude, etc.)

## MCP Tools

| Tool | Description |
|------|-------------|
| `get_capture_status` | Check capture load status |
| `get_draw_calls` | Get draw call list in hierarchical structure |
| `get_frame_summary` | Get frame statistics and top-level markers |
| `find_draws_by_shader` | Find draw calls using specific shader (partial match) |
| `find_draws_by_texture` | Find draw calls using specific texture (partial match) |
| `find_draws_by_resource` | Find draw calls using specific resource ID (exact match) |
| `get_draw_call_details` | Get detailed information about a specific draw call |
| `get_shader_info` | Get shader source code and constant buffer values |
| `get_buffer_contents` | Get buffer contents (Base64) |
| `get_texture_info` | Get texture metadata |
| `get_texture_data` | Get texture pixel data (Base64) |
| `get_pipeline_state` | Get pipeline state |
| `list_captures` | List all .rdc files in directory |
| `open_capture` | Open a capture file |

## Examples

### Get Draw Call List

```
get_draw_calls(include_children=true)
```

### Get Shader Information

```
get_shader_info(event_id=123, stage="pixel")
```

### Get Pipeline State

```
get_pipeline_state(event_id=123)
```

### Get Texture Data

```
# Get mip 0 of 2D texture
get_texture_data(resource_id="ResourceId::123")

# Get specific mip level
get_texture_data(resource_id="ResourceId::123", mip=2)

# Get specific cube map face (0=X+, 1=X-, 2=Y+, 3=Y-, 4=Z+, 5=Z-)
get_texture_data(resource_id="ResourceId::456", slice=3)

# Get specific depth slice of 3D texture
get_texture_data(resource_id="ResourceId::789", depth_slice=5)
```

### Get Partial Buffer Data

```
# Get entire buffer
get_buffer_contents(resource_id="ResourceId::123")

# Get 512 bytes from offset 256
get_buffer_contents(resource_id="ResourceId::123", offset=256, length=512)
```

## Requirements

- Python 3.10+
- [uv](https://docs.astral.sh/uv/)
- RenderDoc 1.20+

> **Note**: Tested only on Windows + DirectX 11.
> May work on Linux/macOS + Vulkan/OpenGL but untested.

## License

MIT
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# RenderDoc MCP Server

**[日本語]** | [English](README.en.md)

RenderDoc UI拡張機能として動作するMCPサーバー。AIアシスタントがRenderDocのキャプチャデータにアクセスし、グラフィックスデバッグを支援する。

## アーキテクチャ
Expand Down
Loading