NexusWindows for Claude について
NexusWindows for Claude は、Windows 10/11 向けのローカル MCP サーバーです。Claude Desktop と Claude Code がデスクトップアプリをバックグラウンドで確認・操作できます。UI Automation や Win32 メッセージなどで操作結果を読み戻し、前面のウィンドウやマウス、キーボードを使える状態に保ちます。
主な機能
- 01Windows ウィンドウのバックグラウンド確認と操作
- 02UI ファミリーに応じた自動化方式
- 03各操作の読み戻しと検証
- 04ルーチンの保存と再実行
- 05通知の読み取りとデバッグログ
活用シーン
- 01前面のアプリを使いながらデスクトップフォームに入力
- 02アプリ操作をまとめて実行し結果を検証
- 03保存済みルーチンを再実行
MCP 対応
Claude Desktop と Claude Code 向けのローカル MCP サーバーで、stdio で接続します。ウィンドウ一覧、画面確認、操作、アプリ起動、ウィンドウ管理、通知の読み取り、ログ表示のツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
6掲載時のツール一覧 · 6 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| filter | any | いいえ |
詳細
Claude 向け NexusWindows

Claude 向けのバックグラウンドでの Windows コンピューター操作です。 MCP サーバー(nexus-windows-claude)により、ユーザーがマウス、キーボード、前面のウィンドウを使い続けながら、Claude Desktop と Claude Code が Windows デスクトップアプリケーションを認識して操作できます。
バージョン 3.7.0 · Windows 10/11 · Python 3.14 · MIT ライセンス
Nexus ファミリーの一部です:NexusWindows (Claude · Codex · Antigravity)、 NexusBrowser(リポジトリ)、 NexusAndroid(リポジトリ)。 プロジェクトページ:julienpiron.fr/nexuswindows。
理由
Anthropic が提供するコンピューター操作(Cowork および Claude Desktop 内の Claude Code で利用可能)は、Pro と Max の加入者向けのベータ版です。「Team プランと Enterprise プランでは、現時点でコンピューター操作を利用できません」 (Claude ヘルプセンター)。 NexusWindows for Claude はローカル MCP サーバーのため、ローカル MCP サーバーが許可されているすべてのプラン(Team と Enterprise を含む)で、Claude Desktop と Claude Code を利用できます。
スクリーンショットを撮ってクリックする方式のコンピューター操作では、実際のカーソルが動き、ウィンドウが前面に表示されるため、エージェントが操作している間、PC の前にいるユーザーは作業を中断しなければなりません。多くの Windows アプリケーションは、この方法を使わずに操作できます。ネイティブコントロールはウィンドウメッセージを受け付け、最新のフレームワークは UI Automation を公開し、Chromium にはアクセシビリティツリーからアクセスできます。このサーバーは UI の種類ごとに、フォーカスを奪わないことが測定で確認された手法を選び、その効果を読み取って確認します。また、ユーザーが明示的に許可した場合に限り、実際のマウスまたはキーボードに切り替えます。
NexusWindows ファミリー
エージェントごとに1つ、合計3つのMCPサーバーを個別に構築しています。各モデルに合わせてツールを調整する必要があるためです。共通の約束は、ユーザーがマウス、キーボード、フォアグラウンドウィンドウを使い続けられ、すべての操作結果が読み返されることです。
| Claude | Codex | Antigravity | |
|---|---|---|---|
| インストール | uvx --python 3.14 nexus-windows-claude | npx -y nexus-windows-codex | uvx --python 3.14 nexus-windows-antigravity |
| パッケージ | PyPI | npm | PyPI |
| ツール | windows look act launch window、および notifications と logs | windows look act launch window | windows look act launch window |
| リポジトリ | NexusWindows-Claude | NexusWindows-Codex | NexusWindows-Antigravity |
各ステップの結果は、✓ 検証済み、= 完了済み、~ 不明(再実行されません)、または ✗ 失敗もしくは拒否として報告されます。3つすべてで、ガードレールポリシー、フォアグラウンドトークン、緊急停止(Ctrl+Alt+Shift+Esc)、共通のジャーナル形式、共通のベンチを共有しています。
インストール
Windows 10または11が必要です。Pythonは不要です。uvがPython 3.14を自動でダウンロードします。
ワンステップ(uvがない場合はインストールし、サーバーをダウンロードして確認し、Claude Codeに登録してClaude Desktopの設定に追加します。事前にバックアップを作成してから設定を統合します。既存の設定項目は保持され、Claude Codeプラグインが有効な場合はサーバーが重複して追加されません):Windows PowerShellを開き(スタートメニューでpowershellと入力)、次を貼り付けます。
irm https://raw.githubusercontent.com/pironjulien/NexusWindows-Claude/main/setup.ps1 | iex
その後、Claudeを完全に終了して、もう一度開きます。setup.ps1は短く、実行前に読むことができます。再実行しても、不足しているものだけが処理されます。
Claude Codeプラグイン(同じサーバーにスキルを追加したもの。uvが必要です):
/plugin marketplace add pironjulien/nexus-plugins
/plugin install nexus-windows@nexus-plugins
Claude Desktop拡張機能(uvが必要です):最新リリースからnexus-windows-claude-<version>.mcpbをダウンロードし、Claude Desktopで「Settings」→「Extensions」を開いてファイルをドロップします(または「Advanced settings」→「Install extension」を選択します)。その後、「Install」をクリックします。Claude DesktopのMicrosoft Store版では、ファイルをダブルクリックしても開きません。Windowsには.mcpbを開くアプリがありません。
手動でインストールする場合。 uvをインストールします(公式パッケージ):
winget install --id=astral-sh.uv -e
その後、Claudeを再起動してuvを認識させ、PyPIからサーバーを登録します。 Claude Code:
claude mcp add --scope user -e PYTHONUTF8=1 --transport stdio nexus-windows -- uvx --python 3.14 nexus-windows-claude
Claude Desktop:「Settings」→「Developer」→「Edit Config」を開き、claude_desktop_config.jsonに次の内容を追加します(mcpServersがすでにある場合はその中に追加します)。保存してからClaudeを完全に終了し、もう一度開きます。
{
"mcpServers": {
"nexus-windows": {
"command": "uvx",
"args": ["--python", "3.14", "nexus-windows-claude"],
"env": { "PYTHONUTF8": "1" }
}
}
}
初回起動時には約100 MB(Python 3.14とサーバーの依存関係)がダウンロードされます。2回目以降の起動は1秒未満です。3.0.0まではパッケージ名がnexus-windowsでした。現在もその名前を使用でき、nexus-windows-claudeがインストールされます。
クローンから(開発用):
git clone https://github.com/pironjulien/NexusWindows-Claude.git
cd NexusWindows-Claude
$env:UV_PROJECT_ENVIRONMENT = "$env:LOCALAPPDATA\claude-windows-computer-use\venv" # optional: venv outside the clone
uv sync --frozen
Claude Codeに登録します(ユーザースコープ):
claude mcp add --scope user `
-e "UV_PROJECT_ENVIRONMENT=$env:LOCALAPPDATA\claude-windows-computer-use\venv" -e PYTHONUTF8=1 `
--transport stdio nexus-windows '--' uv run --project "$PWD" --frozen python -m nexus_windows
クローンからClaude Desktopを使う場合:
{
"mcpServers": {
"nexus-windows": {
"command": "uv",
"args": ["run", "--project", "C:/path/to/NexusWindows-Claude", "--frozen", "python", "-m", "nexus_windows"],
"env": { "PYTHONUTF8": "1" }
}
}
}
ローカルの状態(ログ、ルーティン)は%USERPROFILE%\.claude\nexus-claude\に保存されます。別のフォルダーを使用するには、NEXUS_WINDOWS_HOMEを設定します。
ツール
| ツール | 目的 |
|---|---|
windows(filter) | アプリケーションウィンドウを前面から背面の順に表示します。内容は hwnd、タイトル、プロセス、UI ファミリー、サイズです。バックグラウンドで起動された Store アプリ(表示はされませんが、操作できます)には [hidden] が付きます。その後にタスクバーとデスクトップが続きます |
look(window, show, query, region, detail, marks) | ウィンドウを前面に表示せず、番号付きの [N] 要素(ロール、名前、値、状態、位置)を返します。テキストを優先し、ツリー情報が不十分な場合、または検証できていない手順の後にのみ画像を表示します(show="both" は常に画像を添付します)。window="taskbar"、"desktop"、"screen"(画面全体と各ウィンドウの位置)も指定できます |
act(steps, window, then, foreground, remember, routine, params) | 1 回の呼び出しで複数の手順を実行し、各手順の結果を読み返してから更新後の状態を返します。Windows の「クイック設定」「通知」「スタート」パネルでは foreground=true を指定します |
launch(app, args, devtools, restart) | アプリケーション(スタートメニュー名、Store アプリ、実行ファイル)、フォルダー、ドキュメント、またはアドレス(ms-settings:<page>、mailto:、https:)を起動します。フォーカスは移動せず、起動を検証します |
window(action, ...) | 背面に戻す、最小化、最大化、閉じる、移動、サイズ変更 |
notifications(limit, app) | Windows の通知をデータベースから読み取ります(読み取り専用)。画面上では何も開きません。セキュリティコードはマスクされます |
logs(count, errors_only) | デバッグログです。試した手法、所要時間、エラー、サーバーの状態を表示します |
手順のアクション:click、double_click、right_click、type、set、clear、key、select、check、uncheck、
toggle、expand、collapse、scroll、focus、menu、wait、drag、hover。対象には、直前の
look に表示された [N]、表示名("OK")、ロール付きの名前("button:OK"、"edit:Name"、"checkbox:Subscribe")、または直前の画像内の
x,y 座標を指定できます。
windows、notifications、logs は、同じテキストに加えて構造化コンテンツ(MCP の outputSchema および structuredContent:
ウィンドウ行、通知、ログレコード)も返します。これは、文章ではなくデータを読み取るクライアント向けです。
使い方
一般的な流れ:look(window="Notepad") を実行し、次にすべての手順をまとめて 1 回の act で実行してから、手順ごとのレポートを確認します。
act(window="Settings form", steps=[
{"do": "set", "target": "edit:Name", "text": "Ada",
"check": {"target": "Name", "value": "Ada"}},
{"do": "check", "target": "Subscribe"},
{"do": "click", "target": "button:Save", "expect": "Saved"}
], remember="save-form")
その後:act(window="Settings form", routine="save-form")。
機能
変更箇所のみ(then="changes"、show="changes")
アクションの後に act(then="changes")(または look(show="changes"))を実行すると、そのウィンドウで直前に表示された一覧からの変更箇所のみを返します。+ は追加、~ は変更(テキスト、状態、または位置の変更)、- は削除を示します。それ以外の要素はすべて同じ [N] を維持します。多くの要素が一度にスクロールした場合、全一覧ではなく、それらを範囲([2-21])として示す 1 行を返します。比較はウィンドウ固有のフレーム内で行われるため、ウィンドウを移動しても変更とはみなされません。削除された [N] が再び割り当てられることはありません。また、長いレポートから変更内容が省略された要素は、次の look まで [N] を失います。ほぼすべて(60 %)が変更された場合は、全一覧を返します。測定値:クリック後の全一覧と比べて 2~2.6 倍短縮されます。
画像から読み取るテキスト(OCR フォールバック)
ウィンドウが UI Automation 要素をほとんど公開しない場合(6 個未満:Tk、キャンバス)、または Chromium ページがコンテンツの公開を停止した場合、Windows 内蔵 OCR エンジン(Windows.Media.Ocr、ローカル、オフライン)でウィンドウ画像のテキストを読み取り、位置とともに [N] Text "…" (OCR) として一覧表示します。このような要素は、番号または名前で対象に指定できます(ウィンドウが移動した場合は位置を再計算してクリックします)。テストアプリでの測定値:ウィンドウあたり 10~21 ms。テキストの正確性は WPF で 16/16、Edge で 20/23、Tk で 6/7 でした。
ステップごとの4つの結果
各ステップは、次のいずれかとして報告されます。
✓効果を読み戻しました(値、状態、ウィンドウ、画像)。expectまたはcheckのないクリックやメニュー選択も、クリックした要素だけを根拠として個別に確認されます。要素自身の状態(チェック済み、展開済み、選択済み)が読み戻された場合、またはコントロールがクリックを受け取ったときにアプリケーションが発生させる UI Automation の「Invoked」イベント(WPF、Chromium、Electron。WinForms と Win32 では発生しないため、ボタンの結果は~のままです)によって確認されます。「Invoked」が示すのはクリックが届いたことだけで、クリックによる結果ではありません。結果はexpectで確認します。コントロールが確認応答したクリックは、別の手法で再送されることはありません。=ステップのcheckで要求された状態がすでに真だったため、何も送信されませんでした。~入力は送信されましたが、その効果を読み取れませんでした(成功として数えられることはありません)。✗失敗、拒否、または事後条件未達です。バッチはその時点で停止します。
バッチの最後に、4つの結果の件数が表示されます。
事後条件(check)
ステップには check を指定できます。これは、1つの要素と、その要素が到達すべき状態(value、contains、checked、selected、
expanded、focused、enabled、exists)を指定します。ステップの実行前にすでに真の場合、ステップはスキップされます(=)。実行後に真の場合は ✓ です。実行後に偽の場合は ✗ となり、バッチは停止します。要素が公開していない状態は不明のままであり、偽とはみなされません。
ルーチン
act(remember="name") は、すべてのステップが ✓ または = で終了し、すべての対象が表示名([N] や座標ではないもの)である場合にのみ、バッチを保存します。{{x}} は変数テキストを示し、再生時に params の値が設定されます。act(routine="name") は、名前で各対象を再検索してすべてのステップを再検証します。アプリケーションの更新は報告され、再生に失敗したルーチンには要確認のマークが付きます。ルーチンは実行ファイルごとに %USERPROFILE%\.claude\nexus-claude\routines に保存されます。オプションのミラーフォルダー(NEXUS_ROUTINES_MIRROR)を使うと、PC 間で定義を共有できます。入力されたテキストが平文でミラーされることはありません(テキストが {{x}} のテンプレートではないルーチンはローカルに保持されます)。
パスを開いたことの検証
launch(app=<folder or document>) は、ファイルの関連付けを通じて(アクティブ化を要求せずに ShellExecuteEx で)開き、その後、実際に開いたものを確認します。フォルダーの場合はエクスプローラーに表示されたフォルダー(Shell.Application 経由で読み取り)、ファイルの場合はファイル名を含むタイトルのウィンドウで確認します。スクリプト、ショートカット、インストーラーは拒否されます。
UI ファミリー別
- ネイティブ Win32:コントロールへ直接メッセージを送信します(
BN_CLICKED、通知を伴うCB_SETCURSEL/LB_SETCURSEL、EM_REPLACESEL、メニューのWM_COMMAND、TCM_SETCURFOCUS)。その後、状態を読み戻します。フォーカスを奪うことが計測で確認された操作(ボタンの Invoke)や、何も通知せず失敗する操作(リストの Select)では、UI Automation を使用しません。 - Win32 と WinForms のドロップダウンリスト:
CB_SHOWDROPDOWNで開閉し、CB_GETDROPPEDSTATEで状態を読み戻します(リストのexpand、collapse、またはclick)。開いているリストから選択する場合は、最初にリストを閉じます(Windows は閉じる操作をキャンセルと見なすため、その前に行った選択が破棄されます)。次にCB_SETCURSEL、CBN_SELCHANGE、CBN_SELENDOKを親に送信し、アプリケーションから状態(インデックスとラベル)を読み戻します。値が空、または別の値なら✗です。リストが開いている間は UI Automation ツリーをたどりません(ツリーがデスクトップのすべてのトップレベルウィンドウへ連鎖するためです)。選択肢は ComboLBox のポップアップ自体から読み取ります。 - WinForms、WPF、UWP、WinUI:
AutoSetFocusを無効にし、タイムアウトに上限を設けた UI Automation を使用します。選択後に開いたままの WPF ドロップダウンリストは閉じ、選択内容を読み戻します。 - アクティブ化なしの Chromium と Electron:DevTools を使わずにすでに開いているアプリでは、複数行フィールド、リッチエディター、
<select>、キー、Ctrl/Alt ショートカットに対して、シミュレートしたアクティブ化を行います。このウィンドウだけにWM_NCACTIVATEとWM_ACTIVATEを送信します(Chromium はこれらのメッセージからアクティブ化状態を取得し、Windows のフォアグラウンドは変わりません)。MSAAaccSelect(SELFLAG_TAKEFOCUS)で DOM フォーカスを設定して読み戻し、文字はWM_CHARとして送信します。非アクティブ化は、文字の処理後に実行されるよう ポストします。ページには信頼済みのkeydownイベントとinputイベントが届きます。計測で確認された注意点が 1 つあります。起動直後のアプリは、起動時に取得したフォアグラウンドを一度だけ(約 10 ms、ガードが元に戻します)使用する場合があるため、プロセスごとの最初のシミュレートされたアクティブ化は、短時間のアクティブ化として扱います。launch(devtools=true)で起動したアプリは、代わりに DevTools プロトコル経由で操作します。 - Steam(SDL フレーム内の CEF):Chromium として認識されます。
launch(app="Steam")は Steam 独自の-cef-disable-occlusion -cef-force-accessibilityスイッチを追加するため、ウィンドウが覆われていても UI を読み取れます。 - Tk:UI Automation は使用しません。テキストは OCR のフォールバックで検出します。クリックは、Tk のスレッドに限ってマウスボタンが押された状態として送信します(Tk は
GetKeyStateで読み取ります)。キーとショートカットには、対象ウィンドウだけにWM_SETFOCUSを送るシミュレートされたフォーカスを適用します(WM_ACTIVATEは送信しません)。リストはネイティブのスクロールバーでスクロールし、すべての状態を読み戻します。別のウィンドウに覆われた Tk キャンバスでホイール操作を行うと、その操作は失われます(Tk はその位置で見えているウィンドウに操作を振り分けます)。ウィンドウ全体が覆われている場合は、アクティブ化せず、ジェスチャーの間だけデスクトップの外へ移動し、同じコントロールにホイール操作をポストした後、ウィンドウを元の位置に戻して、ピクセル単位で読み戻します。一部が表示されているウィンドウ、最大化されたウィンドウ、最小化されたウィンドウは移動しません(操作を拒否します)。 - DevTools を使わず、覆われた Chromium ページをスクロールする場合:別のウィンドウが手前にあると、Chromium はホイール操作を破棄します。また、スクロール領域には ScrollPattern がありません。そこで、領域内の次の非表示行を表示領域に移動し(UI Automation の ScrollItem)、その領域内での行のオフセットを読み戻します。
キャプチャ
PrintWindow(10〜26 ms、覆われたウィンドウも含む)を使用し、Windows.Graphics.Capture はフォールバックとしてのみ使用します。画像には共通の Nexus 画像ルールを適用します。最大 2000 px、2.56 MP とし、Claude Code もモデルも縮小しないようにします(座標の正確さを保てます)。ロスレス WebP で最大 500 KB とし、その後は画像が 500 KB に収まるまで非可逆圧縮します。画像サイズは維持します(2560×1440 の画面は 2000×1125 で送信され、ロスレスで約 110 KB です)。小さなテキストを読むには、画像を大きくするのではなく region でズームします。そのウィンドウ(またはズームした領域)について前回送信した画像と同一の画像は再度添付しません。その場合は返信でその旨を伝え、show="image" は常に画像を添付します。座標はウィンドウに紐付けられます。ウィンドウが移動した場合は座標を追従させ、サイズが変更された場合は操作を拒否します。
エージェントの動作中
アクション(act、launch、window。読み取り操作は対象外)の実行中は、ゲームのロード画面のように、小さなロゴが操作対象ウィンドウの画面の右下で回転し、青い光輪がゆっくり明滅します。最後のアクションから 1.6 s 後に消えます。オーバーレイは常に最前面に表示され、枠なしで、クリックを透過し、アクティブ化されず、タスクバーにも表示されず、スクリーンショットからも除外されます(モデルは look でこれを見ることはありません)。NEXUS_WINDOWS_INDICATOR=0 で無効にできます。
実際のマウスとキーボード
ユーザーの承認が必要な act(foreground=true) でのみ使用されます。ウィンドウはバッチ全体を通して前面に表示されます。カーソルとフォアグラウンドは終了時に元に戻され、バッチ中にユーザーが物理的に入力すると停止します。
他のエージェントとの連携
このサーバーは、同じ PC 上の他のデスクトップエージェント(Codex レイヤー、NexusWindows for Codex、Antigravity レイヤーと併用されています)と、2 つの簡単なファイルベースのプロトコルを通じて連携します。どのエージェントもこれらを実装できます。
フォアグラウンドトークン(%USERPROFILE%\.nexus\foreground.lock):マウスまたはフォアグラウンドを実際に占有している場合(実際の入力、一時的なアクティブ化、ウィンドウを前面に表示)にのみ取得され、バックグラウンド操作では取得されません。このトークンを保持するには、読み取り、書き込み、削除の共有を有効にして、オフセット 2^32 の 1 バイトに対する排他的な LockFileEx が必要です。ハンドルが閉じると(プロセスの終了時も含めて)Windows が解放するため、古いトークンが残ることはありません。保持者は診断用に、ファイルの先頭に {"owner", "pid", "since", "purpose"} を書き込みます。待機側は最大数秒(ここでは 8 s)待ち、それを過ぎると何もせず、誰が保持しているかを通知します。他のエージェントがトークンを保持しているのをフォアグラウンドガードが検出した場合は、フォアグラウンドを取り戻さず、そのエージェントのウィンドウを追跡します。
緊急停止(Ctrl+Alt+Shift+Esc、ファイルは %USERPROFILE%\.nexus\ 内):各エージェントは RegisterHotKey(MOD_NOREPEAT) の登録を試み、登録できたエージェントが 1 つだけになるよう、他は 3 s ごとに再試行します。保持者は stop.owner に 3 s ごとにハートビートを書き込みます。キーが押されると、stop に {"by", "pid", "at", "hold_s": 120, "nonce"} を書き込みます。すべてのエージェントは少なくとも 0.2 s ごと、かつ各アクションの前に stop を監視します。120 s 未満の新しいバージョンがある場合、残り時間の間、すべてのデスクトップ操作をブロックします(読み取りは許可されます)。停止状態は単調時計を使ってメモリ内に保持されます。ファイルを削除したり時計を変更したりしても解除されず、新たにキーを押すと再設定されます。
アーキテクチャ
flowchart LR
Claude["Claude Code or Claude Desktop"] -->|"MCP stdio"| Server["server.py MCP tools"]
Server --> Worker["COM worker thread with hard timeout"]
Worker --> Snapshot["snapshot and capture"]
Worker --> Actions["actions per UI family"]
Actions --> Win32["Win32 messages"]
Actions --> UIA["UI Automation"]
Actions --> Chromium["Chromium simulated activation and DevTools"]
Actions --> Real["real input only with foreground true"]
Server --> Safety["policy, emergency stop, foreground guard"]
Safety --> Shared["shared files in USERPROFILE nexus"]
Real --> Shared
src/nexus_windows/
reloader.py stdio supervisor: restarts the server on new code and replays the client handshake
server.py MCP tools, dedicated COM thread, per-call log
actions.py executor facade, assembled from the act_*.py modules
act_base.py targets read back live, technique chains, outcomes, shared refusals
act_win32.py Win32 messages
act_uia.py UI Automation (WinForms, WPF, UWP/WinUI) and dispatch per family
act_chromium.py Chromium/Electron/CEF: verified click, DevTools, simulated activation, <select>
act_pointer.py points, message clicks, scrolling, drag, hover
act_wait.py text presence and waiting
snapshot.py window + popups, [N] elements, image, coordinates, changes since the last list
ocr.py Windows built-in OCR (Windows.Media.Ocr) for windows without UI Automation
uia.py UI Automation with a single cross-process cache request
methods.py Win32 message techniques
cdp.py minimal Chrome DevTools Protocol client
capture.py PrintWindow / Windows.Graphics.Capture
foreground.py foreground monitoring and restoration, brief activation
agentlock.py shared foreground token
postcond.py step postconditions (check)
routines.py verified routines per application
physical.py the user's physical input (Raw Input, no hook), told apart from injected input
launch.py background launch, DevTools, throwaway browser profiles
steam.py Steam switches, clean restart, DevTools port
realinput.py real mouse/keyboard (SendInput), only when authorised
policy.py where to act and what to launch (hard blocks of the shared policy, launch switches)
act_confirm.py confirmation of irreversible gestures (confirm: true), whatever key or click triggers them
shared/ the guard-rail policy shared with NexusWindows for Antigravity (garde-fous.json)
packages.py resumes Store apps that Windows suspended in the background
offwindows.py outside Windows: the server starts and lists its tools, every desktop tool says Windows is required
stop.py shared emergency stop
freshness.py detects a server whose code changed on disk
codeprint.py code fingerprint and location of the shared policy (no dependencies)
worker.py COM thread with a hard timeout
log.py JSONL log, 14 days
lab/ test applications (Win32, WinForms, WPF, Tk, a web page for Electron/Edge)
bench/ technique benchmarks and raw results
tests/ unit tests (pytest) and end-to-end tests (pytest -m live)
測定結果
すべての数値は bench/RESULTS.md と bench/results/ 内の生データに基づいています(2026 年 10 月に 1 台の PC で測定。RESULTS.md の注記はフランス語です)。
| 項目 | 結果 |
|---|---|
| キャプチャ、PrintWindow | 10~26 ms、覆われたウィンドウを含む |
| 実際の MCP サーバー、ラボアプリでの 73 アクション(0.4.0~0.5.0) | 69 件成功、明示的な拒否 5 件、誤った成功 0 件、カーソル移動 0 件、クリップボードへのアクセスなし。中央値 78 ms、p90 321 ms |
| 改行 20 個を含む 2,000 文字 | Win32 38 ms、WinForms 66 ms、WPF 141 ms、DevTools を使った Electron/Edge 82~108 ms |
| Chromium のシミュレートされたアクティブ化、18 ステップのシナリオ(0.7.0) | Electron 18/18、フォアグラウンド取得 1 回で 9 ms(最初の起動時)。Edge 18/18、フォアグラウンド取得 0 回 |
| 同じシナリオ、スイッチなしの Electron、非表示 | 17/18。失敗したのはキー入力のたびに 1,500 個の要素を再構築するページで、✗ として報告 |
| シミュレートされたアクティブ化での 700 文字、6 行の入力 | 0.85~1.1 s(Electron、Edge)、遮蔽時は 1.9~2 s |
act の最終描画(0.7.0 と 0.6.1 の比較) | Win32 418 → 221 ms、Electron 341 → 205 ms(固定の 300 ms 待機をウィンドウ安定検出に置き換え) |
| ドロップダウンリストを開いて項目を選択(WinForms と WPF のフォーム、実際の MCP サーバー) | 8/8 シナリオで毎回アプリケーションが選択を受信。WinForms のリストを開いた状態での select は 113 ms(以前は 22 s かかり失敗)。5 ms ごとのサンプリングでフォアグラウンド取得 0 回、カーソル移動なし |
エージェント間パリティベンチ(2026年10月26日)
3つの NexusWindows エディション(本エディション、Codex 向け、および Antigravity 向け)で、Electron、WinForms、WPF の検証用ウィンドウを使い、同じ33タスクをそれぞれ3ラウンド実行しました。ウィンドウは不透明なカバーの下、z オーダーの最下部に配置し、PCの前には誰もいませんでした(ベンチはユーザーがマウスまたはキーボードに触れた時点で停止します)。結果はツールの報告ではなく、アプリケーション(イベントの受信または値の読み戻し)によって判定します。生データ:bench/results/2026-10-26_1045-parity.json(隣にフランス語の概要があります)。
| 正確な動作 | 割り込みなし | 誤った成功 | 中央値 | p95 | |
|---|---|---|---|---|---|
| nexus-windows for Claude 3.3.0 | 84/99 | 83/99 | 0 | 957 ms | 5.6 s |
| NexusWindows for Codex | 84/99 | 82/99 | 0 | 691 ms | 3.8 s |
| NexusWindows for Antigravity | 84/99 | 80/99 | 0 | 817 ms | 3.4 s |
3つの間に差はありません。Electron のタスクはすべて、3つとも3/3でした。15件の失敗はすべて3つで同じで、誤った成功ではなく、バックグラウンドでの制限によって正直に拒否されたものです。該当するのは、WPF の raw click、WPF での Ctrl+K、WPF のコンテキストメニュー、および WinForms と WPF でのダブルクリックです(カバーがクリック位置を覆っており、WinForms はカバーされた位置へのダブルクリックの送信を無視します)。「割り込み」とは、試行中にフォアグラウンドが奪われた、カーソルが移動した、またはクリップボードに書き込まれたことを意味します。
オフラインテストスイートについては、Tests バッジをご覧ください(Windows では test.ps1、Linux では起動時チェックも実行します)。
Cua Driver および Windows-MCP との比較(2026年10月26日)
Cua Driver 0.38.0 は、最も近い他のツールです。これもデフォルトでバックグラウンド動作します。Windows-MCP 0.8.8 は、最もよく使われている Windows MCP サーバーですが、バックグラウンドモードはありません。3つすべてを、同じラボの Windows 環境で、実際の MCP サーバー(bench/cua_vs_nexus.py)を通じて操作しました。画面は不透明なウィンドウで覆い、PC の前には誰もいない状態にしました(ベンチマークは物理入力が2分間ないと開始せず、最初の物理入力があると停止します)。各ツールは、それぞれのガイドでエージェントに指示している方法で使いました(Cua:まずバックグラウンドで操作し、次にクリックを試し、その後フォアグラウンドのフォールバックを使用。Windows-MCP:App switch でウィンドウを前面に出してから、画面を操作)。効果はツールの報告ではなく、アプリケーション側(イベントの受信または値の読み戻し)で判定しています。フォアグラウンドの変化は1ミリ秒ごとに記録し、各試行の前後で実際のカーソル位置を確認しています。Win32、WinForms、WPF、Tk、Electron、Edge にまたがる51件のタスクです(bench/tally_cua.py、生データは bench/results/2026-10-26_1210-cua-vs-nexus.json)。再現するには、スクリプト冒頭の説明に従って Cua Driver と Windows-MCP をインストールしたうえで、アイドル状態の Windows PC で python bench/cua_vs_nexus.py を実行してください。
| 全51件のタスク、対象をカバー | nexus-windows 3.3.0 | Cua Driver 0.38.0 | Windows-MCP 0.8.8 |
|---|---|---|---|
| バックグラウンドで効果を確認 | 44 | 26(クリックで+1、フォアグラウンドに移してから+6) | 0(バックグラウンドモードなし。フォアグラウンドでの効果は10件) |
| 誤った成功(完了と報告したが、アプリには何も起きなかった) | 0 | 4 | 比較不可。下記参照 |
| カバーされたリストのスクロール(Tk、Electron、Edge) | 3/3 | 0/3 | 0/3 |
| フォアグラウンドに移した回数 | 0 | 3 | 15(元に戻さず) |
| 実際のカーソルが移動 | 0 | 0 | 34 |
| 成功した操作の所要時間の中央値 | 598 ms | 728 ms | 1,478 ms |
Windows-MCP は、App switch でウィンドウを前面に出した後、9件すべての Win32 タスクで効果を確認できました。WinForms、WPF、Tk、Electron、Edge のウィンドウでは、切り替え後も30回、ウィンドウが背面に残りました。その状態でクリックや入力を行うと、クリックを報告していても、手前のウィンドウ(このベンチマークではカバー用ウィンドウ、実際の使用ではユーザー自身のウィンドウ)に操作が届きました。効果のない「完了」という応答は36件でした。これは報告の仕方というより、バックグラウンドモードがないことを示しているため、表では誤った成功として数えていません。さらに5件は、開いているリストまたはメニューの項目が画面上で見つからず、ベンチマークアダプターで失敗しました。
この実行でこのサーバーが失敗した操作:WPF の生クリック、ホイール、Ctrl+K、カバーされたキャンバス上でのホイール操作(Tk、Electron、Edge)、および今回の Win32 Ctrl+K。いずれも拒否または結果不明(~)として報告され、完了とは報告されませんでした。
履歴:3.0.1(カバーされた45件中35件)から3.0.2(10月23日、Cua の28件に対して51件中44件。詳細は bench/RESULTS.md)へ:Tk のクリックとショートカット、Win32 の Ctrl+K、カバーされたリストのスクロールに対応しました。引き続き拒否している操作は、原因を各ツールキットのソースで確認し、測定しています:WPF のクリック、ホイール、ショートカット、カバーされたキャンバス上でのホイール操作、非表示の Electron ページ上の座標への入力。Cua から取り入れたもの:変更された部分だけを読む機能(then="changes")。取り入れなかったもの:注入による WPF クリック(ユーザーの実際のカーソルを移動させる)、すでに開いている Chrome での CDP クリック(ユーザーの実際のプロファイルでリモートデバッグを有効にする)。試して採用を見送ったもの:WPF ショートカット向けの模擬アクティブ化(WPF がフォアグラウンドになる)、WM_POINTERWHEEL(Windows が投稿を拒否する)、Chromium レンダラーへの WM_VSCROLL(効果なし)、InjectSyntheticPointerInput(手前のウィンドウに送られる)。
クロスエージェントベンチマーク(2026年10月16日)
この PC で使用している 3 つの Windows デスクトップエージェント(このサーバー、Codex レイヤー、Antigravity レイヤー)で、アクティブ化せず Z オーダーの最背面に作成した WinForms および WPF フォームを対象に、ユーザーが作業を続けている間、同じタスクを実行しました。3 つのフィールドに入力し、ボックスにチェックを入れ、「Formule」ドロップダウンリストを開き、開いたリストで「Bravo」を選択して、検証します。証拠は、アプリケーションから読み戻した結果ラベルです。物理入力は禁止されており、使用回数としてカウントされます。
| 午前 | 修正後 | 測定結果 | |
|---|---|---|---|
| このサーバー(0.7.0 + ドロップダウンの修正) | 17/20 | 19/20 | 両方のフォームで開いたリストを読み戻し;開いた WinForms リストでの select は 22 s から 113 ms に短縮;アプリケーションが Formule=Bravo;Envois=1 を受信;1,371 件および 773 件のサンプル(20 ms)でフォアグラウンドの引き継ぎ 0 回、カーソル移動 0 回、物理入力 0 回 |
| NexusWindows for Codex 1.4.0 | 16/20 | 19/20 | 両方のフォームですべての手順を検証;observe + batch は 1.2~1.4 s |
| Antigravity レイヤー | 18/20 | 19/20 | 開いた WinForms リストを読み取り、選択;batch のステータスが最も悪い手順 |
このサーバーがまだ 20 に届かない要因は、「Validate」をクリックしても expect がないと ~ のままになること(アプリケーションは受信しています)、および閉じた WPF リストで click が ✓ ではなく ~ になることです。expand なら ✓ になります。
セキュリティ
- 緊急停止:Ctrl+Alt+Shift+Esc を押すと、実行中の操作を次のチェックポイントで中断します(入力中も含みます)。その後 2 分間、すべての新しい操作を、会話をまたいで、ほかのエージェントに対しても拒否します(上記のプロトコル)。
- 厳格なブロック(共有ポリシー、
src/nexus_windows/shared/garde-fous.json。Antigravity 向けの NexusWindows と同じファイル):セキュアデスクトップ(UAC、ロック画面、サインイン画面)とパスワードマネージャーは、読み取りも操作も決して行いません。ポリシーが存在しない、または読み取れない場合は、すべての操作を拒否します(フェイルクローズ)。 - 取り消せない操作の確認:支払い、購入、注文、送金、送信、公開、投稿、完全削除、ごみ箱を空にすること、フォーマット、アンインストール、リセット、サブスクリプションの解約、アカウントの削除、リポジトリの公開には、ステップに
confirm: trueが必要です。モデルがこれを設定するのは、ユーザーから明示的な指示または「はい」という返答があった場合のみです。このチェックは、操作によって引き起こされる内容を対象とします。つまり、[N]によるクリック、名前や座標によるクリック、ダブルクリック、Enter(対象、既定のボタン、近くにある送信ボタン)、Ctrl+Enter、Space、Alt+文字、入力した改行、DevTools ページ、Win32 メニューです。ルーチンがconfirmを記録したり、再生したりすることはありません。 - 操作そのものに紐づく承認:外部に作用する操作(送信、通話、支払い、公開、送金)には、
accord: "<token>"も必要です。最初の試行は入力前に拒否され、操作の詳細(トリガー、プロセス、ウィンドウのタイトル、ウィンドウの編集可能なフィールドの値)と、1 回限りのトークンが提示されます。ユーザー自身が「はい」と返答した後に限り、同じステップをconfirm: trueとそのトークンを付けて再送できます。その間に何らかの変更があれば、トークンは無効になります。 - プロンプトインジェクションのシグナル:画面上で読み取ったテキストが AI に向けた指示のように見える場合、警告が応答に追加されます(これはシグナルにすぎず、操作を許可することはありません)。
- 起動:ブラウザーで、モデルが選択したプロファイル、DevTools ポート、読み込み済みの拡張機能を使用することはありません(
devtools=trueは使い捨ての新しいプロファイルを開きます)。コンソール、ファイルエクスプローラー、タスクバー、その他のアプリケーションは拒否されません。このサーバーは、Claude にコマンドの実行をすでに許可しているユーザー向けです。ここで制御をかけたい場合は、Claude 自身の権限確認プロンプトを有効にしておいてください。 - パスワードフィールド:入力しません。入力したテキストは記録されず、長さのみが記録されます。
- アカウント:
devtools=trueで起動したブラウザーには、アカウントや同期のない使い捨てプロファイルが割り当てられ、起動後に確認されて、終了後に削除されます。 - 画面の内容はデータです:すべての
lookで、画面上のテキストは指示ではないことをモデルに再確認させます。 - コードを最新の状態に保つ:エントリーポイントは、小さな stdio スーパーバイザー(
reloader.py)です。各ツール呼び出しの前に、ディスク上のコードと実行中のサーバーのコードを比較します。変更があれば、進行中の呼び出しが完了するまで待ち、新しいサーバーを起動してクライアントのハンドシェイクを再実行するため、更新時に再接続は不要です(/mcp)。2 回のチェックの間にコードが変更されたサーバーは、act、launch、windowを拒否し、呼び出しは新しいサーバーで再実行されます。 - タイムアウト:放棄された呼び出しは、後から完了するのではなく、次のチェックポイントでキャンセルされます。
- クリップボード:使用しません。
プライバシー
NexusWindows for Claude は、すべてお使いの PC 上で動作します。アカウント、テレメトリー、分析機能はありません。独自に行うネットワークリクエストは更新の確認だけです。1 日に最大 1 回、起動時にバックグラウンドで PyPI(https://pypi.org/pypi/nexus-windows-claude/json)から最新バージョン番号を読み取ります(送信されるのはリクエスト自体だけです)。uvx から起動された場合は、次回 Claude を起動するときに使えるよう、そのバージョンを uv のキャッシュに準備します。
NEXUS_UPDATE_CHECK=off でこの機能を無効にできます。DevTools 接続は 127.0.0.1 上にとどまります。
- 読み取る情報:ツールの呼び出し時に限り、Claude が操作するアプリケーションのウィンドウタイトル、UI Automation ツリー、ウィンドウ画像を読み取ります。パスワードマネージャーとセキュアデスクトップは、調査(
look)も操作(act)もしません。ただし、windowsにはタスクバーと同じように、それらのウィンドウタイトルも表示されます。OCR のフォールバックでは PC に組み込まれている Windows エンジンを使い、OCR のために画像が PC の外部へ送信されることはありません。look(window="screen")は、表示中のすべてのウィンドウを含め、見えている画面全体を読み取ります。notificationsツールは Windows の通知データベースを読み取り専用で参照します(アプリ、時刻、テキスト。変更は行いません)。セキュリティコードはマスキングされます。 - 送信先:ツールの結果は Claude Desktop または Claude Code に返され、各サービス独自のプライバシーポリシーに従って Anthropic に送信されます。このサーバーがそれ以外の場所にデータを送信することはありません。
- 保存される情報:
%USERPROFILE%\.claude\nexus-claude\(またはNEXUS_WINDOWS_HOME)には、14 日間保持される JSONL デバッグログ(ツール、手法、所要時間、エラー。入力テキストは文字数に置き換えられます)、記憶するよう選んだルーチン、devtools=trueで作成される一時的なブラウザープロファイル(使用後に削除)が保存されます。NEXUS_WINDOWS_DEBUG_IMAGES=1を設定した場合に限り、画像もログに書き込まれます。%USERPROFILE%\.nexus\には、共有フォアグラウンドトークンと緊急停止状態、status\windows-claude.json(インストール済みバージョンと最新バージョン、更新状態)、および最終確認日が記録されたwindows-claude\update.jsonが保存されます。%LOCALAPPDATA%\NexusJournal\windows\claude\(またはNEXUS_JOURNAL_HOME)には、他の NexusWindows ツールと同じ形式の短い月次 JSONL ジャーナルが保存されます(アプリの実行ファイル名、フレームワーク、アクション、手法、結果、所要時間、フォアグラウンドを使用したかどうか、エラーの冒頭部分。引用符、コロン、角括弧の前で切り取られます)。入力テキスト、画面上のテキスト、ラベル、タイトル、パスは記録されません。サーバーがこのジャーナルを削除することはありません。 - 削除する方法:Claude からサーバーを削除し(
claude mcp remove nexus-windows)、続いて各フォルダーを削除してください(%LOCALAPPDATA%\NexusJournalも削除してください)。
ご質問や懸念がある場合は、このリポジトリで issue を作成してください。
制限事項
- コードコメントはフランス語です。MCP クライアントが受け取るすべての内容(指示、ツールの説明、ステップのレポート、拒否メッセージ)は英語です。
- Windows のみです。ラボアプリといくつかの実際のアプリケーションを使用して Windows 11 でテストしていますが、すべてのアプリケーションを確認したわけではありません。
- UI Automation がなく、投稿された入力を無視するアプリケーション(ゲームやキャンバスなど)では実際の入力が必要なため、ユーザーの承認とフォアグラウンド表示が必要です。OCR フォールバックでテキストは検出できますが、バックグラウンドでの入力は可能になりません。
- WPF:座標を指定したクリック、マウスホイール、キーボードショートカットはバックグラウンドでは拒否されます(実際のカーソルがウィンドウ上にない場合、WPF はクリックを無視し、フォーカスを受け取るとフォアグラウンドになります)。UI Automation パターンを備えたコントロールは動作します。
- Chromium のキャンバスが別のウィンドウに覆われている場合、マウスホイールは効果がありません(Chromium はホイール入力を最前面のウィンドウに送ります)。拒否されるか、成功ではなく
~と報告されます。Tk では、ウィンドウが完全に覆われている場合にのみ動作します(「UI ファミリー別」を参照)。リストやスクロール領域はホイールを使わずにスクロールします(「UI ファミリー別」を参照)。 - 一度フォアグラウンドになった後、フォアグラウンドでなくなった Chromium ページが
hiddenになると、描画が停止します。座標を指定したクリックは~と報告されます。 - Windows がバックグラウンドで中断するストアアプリは再開されます(
IPackageDebugSettings.Resume、フォアグラウンドにはなりません)。それでも Windows が描画しないアプリは、フォアグラウンドにすることでのみ表示できます。この場合はその旨が報告されます。 - Chromium では、各キー入力への反応が非常に遅いページは、読み戻しの制限時間を超えて ✗ と報告されることがあります。
- ボタンで書き込まれるファイルなど、読み取れるものがない効果は
~のままです。それを確認するcheckを追加してください。 - エンドツーエンドテストスイート(
pytest -m live)は実際のウィンドウを操作し、PC が最後に使用されてから 2 分未満の場合は起動を拒否します。
開発
pwsh -NoProfile -File test.ps1 # unit tests, ruff check and format; venv and caches outside the clone
pwsh -NoProfile -File test.ps1 -Full # also the end-to-end tests on the lab windows
uv run python bench/bench.py # technique benchmark (when nobody is using the PC)
ライセンス
MIT。詳細は LICENSE を参照してください。Copyright (c) 2026 Julien Piron.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
