mcpField
W
wpf-visual-tree

wpf-visual-tree

ローカル
github.com/faze79開発ツール212 日前に更新

wpf-visual-tree について

wpf-visual-treeは、AIコーディングエージェントや開発者向けに、実行中のWPFアプリを調査・操作するMCPサーバー兼CLIです。実行時のインジェクションで実際のビジュアルツリー、バインディング、DataContextを読み取り、対象アプリの変更は不要です。

主な機能

  1. 01ビジュアルツリー、論理ツリー、プロパティの確認
  2. 02バインディング、DataContext、エラーの分析
  3. 03コントロール検索とプロパティ変更の監視
  4. 04スクリーンショット取得とツリーの出力
  5. 05クリック、入力、ドラッグ、タッチ操作

活用シーン

  1. 01無効なコントロールやバインディングエラーの診断
  2. 02実行中アプリのレイアウトとプロパティの確認
  3. 03フォーム入力やUIジェスチャーの自動化
  4. 04操作ワークフローの記録と再生

MCP 対応

実行中のWPFアプリを調査・操作する38個のMCPツールを提供します。単発CLIとしても動作し、別途提供されるC# Automation SDKからもテストプロジェクトで調査・入力エンジンを利用できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
nugetWpfVisualTreeMcp0.20.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

WpfVisualTreeMcp

Build Release .NET: 8, 9, 10 WPF on .NET Framework: 4.7.2, 4.8, 4.8.1 License: MIT MCP Compatible

AI エージェントが実行中の WPF アプリを確認し、デバッグし、操作できるようにします。 AI 向けの Snoop + Playwright を、Model Context Protocol 経由で提供します。ビジュアルツリー、バインディング、スクリーンショット、マウスのドラッグ、タッチジェスチャ、テキスト入力、キーボード操作に対応しています。ソースを変更せずに実行中のアプリを検査できます。タッチ操作はアプリケーションの入力サポートに依存します。

デモ:ネイティブ WPF のドラッグ&ドロップ、タッチジェスチャ、フォームの自動操作、バインディング診断

ドラッグ&ドロップ、キャンバスアイテムの移動、タップ、長押し、パン、ピンチズーム、回転を行い、続いてコントロールの照会、フォームへの入力、アイテムの選択、バインディングエラーの診断を行います。このジェスチャシーケンスでは、MCP 経由で実際の WPF 入力を記録し、AutomationId でコントロールを指定して、アプリケーションの応答を確認します。自動テストと同じ方法です。

アニメーションデモを直接見る。

v0.20.0 の新機能: x86 と x64 の両方で、.NET 9、.NET 10、および .NET Framework 4.8.1 上の WPF のサポートを検証しました。CI では、サポート対象の 6 つすべてのターゲットフレームワークで、自動インジェクションとセルフホストをテストします。さらに、.NET 8、9、10 のテストプロジェクトからインストール済みの C# SDK もテストします。.NET 8 がない場合でも、x86 インジェクションヘルパーは .NET 9 または 10 を使用できます。

WpfVisualTreeMcp.Automation C# SDK は、仮想化された DataGrid/TreeView を操作し、コントロールの表示を待機し、WPF ウィンドウを管理し、プロパティ変更をストリーミングします。38 個のツールを備えた MCP サーバーと CLI は、AutomationId による直接指定を含め、同じ検査および入力エンジンを共有します。

ワークフローの記録/再生/xUnit エクスポート、集約診断、全コンテンツのスクリーンショット、.NET Framework 4.7.2 のサポートは、引き続き v0.16.0 から利用できます。PR #22 で互換性対応とスクリーンショット機能に取り組んでくださった @miloszkukla に感謝します。

クイックスタート(60 秒)

  1. 最新リリースから WpfVisualTreeMcp-vX.Y.Z-win-x64.zip をダウンロードして展開します(.NET 8、9、または 10 Desktop Runtime が必要です)。
  2. MCP クライアントに登録します。Claude Code の場合は、.mcp.json に追加します。
    {
      "mcpServers": {
        "wpf-visual-tree": {
          "command": "C:/path/to/WpfVisualTreeMcp.Server.exe",
          "args": []
        }
      }
    }
    
  3. エージェントに次のように尋ねます。「実行中の WPF アプリを見て、保存ボタンが無効になっている理由を教えてください。」

ターミナルを使いたい場合は、同じ exe を完全な CLI として利用できます:WpfVisualTreeMcp.Server.exe help。 v0.14.0 以降は、wpfinspect update(または WpfVisualTreeMcp.Server.exe update)を実行すると、起動したインストールを更新できます。更新方法をご覧ください。 Codex をお使いですか?MCP 設定とスキルをまとめてインストールするには、プラグインのインストールに従ってください。

C# テスト SDK

WpfVisualTreeMcp.Automation は、検査および入力エンジンを C# オブジェクトとして公開し、プロセスへの直接アタッチと AutomationId ロケーターを提供します。このパッケージにはインジェクションペイロードが含まれており、MCP サーバーや CLI を起動せずに動作します。

コンポーネント対応フレームワーク
自動化対象の WPF アプリケーション.NET Framework 4.7.2、4.8、4.8.1;.NET 8、9、10
Automation NuGet を使用する C# プロジェクト.NET 8、9、10
アーキテクチャWindows x86 および x64;どちらも制御するには x64 のテストプロセスを使用してください

アプリケーションとテストプロジェクトでは、異なるフレームワークを使用できます。たとえば、.NET 10 のテストで .NET Framework 4.8.1 のアプリケーションを自動化できます。SDK の net8.0 ライブラリは .NET 9/10 のテストプロジェクトで動作しますが、.NET Framework のテストライブラリではありません。 互換性マトリックスは、実際のランタイムバージョンの確認を含め、リリース前にテストされます。Framework 4.x を対象とするビルドは、これらのランタイムがインプレースで更新されるため、インストール済みの 4.8.1 ランタイムで実行されます。

dotnet add package WpfVisualTreeMcp.Automation --version 0.20.0
using WpfVisualTreeMcp.Automation;

await using var app = await WpfApplication.AttachAsync(processId);
await app.ByAutomationId("LoadButton").ClickAsync();
await app.ByAutomationId("StatusTextBox").WaitForTextAsync(
    "loaded", timeout: TimeSpan.FromSeconds(30));
await app.ByAutomationId("Canvas").PanAsync(100, 0);
await app.ByAutomationId("Canvas").ZoomAsync(1.5);

テキスト待機ではプロパティ値を完全一致で比較します。not loaded は loaded と一致しません。タイムアウト時には、期待値と最後に確認された値を含む例外がスローされます。プロパティ述語、キャンセル、ドラッグ、タッチ、アサーション、検査、記録/再生も利用できます。アタッチされたセッションでは、破棄時にアプリは実行中のままになります。起動されたセッションでは、デフォルトでプロセスを所有し、クリーンアップします。

await app.ByAutomationId("Orders").AsDataGrid()
    .RowByKey("Id", "42").Cell("Quantity").SetTextAsync("7");
await app.ByAutomationId("Folders").AsTreeView().Node("Projects", "WPF").SelectAsync();
await app.ByAutomationId("Enabled").CheckAsync();
await using var changes = await app.ByAutomationId("StatusTextBox").ObservePropertyAsync("Text");

この SDK は、MCP ツール WpfVisualTreeMcp とは別のパッケージです。 インストール方法、API の例、要件を参照してください。

概要

WpfVisualTreeMcp は、AI コーディングエージェント(Codex、Claude Code、Cursor、GitHub Copilot)が実行中の WPF アプリケーションを検査し、操作できるようにする Model Context Protocol(MCP) サーバーです。AI アシスタントに、Snoop WPF や Visual Studio のライブビジュアルツリーなどのツールと同じ機能を与えるものと考えてください。

これが重要な理由

従来、WPF UI の問題をデバッグするには、専用ツールを使った手動の検査が必要でした。このプロジェクトは、WPF の検査機能を MCP 経由で公開してこの隔たりを埋め、AI エージェントが次のことを行えるようにします。

  • コードレビュー中にUI 構造を把握
  • バインディングエラーを自動的に診断
  • レイアウトの問題に対する修正を提案
  • UI のリファクタリングタスクを支援
  • ビジュアルツリーの階層をリアルタイムで分析

機能

主な検査機能
  • プロセスの検出 - 検査可能な、実行中のすべての WPF アプリケーションを一覧表示
  • ビジュアルツリーのナビゲーション - ビジュアルツリーの階層全体をたどる
  • 論理ツリーへのアクセス - 論理ツリー構造をたどる
  • プロパティの検査 - 任意の UI 要素のすべての依存関係プロパティを読み取る
バインディングとリソース
  • バインディング分析 - コンバーター、StringFormat、FallbackValue、MultiBinding のサポートを含むバインディングを検査
  • DataContext の検査 - DataContext の型、プロパティ、INPC の状態、継承チェーンを表示
  • バインディングエラーの検出 - バインディングエラーを自動的に捕捉し、分類して報告
  • リソースの列挙 - 任意のスコープのリソースディクショナリを表示
  • スタイルの検査 - 適用されたスタイルとテンプレートを表示
検索と監視
  • 要素の検索 - 型、名前、プロパティ値で要素を検索
  • 詳細検索 - AdornerLayer や Popup 要素を含むツリー全体を検索
  • プロパティの監視 - プロパティの変更をリアルタイムで監視
インタラクションとエクスポート
  • タッチジェスチャ (v0.13.0) - wpf_touch_gesture / CLI touch:ネイティブのタップ、長押し、スワイプ、ピンチ、回転に、1本または2本の指で対応します。インタラクティブなデモとWPF の互換性ガイダンスが含まれています。
  • マウスドラッグ - wpf_drag / CLI drag:ビジュアルツリー内の要素間、またはローカルな移動量を指定してドラッグできます。左/右/中央ボタン、ドラッグ時間、ローカルな開始点と終了点を設定できます。スライダーのつまみ、スプリッター、ドラッグ&ドロップに対応しています。パラメーターと使用例を参照してください。
  • スクリーンショットのキャプチャ - 現在のソースでは、ネイティブのホストコンテンツに対して auto キャプチャを使用し、選択されたモードを報告します。明示的なレンダリングでは、サポートされていないネイティブ領域は拒否されます。AI エージェントから見えるウィンドウ/要素のスクリーンショットをキャプチャできます。full_content=true / CLI --full-content を指定すると、仮想化されたリストを含むスクロール可能なコンテンツをキャプチャし、元のスクロール位置を復元します
  • 要素のハイライト - 実行中のアプリ内の要素を視覚的にハイライトします
  • コントロールのクリック (v0.4.0) - UI Automation(Invoke/Toggle/Select/ExpandCollapse)または OS の実際のマウスクリックで要素をクリックします
  • テキストの設定 (v0.5.0 で追加) - UI Automation の IValueProvider.SetValue を使用して TextBox/ComboBox/PasswordBox に入力します。TextBox.Text/PasswordBox.Password/反映された Text によるフォールバックにも対応します。または、physical=true を指定すると OS のキーボード入力で入力します(Unicode BMP 全文字に対応)
  • キーの送信 (v0.5.0 で追加) - OS のキーボード入力で、要素またはフォーカス中のウィンドウにキーボードショートカット(Ctrl+S、Alt+F4、F5、Enter、Ctrl+Shift+F、...)を送信します
  • レイアウト情報 - 詳細なレイアウトメトリクスを取得します
  • ツリーのエクスポート - ビジュアルツリーを XAML または JSON 形式でエクスポートします
  • 自動インジェクション - 実行中の WPF プロセスに Inspector をインジェクトします(ソースの変更は不要です)。v0.6.0 以降はマルチアーキテクチャに対応しており、同梱の WpfInjectorHelper.exe を使って、64 ビットサーバーから 32 ビットの WPF アプリにインジェクトできます
デュアルモード CLI (v0.4.0 で追加)

同じ WpfVisualTreeMcp.Server.exe は、MCP stdio サーバー(引数なし、デフォルト)またはワンショット CLI(認識されたサブコマンドを指定)として実行できます。MCP サーバーに接続されていない場合や、スクリプトの実行、パイプラインの手動検証に便利です。コマンドの一覧は WpfVisualTreeMcp.Server.exe help を実行して確認してください。標準出力には JSON が出力され、診断情報は標準エラー出力に出力されます。

比較

一般的なツールカテゴリーとの比較:

WpfVisualTreeMcpSnoopFlaUI / WinAppDriver汎用コンピューター操作(スクリーンショット+マウス)
利用者AI エージェント(MCP)+人間(CLI)人間(GUI)テストコード(C#)AI エージェント
ビジュアルツリー、依存関係プロパティ✅✅❌(UIA ビューのみ)❌
データバインディング、バインディングエラー、DataContext✅✅❌❌
表示テキスト/プロパティでコントロールを検索✅手動一部対応(UIA)ピクセルから推測
クリック/入力/選択/ショートカット✅❌✅✅(手探り)
UI の条件を待機(sleep ループなし)✅❌✅❌
要素のスクリーンショット+ポップアップを考慮した画面キャプチャ✅❌一部対応全画面のみ
対象アプリのソース変更なしで動作✅(自動インジェクション)✅✅✅

他の WPF MCP サーバーとの比較。 ほとんどの WPF MCP サーバーはUI Automation(FlaUI)を基盤としており、アクセシビリティツリーを読み取ります。また、WPF 内部のバインディング、DataContext、ViewModel の状態にアクセスするには、調査対象のアプリにインプロセスプローブをインストールする必要があります。このサーバーは代わりに Snoop と同じ方式を採用し、実行時にインジェクションすることで、実際のビジュアルツリーを読み取り、対象アプリに一切変更を加えずにバインディングエラーと DataContext を診断します。ビルドに追加するものも、本番環境に含めるものもありません。

WpfVisualTreeMcpUIA ベースのサーバー(FlaUI)その他のインジェクションベースのサーバー
実際のビジュアルツリーを表示(UIA ビューだけではない)✅ インジェクション❌ アクセシビリティツリー✅
対象アプリにプローブがなくてもバインディングエラーと DataContext を確認✅❌(インプロセスプローブが必要)一部対応
操作機能クリック(UIA+物理操作、ダブルクリック/右クリック)、ドラッグ、タッチジェスチャー、読み戻し付きテキスト設定、キー送信、項目選択(仮想化対応)クリック/入力/選択通常は呼び出しのみ
要素の条件を待機✅ wpf_wait_for✅❌
ポップアップ/ドロップダウン/コンテキストメニューのスクリーンショット✅ 画面モード一部対応スクリーンショットのみ
アーキテクチャをまたいだインジェクション(x64 ⇄ x86)✅該当なし❌
MCP サーバーと単発 CLI のデュアルモード✅❌❌
配布方法NuGet(dnx/tool)、公式 MCP レジストリ、Codex プラグイン+スキルさまざまさまざま

要するに、UIA ベースのツールはアクセシビリティから公開される情報を確認し、コンピューター操作エージェントはピクセルを見ます。このプロジェクトは、対象アプリにプローブをインストールせずに、エージェントに WPF 開発者が Snoop で見るのと同じ内部情報を提供し、さらに、あらゆる AI コーディングツールが話すプロトコルを通じて、幅広い操作を可能にします。

インストール

前提条件
  • Windows 10/11
  • .NET 8.0 SDK 以降
  • 調査対象の WPF アプリケーション

完全な互換性スイートをビルドして実行するには、.NET 10 SDK、x64 および x86 用の .NET 8/9/10 Desktop ランタイム、ならびに .NET Framework 4.8.1 が必要です。

インストール
オプション 1:.NET ツール/NuGet(推奨)
dotnet tool install -g WpfVisualTreeMcp     # installs the `wpfinspect` command

このパッケージはMCP サーバーパッケージ(PackageType: McpServer)としても公開されているため、NuGet ホスト型サーバーに対応した MCP クライアントから直接起動できます。

dnx WpfVisualTreeMcp                        # runs the MCP stdio server
オプション 2:リリースをダウンロード

GitHub Releases から最新リリースをダウンロードします。

  1. WpfVisualTreeMcp-vX.X.X-win-x64.zip をダウンロードします
  2. フォルダーに展開します(例:C:\Tools\WpfVisualTreeMcp)
  3. MCP サーバーの実行ファイルは server/WpfVisualTreeMcp.Server.exe です
デスクトップ拡張機能(MCPB)

MCP バンドルに対応したクライアントでは、 WpfVisualTreeMcp-v0.20.0-win-x64.mcpb をインポートできます。この Windows x64 バンドルには、サーバーのランタイムと自己完結型の x86 インジェクションヘルパーが含まれています。より小さい compact バンドル では、アップロード容量に制限のあるカタログ向けに、ランタイムを縮小しながら同じツールを提供します。どちらのバンドルも、クライアントの拡張機能 UI から更新できます。要件、パッケージ化、検証については、 MCPB ガイドを参照してください。

オプション 3:ソースからビルド
git clone https://github.com/faze79/WpfVisualTreeMcp.git
cd WpfVisualTreeMcp
# Visual Studio Developer PowerShell (C++ v143 toolset + Windows SDK)
./scripts/Build-NativeBootstrapper.ps1
dotnet build -c Release

インジェクションのビルド要件、パッケージのレイアウト、トラブルシューティングについては、 Injector READMEを参照してください。x86 アプリにインジェクションするには、ヘルパー用の x86 .NET 8 ランタイムが必要です。

更新
wpfinspect update --check   # current/latest stable version; no installation changes
wpfinspect update           # download and schedule installation automatically
wpfinspect update --status  # confirm completion or inspect a failure

# For an extracted release or a published folder, invoke that exact executable:
C:\Tools\WpfVisualTreeMcp\server\WpfVisualTreeMcp.Server.exe update

update は v0.14.0 以降で利用できます。古いグローバルツールの場合は、最初に一度ブートストラップしてください。

dotnet tool update -g WpfVisualTreeMcp

古いポータブル版の場合は、最新リリースを展開し、その server フォルダーを使用してください。

このコマンドは、起動元のインストールのみを更新します。グローバルツールとカスタムの --tool-path ツールは、正確な公式 NuGet パッケージをダウンロードし、そのステージング済みパッケージから dotnet tool update を実行します(.NET SDK が必要です)。一時的な NuGet のダウンロード失敗や公開の遅延が発生した場合は、10 秒、20 秒、30 秒の間隔を空けて、最大 4 回まで再試行します。準備に失敗した場合、インストール済みのファイルは変更されません。後でもう一度お試しください。ポータブルフォルダーには、最新の安定版 GitHub リリースのサーバーペイロード全体が配置され、SHA-256 ダイジェストで検証されます。bin 内のソースビルドはソース/ビルドのワークフローに委ねられ、ローカルマニフェストツールと dnx キャッシュはパッケージマネージャーに委ねられます。--check は、検出されたインストールの種類を説明します。

Windows では、実行可能ファイルのロックを解除するため、CLI の終了後に非表示のワーカーでインストールが開始されます。scheduled という結果は、ワーカーが起動したことを示すものであり、インストールが完了したことを示すものではありません。updated または failed が報告されるまで update --status を実行してください。失敗ステータスの場合、終了コード 1 が返されます。JSON 出力にはログパスが含まれます。ステータス、ログ、ポータブル版のバックアップは、インストールごとに分けて %LOCALAPPDATA%\WpfVisualTreeMcp\updates の下に保存されます。

更新する前に、同じファイルを使用している他の MCP インスタンスを終了してください。アップデーターはアプリケーションを停止しません。ファイルが使用中の場合はエラーになり、ポータブル版の置き換えに失敗した場合はバックアップから復元されます。無関係なファイルと MCP の設定は保持されます。更新が成功したら、MCP クライアントと、以前に検査した WPF アプリを再起動して、サーバーとインジェクションされた Inspector の両方で新しいバージョンを使用してください。他にインストールされているコピーや、別途コピーしたセルフホスト可能な Inspector は、それぞれ個別に更新する必要があります。

設定

サーバーは Microsoft/Anthropic の公式 MCP SDK for .NET を使用しており、Claude Code やその他の MCP クライアントとの互換性が保証されています。

Claude Code

オプション 1:コマンドライン(推奨)

claude mcp add コマンドを使用して、サーバーを直接追加します。

# Add to current project only
claude mcp add wpf-visual-tree -- C:/path/to/WpfVisualTreeMcp/publish/WpfVisualTreeMcp.Server.exe

# Add globally (available in all projects)
claude mcp add --scope user wpf-visual-tree -- C:/path/to/WpfVisualTreeMcp/publish/WpfVisualTreeMcp.Server.exe

サーバーが追加されたことを確認できます。

claude mcp list

オプション 2:プロジェクトレベルの JSON 設定

プロジェクトのルートに .mcp.json を作成するか、編集します。

{
  "mcpServers": {
    "wpf-visual-tree": {
      "command": "C:/path/to/WpfVisualTreeMcp/publish/WpfVisualTreeMcp.Server.exe",
      "args": []
    }
  }
}

オプション 3:グローバル JSON 設定

~/.claude/settings.json に追加します。

{
  "mcpServers": {
    "wpf-visual-tree": {
      "command": "C:/path/to/WpfVisualTreeMcp/publish/WpfVisualTreeMcp.Server.exe",
      "args": []
    }
  }
}

重要な注意事項:

  • ビルドした .exe ファイルには絶対パスを使用してください
  • Windows のパスにはスラッシュ(/)を使用してください
  • 本番環境向けには Release モードでビルドしてください:dotnet build -c Release
  • 設定を変更した後は Claude Code を再起動してください
Cursor

Cursor の設定(.cursor/mcp.json)に追加します。

{
  "mcpServers": {
    "wpf-visual-tree": {
      "command": "C:/path/to/WpfVisualTreeMcp/publish/WpfVisualTreeMcp.Server.exe",
      "args": []
    }
  }
}
Codex プラグイン

このリポジトリには、MCP 設定と wpfvisualtreemcp スキルをまとめてインストールする WPFVisualTreeMcp Codex プラグインが含まれています。このプラグインはチェックアウトしたソースのビルドではなく、最新の安定版 NuGet パッケージを実行します。マシン固有の実行可能ファイルのパスは必要ありません。

このインストール方法の前提条件:

  • Windows 10/11 と、プラグインをサポートするローカルの Codex クライアント。
  • dotnet dnx 用の .NET 10 SDK、.NET 10 内のバージョン 10.0.300 以降と、.NET 8 ランタイム。
  • 最新の安定版を解決するため、MCP の起動ごとに nuget.org へのインターネットアクセスが必要です。ダウンロードしたパッケージは .NET によってキャッシュされます。x86 インジェクションを使用する場合は、x86 .NET 8 ランタイムもインストールしてください。

リポジトリのルートから、ローカルマーケットプレイスを登録してプラグインをインストールします。 または、GitHub Releases から WpfVisualTreeMcp-v0.20.0-codex-plugin.zip をダウンロードして展開し、展開先のルートから次のコマンドを実行することもできます。

codex plugin marketplace add .
codex plugin add wpfvisualtreemcp@WPFVisualTreeMcp

Codex を再起動するか、新しいセッションを開いて、実行中の WPF アプリを調査するよう依頼してください。 $wpfvisualtreemcp としてスキルを明示的に呼び出すこともできます。

手動でクローンせずに、上流の Git リポジトリから直接インストールすることもできます。

codex plugin marketplace add https://github.com/faze79/WPFVisualTreeMcp.git
codex plugin add wpfvisualtreemcp@WPFVisualTreeMcp

codex plugin list --marketplace WPFVisualTreeMcp を使ってインストールを確認してください。これはリポジトリのマーケットプレイスであり、OpenAI の公開プラグインディレクトリへの掲載を意味するものではありません。クライアントに codex plugin add がない場合は、プラグイン対応クライアントを使用するか、以下の直接 MCP 設定を使用してください。

独自のビルドを使用する場合、または .NET 10 SDK の要件を避ける場合は、プラグインをインストールする代わりに、公開済みの実行可能ファイルを直接登録してください。

codex mcp add wpf-visual-tree -- "C:/Tools/WpfVisualTreeMcp/server/WpfVisualTreeMcp.Server.exe"

例を実際の実行可能ファイルのパスに置き換えてください。この手動エントリとプラグインの両方を同時に有効にすると、サーバーが 2 つ起動するため避けてください。

プラグインのファイルは plugins/wpfvisualtreemcp/ にあり、マーケットプレイスのエントリは .agents/plugins/marketplace.json です。このプラグインは、Codex がサポートする .codex-plugin/plugin.json 互換形式を使用します。マニフェストのバージョンはプラグイン設定とスキルを識別するもので、NuGet サーバーのバージョンとは独立しています。MCP の起動時にはパッケージのバージョンを指定せず、--no-http-cache を使用して起動のたびに nuget.org から最新の安定版を解決します。プレリリース版は除外されます。新しいサーバーリリースを適用するには、MCP サーバーまたは Codex を再起動してください。実行中のサーバーはその場で更新されません。MCP の起動引数に list などの CLI サブコマンドを追加しないでください。サブコマンドを指定しないと stdio モードが選択されます。

プラグインは独自のディレクトリから起動し、SDK 10.0.300 以降の安定版 .NET 10 SDK を選択する global.json を含みます。これにより、対象プロジェクトで古い SDK が固定されていても、dotnet dnx が無効になりません。非対話型の起動と x64/x86 Inspector インジェクションは、SDK 10.0.402 と Codex CLI 0.162.1 で検証済みです。この SDK 固定により、起動時にテスト済みの .NET 10 コマンドライン動作が維持されます。

互換性のある MCP 設定では "cwd": "." を使用しており、Codex はこれをインストール済みプラグインのルートからの相対パスとして解決します。この解決方法は、隔離されたプロファイルにインストールした後、codex mcp list --json で検証済みです。 ローカルのプラグインファイルを編集した後は、codex plugin add wpfvisualtreemcp@WPFVisualTreeMcp を再実行してインストール済みのコピーを更新し、新しい Codex セッションを開いてください。

Git ベースのマーケットプレイスの場合は、次のコマンドでプラグイン設定と付属のスキルを更新します。

codex plugin marketplace upgrade WPFVisualTreeMcp
codex plugin add wpfvisualtreemcp@WPFVisualTreeMcp

ローカルマーケットプレイスの場合は、プラグインを再インストールする前に、そのソースのチェックアウトを更新してください。 付属のスキルでは、マウスでのドラッグ、タッチジェスチャー、更新動作を説明しています。 wpfinspect update は別途インストールした CLI またはポータブルコピーを更新します。プラグインやそのスキルは更新せず、プラグインが共有する dnx パッケージキャッシュの変更にも使用しないでください。単独インストールについては、更新を参照してください。

セルフホストモード(推奨)

WPF アプリケーションを検査可能にするには、Inspector DLL への参照を追加し、起動時に初期化します。

  1. WpfVisualTreeMcp.Inspector へのプロジェクト参照を追加します。

  2. App.xaml.cs で次のようにします。

using System.Diagnostics;
using System.Windows;
using WpfVisualTreeMcp.Inspector;

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        // Initialize the WPF Visual Tree Inspector
        InspectorService.Initialize(Process.GetCurrentProcess().Id);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        InspectorService.Instance?.Dispose();
        base.OnExit(e);
    }
}

これにより、MCP サーバーが名前付きパイプ経由でアプリケーションに接続し、リアルタイムで検査できるようになります。

使用例

実行中の WPF アプリケーションを一覧表示する
Use the wpf_list_processes tool to show all running WPF applications.
接続してビジュアルツリーを検査する
Attach to the MyApp.exe WPF application and show me the visual tree of the main window.
バインディングエラーを検出する
Check the attached WPF application for any binding errors and explain what's causing them.
要素を検索する
Find all Button elements in the visual tree that have IsEnabled set to false.
ビジュアルツリーをエクスポートする
Export the visual tree of the current window to JSON format so I can analyze the structure.

アーキテクチャ

┌─────────────────────────────────────────────────────────────┐
│                    AI Agent (Claude Code)                    │
└─────────────────────────┬───────────────────────────────────┘
                          │ MCP Protocol (stdio)
                          ▼
┌─────────────────────────────────────────────────────────────┐
│                 WpfVisualTreeMcp Server                      │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────┐  │
│  │   MCP Handler   │  │  Tree Navigator │  │   Injector  │  │
│  │  (Tools/Res.)   │  │   & Inspector   │  │   Manager   │  │
│  └────────┬────────┘  └────────┬────────┘  └──────┬──────┘  │
└───────────┼────────────────────┼───────────────────┼────────┘
            │                    │                   │
            └────────────────────┼───────────────────┘
                                 │ Named Pipes / IPC
                                 ▼
┌─────────────────────────────────────────────────────────────┐
│                   Target WPF Application                     │
│  ┌─────────────────────────────────────────────────────────┐│
│  │              Injected Inspector DLL                      ││
│  │  • VisualTreeHelper access                              ││
│  │  • LogicalTreeHelper access                             ││
│  │  • Property/Binding inspection                          ││
│  │  • Resource dictionary enumeration                      ││
│  └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

アーキテクチャの詳細については、docs/ARCHITECTURE.md を参照してください。

利用可能なツール

ツール説明
wpf_list_processes実行中のすべての WPF アプリケーションを一覧表示します
wpf_attachWPF アプリケーションにアタッチします(DLL インジェクション用の auto_inject をサポート)
wpf_get_visual_treeビジュアルツリーの階層を取得します(デフォルトの深さ:25、最大:100)
wpf_get_element_properties要素のすべての依存関係プロパティを取得します
wpf_find_elements完全一致する AutomationId、型、x:Name、表示テキスト、プロパティ値、表示状態で要素を検索します。結果にはテキスト、オートメーション ID、有効/表示状態、画面上の境界が含まれます
wpf_find_elements_deep結果数の上限なしで、アドーナーやポップアップを含むすべてのウィンドウを対象に、同じ検索フィルターで検索します
wpf_capture_screenshotウィンドウまたは要素のスクリーンショットを撮影します(画像を返します)。mode='screen' はポップアップとメニューを含みます。レンダーモードで full_content=true を指定すると、スクロール可能なコンテンツをキャプチャします
wpf_reportバインディング/検証エラー、UI 状態の件数、最近のバインディングトレースを、明示的なスキャン上限とカバレッジとともに集約します
wpf_record / wpf_get_recording安定したセレクターを使用して、ワークフローの記録を開始、停止、確認、または消去します
wpf_assert依存関係プロパティの値を検証します。成功した検証は、アクティブな記録に含まれます
wpf_replay新しいアプリに対してワークフローを再生し、最初に失敗したステップで停止します
wpf_export_test停止した記録を、実行可能な xUnit プロジェクトまたはワークフロー JSON としてエクスポートします
wpf_get_bindings要素のデータバインディングを取得します(MultiBinding、コンバーター、StringFormat を含みます)
wpf_get_binding_errorsキャプチャしたすべてのバインディングエラーを一覧表示します
wpf_clear_binding_errorsキャプチャしたバインディングエラーの一覧を消去します
wpf_get_data_contextDataContext の型、プロパティ、INPC の状態、継承チェーンを取得します
wpf_get_resourcesリソースディクショナリを列挙します
wpf_get_styles適用されたスタイルとテンプレートを取得します
wpf_watch_propertyプロパティの変更を監視します
wpf_evaluate_bindingプロパティがその値になっている理由を説明します。値のソースと、バインディングの場合は、壊れたバインディングが失敗する箇所を特定する、ホップごとのパス解決を示します
wpf_explain_triggers現在の状態に対して Style と ControlTemplate のトリガーを評価します(条件、現在値、アクティブ状態、セッター)。「このトリガーが発火しないのはなぜか?」を確認できます。また、プロパティの値を設定したスタイルセッター/アクティブなトリガーを特定します
wpf_snapshot要素サブツリーの状態(レイアウト、表示状態、ブラシ、テキスト)をラベル付きでキャプチャします
wpf_diff2 つのスナップショットを比較し、変更によって何が移動したかを正確に測定します(プロパティの変更前→変更後、追加/削除)
wpf_set_property実行時に依存関係プロパティをライブ編集し(型変換あり)、再ビルドせずに変更をテストします。状態を変更しますが、元に戻せます。
wpf_revert_propertywpf_set_property による編集を元に戻します(1 つ、フィルター指定、またはすべて)。以前のバインディング/値/デフォルト値を復元します
wpf_highlight_element要素を視覚的に強調表示します
wpf_click_elementハンドルまたは AutomationId でコントロールをクリックします。automation_id="form.clear" を直接渡せます。オプションの root_handle で検索範囲を限定でき、重複 ID がある場合は失敗します。デフォルトでは UI Automation の invoke を使用し、実際の OS マウスクリックには physical=true、ダブルクリック/右クリックには click_type='double'/'right' を指定します。状態を変更します。
wpf_move_mouseクリックせずに、ローカル座標上の位置へマウスを移動/ホバーします。v0.17.0 から利用できます
wpf_scrollホイール入力を垂直または水平方向に送ります。スクロールするかズームするかはアプリが判断します。v0.17.0 から利用できます
wpf_dragマウスでドラッグします。ソース要素とターゲット要素、または相対移動量、ローカル座標、左/右/中ボタン、段階的な移動、ボタン解放時のクリーンアップに対応しています。状態を変更します。
wpf_touch_gestureネイティブのタッチ操作を実行します。表示されている要素内で、タップ、長押し、スワイプ、2 本指でのピンチと回転を行います。アプリケーションのタッチ対応が必要です。状態を変更します。
wpf_select_itemComboBox/ListBox/ListView/TabControl 内の項目を、表示テキストまたはインデックスで選択します。仮想化された項目にも対応します。状態を変更します。
wpf_wait_for対象アプリ内をポーリングして、要素が表示/存在/有効になるか、非表示になるまで待機します。スリープと再試行のループは不要です
wpf_set_textTextBox/ComboBox/PasswordBox のテキスト/値を設定します。デフォルトでは UI Automation の IValueProvider.SetValue を使用し、OS キーボード入力で入力するには physical=true を指定します。状態を変更します。
wpf_send_keys要素またはフォーカス中のウィンドウにキーボードショートカット(Ctrl+S、Alt+F4、F5、Enter など)を送信します。状態を変更します。
wpf_get_layout_infoレイアウト情報を取得します
wpf_export_treeビジュアルツリーを XAML または JSON としてエクスポートします
完全なツールのドキュメントについては、docs/TOOLS_REFERENCE.mdを参照してください。

すべての入力アクションでは、element_handleの代わりにautomation_idを使用できます。クリック、マウス移動、スクロール、ドラッグ、すべてのタッチジェスチャー、選択、テキスト入力、キーボード入力が対象です。アサーションとプロパティ編集でも使用できます。IDは大文字と小文字を区別し、AutomationProperties.AutomationIdと完全に一致する必要があります。重複がある場合は失敗します。検索範囲を限定するにはroot_handleを使用してください。ドラッグ先にはtarget_automation_idと、それとは独立したtarget_root_handleを指定できます。同じセレクターは記録とエクスポートされたテストでも使用できます。

wpf_touch_gesture(automation_id="Canvas", gesture="tap")
wpf_touch_gesture(automation_id="Canvas", gesture="swipe", delta_x=80)
wpf_touch_gesture(automation_id="Canvas", gesture="pinch", scale=1.5)
wpf_drag(automation_id="Source", target_automation_id="Destination")
wpf_set_text(automation_id="UserName", text="test")
wpf_assert(automation_id="UserName", property_name="Text", expected_value="test")

CLIの同等オプションには--automation-id、--root、--target-automation-id、--target-rootを使用します。タッチによるパンにはswipe、ズームにはpinchを使用します。これらのジェスチャーに反応するには、アプリがタッチ操作/マニピュレーションをサポートしている必要があります。

ロードマップ

フェーズ 1:コアのインスペクション ✅
  • プロジェクト構造とアーキテクチャ
  • プロセスの検出と列挙
  • 基本的なプロセスへのアタッチ
  • ビジュアルツリーのナビゲーション
  • プロパティのインスペクション
  • 要素の検索
フェーズ 2:高度な機能 ✅
  • 名前付きパイプを介したIPC通信
  • バインディングの分析とエラー検出
  • リソースディクショナリの列挙
  • スタイルとテンプレートのインスペクション
  • プロパティ変更の監視(通知機能付き)
フェーズ 3:操作と診断 ✅
  • 要素ハイライトのオーバーレイ
  • XAML/JSONへのエクスポート
  • スクリーンショットのキャプチャ(MCP ImageContentBlockを返します)
  • 実行中のWPFプロセスへのDLL自動インジェクション(x64/x86)
  • AdornerLayerとPopupのビジュアルツリー走査
フェーズ 4:CLI+アプリの操作 ✅ (v0.4.0 / v0.5.0)
  • デュアルモード実行ファイル(MCP stdio+単発CLI)(v0.4.0)
  • UI Automationパターンによるコントロールのクリック (v0.4.0)
  • オプトインのフォールバックとしての物理OSマウスクリック (v0.4.0)
  • CLIを同梱したユーザーレベルのClaude Codeスキル (v0.4.0)
  • UI AutomationのIValueProviderとフォールバックによるテキスト/値の設定 (v0.5.0)
  • Unicode BMPに対応した物理キーボード入力 (v0.5.0)
  • OS入力によるキーボードショートカット(Ctrl+S、Alt+F4、F5など)(v0.5.0)
フェーズ 5:マルチアーキテクチャ ✅ (v0.6.0)
  • ビット数をまたぐ自動インジェクション(64ビットサーバー → 32ビットターゲット)
  • アーキテクチャに合わせたWpfInjectorHelper.exe(32ビット.NET 8)
  • v0.5.0の既知の制限を解消。x86とx64の両方のWPFアプリを操作可能
フェーズ 6:クエリエンジンと完全な操作 ✅ (v0.7.0)
  • 表示テキスト、プロパティ値、可視性による要素のクエリ
  • 結果の拡充:テキスト、オートメーションID、有効/可視状態、画面上の境界
  • wpf_select_item — テキストまたはインデックスでComboBox/ListBox/TabControlの項目を選択
  • ダブルクリック/右クリック。物理入力の前に画面内へスクロール
  • 画面モードのスクリーンショット(ポップアップ、ドロップダウン、コンテキストメニューを表示)
  • テキスト設定後の読み戻し検証。弱参照による要素ハンドルのキャッシュ
  • 重大なIPCシリアル化の修正(リクエストパラメーターが通知されずに破棄されていました)
フェーズ 7:配布とエージェントの使いやすさ ✅ (v0.7.1 / v0.8.0)
  • dnx/dotnet tool installでインストール可能なNuGetパッケージ(MCPサーバーパッケージの種類)
  • nuget.org(信頼された公開/OIDC)と公式MCPレジストリに公開
  • バインディングエラーのキャプチャを修正(未接続のままでした)。IPCパラメーター破棄の問題も修正
  • wpf_wait_for — 要素/条件を待機。スリープと再試行のループは不要
  • IPC接続の同時処理(長時間の待機で他のコマンドがブロックされなくなりました)
次の予定

v0.13.0 でリリース済み:マウスによるドラッグとネイティブなタッチジェスチャー、MCP/CLI の機能 parity、サンプルデモ、入力のクリーンアップに加え、net48 x86/x64 および net8 x64 で実際のデスクトップ環境での検証を実施しました。 v0.14.0 でリリース済み:バージョン確認とインストール状況の表示に対応した CLI のセルフアップデート。 v0.15.0 でリリース済み:Codex プラグインマーケットプレイス、連携スキル、プラグイン ZIP。 v0.16.0 でリリース済み:ワークフローの記録/再生/xUnit エクスポート、集約診断、全コンテンツのスクリーンショット、.NET Framework 4.7.2 互換性。

「変更 → 測定 → 効果があったか?」のループが完了しました。プロパティをライブ編集し、変更前後のスナップショットを比較して、何がどう変わったかを正確に確認できます。

  • wpf_set_property / wpf_revert_property — 依存関係プロパティをライブ編集し、その後元に戻します (v0.9.0)
  • wpf_snapshot / wpf_diff — 変更の効果を確認するため、変更前後のスナップショットを比較します (v0.10.0)
  • wpf_evaluate_binding — プロパティがその値になっている理由を説明し、バインディングパスを段階ごとに解決します (v0.11.0)
  • wpf_record → wpf_export_test — ドラッグ/タッチを含む、安定したセレクターによる再生と、新しいプロセスでの xUnit テスト (v0.16.0)
  • wpf_report — 対象範囲を明示した、制限付きの集約診断 (v0.16.0)
  • .NET Framework 4.7.2 および全コンテンツのスクロールスクリーンショット (v0.16.0)
  • セルフホストモード用の Inspector 専用 NuGet パッケージ(インジェクションの代わりに参照)
  • バインディングエラー/プロパティ変更の通知を MCP クライアントへストリーミング
  • WinUI 3 のサポート

優先順位付きの計画全体については、docs/ROADMAP.md をご覧ください(根拠、設計メモ、作業量、推奨される順序)。

コントリビューション

コントリビューションを歓迎します!お気軽にプルリクエストを送信してください。

開発環境のセットアップ
  1. リポジトリをクローンします:

    git clone https://github.com/faze79/WpfVisualTreeMcp.git
    cd WpfVisualTreeMcp
    
  2. Visual Studio 2022 または VS Code で開きます:

    code .
    # or
    start WpfVisualTreeMcp.sln
    
  3. ビルドしてテストを実行します:

    dotnet build
    dotnet test
    
  4. テスト用のサンプル WPF アプリを実行します:

    dotnet run --project samples/SampleWpfApp
    
プロジェクト構成
WpfVisualTreeMcp/
├── src/
│   ├── WpfVisualTreeMcp.Server/        # MCP Server (.NET 8) - Uses official MCP SDK
│   │   ├── Program.cs                  # Server initialization with MCP SDK
│   │   ├── WpfTools.cs                 # 38 inspection, interaction and workflow tools
│   │   ├── Cli/CliRunner.cs            # One-shot CLI front-end (v0.4.0)
│   │   └── Services/                   # Process & IPC management
│   ├── WpfVisualTreeMcp.Inspector/     # Injected DLL (Framework 4.7.2/4.8/4.8.1; .NET 8/9/10)
│   ├── WpfVisualTreeMcp.Injector/      # Managed injection logic (CreateRemoteThread; net48 + net8.0)
│   ├── WpfVisualTreeMcp.InjectorHelper/# x86 .NET 8 helper exe for cross-arch injection (v0.6.0)
│   ├── WpfVisualTreeMcp.Bootstrapper/  # Native C++ DLL for CLR hosting
│   └── WpfVisualTreeMcp.Shared/        # Shared models & IPC contracts
├── samples/
│   └── SampleWpfApp/                   # Test application
├── tests/
│   ├── WpfVisualTreeMcp.Tests/         # Unit tests
│   └── WpfVisualTreeMcp.IntegrationTests/ # Live WPF integration tests
├── publish/                            # Published server + native DLLs
│   └── native/{x64,x86}/              # Architecture-specific bootstrapper
└── docs/                               # Documentation
技術的な詳細
  • MCP SDK:Microsoft/Anthropic による公式 C# MCP SDK を使用して構築
  • プロトコル:stdio トランスポート上の JSON-RPC 2.0
  • ターゲットフレームワーク:.NET 8.0(サーバー)/.NET Framework 4.7.2、4.8 および .NET 8.0-windows(Inspector)
  • IPC:サーバーとアプリケーション間の通信に名前付きパイプを使用
  • ツール:[McpServerTool] 属性によって自動検出される 38 個のツール。検査、診断、操作、ワークフローの記録/テストをカバーします。再生では記録されたアクションを実行します。全コンテンツのスクリーンショットでは、コントロールを一時的にスクロールする場合があります。
  • CLI:サブコマンドを指定すると、同じ実行ファイルがワンショット CLI として実行されます(Program.cs が CliRunner.IsCliCommand を介して振り分けます)。

謝辞

  • 元祖 WPF スパイユーティリティである Snoop WPF に着想を得ています
  • Anthropic の Model Context Protocol 上に構築されています
  • .NET および WPF コミュニティに感謝します

ライセンス

このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は LICENSE ファイルをご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。