mcpField
N
NexusWindows for Codex

NexusWindows for Codex

ローカル
julienpiron.fr生産性31 日前に更新

NexusWindows for Codex について

NexusWindows for Codexは、ユーザーが前面のウィンドウを使い続けながらWindowsデスクトップアプリを操作するMCPサーバー兼Codexスキルです。アプリの状態を読み戻し、バックグラウンドのUI操作を優先して、物理入力は代替手段として使います。

主な機能

  1. 01ウィンドウ一覧とUI Automationの確認
  2. 02隠れたウィンドウのキャプチャ
  3. 03Win32とUI Automationによるバックグラウンド操作
  4. 04明示的な事後条件による操作検証
  5. 05物理入力によるフォールバック

活用シーン

  1. 01前面ウィンドウを切り替えずにアプリを操作
  2. 02隠れたウィンドウを操作前に確認
  3. 03検証付きのデスクトップ操作を実行

MCP 対応

MCPサーバーは、Windowsアプリのウィンドウ一覧表示、確認、起動、操作、終了のツールを提供します。各操作はアプリの状態に照らして確認され、物理的なマウスとキーボード入力はフォールバックとしてのみ使われます。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"pironjulien-nexus-windows-codex": {
"command": "npx",
"args": [
"-y",
"nexus-windows-codex"
]
}
}
}
起動コマンドnpx -y nexus-windows-codex

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmnexus-windows-codex3.7.4

ツール

5

掲載時のツール一覧 · 1 日前に更新

パラメーター型必須説明
filterstringいいえ

詳細

NexusWindows for Codex

Release Tests OpenSSF Scorecard License: MIT npm Node 22+ .NET 8 Windows 10/11

NexusWindows: Windows computer use for AI agents, in the background. Works with Claude, Codex and Antigravity.

バックグラウンドで動作する、Codex 向けの Windows コンピューター操作機能です。 MCP サーバー(nexus-windows-codex、npx コマンドひとつで起動)により、ユーザーがマウス、キーボード、フォアグラウンドのウィンドウを使い続けながら、OpenAI Codex が Windows デスクトップアプリケーションを表示して操作できます。Codex 独自の Computer Use はまず macOS に導入されました。Windows では、OpenAI のドキュメントによると、実行中は対象アプリをアクティブなデスクトップに表示しておく必要があります(Codex のドキュメント)。NexusWindows for Codex は、すべての処理に専用のローカル .NET ヘルパーを使用します。ウィンドウの一覧表示、UI Automation ツリー、覆われたウィンドウの PrintWindow キャプチャ、フォーカスを移さずに実行する Win32 メッセージと UI Automation パターン、そして最後の手段として、共有フォアグラウンドトークンのもとで使用する実際のマウスとキーボードを備えています。すべてのアクションはアプリケーションの実際の状態に基づいて評価され、バッチでは各ステップに明示的な事後条件が必要です。また、Codex の Computer Use API(@oai/sky)上で同じセッションを実行する Codex スキルも付属しています。

バージョン 3.0.1 · Windows 10/11 · Node 22+ · .NET 8 · MIT ライセンス

Nexus ファミリーの一部です:NexusWindows (Claude · Codex · Antigravity)、 NexusBrowser(リポジトリ)、 NexusAndroid(リポジトリ)。 プロジェクトページ:julienpiron.fr/nexuswindows。

理由

Codex に組み込まれた Computer Use は物理マウスとキーボードを使用します。対象ウィンドウを最前面に表示するため、操作中はユーザーが作業を中断する必要があります。多くの Windows アプリケーションは、そうしたことをせずに操作できます。NexusWindows for Codex はまずバックグラウンドでの操作方法を試し、アプリケーションの実際の状態に基づいて結果を評価します。ヘルパーの実際のマウスとキーボードを使うのは、ユーザーの入力がしばらく途切れた後、PC 上のほかのエージェントと共有するトークンのもとでのみ行う、フォールバックとしての最後の手段です。

Node 製の MCP サーバー(npm 依存関係なし)で、自己完結型の .NET ヘルパーを備えています。待ち受け用ネットワークポートも、トークンも、非公開の Electron API も必要ありません。オプションの Codex スキルは、Codex の Computer Use API を介して、Codex の Node REPL 内で同じセッションを実行します。

NexusWindows ファミリー

3つの MCP サーバーを、それぞれのエージェント向けに個別に構築しています。モデルごとにツールを最適な形に調整する必要があるためです。共通の約束は、ユーザーがマウス、キーボード、フォアグラウンドウィンドウを使い続けられること、そしてすべての操作が読み戻されることです。

ClaudeCodexAntigravity
インストールuvx --python 3.14 nexus-windows-claudenpx -y nexus-windows-codexuvx --python 3.14 nexus-windows-antigravity
パッケージPyPInpmPyPI
ツールwindows look act launch window、および notifications と logswindows look act launch windowwindows look act launch window
リポジトリNexusWindows-ClaudeNexusWindows-CodexNexusWindows-Antigravity

各ステップは、✓ 検証済み、= 完了済み、~ 不明(再実行されません)、✗ 失敗または拒否のいずれかを報告します。3つはガードレールポリシー、フォアグラウンドトークン、緊急停止(Ctrl+Alt+Shift+Esc)、共通ジャーナル形式、共通ベンチを共有しています。

インストール

要件:Windows 10 または 11、Node 22 以降。npm パッケージには自己完結型のヘルパーが含まれているため、.NET のインストールは不要です。

npm から、Codex の ~/.codex/config.toml に設定します。

[mcp_servers.nexus-windows]
command = "cmd"
args = ["/c", "npx", "-y", "nexus-windows-codex"]

Windows では npx は .cmd スクリプトのため、cmd /c を使用します。同じコマンドは、どの MCP クライアントでも動作します ("command": "cmd", "args": ["/c", "npx", "-y", "nexus-windows-codex"])。

Codex スキル(代替手段、クローンから)

このスキルは Codex の Node REPL 内で同じセッションを実行し、Codex の Computer Use API にフォールバックできます。Codex デスクトップアプリとその Computer Use プラグイン、および .NET 8 SDK が必要です。

git clone https://github.com/pironjulien/NexusWindows-Codex.git
cd NexusWindows-Codex
pwsh -NoProfile -File install.ps1             # build the helper, install the skill into %USERPROFILE%\.codex\skills\nexus-windows
pwsh -NoProfile -File install.ps1 -CheckOnly  # verify the installation matches the sources

install.ps1 は、バージョン管理されたヘルパービルドを %LOCALAPPDATA%\NexusCodex\ComputerUse(または -StateRoot)の下に保持し、スキルの隣にソースとリンクされた entry.mjs を書き込みます(そのため、クローンは同じ場所に置いてください)。4つの .NET ランタイムファイルをハッシュで確認し、同時インストールを直列化します。CODEX_HOME または -CodexHome を指定すると、Codex のフォルダーが変更されます。クローンを更新した後は、再実行してください。注意:ビルドパスは Windows の260文字制限内に収める必要があります。MCP サーバーは、クローンから実行された場合もこのヘルパーを検出します。

このスキルは、新しい Codex セッションで読み込まれます。古いバージョンをすでにインポートした REPL は、JavaScript モジュールキャッシュでは再読み込みされないため、リセットする必要があります。

ツール

ツール目的
windows(filter)アプリケーションウィンドウ(id、app、title、pid)。タスクバーと同様ですが、パスワードマネージャーは一覧に表示されません
look(window, mode)id、またはタイトルかアプリ名の一意な一部分で指定したウィンドウを1つ表示します。UI Automation ツリーに加え、mode="image" または "both" で、他のウィンドウに覆われていても取得できるキャプチャを表示します。act の対象ウィンドウを選択します
act(steps)最後の look で指定したウィンドウに対し、1ステップ、またはそれぞれに独自の expect を持つ最大32ステップを実行します。最初に検証されなかったステップで停止します
launch(app)アプリケーション(名前、パス、Store アプリ ID)、フォルダー、ドキュメント、または Settings ページ(ms-settings:)を起動し、フォアグラウンドを戻します
window(action, window)action="close":閉じるメッセージを1つ送り、読み戻します。「保存しますか?」というプロンプトが表示された場合は報告しますが、応答はしません

ステップの種類:click(セレクター、またはポイントとネイティブキャプチャ ID。button、count)、setValue、typeText、key、 select、menu、secondary、scroll、drag。各ステップは、✓ 検証済み、= 完了済み、~ 不明(再確認しますが、 再実行されません)、✗ 失敗または拒否のいずれかを報告します。

使用方法

MCP サーバーとして使用する場合:まず windows を実行し、次にいずれかのウィンドウを look で確認してから、その結果から得たセレクターと効果を証明する expect を指定して act を実行します。観察結果は 1 回の act にのみ有効で、60 秒後に期限切れになります。

スキルとして使用する場合、エージェントは SKILL.md と API リファレンスに従います。 Codex の Node REPL では、次のようにします。

if (!globalThis.sky) { const { sky } = await import('@oai/sky'); globalThis.sky = sky; }
const home = nodeRepl.homeDir ?? (await import('node:os')).homedir();
globalThis.nexusWindows = await import('file:///' + home.replaceAll('\\', '/') + '/.codex/skills/nexus-windows/entry.mjs');
globalThis.win = nexusWindows.createWindowsSession(sky);
nodeRepl.write(await win.windows());          // pick exactly one window from this list
await win.bind({ id: chosenWindowId, app: chosenAppId });
globalThis.obs = await win.observe();
globalThis.result = await win.act(obs, {
  kind: 'click', selector: { automationId: 'okButton', role: 'button' },
  expect: { selector: { automationId: 'status' }, field: 'name', equals: 'Saved' }
});

result.status、result.technique、result.foregroundTaken を読み取り、その後 result.observation を基に続行します。 最後に await win.close() を呼び出します。

ローカルファイル:

場所内容
%USERPROFILE%\.codex\skills\nexus-windowsインストール済みのスキルと entry.mjs
%LOCALAPPDATA%\NexusCodex\ComputerUse\native\<fingerprint>バージョン管理されたヘルパービルド
%LOCALAPPDATA%\NexusCodex\ComputerUse\recipes検証済みレシピ(静的な UI ラベルのみ)
%LOCALAPPDATA%\NexusCodex\ComputerUse\reports明示的な測定値。ウィンドウの内容や入力したテキストは含まれません
%LOCALAPPDATA%\NexusCodex\ComputerUse\capturesネイティブキャプチャ。最大 10 分間、最大 32 ファイル

動作

まずバックグラウンドで操作し、物理入力は最後に使用

各セマンティック操作 click、setValue、typeText、secondary、select、menu は、まずヘルパーに送られます。

UI ファミリーバックグラウンドの手法使用しない手法
Win32親への BN_CLICKED(チェックボックスとラジオグループには BM_SETCHECK)、EM_SETSEL + EM_REPLACESEL、CB_SHOWDROPDOWN で開閉するコンボボックスのリスト(CB_GETDROPPEDSTATE で読み戻し)、CB_SETCURSEL + CBN_SELCHANGE + CBN_SELENDOK で選択するオプション(開いたリストは先に閉じます。閉じる操作はキャンセルとなり、以前の選択が復元されます)、LB_SETCURSEL + LBN_SELCHANGE、TCM_SETCURFOCUS、メニューの WM_COMMAND、UIA ToggleUIA Invoke(Win32 プロキシが SetForegroundWindow を呼び出します)、リストでの UIA Select(通知なし)
WinFormsUIA Invoke/Toggle、Edit、ComboBox(リストを開く操作も含め、Win32 と同じ)、ListBox に対するメッセージチェックボックスへの BN_CLICKED、リストでの UIA Select
WPF、UWP/WinUI、Chromium/ElectronAutoSetFocus = FALSE を指定した COM UI Automation:Invoke、Toggle、Value、ExpandCollapse(状態を読み戻し)、SelectionItem。選択後はコンボボックスを再び閉じます

測定により、設計を左右する詳細が判明しています。マネージドの System.Windows.Automation クライアントをプロセス内で一度使用すると、同じプロセスからの COM Invoke または Toggle は、AutoSetFocus = FALSE にしていても対象ウィンドウをアクティブにします(.NET 8 の WPF と WinForms)。そのため、UI Automation パターンは、マネージドクライアントを読み込まない子プロセス(--com-worker)から送信します。1.4.0 以降、マネージドクライアントはどこでも読み込まれません。ツリーは COM UI Automation クライアントを使って1 回の往復で読み取ります(CacheRequest、Subtree スコープ、コントロールビューを使用。ベンチ用フォームでは約 150~300 ms ではなく約 50 ms)。操作時には対象とその祖先のみを再度読み取り、観察結果との差異があれば操作を拒否します。

Win32/WinForms のコンボボックスのオプションは、メッセージ(CB_GETCOUNT、CB_GETLBTEXT、CB_GETCURSEL)で、開閉状態にかかわらず読み取られ、その配下の list/listitem ノードとして表示されます。expanded は CB_GETDROPPEDSTATE の結果です。測定では、開いた WinForms コンボボックスの UIA サブツリーは約 7 秒後に「Malformed Cacheresponse」を返し、その後応答しなくなるため、走査することはありません。

各手法では効果を読み戻します。結果は applied(適用済み)、none(変更なし)、sent(読み戻し不可)のいずれかです。物理入力へのフォールバックは、適用可能な手法がない場合、または expect が満たされず、かつ観察可能な変更もなかった場合にのみ実行されます。部分的な効果を物理入力で再実行することはありません。fallback:false は物理入力の経路を禁止します。各結果には、実行した手法(background:messages、background:uia、foreground:uia、physical:sky、sky:semantic)、フォアグラウンドを取得したかどうか、すべての試行が記録されます。

明示的な事後条件

expect では、verified、unmet、already-satisfied、不明な結果を区別します。観測は一度だけ使用されます。古い観測、別のウィンドウ、コントロールの欠落または曖昧さ、コントロール ID の変更があると、入力を行う前にアクションを中止します。UIA の値が途中で切り詰められている場合、厳密な一致条件を満たすことはできません。また、ツリーが空でも、コントロールが消えたことの証明にはなりません。ネイティブのパスワードフィールドは拒否されます。

事後条件がアクションの実行前からすでに真である場合、アクションが変更する精密な状態(対象の value、checked、selected、expanded、focused、または別の要素の結果)である場合に限り、その事後条件をスキップします(already-satisfied、何も送信されません)。対象について言い換えただけの事後条件(「ボタンが存在する」など)は拒否されます。また、精密でない事後条件(exists、includes、対象のラベル)がすでに真である場合、以前の状態とアクションの効果を区別できないため、入力前に拒否されます。コンボボックスの選択は、選択肢の要素ではなく、コンボボックスの value によって証明されます。

PrintWindow によるクリーンなキャプチャ

observe({mode:'image', capture:'native'}) は、前面に表示することなく、PrintWindow(PW_RENDERFULLCONTENT) でバインドされたウィンドウをキャプチャします。ほかのウィンドウに覆われている場合も同様です。モニターごとの DPI に対応し、DWM フレームに合わせて切り抜きます。DPI 非対応のウィンドウは論理サイズで描画され、拡大縮小されます。Codex スキルでは、キャプチャが空、最小化状態、または失敗の場合、Sky のスクリーンショットにフォールバックします。MCP サーバーにはそのようなフォールバックはなく、失敗が報告されます。ネイティブ画像はローカルの PNG ファイルです(最大 32 ファイル。次回のキャプチャ時、サーバー起動時、および正常終了時に 10 分経過したファイルが削除されます)。これはモデルのための証拠であり、画像を指定するポイントアクション(screenshotId)の座標フレームです。

検証済みのバッチ(actBatch)

actBatch(obs, steps) は、1 回の呼び出しで最大 32 件のアクションを実行します。各ステップには expect が必要です。入力を行う前にすべてのステップを検証し、各ステップは直前のステップで更新された観測に基づいて実行されます。verified または already-satisfied 以外の結果になった最初のステップでバッチを停止します。

複数のウィンドウ

セッションは新たに bind することなく、ダイアログやポップアップを追跡します。対象には、追跡中のウィンドウが所有するウィンドウ、手前のウィンドウを無効化するウィンドウ(モーダル)、およびアクション中に表示される同一プロセスのウィンドウが含まれます。ダイアログが閉じると、セッションは最も近い開いている親ウィンドウに戻ります。各観測では windowStack と windowChange が報告されます。一時的なポップアップ(キャプションのない WS_POPUP ウィンドウで、WS_EX_NOACTIVATE が設定されたもの。開いたドロップダウンリスト、ツールチップ、WPF ポップアップ、または Win32 の ComboLBox)は追跡されません。ウィンドウ自身のツリーを通して読み取られ、obs.popups に一覧表示されます。

ガードレール:共有ポリシーを一元管理

1.5.0 以降、ガードレールは NexusWindows の 3 つのエディション(Codex、Claude、 Antigravity)で共有されるポリシー garde-fous.json に従い、codex エントリを使用します。このリポジトリのルートにはそのコピーが埋め込まれています。作成者のプライベートワークスペースでは、代わりに共有ポリシーの最新ファイルが読み込まれます(テストで両者のバイト列が一致することを確認します)。 NEXUS_GARDE_FOUS で別のファイルを指定できます。指定されたパスが暗黙に置き換えられることはありません。ポリシーが見つからないか無効な場合、すべてのアクションを拒否します(フェイルクローズ)。また、.NET ヘルパーは読み取り可能なポリシーがない場合、すべてのウィンドウ要求を拒否します。

ハードブロック(読み取りや入力を行う前に拒否):セキュアデスクトップ(UAC、ロック画面、サインイン画面)、Windows の資格情報プロンプト、パスワードマネージャー(プロセス名のプレフィックスで判定する KeePass、Bitwarden、1Password、Dashlane、NordPass、RoboForm、LastPass)、および Codex 自身のアプリケーション(Codex、ChatGPT)。これは、Codex のコンピューター操作でメインウィンドウ内からアプリへのアクセスを求められるためです。コンソールとターミナル、ファイルエクスプローラー、管理ツールは、もはや拒否されません(1.4.1 までは拒否されていました)。このレイヤーは、Codex にコマンドの実行をすでに許可しているユーザーを対象としています。パスワードフィールドはどこでも拒否され、その値が読み取られることはありません。

確認(アクションに confirm:true を設定。ユーザーの明示的な指示がある場合、またはユーザーが承諾した後に限り設定):支払い、通話、送信、公開、完全削除、フォーマット、アンインストール、リセット、サブスクリプションの解約、リポジトリの公開。また、支払いまたはフォーマットに関するタイトルのウィンドウで、汎用的な動詞(Validate、OK、Start)を実行する場合も対象です。確認するのはジェスチャーの形式ではなく、そのジェスチャーによって実行される内容です。入力の前に、またその後にどの手法が使われるかにかかわらず確認します。対象となる操作は、セレクターまたはスクリーンショット座標によるクリック(シングルまたはダブル。ボタン内のテキストやアイコンもボタンとして扱います)、Enter、Ctrl+Enter、Space、Alt+文字(アクセスキーまたは下線付きの文字)、改行を含むテキストの入力、メニューコマンド、および展開、折りたたみ、切り替え、選択、スクロール以外のセカンダリアクションです。拒否時(error.confirmationRequired)は何も送信されず、バッチは該当ステップで停止します。学習済みレシピに confirm が引き継がれることはありません。Sky への直接呼び出しはこのレイヤーを迂回するため、必ずセッションを経由してください。

ユーザーの物理入力(Raw Input)

長時間動作する --stop-guard プロセスは、Raw Input(RIDEV_INPUTSINK、メッセージ専用ウィンドウ、フックなし)を登録します。報告するのは、物理キーボードまたはマウス入力の瞬間のみで、その内容は報告しません。Sky 自身の SendInput を含む注入された入力には入力元デバイスがないため、無視されます。物理入力があると、セッションはユーザーの入力がない状態が 1.618 秒間続くまで待機します(最大 8 秒。これを超えた場合、アクションは保留され、何も送信されません)。その後、最大 48 書記素のチャンク単位で入力し、ユーザーがキーボードまたはマウスの操作を再開した場合は停止します(interrupted。再送はしません)。Raw Input を利用できない場合は、独自の注入を除外したうえで GetLastInputInfo にフォールバックします。

アプリケーションの記憶

検証済みのセマンティッククリックまたはセカンダリアクションは、期待される効果、実行ファイルのメタデータのフィンガープリント、およびコントロール構造のフィンガープリントとともに、レシピとして保存できます。変更があれば必ず再検査します。コントロール番号やピクセルが再利用されることはなく、入力された内容が保存されることもありません。

エージェントの動作中

アクションの実行中(act、actBatch、activate。観察中を除く)は、バインドされたウィンドウの画面の右下に、小さなロゴがゲームのロード画面のようにその場で回転し、青い光が呼吸するように明滅します。最後のアクションから 1.6 秒後に消えます。REPL の起動中ずっと動作している緊急停止ガードが、busy <hwnd> および idle コマンドでこれを描画します(native/BusyIndicator.cs)。これは、常に最前面に表示され、枠なし、クリックを透過し、アクティブ化されず、タスクバーに表示されず、スクリーンキャプチャにも含まれないレイヤードウィンドウです。描画は、GDI+ でデコードした native/logo.png を使った解析的なもの(光、影、コイン)で、追加の依存関係はありません。NEXUS_WINDOWS_INDICATOR=0 で無効にできます。

他のエージェントとの連携

このレイヤーは、同じ PC 上でほかの 2 つのデスクトップエージェント(Claude MCP サーバーである NexusWindows for Claude と Antigravity レイヤー)と並行して動作します。 これらは、どのエージェントでも実装できる 2 つのファイルベースのプロトコルを通じて連携します。

フォアグラウンドトークン(%USERPROFILE%\.nexus\foreground.lock):マウスまたはフォアグラウンドを実際に使用している間(Sky の物理入力、アクティブ化、フォアグラウンド UIA フォールバック)のみ保持し、読み取りやバックグラウンド手法では保持しません。保持するには、オフセット 2^32 の 1 バイトに対する排他的な LockFileEx を使用します(C# の場合:FileShare.ReadWrite | FileShare.Delete を指定した FileStream を作成し、続けて Lock(1L << 32, 1) を呼び出します)。ハンドルが閉じると Windows がトークンを解放します。プロセスが終了した場合も同様です。保持者は診断用にのみ {"owner", "pid", "since", "purpose"} を書き込みます。待機側は最大 8 秒待機し、その後、操作を延期したことを報告して何も送信しません。

緊急停止(Ctrl+Alt+Shift+Esc、ファイルは %USERPROFILE%\.nexus\ 内):PC ごとに 1 つのプロセスが RegisterHotKey(MOD_NOREPEAT) を保持し(ほかのプロセスは 3 秒ごとに再試行)、stop.owner を 3 秒ごとに更新します。キーが押されると、{"by", "pid", "at", "hold_s": 120, "nonce"} で stop を書き換えます。ここでは、--stop-guard ヘルパーが、ほかのプロセスがホットキーを保持していない場合に、Codex REPL が稼働している間、ホットキーを取得します。JavaScript セッションは 0.2 秒ごと、および各操作の前に stop を監視し、ヘルパーも各 UIA 操作とトークン取得の前に再確認します。作成から 120 秒未満の新しいバージョンがあると、残り時間中はすべてのデスクトップ操作がブロックされます。観察は引き続き許可されます。停止状態は単調増加時計を使ってメモリ内に保持されるため、ファイルを削除したり時計を変更したりしても解除されません。

アーキテクチャ

flowchart LR
    Codex["Codex"] --> MCP["MCP server bin and lib mcp.mjs"]
    MCP --> Provider["lib native-provider.mjs"]
    Provider --> Session["lib session.mjs"]
    Codex --> Skill["skill entry.mjs in the Node REPL"]
    Skill --> Session
    Session -. skill only .-> Sky["Codex Computer Use API"]
    Session --> Native["lib native.mjs"]
    Native --> Helper["NexusCodex.UIA server"]
    Helper --> Messages["Win32 messages"]
    Helper --> ComWorker["COM only worker for UIA patterns"]
    Helper --> Capture["PrintWindow capture"]
    Session --> Guard["stop guard with Raw Input"]
    Guard --> Shared["shared files in USERPROFILE nexus"]
    Helper --> Shared
bin/nexus-windows-codex.mjs   the MCP server command (stdio)
lib/
  mcp.mjs        MCP protocol and tools (no npm dependency)
  native-provider.mjs  window inventory by the helper, every window driven by the helper alone
  session.mjs    WindowsSession: bind, observe, act, actBatch, recipes, window following
  native.mjs     client for the .NET helper (one reused process, correlated requests, timeouts)
  tree.mjs       accessibility tree normalisation and digests
  memory.mjs     recipes and metrics (atomic, locked writes)
  presence.mjs   user presence from the stop guard
  stop.mjs       emergency stop watcher and guard process
native/          .NET 8 helper: Program.cs (modes --server, --com-worker, --stop-guard, --foreground-token),
                 Background.cs, ComUia.cs, ComWorker.cs, Capture.cs, Presence.cs, EmergencyStop.cs,
                 ForegroundToken.cs, Win32.cs
skill/nexus-windows/   SKILL.md and references (API, per-application notes)
tests/           node:test suites; tests/live: real validation fixture (WinForms, Win32, WPF)
install.ps1      builds the helper and installs the skill
test.ps1         offline check; -Full adds the real validation

測定結果

VALIDATION.md より(2026 年 10 月 15 日、リポジトリ独自のフィクスチャでの実環境検証。このファイルはフランス語です)。Windows はアクティブ化せず、Z オーダーの最下部に表示しています。Win32 ウィンドウは WinForms ウィンドウに覆われています。各操作では、事後条件を検証し、アプリケーションがイベントをカウントし、フォアグラウンドが変化せず、カーソルも静止していることを確認しました。

操作手法所要時間(入力と読み戻し)
Win32 ボタン、チェックボックス、文字入力、キャレット位置への追記、コンボボックス、リスト、メニューメッセージ105~159 ms
WinForms の文字入力、コンボボックス、リストメッセージ292~338 ms
WinForms のチェックボックス、ボタン、開いた後に閉じたダイアログ(自動で追従)COM UIA Toggle / Invoke205~441 ms
WPF のボタン、チェックボックス、値COM UIA Invoke / Toggle / Value193~241 ms
3 ステップのバッチをステップ 2 で停止(ステップ 3 は未送信)メッセージ658 ms
覆われた Win32 ウィンドウのキャプチャPrintWindow、空白ではない19 ms

オフラインテストスイート:JavaScript テスト 108 件のうち、103 件が合格し、実環境テスト 5 件は -Full 以外ではスキップされました(test.ps1、2026 年 10 月 16 日)。所要時間の大半は、UIA ツリー全体の読み戻しにかかっています。フォアグラウンドを取得する物理フォールバックは、その実行時にユーザーが操作中だったためスキップされており、合格数には含まれていません。

エージェント横断ベンチマーク(2026年10月16日)

このPCで使用している3つのWindowsデスクトップエージェント(このレイヤー、Claudeサーバー、Antigravityレイヤー)で、powershell.exe がホストするWinFormsおよびWPFのフォームを使って同じタスクを実行しました。ユーザーが作業を続ける間、アクティベーションせずにZオーダーの最背面でフォームを作成し、3つのフィールドに入力し、ボックスにチェックを入れ、「Formule」ドロップダウンリストを開き、開いたリストで「Bravo」を選択して、確定します。証明として、アプリケーション内の結果ラベルを読み戻しています。このテストでは、実際のセッションと.NETヘルパーは、物理入力を拒否し、その回数を記録する偽のSkyで実行しました。

チェック項目WinFormsWPF
3つのフィールド✓ バックグラウンド:messages、103~124 ms✓ バックグラウンド:uia、170~189 ms
リストを開く(expanded = true)✓ 検証済み(1.3.0:誤って already-satisfied)✓ 検証済み(1.3.0:unmet の後、フォームのコントロールが失われた)
開いたリストで「Bravo」を選択して確定✓ 検証済み✓ 検証済み(1.3.0:確定処理がスキップされた)
簡単な事後条件(「ボタンが存在する」)✓ 入力前に拒否✓
アプリケーションの結果Formule=Bravo;Envois=1Formule=Bravo;Envois=1
物理入力/フォアグラウンドが奪われた回数123サンプル中0/00/0
時間(観察+一括処理)0.12 + 1.16秒0.11 + 1.41秒(1.3.0:4.5~8秒)
エージェント午前修正後
このレイヤー(1.3.0、その後1.4.0)16/2019/20
NexusWindows for Claude17/2019/20
Antigravityレイヤー18/2019/20

このレイヤーがまだ20点に達していない理由は、このベンチマーク(偽のSky)ではCodexアプリ内のSkyを通る実際の経路を測定していないことです。同日の test.ps1 -Full では、ユーザーが操作していない状態で、実際の検証チェックが15件成功、失敗0件、スキップ0件でした。物理フォールバック ✓(フォアグラウンド:uia、123 ms)、ベンチマークフォームはWinForms 1.1秒、WPF 2.0秒、フォアグラウンドが奪われたサンプルは227件中0件でした。

セキュリティ

  • バックグラウンドの手法は、ユーザーのキーボード、マウス、フォアグラウンドのいずれにも触れません。物理入力は一時停止を待ち、共有トークンを保持し、ユーザーが操作を引き継ぐと停止します。
  • 上記の緊急停止により、すべてのデスクトップ操作が2分間ブロックされます。拒否された操作が再実行されることはありません。
  • 操作が拒否された場合(パスワードフィールド、ハードブロックされたアプリケーション、確認の欠落、コントロールIDの変更、無効化されたウィンドウまたはメニューコマンド)、何も送信されず、フォールバックも行われません。
  • Codex独自のComputer Useルール(アプリケーションへのアクセス、機密性の高い操作)は引き続き適用されます。このレイヤーは、拒否されたアプリや操作を回避する手段ではありません。ページのテキスト、コントロール、レシピはデータであり、認可ではありません。
  • OneDriveフォルダー内でのキャプチャは拒否されます。メトリクスにUIテキスト、スクリーンショット、入力値、タイトルが含まれることはありません。

プライバシー

NexusWindows for Codex はすべて PC 上で動作します。アカウント、テレメトリ、アナリティクスはなく、独自のネットワークリクエストも送信しません。接続先はローカルのみです。操作対象の Chromium または Electron ウィンドウの 127.0.0.1 にある DevTools ポートに接続し、別のマシンには接続しません。

  • 読み取る情報:Codex が作業するアプリケーションのアクセシビリティツリーとウィンドウ画像です。Codex から呼び出された場合に限ります。
  • 送信先:結果は Codex に返され、Codex 独自のプライバシーポリシーに基づいて OpenAI に送信されることがあります。このサーバーがほかの場所に何かを送信することはありません。
  • 保存する情報:%LOCALAPPDATA%/NexusCodex/ComputerUse には、インストール済みヘルパー、記憶するよう選択したルーチンのレシピ(静的なインターフェースラベルのみ。ドキュメントのテキストや入力値は保存しません)、セッションごとのメトリクス(アクションの種類、結果、手法、所要時間。UI テキスト、スクリーンショット、入力値、タイトルは含みません)、ウィンドウのキャプチャを保存します。キャプチャは直近の 32 件のみ保持されます。10 分を超えたキャプチャは、次回のキャプチャ時、サーバー起動時、正常終了時に削除されます(サーバーが強制終了された場合、キャプチャは次回起動まで残ることがあります)。~/.nexus には、共有のフォアグラウンドトークンと緊急停止状態を保存します。%LOCALAPPDATA%/NexusJournal/windows/codex(または NEXUS_JOURNAL_HOME)には、他の NexusWindows ツールと同じ形式の短い月次 JSONL ジャーナルを保存します(アプリの実行ファイル名、アクション、手法、結果、所要時間、フォアグラウンドが使用されたかどうか)。UI テキスト、入力値、タイトル、パスは含みません。サーバーがこれを削除することはありません。
  • 削除方法:これらのフォルダー(および %LOCALAPPDATA%/NexusJournal)と、Codex からサーバーまたはスキルを削除します。

ご質問や懸念がある場合は、このリポジトリで issue を作成してください。

制限事項

  • サポート対象であっても、すべての Windows アプリケーションが認定されているわけではありません。キャンバス、3D ビュー、アクセシビリティプロバイダーのないコントロールでは、スクリーンショットと物理的な操作が引き続き必要です。
  • メッセージ手法は、実際のクリックで送信される通知をエミュレートします。実際のマウス入力にしか反応しないアプリでは認識されず、後条件によって結果が判定されます。
  • 生のクリック、ホイール、キーボードショートカット、および Edit コントロールのないリッチエディターでは、引き続き物理入力が必要です。Tk には UI Automation がなく、投稿された入力を無視します。
  • アクセシビリティツリーに痕跡がない効果は、「効果なし」と区別できません。効果を確認する後条件を指定するか、fallback:false を指定してください。
  • launch は、ウィンドウをプロセスによって起動に帰属させ、proof でその方法を示します。process はシェルが返したプロセスです。application は、実行ファイル名または Store ID で指定されたアプリケーション(ランチャーが別のプロセスに処理を引き継ぐことがあります)の場合に、リクエスト後に起動したそのアプリケーションのプロセスを示します。application を使うと、同じタイミングで別のものによって起動された同じアプリケーションの別インスタンスが、対象とみなされる可能性があります。ファイルとフォルダーには絶対パスが必要です。シェルがそれらを表示するプロセスを返さない限り、ウィンドウは候補として返されます。
  • スキルにおける Sky の物理入力は、Codex REPL の外ではテストできません。そのオーケストレーション(一時停止、トークン、チャンク、中断)はオフラインテストのみで検証されます。MCP サーバーが Sky を使うことはありません。
  • スキル、コメント、および一部のメッセージは、特定のユーザーに向けて書かれており(そのユーザーの名前が記されています)、一部はフランス語です。

開発

pwsh -NoProfile -File test.ps1         # node tests + helper build in a temp folder; never touches %USERPROFILE%\.nexus
pwsh -NoProfile -File test.ps1 -Full   # also real token/stop tests and the background validation on the fixture

ライセンス

MIT。詳細は LICENSE を参照してください。Copyright (c) 2026 Julien Piron.

コメント

MCP は初めてですか?

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

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