MCP サーバー

August 8, 2026 · View on GitHub

D3D12LookDevPT には、実行中の renderer を VS Code、Codex、独自 JSON-RPC client などから参照・操作するための local MCP server が入っています。ImGui UI と同じ validation-oriented action layer を経由します。

English documentation: MCP Server

MCP 経由の操作例

下の screenshot は、MCP 対応 client から camera、quality、denoise の変更を指示したときの renderer 側を示します。D3D12LookDevPT はすべての mutation を検証済み action layer 経由で適用します。

MCP server を起動し recent local request を表示している D3D12LookDevPT

上の viewport は MCP server 起動中の renderer で、local JSON-RPC request の履歴を表示しています。Bearer token の領域は redacted 済みです。実 token は screenshot や project file に入れないでください。

client 側では先に validation を通し、mutation tool を適用し、その後 get_state で renderer state が同じ値になったことを確認します。現在の build では、tools/list または lookdevpt://actions/schema が返す live schema と、この文書の例を正として扱ってください。

利用条件とセキュリティ

  • Endpoint: http://127.0.0.1:<port>/mcp
  • Default port: 8777
  • Bind address: 127.0.0.1 のみ
  • Transport: Streamable HTTP JSON-RPC と subscription SSE over POST /mcp
  • 対応 protocol version: 2026-07-282025-11-252025-06-18
  • 認証: Authorization: Bearer <token> が必須
  • modern era(2026-07-28): request は stateless。initializeMCP-Session-Id は使用しない
  • legacy era(2025-11-252025-06-18): initializeMCP-Session-Id を作成。session は idle 30 分で失効
  • Server-Sent Events: POST subscriptions/listen の response で使用。GET /mcp は引き続き 405 Method Not Allowed
  • HTTP request body の上限: 16 MiB。Content-LengthTransfer-Encoding: chunked の両方に対応
  • 上限: 同時 connection 64、同時 subscription 16、legacy session 64

Bearer token と MCP 設定は以下に保存されます。

%APPDATA%\D3D12LookDevPT\settings.json

この file は user-local です。token を .lookdevpt.json、README、screenshot、issue comment、commit 済み VS Code 設定に入れないでください。

Origin header は absent、または parse 後の host が 127.0.0.1localhost[::1] の HTTP origin(valid な port は任意)だけ許可します。Origin: null、非 loopback の Host、その他の origin は 403 になります。

サーバーの起動

dockable な MCP Server panel から操作できます。

  • Start Server / Stop Server
  • Port
  • Request Timeout
  • Access Mode
  • Copy Token
  • Regenerate Token
  • pending approvals と recent request log

server は default disabled です。command line から明示的に起動することもできます。

.\Bin\x64\Debug\D3D12LookDevPT.exe --mcp-server --mcp-port 8777 --mcp-token <token> --mcp-access confirm_mutations

Access mode:

  • read_only: read tool は使えます。mutation tool は拒否されます。
  • confirm_mutations: mutation tool は ImGui の MCP Server panel で Approve されるまで待ちます。
  • allow_mutations: mutation tool を UI 承認なしで実行します。

mutation queue は main thread で処理され、同時に保持できる request は 16 件までです。HTTP server thread から D3D12 / ImGui state を直接触りません。

capture_viewport は read operation ですが、GPU readback を行うため renderer thread の queue を経由します。capture_debug_pack は一時的に debug view を変更し、その関連 temporal history を無効化するため mutation access が必要です(confirm_mutations では承認も必要)。restoreView の default は true です。

Snapshot の更新頻度と鮮度

MCP read は、HTTP thread から renderer / scene data を直接走査せず、mutex で保護した snapshot を使います。server 停止中は snapshot 生成処理も停止します。server 起動時に最初の snapshot を強制生成し、起動中は次の頻度で更新します。

  • state: 約 33 ms ごと(30 Hz)。
  • statsdiagnostics: 約 100 ms ごと(10 Hz)。
  • materialsprojectscene/summary、material variants、presets: scene / project / catalog revision が変わった場合のみ再生成。
  • debug-view、render-mode、action-schema resource: 固定 metadata から on demand で生成。

同じ publication point が subscriptions/listen の通知も駆動します。URI と snapshot revision 単位で coalesce するため、state は最大 30 Hz、stats / diagnostics は最大 10 Hz、revision resource は serialized content が変わった場合だけ、capture index / latest は capture 変更時だけ通知します。

mutation 直後の read は、通常 1 回分の refresh interval だけ renderer より遅れることがあります。値を検証する client は、renderer が frame を更新している状態で、その interval 後に get_state をもう一度読んでください。mutation、validation、capture は main-thread queue 上で直列化されますが、通常の snapshot read は renderer state の mutation を block しません。

VS Code 設定

VS Code の MCP server 設定は、workspace の .vscode/mcp.json または user profile の mcp.json に保存します。現在の VS Code MCP configuration reference では、HTTP server に typeurlheaders を使い、secret には optional の inputs を使えます。

.vscode/mcp.json の例:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "lookdevpt-token",
      "description": "D3D12LookDevPT MCP bearer token",
      "password": true
    }
  ],
  "servers": {
    "d3d12LookDevPT": {
      "type": "http",
      "url": "http://127.0.0.1:8777/mcp",
      "headers": {
        "Authorization": "Bearer ${input:lookdevpt-token}"
      }
    }
  }
}

編集後は VS Code の MCP: List Servers から server entry を start / restart してください。D3D12LookDevPT を rebuild して tool list が変わった場合は MCP: Reset Cached Tools を実行してください。

注意:

  • VS Code 側の server entry を start する前に、D3D12LookDevPT 本体と MCP server を起動しておきます。
  • ImGui で token を regenerate した場合は、VS Code 側の MCP server entry を restart し、新しい token を入力します。
  • protocol version と MCP routing header は VS Code に生成させます。mcp.jsonMCP-Protocol-Version を固定しないでください。
  • subscription stream は POST subscriptions/listen の response です。deprecated な unsolicited GET stream は実装していません。

LocalMCPChatClient 設定

LocalMCPChatClient から接続する場合は、config/LocalMCPChatClient.mcp.json を LocalMCPChatClient の「設定」→「MCP接続」→「JSONからインポート」で読み込めます。

  1. MCP Server panel の Copy Token で token を取得する。
  2. Windows の user 環境変数 D3D12LOOKDEVPT_MCP_TOKEN に token だけを設定する。
  3. 環境変数を反映するため LocalMCPChatClient を完全に終了して起動し直す。
  4. JSONをインポートし、「接続テスト」→「保存」→「接続」を実行する。

example 設定は Authorization: Bearer ${env:D3D12LOOKDEVPT_MCP_TOKEN} を LocalMCPChatClient の bearer-token 環境変数設定へ変換し、standalone GET を無効にします。token と MCP-Protocol-Version は Git 管理ファイルへ直接書かないでください。protocol version は MCP C# SDK 2.1.0 とこの server が 2026-07-28 を自動交渉します。

両リポジトリを同じ親 directory に clone している開発環境では、次の script が D3D12LookDevPT の test host を起動し、実際の LocalMCPChatClient client 実装で tools/listlookdevpt.get_state を検証します。

.\Scripts\TestLocalMcpChatClientIntegration.ps1

JSON-RPC の流れ

推奨経路は 2026-07-28 です。各 request の params._meta に protocol version と client capabilities を入れ、それと一致する MCP-Protocol-VersionMcp-Method header を送ります。tools/callresources/readprompts/get では一致する Mcp-Name も必要です。initialize と session header は使いません。

modern の successful result には resultType: "complete"_meta["io.modelcontextprotocol/serverInfo"] が入ります。server/discover は対応 version と tools / resources / prompts capability を返します。これらの modern 専用 field は legacy response には追加しません。

PowerShell で discover と read tool を呼ぶ例:

$endpoint = "http://127.0.0.1:8777/mcp"
$token = "<token>"
$baseHeaders = @{
  "Authorization" = "Bearer $token"
  "Accept" = "application/json, text/event-stream"
  "MCP-Protocol-Version" = "2026-07-28"
}

$meta = @{
  "io.modelcontextprotocol/protocolVersion" = "2026-07-28"
  "io.modelcontextprotocol/clientInfo" = @{ name = "manual-client"; version = "1.0" }
  "io.modelcontextprotocol/clientCapabilities" = @{}
}

$discoverHeaders = $baseHeaders.Clone()
$discoverHeaders["Mcp-Method"] = "server/discover"
$discoverBody = @{
  jsonrpc = "2.0"
  id = 1
  method = "server/discover"
  params = @{ _meta = $meta }
} | ConvertTo-Json -Depth 10 -Compress

Invoke-RestMethod -Uri $endpoint -Method Post -Headers $discoverHeaders -ContentType "application/json" -Body $discoverBody

$callHeaders = $baseHeaders.Clone()
$callHeaders["Mcp-Method"] = "tools/call"
$callHeaders["Mcp-Name"] = "lookdevpt.get_state"
$body = @{
  jsonrpc = "2.0"
  id = 2
  method = "tools/call"
  params = @{
    _meta = $meta
    name = "lookdevpt.get_state"
    arguments = @{}
  }
} | ConvertTo-Json -Depth 10 -Compress

Invoke-RestMethod -Uri $endpoint -Method Post -Headers $callHeaders -ContentType "application/json" -Body $body

HTTP field value として安全に表せない header value は MCP の =?base64?<payload>?= sentinel 形式を使います。server は JSON body と比較する前にこの形式を decode します。

legacy client は従来どおり initialize、返された MCP-Session-Id の保持、notifications/initialized、以後の call への session id 付与という順序を利用できます。DELETE /mcp は legacy session を終了し、modern の DELETE405 になります。

Resource subscription

server/discoverresources: { "subscribe": true, "listChanged": false } を公開します。subscriptions/listennotifications.resourceSubscriptions に必要な URI を指定してください。最初の SSE event は必ず notifications/subscriptions/acknowledged で、server が受理した URI だけを含みます。以後の更新は同じ subscription id を持つ notifications/resources/updated です。

response が開いたままになるため、次の PowerShell 例では curl.exe を使います。

$listenBody = @{
  jsonrpc = "2.0"
  id = 30
  method = "subscriptions/listen"
  params = @{
    _meta = $meta
    notifications = @{
      resourceSubscriptions = @("lookdevpt://state", "lookdevpt://diagnostics")
    }
  }
} | ConvertTo-Json -Depth 10 -Compress

curl.exe -N $endpoint `
  -H "Authorization: Bearer $token" `
  -H "Accept: application/json, text/event-stream" `
  -H "Content-Type: application/json" `
  -H "MCP-Protocol-Version: 2026-07-28" `
  -H "Mcp-Method: subscriptions/listen" `
  --data-binary $listenBody

server は 15 秒ごとに comment keepalive を送り、SSE event id は発行せず、Last-Event-ID を使用しません。client 切断時に subscription を破棄し、server の graceful shutdown 時は complete result を送ります。

Tools

Read tools:

  • lookdevpt.get_stats: adapter、DXR tier、resolution、集約 GPU timing、scene counts、history / resource-memory 状態、active secondary shading rate、denoiser state、MCP queue state を返します。
  • lookdevpt.get_state: scene / project path、quality / ray-budget 設定、camera、lighting、path tracing、ReSTIR / RTXDI 状態、denoise、frame-history revision、view state を返します。
  • lookdevpt.list_materials: material 名、使用数、編集可能な PBR factor、texture slot 状態を返します。
  • lookdevpt.list_debug_views: debug view の id、label、key を返します。
  • lookdevpt.list_render_modes: render mode の label と action value を返します。
  • lookdevpt.get_diagnostics: scene / project / capture / MCP diagnostics を返します。
  • lookdevpt.capture_viewport: 現在の final/debug viewport を PNG として取得し、inline image/pnglookdevpt://captures/latest.png を返します。

Validation / capture workflow tools:

  • lookdevpt.validate_action: { "method": "...", "params": { ... } } を受け取り、同じ action path を validateOnly=true で実行します。
  • lookdevpt.run_actions: 最大 16 個の action-layer call を 1 request で validation / apply します。validation 失敗時は一切 mutation しません。apply は指定順ですが、後段の runtime operation が失敗した場合の rollback transaction ではありません。
  • lookdevpt.capture_debug_pack: 最大 8 個の debug view を PNG capture し、それぞれの resource link を返します。capture 中に debug-view / history state を変更するため mutation として扱います。

Mutation tools:

  • lookdevpt.reset_accumulation
  • lookdevpt.reset_denoise_history
  • lookdevpt.reset_reservoirs
  • lookdevpt.reset_camera_view
  • lookdevpt.set_camera_speed
  • lookdevpt.fit_camera_to_scene
  • lookdevpt.set_display_resolution
  • lookdevpt.load_project
  • lookdevpt.save_project
  • lookdevpt.save_project_as
  • lookdevpt.set_scene
  • lookdevpt.set_camera
  • lookdevpt.set_material
  • lookdevpt.set_material_texture
  • lookdevpt.reset_material
  • lookdevpt.save_material_variant
  • lookdevpt.apply_material_variant
  • lookdevpt.delete_material_variant
  • lookdevpt.set_material_view
  • lookdevpt.set_color_management
  • lookdevpt.set_lighting
  • lookdevpt.set_path_tracing
  • lookdevpt.set_quality
  • lookdevpt.set_restir
  • lookdevpt.set_denoise
  • lookdevpt.set_view

tool result は主に structuredContent を使います。互換用に text summary も含めます。

Resources

  • lookdevpt://state: 現在の state JSON。
  • lookdevpt://stats: 現在の stats JSON。
  • lookdevpt://diagnostics: scene、project、capture、MCP diagnostics。
  • lookdevpt://materials: material list JSON。
  • lookdevpt://materials/{index}: 1 material の JSON object。
  • lookdevpt://materials/{index}/textures: 1 material の source/current/override texture slot。
  • lookdevpt://material-variants: 保存済み per-material variant snapshot。
  • lookdevpt://material-presets: built-in / user material preset。
  • lookdevpt://debug-views: debug view の id、label、key。
  • lookdevpt://render-modes: render mode と set_path_tracing.mode の value。
  • lookdevpt://project: 現在の project path と dirty flag。
  • lookdevpt://scene/summary: scene counts、bounds、lights、asset paths。
  • lookdevpt://actions/schema: action 名と JSON input schema。
  • lookdevpt://captures/index: memory 上の capture history。
  • lookdevpt://captures/latest.png: 最新の PNG capture。
  • lookdevpt://captures/{id}.png: capture_viewport または capture_debug_pack の PNG。

Resource templates:

  • lookdevpt://captures/{id}.png
  • lookdevpt://materials/{index}
  • lookdevpt://materials/{index}/textures

modern の discover / list / read result は cacheScope: "private"ttlMs hint を返します。catalog と immutable capture ID は 3,600,000 ms、state は 33 ms、stats / diagnostics は 100 ms、materials / project / scene / variants / presets は 1,000 ms、capture index / latest は 0 ms です。list は cursor を発行せず、client が cursor を送った場合は拒否します。

Prompts:

  • lookdevpt.inspect_scene: state / stats / materials / diagnostics を読み、scene を要約します。
  • lookdevpt.tune_denoise: validation を通して安定した denoise 設定を提案・適用します。
  • lookdevpt.setup_camera_shot: scene bounds と state を使って camera shot を作ります。
  • lookdevpt.capture_debug_review: debug pack を capture し、見える問題を要約します。

State、Stats、Benchmark metric

安定化 / 性能 pipeline に関連する主な get_state field は次のとおりです。

  • quality: 保存または request された qualityProfilerestirBackendsecondaryShadingRate、完全な rayBudgetfinalTaasharpenStrengthreferenceSpp の policy object。profile と availability に依存する実効結果は finalTaaActiverestir.effectivedenoise.activeBackend に分けて公開します。
  • finalTaaActive: 選択 profile と利用可能な pipeline の組み合わせで Final TAA が実際に動作しているか。
  • pathTracing.requestedSecondaryShadingRateactiveSecondaryRateautoSecondaryHalfActive: request した policy と現在の secondary rate。
  • restir.requestedBackendeffectivertxdiStatus: request した RTXDI path、build / runtime availability、DI / GI の active 状態、fallback reason。
  • frameState: frame / sample counter、change mask、有効 history-domain mask、camera-cut flag、独立した scene / geometry / material / light / HDRI / backend / profile revision。

主な get_stats group は次のとおりです。

  • gpuTiming: 最後に完了した aggregate pipeline、Path Trace、ReSTIR reuse、denoise、copy、UI timing、および validity / completion serial。
  • historyDomains: 有効 history mask と最後の change mask。
  • resourceMemory: frame / history の bytes / MiB、512 MiB budget、budget 判定、active allocation profile。
  • secondaryShading: requested / effective rate、active ratio、automatic half-rate state、追加 sample quota、bounce penalty、over / under-budget counter。
  • denoisermcp: effective backend / history 状態と server queue state。

より重い per-phase metric(ReSTIR candidate / temporal / spatial / shade / publish、denoise prepare / core / composite、Final TAA、quality counters、history publish、詳細 CPU stage、推定 ray budget、history / contribution diagnostics)は benchmark の CSV / JSON artifact に記録します。get_stats は意図的に低コストな aggregate snapshot のままです。performance benchmark では full-screen quality counter を無効化するため、それらが必要な場合は quality または combined run を使ってください。

resource read 例:

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "resources/read",
  "params": {
    "uri": "lookdevpt://actions/schema"
  }
}

よく使う操作

camera の取得:

{
  "jsonrpc": "2.0",
  "id": 10,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.get_state",
    "arguments": {}
  }
}

camera の設定:

{
  "jsonrpc": "2.0",
  "id": 11,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_camera",
    "arguments": {
      "position": [-14.7075, 7.99065, -11.7407],
      "yaw": 0.456,
      "pitch": -0.144733,
      "historyMode": "auto"
    }
  }
}

historyMode は、この camera mutation にだけ適用されます。

  • auto(default): 通常移動では history を再投影して維持し、大きな teleport / turn は camera cut と判定します。
  • preserve: automatic cut threshold を超えても再投影を強制します。変更前後の view が意図的に連続している場合だけ使ってください。
  • reset: 明示的な camera cut として扱い、新しい frame では temporal history を reject します。

Bistro の読み込み:

{
  "jsonrpc": "2.0",
  "id": 12,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_scene",
    "arguments": {
      "scenePath": "C:\\Projects\\D3D12LookDevPT\\Bistro_v5_2\\BistroExterior.fbx"
    }
  }
}

ReSTIR GI + DI に切り替え:

{
  "jsonrpc": "2.0",
  "id": 13,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_path_tracing",
    "arguments": {
      "mode": "restir_gi_di",
      "samplesPerFrame": 2,
      "maxBounces": 4,
      "radianceClamp": 8.0
    }
  }
}

interactive quality profile と automatic secondary shading budget の設定:

{
  "jsonrpc": "2.0",
  "id": 14,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_quality",
    "arguments": {
      "qualityProfile": "interactive_game",
      "restirBackend": "rtxdi",
      "secondaryShadingRate": "auto",
      "rayBudget": {
        "movingSpp": 1,
        "movingBounces": 2,
        "staticBaseSpp": 1,
        "staticMaxSpp": 2,
        "staticBounces": 4,
        "settleFrames": 8,
        "targetGpuMs": 14.5
      },
      "finalTaa": true,
      "sharpenStrength": 0.0,
      "referenceSpp": 4096
    }
  }
}

secondaryShadingRateautofulladaptive_half を受理します。auto は追加 sample quota、bounce depth の順に削減し、それでも budget 超過が続いた場合に secondary shading を half-rate にします。回復は一定期間 budget を下回った場合だけ行います。adaptive_half は Interactive の secondary path を half-rate に固定し、full は無効化します。Sharp Preview / Reference Still では常に full に解決されます。partial set_quality は未指定値を維持しますが、profile 変更時はその profile の renderer / denoiser default を適用し、対象 history を reset します。

interactive denoise preset の設定:

{
  "jsonrpc": "2.0",
  "id": 14,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_denoise",
    "arguments": {
      "preset": "interactive_stable",
      "temporalStability": true,
      "jitterMode": "stable32",
      "movingJitterScale": 0.25,
      "resetHistory": true
    }
  }
}

NRD REBLUR を選択する例。NRD SDKとD3D12 evaluation resourceが利用可能ならactive backendになり、利用できない場合だけinternal denoiserへ安全にfallbackします。実際の経路はlookdevpt.get_statedenoise.activeBackenddenoise.nrd.fallbackReasonを確認してください。setupはOptional NVIDIA NRD Backendを参照してください。

{
  "jsonrpc": "2.0",
  "id": 15,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_denoise",
    "arguments": {
      "backend": "nrd_reblur",
      "resetNrd": true
    }
  }
}

DLSS Ray Reconstruction を選択する例。未対応環境では selected backend は保持しつつ internal denoiser に fallback します。詳細理由は lookdevpt.get_statedenoise.dlss.fallbackReason を確認してください。setup は Optional DLSS Ray Reconstruction を参照してください。

{
  "jsonrpc": "2.0",
  "id": 16,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_denoise",
    "arguments": {
      "backend": "dlss_rr",
      "dlssMode": "quality",
      "resetDlss": true
    }
  }
}

material factor の設定:

{
  "jsonrpc": "2.0",
  "id": 17,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_material",
    "arguments": {
      "index": 0,
      "baseColor": [0.9, 0.76, 0.54, 1.0],
      "roughness": 0.42,
      "metallic": 0.0
    }
  }
}

material texture slot の override / clear:

{
  "jsonrpc": "2.0",
  "id": 16,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.set_material_texture",
    "arguments": {
      "index": 0,
      "slot": "baseColor",
      "path": "D:\\LookDevTextures\\paint_basecolor.png"
    }
  }
}

slot override を消す場合は "clear": true、import 元の texture に戻す場合は "resetToSource": true を使います。

material variant の保存と適用:

{
  "jsonrpc": "2.0",
  "id": 17,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.save_material_variant",
    "arguments": {
      "index": 0,
      "variant": "warm rough"
    }
  }
}
{
  "jsonrpc": "2.0",
  "id": 18,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.apply_material_variant",
    "arguments": {
      "index": 0,
      "variant": "warm rough"
    }
  }
}

material focus と final view transform の設定:

{
  "jsonrpc": "2.0",
  "id": 19,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.run_actions",
    "arguments": {
      "actions": [
        {
          "method": "set_material_view",
          "params": { "selectedMaterial": 0, "focusMode": "dim" }
        },
        {
          "method": "set_color_management",
          "params": { "toneMapper": "aces", "exposure": 0.0, "gamma": 2.2 }
        }
      ],
      "validateOnly": false,
      "stopOnError": true
    }
  }
}

viewport capture:

{
  "jsonrpc": "2.0",
  "id": 20,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.capture_viewport",
    "arguments": {}
  }
}

validation 付き batch 実行:

{
  "jsonrpc": "2.0",
  "id": 21,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.run_actions",
    "arguments": {
      "actions": [
        {
          "method": "set_path_tracing",
          "params": { "mode": "restir_gi_di", "samplesPerFrame": 2 }
        },
        {
          "method": "set_denoise",
          "params": { "preset": "interactive_stable", "resetHistory": true }
        }
      ],
      "validateOnly": false,
      "stopOnError": true
    }
  }
}

debug review pack の capture:

{
  "jsonrpc": "2.0",
  "id": 22,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.capture_debug_pack",
    "arguments": {
      "views": [
        "Final",
        "Base Color",
        "World Normal",
        "Roughness",
        "Metallic",
        "Direct Signal",
        "Indirect Signal",
        "History Confidence"
      ]
    }
  }
}

dialog なしで project 保存:

{
  "jsonrpc": "2.0",
  "id": 23,
  "method": "tools/call",
  "params": {
    "name": "lookdevpt.save_project_as",
    "arguments": {
      "path": "C:\\Projects\\D3D12LookDevPT\\projects\\bistro.lookdevpt.json"
    }
  }
}

Troubleshooting

  • 401 Unauthorized: token が一致していません。ImGui の MCP Server panel から token を copy し、client connection を再起動してください。
  • 403 Forbidden: client が許可されていない Origin header を送っています。
  • 400 / -32020: modern routing header が不足、malformed、または JSON body と一致していません。protocol / method / name header は MCP client に生成させてください。
  • 400 / -32022: 2026-07-282025-11-252025-06-18 のいずれかを使ってください。対応 version は error data にも入ります。
  • 400 MCP-Session-Id is required: legacy traffic だけに該当します。最初に initialize を呼び、返ってきた MCP-Session-Id を送ってください。
  • 404 Unknown MCP session: legacy session が削除された、idle 30 分で失効した、または app/server が再起動されています。再度 initialize してください。
  • GET405 Method Not Allowed: 想定通りです。modern subscription は POST subscriptions/listen の SSE response を使います。
  • modern DELETE405 Method Not Allowed: modern request は stateless なので想定通りです。DELETE は legacy session 終了専用です。
  • confirm_mutations で mutation request が止まる: timeout 前に ImGui の MCP Server panel で Approve / Reject してください。
  • MCP mutation queue is full: pending request が終わるのを待つか、pending mutation を approve/reject するか、server を再起動してください。
  • mutation 成功直後の state / stats read が古く見える: state は 33 ms、stats / diagnostics は 100 ms 待ってから再度 read してください。
  • capture_debug_packread_only で拒否される、または confirm_mutations で待つ: debug-view / history state を一時変更するため mutation access / approval が必要です。
  • lookdevpt://captures/latest.png が読めない: 先に lookdevpt.capture_viewport を 1 回呼んでください。

References