mcpField
N
Netwright

Netwright

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

Netwright について

Netwrightは、WPF、WinForms、WinUIのデスクトップアプリをAIエージェントで操作するMCPサーバーです。簡潔な画面スナップショットやバックグラウンド操作を備え、検証済みの操作からC#回帰テストを作成できます。

主な機能

  1. 01WPF、WinForms、WinUIの自動操作
  2. 02簡潔な画面スナップショットの確認
  3. 03フォアグラウンドを使わない操作
  4. 04状態の検証と画面変化の待機
  5. 05操作手順からC#テストを作成

活用シーン

  1. 01.NETアプリのフォームやグリッドのテスト
  2. 02AIエージェントによるデスクトップ画面の調査
  3. 03検証済み手順からの回帰テスト作成

MCP 対応

Netwrightは、デスクトップアプリの起動、画面の確認と操作、状態検証、テスト出力のツールをMCPクライアントに提供します。

設定

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

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

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

リポジトリ
パッケージ
nugetNetwright2.1.0

ツール

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

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

詳細

Netwright

.NET デスクトップアプリ向けの Playwright スタイルの自動化ツールです。 Netwright は、AI エージェントが WPF、WinForms、WinUI アプリを確認して操作できる MCP サーバーです。プロジェクトを起動し、UI を簡潔なテキストとして読み取り、マウスを奪うことなく操作して、結果を検証し、検証済みのフローを回帰テストに変換します。

CI NuGet License: MIT

Netwright demo: an agent fills and submits an order in a WPF app that runs hidden, then exports the regression test

▶ 音声付きで視聴

以前の名称は 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.0FlaUI-MCPWindows-MCPNetwright 2.0
各ターンで送信されるツール定義(トークン)2,023(24 ツール)1,418(12)3,984(20)1,387(15)
フォームのスナップショット(トークン)1,0237851,956¹385
1000 行のグリッドのスナップショット(トークン)3,9886,2341,897¹627
フォームへの入力と送信:呼び出し数/トークン数10 / 2,46310 / 3,469–²6 / 549
同じフォームを WinForms で実行:成功数0/50/5–²5/5
非同期読み込みの待機:呼び出し数/トークン数5 / 3,3375 / 2,484–²3 / 405
スクリーンショット(トークン)25,0731,0001,9441,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_snapshotRefs を含む、コンパクトなテキスト形式の UI
desktop_findセレクター(#id、role "name"、a >> b)に一致する要素
desktop_inspect1 つの要素のプロパティ、パターン、安定したセレクター
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 テクノロジー

ティアテクノロジー内容
1WPF、WinForms(.NET 6+ および .NET Framework 4.x)Fixture App があり、変更のたびに統合テストを実施し、ベンチマーク済み
2WinUI 3、Windows 上の .NET MAUIFixture App と統合テストあり
3Avalonia、Uno PlatformUI 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.x2.0
wpf_launch_application、wpf_attach_application、wpf_close_applicationdesktop_app action=launch|attach|close
wpf_snapshot(スナップショットごとに参照がリセットされます)desktop_snapshot(参照は安定しています)
wpf_find_element、wpf_get_element_propertiesdesktop_find、desktop_inspect
wpf_click、wpf_typedesktop_click、desktop_type。どちらも Ref または Selector を受け付けます
wpf_set_value、wpf_toggle、wpf_select、wpf_expand_collapsedesktop_set_state(value、checked、item、expanded)
wpf_press_keydesktop_press_key foreground=true
wpf_scroll、wpf_scroll_into_view、wpf_focusdesktop_scroll(direction、to、into_view)
wpf_list_windows、wpf_switch_window、wpf_window_actiondesktop_window
wpf_take_screenshot(base64 テキスト)desktop_screenshot(画像コンテンツ)
wpf_wait_fordesktop_wait(テキストも待機対象にできます)
wpf_console_messagesdesktop_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

コメント

MCP は初めてですか?

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

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