Netwright について
Netwrightは、WPF、WinForms、WinUIのデスクトップアプリをAIエージェントで操作するMCPサーバーです。簡潔な画面スナップショットやバックグラウンド操作を備え、検証済みの操作からC#回帰テストを作成できます。
主な機能
- 01WPF、WinForms、WinUIの自動操作
- 02簡潔な画面スナップショットの確認
- 03フォアグラウンドを使わない操作
- 04状態の検証と画面変化の待機
- 05操作手順からC#テストを作成
活用シーン
- 01.NETアプリのフォームやグリッドのテスト
- 02AIエージェントによるデスクトップ画面の調査
- 03検証済み手順からの回帰テスト作成
MCP 対応
Netwrightは、デスクトップアプリの起動、画面の確認と操作、状態検証、テスト出力のツールをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Netwright
.NET デスクトップアプリ向けの Playwright スタイルの自動化ツールです。 Netwright は、AI エージェントが WPF、WinForms、WinUI アプリを確認して操作できる MCP サーバーです。プロジェクトを起動し、UI を簡潔なテキストとして読み取り、マウスを奪うことなく操作して、結果を検証し、検証済みのフローを回帰テストに変換します。
▶ 音声付きで視聴
以前の名称は WPF-MCP です。バージョン 2.0 は書き直されたもので、WPF-MCP 1.x からの移行をご覧ください。
> desktop_app action=launch project=src/Orders/Orders.csproj
Launched Orders.exe (pid 9120, WPF, launched by Netwright)
- window "Orders" [e1]
> desktop_snapshot
- window "Orders" [e1]
- textbox "Customer" [e4] #txtCustomer
- combobox "Country" [e5] #cmbCountry collapsed
- checkbox "Accept terms" [e6] #chkTerms unchecked
- button "Save" [e7] #btnSave disabled
> desktop_set_state target=#chkTerms checked=true
checked checkbox "Accept terms" [e6] #chkTerms
~ checkbox "Accept terms" [e6] #chkTerms checked
~ button "Save" [e7] #btnSave
> desktop_click target=#btnSave
clicked button "Save" [e7] #btnSave
+ window "Confirm" [e9] modal
+ text "Save order 42?"
+ button "Yes" [e10]
Netwright の特長
- .NET アプリ向けに開発されています。 UI Automation を通じて、WPF、WinForms(.NET および .NET Framework 4.x)、WinUI/MAUI に対応しています。
.csprojから直接起動し、stdout/stderr とTrace出力をキャプチャして、例外とスタックトレースを含むクラッシュ情報を報告します。 - トークン消費を抑えます。
- スナップショットはエージェントに必要な情報に絞られています。名前のないレイアウトペインは折りたたまれ、グリッドは行ごとに要約されます。
- 操作の応答には、何が表示、非表示、変更されたかを示す変更レポートが含まれるため、エージェントが再度スナップショットを取得する必要はほとんどありません。
- Refs(
e12)はスナップショットをまたいで有効です。
- 作業の邪魔をしません。 操作はバックグラウンドで実行されます。Netwright が起動したアプリでは、小さなコンパニオンがアプリ内で操作を実行するため、フォアグラウンドに切り替わらず、バインドされたフィールドも実際の編集と同じように確定されます。エージェントがテストしている間も、作業を続けられます。キー入力と右クリックは明示的に実行され、一時的にフォーカスを取得してから返します。
- デフォルトで信頼性があります。
- すべての操作は、対象が有効になり、画面上に表示されるまで待機します。
- 続いて UI が安定するまで待機するため、非同期画面でスリープを指定する必要はありません。
- 失敗は、次に何をすべきかのヒントを含むエラーコードで返されます。
- 探索から回帰テストまで対応します。
desktop_expectで状態を検証し、desktop_export_testでセッションを Netwright.Testing を使用する C# テスト(xUnit、NUnit、MSTest)に変換します。
ベンチマーク
すべてのサーバーで、シナリオ、Fixture App、トークンのエンコーディングを統一しています(方法の詳細と全数値は benchmarks/results をご覧ください)。
| WPF Fixture App、5 回の実行の中央値 | WPF-MCP 1.0 | FlaUI-MCP | Windows-MCP | Netwright 2.0 |
|---|---|---|---|---|
| 各ターンで送信されるツール定義(トークン) | 2,023(24 ツール) | 1,418(12) | 3,984(20) | 1,387(15) |
| フォームのスナップショット(トークン) | 1,023 | 785 | 1,956¹ | 385 |
| 1000 行のグリッドのスナップショット(トークン) | 3,988 | 6,234 | 1,897¹ | 627 |
| フォームへの入力と送信:呼び出し数/トークン数 | 10 / 2,463 | 10 / 3,469 | –² | 6 / 549 |
| 同じフォームを WinForms で実行:成功数 | 0/5 | 0/5 | –² | 5/5 |
| 非同期読み込みの待機:呼び出し数/トークン数 | 5 / 3,337 | 5 / 2,484 | –² | 3 / 405 |
| スクリーンショット(トークン) | 25,073 | 1,000 | 1,944 | 1,020 |
| 仮想化されていない 1000 行の WinForms グリッド:スナップショット時間 | 9.2 秒 | 12.9 秒 | 0.3 秒¹ | 1.5 秒 |
¹ Windows-MCP はアプリの UI ツリーではなく、デスクトップ全体を要約します。また、グリッドのスナップショットには行が含まれません。² 操作は実際のマウスを使って画面座標上で行われるため、スクリプト化されたフローは実行していません。
トークン数は、Claude のトークナイザーの代替として o200k_base で計測しています。Netwright の操作は呼び出しごとに時間がかかります。各操作で UI が安定するまで待機するため、フォームのフローには約 1.8 秒かかります(他は約 0.6 秒)。その代わり、応答には結果がすでに含まれるため、エージェントが必要とする呼び出し数とトークン数は大幅に少なくなります。
インストール
Windows 10/11 と .NET 10 SDK が必要です。アプリは任意の .NET または .NET Framework バージョンを対象にできます。
Claude Code
claude mcp add netwright -- dnx Netwright --yes
任意の MCP クライアント(Claude Desktop、Cursor、VS Code、Copilot…)
{
"mcpServers": {
"netwright": {
"command": "dnx",
"args": ["Netwright", "--yes"]
}
}
}
グローバルツールを使う場合は、dotnet tool install -g Netwright を実行し、"command": "netwright" を使用してください。エージェントが操作できるアプリを制限するには、args に "--", "--allow", "MyApp*" を追加します。すべてのオプションについては、統合ガイドを参照してください。
ツール
| ツール | 機能 |
|---|---|
desktop_app | .exe の起動、またはプロジェクトのビルドと起動、接続、終了、状態確認 |
desktop_snapshot | Refs を含む、コンパクトなテキスト形式の UI |
desktop_find | セレクター(#id、role "name"、a >> b)に一致する要素 |
desktop_inspect | 1 つの要素のプロパティ、パターン、安定したセレクター |
desktop_click | クリック(バックグラウンド。foreground を指定すると右クリック/ダブルクリック) |
desktop_type | テキストを設定(バックグラウンド)するか、実際のキーを入力 |
desktop_set_state | チェック、選択、展開、値の設定、または名前で項目を選択 |
desktop_press_key | キー入力とショートカット(フォアグラウンド) |
desktop_scroll | 方向、端、または表示位置までスクロール |
desktop_window | ウィンドウの一覧表示、アクティブ化、最小化、最大化、復元、終了 |
desktop_screenshot | 隠れていても、ウィンドウまたは要素の画像を取得 |
desktop_wait | 要素の状態またはテキストを待機し、変更内容を報告 |
desktop_expect | 再試行するアサーション:テキスト、値、有効状態、チェック状態、件数… |
desktop_logs | アプリの出力:stdout、stderr、デバッグ/トレース |
desktop_export_test | セッションを C# 回帰テストに変換 |
完全なリファレンス:docs/TOOLS_REFERENCE.md。
サポート対象の UI テクノロジー
| ティア | テクノロジー | 内容 |
|---|---|---|
| 1 | WPF、WinForms(.NET 6+ および .NET Framework 4.x) | Fixture App があり、変更のたびに統合テストを実施し、ベンチマーク済み |
| 2 | WinUI 3、Windows 上の .NET MAUI | Fixture App と統合テストあり |
| 3 | Avalonia、Uno Platform | UI Automation によるベストエフォート対応 |
その他の Windows アプリ(Win32、Qt、Electron…)も、Netwright は標準の UI Automation を使用するため動作することが多いですが、サポート対象ではありません。
アプリの操作対象となるコントロールに AutomationProperties.AutomationId(WPF/WinUI)または Name(WinForms)を設定すると、自動化が最も効果的に機能します。アプリを自動化に適したものにするを参照してください。
エージェントを使わない回帰テスト
[Fact]
public async Task Saving_an_order_asks_for_confirmation()
{
await using var app = await DesktopApp.LaunchProjectAsync(@"..\..\..\..\src\Orders\Orders.csproj");
await app.TypeAsync("#txtCustomer", "Rossi");
await app.CheckAsync("#chkTerms");
await app.ClickAsync("#btnSave");
await app.Expect("window \"Confirm\"").ToBeVisibleAsync();
}
dotnet add package Netwright.Testing。これは desktop_export_test が生成するコードです。
動作の仕組み
Netwright は、キャッシュされた 1 回の UI Automation クエリで各ウィンドウをキャプチャします。ウィンドウの検出には Win32 を使用し、要求するプロパティは約 20 個に限られ、画面外の要素はプロバイダー内でフィルターされます。このキャプチャから、フィルター済みテキストを描画し、メモリ内でセレクターを解決し、RuntimeId でツリーを比較して変更レポートを作成します。詳細と測定結果:docs/ARCHITECTURE.md。用語集:CONTEXT.md。設計判断:docs/adr。
WPF-MCP 1.x からの移行
| 1.x | 2.0 |
|---|---|
wpf_launch_application、wpf_attach_application、wpf_close_application | desktop_app action=launch|attach|close |
wpf_snapshot(スナップショットごとに参照がリセットされます) | desktop_snapshot(参照は安定しています) |
wpf_find_element、wpf_get_element_properties | desktop_find、desktop_inspect |
wpf_click、wpf_type | desktop_click、desktop_type。どちらも Ref または Selector を受け付けます |
wpf_set_value、wpf_toggle、wpf_select、wpf_expand_collapse | desktop_set_state(value、checked、item、expanded) |
wpf_press_key | desktop_press_key foreground=true |
wpf_scroll、wpf_scroll_into_view、wpf_focus | desktop_scroll(direction、to、into_view) |
wpf_list_windows、wpf_switch_window、wpf_window_action | desktop_window |
wpf_take_screenshot(base64 テキスト) | desktop_screenshot(画像コンテンツ) |
wpf_wait_for | desktop_wait(テキストも待機対象にできます) |
wpf_console_messages | desktop_logs |
wpf_set_background_mode | バックグラウンドがデフォルトです。必要に応じて、呼び出しごとに foreground=true を渡します |
JSON エンベロープ(success、data、metadata) | コンパクトなテキスト。エラーは code と hint を含む isError 結果です |
パッケージは Netwright(コマンド netwright)になり、WpfMcp.Server(wpf-mcp)に代わります。
貢献
Issue や PR を歓迎します。CONTRIBUTING.md をご覧ください。.\scripts\build.ps1 -Integration でビルドとテストを行い、.\scripts\benchmark.ps1 で計測してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
