Ghost について
Ghost は、Windows と Linux 上のエージェントやスクリプト向けの MCP サーバー兼デスクトップ自動化レイヤーです。ネイティブアプリ、ウィンドウ、シェル、ブラウザーをバックグラウンドで操作し、各操作の成否を確認します。
主な機能
- 01バックグラウンドでのデスクトップ操作
- 02アクセシビリティによる要素検出
- 03操作結果の検証
- 04ウィンドウ、シェル、ブラウザーツール
- 05CLI とローカル REST API
活用シーン
- 01API のないレガシーアプリの自動化
- 02フォーカスを奪わない GUI 操作
- 03デスクトップ操作の成否確認
- 04ウィンドウとブラウザータブの制御
MCP 対応
Ghost は `ghost-mcp` サーバーを通じて、アプリ、ウィンドウ、シェル、ブラウザーを操作するツールを公開します。MCP クライアントは共通の操作・検証フローを利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Ghost
Windows と Linux 上で、エージェントとプログラムのために、デスクトップ全体を検証済みで制御します。 Ghost は、Claude Code、Codex、Cursor、あらゆる MCP ハーネス、または単なるスクリプトに、オペレーティングシステム自身の制御サーフェスを与えます。すなわち、API を持たないアプリ、ウィンドウ、シェル、そしてすでにログインしているブラウザーです。しかも、画面やカーソルを奪うことなくバックグラウンドで、すべてのアクションが実行されたことを証明しながら行います。
Playwright のようなものですが、ネイティブデスクトップ向けであり、エージェントのために作られています。Ghost が知覚、実行、検証を行い、必要とされる確認はすでに実行中のモデルが行うため、ビジョン API キーを設定する必要はありません。
1 つの MCP サーフェス、2 つのエンジン: Windows では Win32 UI Automation、Linux では D-Bus 上の AT-SPI2 です。動詞、ロケーターの階層、そして実行してから検証するループは一度だけ書かれており、両方で同じように動作します。プラットフォーム対応 · Linux セットアップ
Ghost が他と異なる理由
- バックグラウンドで動作し、それが強制されます。 エージェントは、あなたが別のウィンドウで作業を続けている間に、アプリ内でクリック、入力、ショートカットの使用ができます - フォーカスを奪うことも、カーソルが飛ぶこともありません。実際のコントロールにはウィンドウメッセージを送信し、ウィンドウを持たないコントロールには UI Automation パターンを使用します。ほとんどのツールはフォアグラウンドにあるものしか操作できません。0.19 以降、これは設定ではなくポリシーです。フォーカスポリシーはデフォルトで
backgroundになります。0.20 以降、これは構築的でもあります。Ghost が起動するもの (アプリ、ウィンドウ付きブラウザー) は、独自の入力キューを持ちあなたのフォアグラウンドを奪えない非表示のデスクトップ上で生まれ、通常の動詞はウィンドウタイトルによってそこを操作します。本当にバックグラウンドの経路が存在しない呼び出しは、黙って画面を奪うのではなく、そのアクションを名指しして失敗します。0.22 以降、ポリシーはそこでロックされます。どのツール呼び出しもそれを引き上げることはできないため、エージェントが独断であなたのマウスを奪うことはできません。サーバーの環境でGHOST_FOCUS_LOCK=offを設定すれば、あなた自身は可能です。そして 0.23 以降、自らフォアグラウンドを奪うウィンドウ - ブラウザーは自身のアクセシビリティ呼び出しでそうします - はすぐに返されるため、あなたの入力は見ている場所へそのまま続きます。実際のデスクトップ上で、人がずっと入力し続ける状態で計測したところ、1 回の実行でおよそ 490 回のキーストロークのうち、エージェントが操作していたウィンドウに届いたのは 0 回から 1 回でした。 (方法) - 決してあなたのウィンドウを誤って操作しません。 セッションは、エージェントが最後に名指しまたは起動したウィンドウを記憶しており、ウィンドウを対象とするすべての動詞はデフォルトでそれを対象にします。人間のフォアグラウンドウィンドウが使用されるのは、何も固定されたことがない場合のみで、その旨が応答に記載されます。3 週間分の実際のトランスクリプトでは、これ以前の最大の失敗は「フォアグラウンドウィンドウに要素が見つかりません」でした。それは、エージェントがあなたが開いていたウィンドウを検索していたのです。
- 複数のエージェントを同時に。 リクエストは並列にディスパッチされるため、あるタブでの 15 秒の待機がその後ろの即時クエリを停滞させることはなく、2 つ目の Ghost プロセスはマウスを奪い合うことなく最初のプロセスと並んで独自のブラウザーを実行します。
- あなたのマシンで証明できます。
ghost verifyは stdio 経由で実際の MCP サーバーを操作し、上記のすべての主張を厳密なタイミング予算に対して監査し、あなたのハードウェアでいずれかが成立しなければ非ゼロで終了します。 - すべてのアクションが検証されます。 Ghost は操作後に画面を再確認し (またはコントロールの値を読み返し)、
verified/focus_confirmedを返します - 盲目的なok:trueは決して返しません。エージェントは、操作はしたものの成功したかどうかがわからないことで失敗します。Ghost はそのループを閉じます。 - API を持たないアプリを操作します。 レガシーな Win32、WPF、Electron、UWP、ベンダーポータル - 統合機能がなく、自動化が最も必要なソフトウェアです。CDP もブラウザーも、アプリの協力も不要です。
- vision キーは不要。 Ghost を操作するモデルは、
ghost_see(名前、ロール、画面上の中心を持つすべての要素) またはghost_screenshot自体を読み取ります。Ghost 自体の vision 層はオプションで、独自のモデルを持たない呼び出し元のために存在し、設定するまでオフです。 - アクセシビリティネイティブで深い。 OS 自体のアクセシビリティ API による実際の要素検出 - Windows では UI Automation、Linux では AT-SPI2 - であり、ピクセル推測ではありません。要素は実際の名前、ロール、境界とともに返されます。
1 つのスクリプトで確認できます。examples/background_agent_demo.py は、フォアグラウンドをあなたのものに保ったまま、バックグラウンドでアプリを操作します。
Playwright-MCP / cua-driver / Computer Use との正直な比較:
docs/comparison.md。
主な用途
Vision はそのごく一部にすぎません。典型的なセッションでは、エージェントは Ghost を主に、操作を実行するため、ウィンドウやプロセスを管理するため、コマンドを実行するため、そして状態を読み戻すために呼び出します。
| 用途 | ツール | 典型的な呼び出し元 |
|---|---|---|
| API を持たないアプリの操作: インストーラー、レガシーな業務ソフトウェア、ベンダーポータル、WPF や Electron のツール | ghost_act、ghost_key、ghost_scroll、ghost_drag | エージェント、RPA スクリプト |
| ウィンドウとプロセスの制御: 不可視での起動、フォーカス、最小化、復元、終了、非表示ウィンドウの復旧、孤立したブラウザの一掃 | ghost_window、ghost_desktop_*、ghost_stats | エージェント、運用スクリプト |
| エージェント用のターミナル: ビルド、git、CLI、永続的な PowerShell の状態、別の Claude Code セッションの起動 | ghost_shell、ghost_run | Windows 上のコーディングエージェント |
| すでにサインイン済みのブラウザを DevTools ポート経由で操作: タブ、ナビゲーション、DOM のクリック、JS 評価、ページテキスト | 19 個の ghost_browser_* および ghost_tab_* ツール | エージェント、Web 自動化 |
| エクスポート機能を持たないアプリからのデータ読み取り: アクセシビリティテキスト、タブテキスト、OCR | ghost_see mode=text、ghost_tab_text | エージェント、レポート作成スクリプト |
| 「うまくいったか」を機械的に確認: 要素の存在、値の一致、アイドル状態やテキストの待機 | ghost_assert、ghost_wait | QA エージェント、CI |
| 分離されたデスクトップ: 夜間の GUI 作業や、人の画面に一切触れない並列エージェント | ghost_window op=launch、フォーカスポリシー、ghost_desktop_* | 自律実行 |
| リトライと条件を備えた再現可能なマルチステップフロー、モデルを介在させない | ghost run、POST /run、ghost_execute_intent によるインテント | スケジュールされたジョブ |
| 入力を拒むアプリへの橋渡しとしてのクリップボード | ghost_clipboard | 上記すべて |
すべての行は同じ保証のもとで実行されます。アクションは verified を返し、デフォルトポリシーがあなたのフォアグラウンドを奪うことはなく、Ctrl+Alt+G ですべての Ghost プロセスを一度に停止できます。
Ghost とは?
Ghost はモデルとデスクトップの間にあるレイヤーです。モデルが推論を行い、Ghost はオペレーティングシステムと同じように画面を見て、フォアグラウンドに触れることなく実際のコントロールを操作し、その操作が成功したかどうかを報告します。これにより、任意のデスクトップアプリケーション - ネイティブ Win32、Electron、WPF、UWP、GTK、Qt、その他 - を、エージェント、スクリプト、またはプログラムからプログラム的に制御できます。
Windows では、要素の検出に UI Automation、キーボード/マウスの注入に SendInput、画面キャプチャに DXGI/GDI を使用します。Linux では、検出と操作に D-Bus 経由の AT-SPI2、入力に XTEST(X11)または RemoteDesktop ポータル / uinput(Wayland)、キャプチャに X11 の GetImage または Screenshot ポータルを使用します。Linux エンジンは純粋な Rust です - インストールが必要な -devel パッケージはありません。
3 つの方法で提供できます:
ghost-mcpサーバー - 主要なインターフェース: Claude Code、Claude Desktop、Codex、Cursor、およびあらゆる MCP クライアント向けの Model Context Protocol サーバー(Windows では 54 のツール)ghostCLI - ワンショットコマンド。スクリプトや CI に最適(ghost click --name "Submit")ghost-httpサーバー - ローカル REST API。Python、Node、curl など何からでも呼び出せます(curl http://127.0.0.1:7878/list-windows)
MCP のインターフェースは、20 のデスクトップ動詞、バックグラウンドで個々のブラウザタブ(Chrome、Comet、Edge、Brave)を操作するための 19 の ghost_browser_* / ghost_tab_* ツール、そして 15 の Windows 専用ツールで構成されています: フォーカスポリシーと、ユーザーには決して見えない分離された Windows デスクトップを明示的に制御するための ghost_desktop_* です。デフォルトのポリシーでは、後者が必要になることはほとんどありません: ghost_window op=launch はすでに隠しデスクトップ auto 上でアプリを起動し、ghost_see / ghost_act / ghost_key / ghost_scroll は window=<title> を使って、自分のデスクトップ上のウィンドウに到達するのとまったく同じようにそこに到達します(どちらであるかはレスポンスの target.surface が示します)。UIA、ウィンドウメッセージ、キャプチャはそこでも完全に機能します。実際の SendInput は機能しません。Windows は入力デスクトップ以外での使用を拒否するためであり、入力はコントロールの値を読み返すことで検証されるため、ポストされた文字を破棄するターゲットは偽の成功ではなくエラーを返します。デスクトップ動詞とブラウザツールは Linux でもビルドできますが、フォーカスポリシーと隠しデスクトップは Windows 専用です。
Claude は不要です。ブラウザも不要です。CDP も不要です。OS 自身の自動化 API と入力 API を通じてアプリを操作するため、独自の API も自動化フックも持たないネイティブアプリで動作します - アプリが自動化を前提に作られているかどうかに関わらず、同じ信頼性を発揮します。
プラットフォーム
| プラットフォーム | ステータス | エンジン |
|---|---|---|
| Windows | ✅ 完全対応・検証済み | ghost-core - Win32 UI Automation、SendInput、ポストされたウィンドウメッセージ、DXGI/GDI キャプチャ |
| Linux, X11 | ✅ 機能的 - 実際の GTK アプリに対するライブ CI テストで検証済み | ghost-linux - D-Bus 経由の AT-SPI2、XTEST 入力、X11 GetImage キャプチャ |
| Linux, Wayland | ⚠️ 実装済み、未検証 - ハードウェア上で実行したテストはありません | 同じ AT-SPI2 の検出とアクション。入力とキャプチャは代わりに RemoteDesktop / Screenshot ポータルまたは uinput を経由します |
| macOS | 🚧 スキャフォールド | Accessibility + CGEvent + ScreenCaptureKit - Mac 上で構築予定 |
Wayland は脚注ではなく独立した行にする価値があります。現行の Ubuntu と Fedora ではデフォルトのセッションであり、ほとんどの Linux ユーザーが実際に使う環境であるにもかかわらず、テストが一切ない部分だからです。検出とアクションのレイヤーは X11 と共有されており、カバーされています。そしてここで最も重要なレイヤーでもあります - AT-SPI2 はアプリケーションに処理を依頼するため、移動すべきポインターも、前面に出すべきウィンドウもありません。未検証なのはその下にあるフォールバックです: ポータル入力、ポータルキャプチャ、uinput。Wayland を使用している場合は、ghost doctor を最初に実行するものと考え、バグ報告を前提としてください。報告は歓迎され、この行が変わる最速の方法です。
ghost-session と ghost-mcp は共有されています: ロケーターティア、グラウンディングカスケード、実行してから検証するループ、および 20 個のコア MCP 動詞は一度だけ書かれ、両方のプラットフォームで動作します。変わるのはその下のエンジンだけであり、1 行の cfg エイリアスの背後にあります。ブラウザーとタブのツールはエンジン非依存で両方向けにビルドされます。フォーカスポリシーと分離デスクトップは Windows 専用であり、偽装されることなくそのように報告されます。
この優位性は移植後も生き残ります。 Windows では、フォーカスを奪わずにアプリを操作することは、ポストされたウィンドウメッセージの上に構築されています。Linux には AT-SPI2 アクションという、よりクリーンな類似物があります: アプリケーションが自身のツールキットを通じて操作を実行するため、移動すべきポインターも、前面に出すべきウィンドウもありません。このレイヤーは X11 と Wayland で同じコードです。合成入力はその下にあるフォールバックにすぎず、そのフォールバックこそが Wayland でテストされていない部分です。
これは主張ではなく、テストされています: CI は実際のデスクトップ (Xvfb + D-Bus + at-spi-bus-launcher) を起動し、実際の GTK アプリケーションを操作し、AT-SPI 経由で書き込まれたテキストがアプリから読み戻せること、およびボタンの呼び出しが実際にダイアログを閉じることを要求します。Wayland ポータルの入力とキャプチャは実装されていますが、ハードウェア上ではまだ検証されていません。
Linux のセットアップ、検証チェックリスト、および正直な制限事項:
docs/linux-fedora.md。3 つすべてにわたる機能マトリクス: docs/cross-platform.md。
Ghost は汎用の自動化ツールです。所有しているシステム、または自動化する権限があるシステムで、操作対象ソフトウェアの利用規約に従って使用してください。
インストール
ワンクリック - MCP バンドル(無料)。 各リリースでは、Releases ページで ghost-windows-x64.mcpb と
ghost-linux-x86_64.mcpb が配布されます。
MCP バンドルをサポートするクライアントでこれを開くと(Claude Desktop: 設定 -> 拡張機能 ->
ファイルからインストール)、Ghost が登録されます。PATH や設定の編集は不要で、API キーも不要です。Ghost は
MCP レジストリ にも io.github.NORTHTEKDevs/ghost として登録されているため、
レジストリ対応のクライアントはそこからインストールできます。バンドルに含まれるのは ghost-mcp サーバーのみで、
CLI と HTTP サーバーは以下のアーカイブに含まれています。
ビルド済みバイナリ(無料)。 各リリースでは、チェックサムで署名された 両プラットフォーム向けアーカイブが Releases ページで配布されます:
# Linux x86_64
curl -LO https://github.com/NORTHTEKDevs/ghost/releases/latest/download/ghost-linux-x86_64.tar.gz
curl -LO https://github.com/NORTHTEKDevs/ghost/releases/latest/download/ghost-linux-x86_64.tar.gz.sha256
sha256sum -c ghost-linux-x86_64.tar.gz.sha256
tar -xzf ghost-linux-x86_64.tar.gz && ./install.sh
Windows: 同じページから ghost-windows-x64.zip をダウンロードしてください。チェックサムを検証し、
解凍して、そのフォルダーを PATH に追加します。その後 ghost doctor を実行してください。
ダウンロード元を確認する。 すべてのリリース成果物には、署名された ビルド来歴の証明が付与されているため、あるファイルが特定のコミットにおいて このリポジトリのリリースワークフローから生成されたものであり、他のどこからでもないことを証明できます:
gh attestation verify ghost-windows-x64.mcpb --repo NORTHTEKDevs/ghost
バイナリはまだコード署名されていないため、Windows SmartScreen が初回実行時に警告を表示します(詳細情報
→ 実行をクリックしてください)。この警告は発行元の身元に関するもので、検証済みの法人格に紐づく有償の証明書が必要です。
上記の証明は来歴に関するより強力な表明であり、費用もかかりませんが、Windows はそれを読み取りません。
証明書が設定され次第、任意の CA からパイプラインが署名します - 詳細は
docs/code-signing.md、および
何が、誰によって署名され、何があなたのマシンから出ていくのか(ビジョンキーを設定しない限り何も出ません)については
docs/signing-policy.md を参照してください。ウイルス対策エンジンがリリースを隔離した場合は、
チェックサムを検証し、バイナリが認識可能であり続けるために何を行っているか、および
誤検知を報告する方法について docs/antivirus.md を参照してください。このキットが買うのは利便性であり、機能ではありません - Ghost ができることのすべては
以下の無料のソースに含まれており、自分でビルドするのはコマンド 1 つで済みます。
オプション C - ソースからビルド(無料、MIT)。 Ghost はオープンソースです。自分でコンパイルしてください:
git clone https://github.com/NORTHTEKDevs/ghost
cd ghost
cargo build --release --bin ghost --bin ghost-http --bin ghost-mcp
# binaries in target/release/
要件: Windows 10 build 19041 以降、または at-spi2-core を備えた Linux(Rust
stable はソースからビルドする場合のみ必要です)。
Linux の場合:
sudo dnf install at-spi2-core xdg-desktop-portal xdg-desktop-portal-gnome
gsettings set org.gnome.desktop.interface toolkit-accessibility true
./scripts/install.sh # build, install, register the MCP server, run doctor
-devel パッケージは不要です - Linux エンジンは純粋な Rust です。完全なセットアップと
トラブルシューティング: docs/linux-fedora.md。
まず自分のマシンを確認してください:
ghost doctor
PASS/WARN/FAIL を報告し、FAIL があれば終了コード 1 で終了します。issue を開く前にこれを実行してください - 通常は問題をずばり指摘してくれます。
- Windows: ビルドバージョン、対話型デスクトップ、UI Automation、DPI 対応、 モニターレイアウト、画面キャプチャ、オプションのビジョン認証情報。
- Linux: セッションタイプ(X11/Wayland)、AT-SPI バスの到達可否、アプリケーションが 実際にアクセシビリティツリーを公開しているかどうか、選択された入力 バックエンド、画面キャプチャ。
クイックスタート - コーディングエージェントと MCP クライアント
これは Ghost が想定して作られた導線です。設定は不要で、API キーもありません。
Claude Desktop: 最新リリースから ghost-windows-x64.mcpb(または Linux バンドル)をダウンロードして開きます:
Settings -> Extensions -> Install from file。
Claude Code:
claude mcp add ghost --scope user -- C:/path/to/ghost-mcp.exe
その他の MCP クライアント(Codex、Cursor、カスタムハーネス): バイナリを stdio サーバーとして登録します。
{
"mcpServers": {
"ghost": { "command": "C:/path/to/ghost-mcp.exe" }
}
}
Ghost は MCP レジストリにも io.github.NORTHTEKDevs/ghost として登録されており、そこからインストールするクライアントで利用できます。
リポジトリの Dockerfile はヘッドレスイメージ(docker build -t ghost-mcp .)をビルドします。これはディスプレイなしで initialize と tools/list に応答し、レジストリや CI がサーバーをイントロスペクトするために使用します。コンテナには操作対象のウィンドウがないため、実際に使用するためのインストール手段ではありません。
エージェントがどのように使うか。 ループは「見る、操作する、確認する」です:
ghost_see window="Invoice Editor"- ウィンドウ内のすべての要素を、その名前、ロール、有効状態、画面上の中心とともに取得します。テキストモードでは代わりに読み取り可能なテキストを抽出し、トークン数は画像の約10分の1になります。ghost_act window="Invoice Editor" name="Save" action="click"- Ghost はバックグラウンドでコントロールを操作し、画面またはコントロールの値が操作の成功を示した場合にのみverified: trueを返します。ghost_screenshot window="Invoice Editor"- ピクセル情報です。レイアウト、チャート、キャンバスをモデル自身の目で見る必要がある場合に使います。
モデルはステップ1とステップ3を読んで判断します。Ghost が画像の意味を推測する必要はなく、ビジョン用のキーも関与しません。
ループ以外にも: ghost_shell はコマンドと永続的な PowerShell セッションを実行し、ghost_window はウィンドウの起動、一覧表示、フォーカス、復元、クローズを行い(デフォルトでは非表示のデスクトップ上)、ghost_assert と ghost_wait は「うまくいったか」をチェックに変え、ghost_tab_* ツールはすでにサインインしているブラウザを操作します。実際のセッションでは、目視よりもこれらの呼び出しに多くの時間を費やします。
Windows では 54 個のツールがあります(レガシー名も引き続きディスパッチ可能): see/snapshot/find/act/keys/scroll/drag/clipboard/screenshot/windows/shell/waits/query/run をカバーする 20 個のデスクトップ動詞、19 個の ghost_browser_* / ghost_tab_* ツール、そしてフォーカスポリシーと分離デスクトップ用の Windows 専用ツール 15 個です。ダウンロードではなくソースからビルドする場合: cargo build -p ghost-mcp --release。
すべてのツールは独自のタスクで実行されるため、遅い呼び出しが速い呼び出しをブロックすることはなく、2 つ目の Ghost プロセスを 1 つ目と並行して実行できます。マウントしたら、ghost verify を実行してご自身のマシンで監査してください。
速度。 Ghost 自体の所要時間はわずかです: テキスト読み取りで約 75 ms、検証済みクリックで 200 ms、ウィンドウ一覧表示で 1 ms です。エージェントセッションを遅くするのは呼び出しの前後に起こることですが、3 つの習慣でそのほとんどを排除できます。ウィンドウを一度名付けたら、以降は window= を省略します。アンカーはハンドルによってそのウィンドウを追跡し、以前のタイトルでも応答に title_drift が含まれて即座に解決されます。期間ではなく条件を待ちます: ghost_wait for=element、for=value、for=navigate(バックグラウンドでアドレスバーを設定し、タイトルが変わったときに返ります。固定スリープが 6 秒かかるところを約 0.4〜1.4 秒)は、その出来事が起きた瞬間に返ります。ghost_run でバッチ処理し、1 回のモデルターンで複数のステップを実行します。scripts/speed-probe.mjs はこれらすべてを任意の ghost-mcp バイナリに対して測定します。
シェル制御 (ghost_shell)
Ghost は GUI および コマンドラインを操作します。ghost_shell はターミナルコマンドと
永続的な PowerShell セッションを実行します - ビルド、git、CLI、ファイルツールを持たない
ホスト上でのファイル編集、アプリの起動などです。op=run はワンショット実行
(powershell/pwsh/cmd) です。op=open は永続的な PowerShell を起動し、その変数と
cwd は op=send 呼び出しをまたいで維持されます。出力は stdout+stderr がマージされ、
エージェントのコンテキストウィンドウに合わせて末尾が切り詰められます。タイムアウトした
コマンドは実行を続け、op=read で排出されます。ghost_stop は暴走したコマンドを強制終了
します。デフォルトの powershell を使用した op=run は、事前に起動済みのスペアプロセス
から処理されるため、コマンドのコストは新規 PowerShell 起動にかかる 230~450 ms ではなく
約 85 ms になります (スペアは 1 回限りの使用で即座に置き換えられます。
GHOST_SHELL_WARM=off で無効化できます)。
エージェントから新しい Claude Code セッションを起動します:
ghost_shell op=run cmd='Start-Process wt -ArgumentList "pwsh","-NoExit","-Command","claude"'、
その後、新しいターミナルウィンドウを ghost_see / ghost_act / ghost_key で操作します。
セキュリティ: シェルアクセスは強力です。サーバーの環境で GHOST_SHELL=off を設定すると、
この動詞を完全に無効化できます - その場合、すべての op は明確な拒否を返し、GUI 自動化の
動詞は完全に使用可能なままです。
クイックスタート - CLI
# Launch Notepad and type into it
ghost launch notepad.exe
ghost focus-window "Notepad"
ghost type --role edit --text "hello from ghost"
# Keys and hotkeys
ghost press Enter
ghost hotkey --mods Ctrl --key s
# Screenshot
ghost screenshot --out shot.png
# Enumerate windows or UI
ghost list-windows
ghost describe --window "Notepad"
# Click at coords or by name
ghost click-at 500 300
ghost click --name "Save"
# Run a JSON intent (finite-state machine with retries, timeouts, conditions)
ghost run my-flow.json
echo '{"ops":[{"op":"launch","exe":"notepad.exe"}]}' | ghost run -
すべてが JSON を出力するため、jq やスクリプトへのパイプが簡単です。
クイックスタート - HTTP サーバー
サーバーを起動します:
ghost-http --addr 127.0.0.1:7878
その後、任意の言語から:
# Bash / curl
curl http://127.0.0.1:7878/list-windows
curl -X POST http://127.0.0.1:7878/click \
-H 'content-type: application/json' \
-d '{"name":"Submit"}'
curl http://127.0.0.1:7878/screenshot -o shot.png
# Python
import requests
requests.post("http://127.0.0.1:7878/launch", json={"exe": "notepad.exe"})
requests.post("http://127.0.0.1:7878/type",
json={"role": "edit", "text": "hello from python"})
// Node
await fetch("http://127.0.0.1:7878/hotkey", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ mods: ["Ctrl"], key: "s" }),
});
エンドポイント: /health、/tools、/click、/click-at、/type、/press、/hotkey、/screenshot、/launch、/list-windows、/focus-window、/window-state、/describe、/clipboard (GET/POST)、/run。
クイックスタート - Rust SDK
[dependencies]
ghost-session = { git = "https://github.com/NORTHTEKDevs/ghost" }
use ghost_session::{GhostSession, By, session::Region};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let session = GhostSession::new()?;
session.launch("notepad.exe").await?;
let edit = session.find(By::role("edit")).await?;
edit.type_text("hello world")?;
let png = session.screenshot(Region::full()).await?;
std::fs::write("screen.png", png)?;
Ok(())
}
信頼性モデル
MCP クライアントから操作されるデスクトップ自動化は、フォーカス環境が厳しいものです。ツール 呼び出しの合間には、クライアント自身のターミナルが通常 OS のフォーカスを取り戻します。Ghost は そのために作られています:
ghost_actはアトミックです - 画面差分による find → act → verify。1 回の呼び出しで完結し、 呼び出し間の競合はありません。デフォルトのbackgroundポリシーではその場でコントロールを操作し、 ウィンドウを前面に出すことはありません。ポリシーを引き上げると、さらに先に対象のウィンドウを フォアグラウンドへ持ち上げます(AttachThreadInput、確認済み)。- すべてのアクション応答は正直です:
verified(画面が実際に変化したか)、focus_confirmed(正しいウィンドウがフォアグラウンドだったか)、そしてどちらかが外れている場合のwarning- 盲目的なok:trueは決して返しません。アクションを再発行する前にverifiedを確認してください。 - 実行中のままになるものはありません。 Ghost が起動するブラウザーは kill-on-close ジョブ
オブジェクト内にあり、サーバーが終了すると、その終わり方にかかわらず、ブラウザーも一緒に終了します
(起動応答の
dies_with_server)。起動時には、以前のサーバーが放棄したブラウザーもサーバーが一掃し、ghost_stats.orphan_sweepで報告します。 - ウィンドウにアンカーする -
ghost_see、ghost_find、ghost_act、ghost_key、ghost_click_at、ghost_scroll、ghost_wait、ghost_assert、ghost_screenshot(full=trueでない場合)はすべてwindowを受け取ります(タイトルの部分文字列で、デスクトップと Ghost の隠しデスクトップを横断して解決されます。完全 一致が前方一致に勝ち、前方一致が部分一致に勝ち、最小化されていないウィンドウが同点の場合に優先されます)。この一致がセッションの アンカーになります。以降のwindowなしの呼び出しはそれ を対象とし、人間がたまたま使っているウィンドウを対象にすることは決してありません。ghost_window op=focusは background ポリシーの下で前面に出さずにアンカーします。op=anchorは設定、クリア、または報告を行い、すべての 応答にtarget {hwnd, title, surface, source}が含まれます。何にも一致しないタイトルの場合は、開いているウィンドウを一覧表示し、コード -32007 を返します。 - 自分のブラウザーを、それ自身のプロトコル経由で - ウィンドウのプロセスが
--remote-debugging-port付きで起動されている場合(Comet、Chrome、Edge、Brave)、同じアンカー付きの動詞が UI Automation ではなく DevTools プロトコルを経由してルーティングされます。まばらなツリーではなく DOM の名前とaria-label、再レンダリングを生き残るセレクター、そのレンダラーへの信頼済み入力イベント、完全な修飾キーの組み合わせ、そしてdocument.hasFocus()を確認するページでも入力を 受け付けるフォーカスエミュレーション。これによりフォアグラウンドに到達することはありません。応答にはroute: {browser, port, tab}とcoords: viewportが含まれます。ポートのないブラウザーは UI Automation パスが変更されないままです。GHOST_CDP_ROUTE=offで無効にできます。これを得るには Comet または Chrome を一度--remote-debugging-port=9333付きで起動してください。 - 見つからない場合は代替を名指しします - 「要素が見つかりません」の後には、そのウィンドウ内で最も近い
要素名が続くため、エージェントはアプリがそのものを何と呼ぶかを知るために
ghost_seeに往復を費やすことはありません。 - 重複を区別する - 複数の要素が名前/ロールを共有している場合(複数の「タブを閉じる」ボタンなど)、
indexは n 番目の一致を選択します。応答にはmatches数が含まれます。 - 自己監査します - 独立したサンプラーがフォアグラウンドウィンドウと
OS の最終入力時刻を監視します。背後に実際のハードウェア入力がないフォアグラウンドの変化は
合成として記録され、そのとき実行中だったツール呼び出しも記録されます。
ghost_statsは その集計を報告するため、主要な主張は一度だけでなく継続的に証明されます。 - 読み取る、スクリーンショットしない -
ghost_see mode=textはウィンドウ/ページの読み取り可能なテキストを アクセシビリティツリーから直接抽出します。画像より高速で、トークンも約 10 倍安価です。 - レイテンシは可視化されます: すべての応答に
msが含まれ、find がネットワーク VLM の往復を支払わなければならなかった場合はescalated: trueが示します(ローカル層: cache → UIA → OCR はすべてオンデバイスです)。 - Windows が消えることはありません: 最小化されたウィンドウは
ghost_window listに(state付きで)残り、op=focusが自動的に復元します。何かが完全に隠したウィンドウ(可視ではなく、最小化でもない)は、op=list include_hidden=trueでstate: "hidden"として表示され、op=state state=restoreがアクティブ化せずに元に戻します。op=stateは Ghost 自身の隠しデスクトップ上のウィンドウにも到達するため、op=launchで起動したアプリ を名前で閉じることができます。 - 停止は常に機能します:
ghost_stopは到着した瞬間に実行中の呼び出しを先取りし (専用の stdin リーダー)、Ctrl+Alt+G は OS レベルのキルスイッチとして残ります。
バックグラウンドモード (agent-harness / computer-use)
エージェントハーネス (OpenClaw、Hermes/cua-driver、および任意の MCP クライアント) は、 computer-use ツールをマウントして、LLM がデスクトップを操作できるようにします。Ghost はそのツールであり、 フォーカスを奪ったりカーソルを移動したりせずに動作するため、エージェントがアプリを操作している間も、 あなたは別のウィンドウで作業を続けられます。
0.19 以降、これがデフォルトであり、強制されます。プロセス全体のフォーカスポリシーは
background から始まり、実際のカーソルやフォアグラウンドウィンドウを取得しないと動作できない
すべてのプリミティブは、このポリシーによって制限されます。暗黙のフォールバックはありません。
バックグラウンドの経路を持たない呼び出しは、そのアクションと、ポリシー変更を必要としない経路
(非表示デスクトップ上でアプリを起動する、または CDP 経由でブラウザーを操作する) を示すエラーを返します。
0.22 以降、ポリシーはそこでロックもされます。デフォルトは、エージェントがそれを覆せない場合に
のみ約束になります。0.22 より前は、バックグラウンドアクションが拒否されたまさにその瞬間
(人間が Ghost のマウス移動に気づくまさにそのとき) に、任意のエージェントが
ghost_set_focus_policy foreground を呼び出せました。今ではその呼び出しも拒否され、
そう告げるエラーが返されます。鍵はオペレーターのものであり、エージェントのものではありません。
MCP サーバーの環境 (あなたが記述するホスト設定) で GHOST_FOCUS_LOCK=off を設定すると、
prefer_background と foreground を再び許可でき、任意で GHOST_FOCUS_POLICY を設定すると
そこから開始できます。ghost_focus_policy はポリシーと、それがロックされているかどうかを報告し、
サーバーは起動時に両方をログに出力します。
// Only if you WANT an agent to be able to drive your real mouse and keyboard:
{ "mcpServers": { "ghost": {
"command": "ghost-mcp",
"env": { "GHOST_FOCUS_LOCK": "off", "GHOST_FOCUS_POLICY": "background" }
}}}
あなたが同意する内容
Ghost には、エージェントがあなたのコンピューターをどこまで利用できるかを決める 2 つの設定があります。 バンドルをインストールすると、両方がチェックボックスとして表示されます。バイナリを直接実行する場合、 これらは環境変数です。サーバーは起動時に両方の状態を出力するため、ホストのログが常にその問いに 答えます。
| 設定 | デフォルト | 「オン」の意味 |
|---|---|---|
Ghost をマウスとキーボードから遠ざけておく (GHOST_FOCUS_LOCK) | オン | エージェントはフォーカスポリシーを決して引き上げられないため、バックグラウンドでウィンドウを操作し、あなたのカーソルを取得できません。エージェントに実際の入力を使用させたい場合にのみオフにしてください。 |
シェルコマンドを許可する (GHOST_SHELL) | オン | ghost_shell はあなたのアカウントの権限でプログラムを実行します。これがエージェントがビルド、git、スクリプトを実行する方法であり、ほとんどのエージェントが Ghost を使用する理由です。これはマシンへの完全なアクセスです。オフにすると、すべてのシェル呼び出しが拒否されますが、ウィンドウ、画面の読み取り、入力は引き続き機能します。 |
シェルがデフォルトでオンになっているのは意図的です。それは能力であり、ボーナスではありません。 人々がインストールする目的のものがひっそりと欠けた状態で出荷されるツールは、自分が何をできるかを はっきりと伝えるツールよりも劣っています。それが手放したい範囲を超えているなら、チェックボックスは すぐそこにあり、拒否は明示的です。
ロックされたポリシーでも、Ghost の制御外に 1 つ残ることがあります。アプリケーションは
自身のウィンドウをアクティブにでき、Chromium はエージェントがアクセシビリティ API を通じて
ページに入力したりボタンをクリックしたりするときに、まさにそうします。ブラウザーの外側では
この呼び出しを止められません。そこで 0.23 以降、Ghost はそれを元に戻します。干渉監査は
センチネルも兼ねています。何らかのウィンドウがフォアグラウンドを取得した瞬間
(Windows イベント、約 1 ミリ秒) に通知され、あなた自身がそのウィンドウを選んでいない限り
(クリックするか alt-tab で切り替えることであり、Ghost は合成入力ではなく実際の入力を監視しているため、
入力と区別できます)、すぐに元に戻します。ghost_session_state はそれが発生した回数
(foreground_handed_back) を報告します。
どれほどうまく機能するかは、実行中ずっと人が別のウィンドウに入力している間、
独立したオブザーバーで測定されました (scripts/background-desktop-probe.mjs、
scripts/interference-watch.ps1)。
| 0.23 より前 | 現在 | |
|---|---|---|
| 誤ったウィンドウに配信されたキーストローク | 48 | 約 493 回の 6 回の実行で 1 回 |
| 奪われたフォアグラウンドがどのくらい早く検知されるか | 決して検知されない | 約 1 ms |
| 0.23.2 以降、フォアグラウンドはポーリングではなくイベントによって監視されるため、ウィンドウがフォアグラウンドを取得してから約 1 ミリ秒後にハンドバックが始まります。人がずっとタイピングしている状態での 6 回のクリーンな実行では、Ghost が操作しているウィンドウに入力されたキーストロークは 0、0、0、1、0、0 でした。これは保証ではありません - アクティベーションの取り消しが保証になり得ないのと同じです - そして保証が必要な場合は、Ghost にアプリを起動させてください。そうすればアクティベーション自体が発生しません。 |
一時的なアクティベーションではなくゼロアクティベーションにするには、Ghost にアプリを起動させてください。Ghost が起動するものはすべて独自の入力キューを持つ非表示のデスクトップ上で動作するため、あなたのフォアグラウンドを取得することはまったくできず、Ghost が起動するブラウザは CDP を介して操作されます。
// Drive an app while the human keeps working. No flag needed: background is the default.
ghost_window { "op": "launch", "exe": "notepad.exe" }
// -> { "surface": "hidden", "desktop": "auto", "window": { "title": "Notepad", ... }, "target": {...} }
ghost_act { "role": "edit", "action": "type", "text_input": "hello" } // targets the anchor
// -> { "verified": true, "focus_preserved": true, "cursor_preserved": true, "mode": "hidden" }
ghost_act { "window": "Comet", "name": "Post", "action": "click" } // a window on YOUR desktop
// -> { "verified": true, "focus_preserved": true, "cursor_preserved": true, "mode": "background" }
- 起動が表面化することはありません。 このリポジトリの CI マシンで計測したところ、Edge と Chrome はあらゆる起動スタイル(通常、非表示、最小化、バックグラウンドの親からの起動、-32000,-32000 への配置)で、起動時に最初のウィンドウをアクティブ化します。デスクトップ上で作成されたウィンドウは、存在した瞬間にキーボードを奪います。そのため、バックグラウンドポリシーでは Ghost がデスクトップ上にウィンドウを作成することはありません。
ghost_window op=launch、ghost_runの起動ステップ、およびghost_browser_launch mode=windowedは、独自の入力キューを持つ非表示デスクトップ上で開始され、次のghost_seeで表示されるようにウィンドウが固定されます。起動から操作、終了までの一連の実行を通じて 100 ms 間隔でフォアグラウンドをサンプリングした独立したオブザーバーは、変化がゼロだったと報告しました。 - 投稿されたウィンドウメッセージによる真のバックグラウンド動作。 実際の Win32 コントロールは、
BM_CLICK/WM_LBUTTONDOWN·UP(クリック)、WM_SETTEXT(入力)、WM_MOUSEWHEEL(スクロール)で操作されます。これらはウィンドウをアクティブ化しません。 - 画面を使わない、ウィンドウレスコントロール。 UWP/WinUI/Chromium/Electron のコントロールにはウィンドウハンドルがありません。Ghost はこれらを UI Automation パターンで操作します。クリックには
Invoke、入力にはValuePatternを使用します。Chromium は、Windows が許可した場合(そのブラウザーを先ほど使用した直後など)に自身のウィンドウをアクティブ化することで、これらの一部に応答します。Edge での計測では、Web 入力欄やアドレスバーへのSetValue、ページ上のボタンへのInvoke、投稿されたクリックはいずれも約 90 ms 以内にウィンドウを前面に引き出しました。0.21.10 以降では、これはその場で元に戻されます。Ghost はすべてのユーザーデスクトップ操作の前後でフォアグラウンドを監視し、対象またはそのプロセスのいずれかのウィンドウがフォアグラウンドを奪った場合、30~50 ms で、それまで使用していたウィンドウにフォーカスを戻し、focus_preserved: falseとその旨を示すfocus_guardレコードを報告します。投稿された単一キーはページのフォーカスされた要素に届き、何もアクティブ化しません。 - シェルの子プロセスがターミナルを開くことはありません。 MCP サーバーにはコンソールがないため、そのまま起動されたシェルにもコンソールはなく、そこで実行されたすべてのコンソールプログラム(node、python、cargo、cmd)は、実行時間の間フォアグラウンドを奪う真新しい Windows Terminal ウィンドウを取得していました。
ghost_shellは現在、シェルを非表示のコンソールで作成します。子プロセスはそれを継承し、ウィンドウが現れることはありません。計測結果: 以前は 7 秒間に 9 回のフォアグラウンド変更があり、以後はゼロ、出力は変わらず。 - オクルージョン中でも検証済み。
typeはコントロールの値を読み戻すことで確認されます。clickは、表示されていないウィンドウをレンダリングするPrintWindowの前後差分で確認されます。すべての応答にはverified、focus_preserved、cursor_preservedが含まれます。Ghost は確認できないバックグラウンド操作を主張しません。 - 非表示デスクトップも同じ語彙です。 非表示デスクトップ上のウィンドウも、同じ
window=<title>呼び出しで操作されます。違いはtarget.surface: "hidden"だけです。そこでの Chromium および Electron のウィンドウは、UIA アクションではなく投稿されたメッセージで操作されます(Chromium は、非コンポジットのデスクトップではInvoke/SetValueを約 2 秒の内部待機の後にのみ処理しますが、投稿されたクリックは約 100 ms で反映されます)。また、そこでのソフトウェアレンダリングには数秒かかるため、ピクセル検証はスキップされます。代わりにghost_tab_evalまたはghost_seeで確認してください。実際のSendInputは非表示デスクトップでは依然として機能しません(Windows は入力デスクトップ以外ではこれを拒否します)。そのため、実際のハードウェア入力にのみ応答するアプリには、ご自身のデスクトップでのforegroundポリシーが必要です。 - 単一インスタンスアプリに対して正直です。 Windows 11 のメモ帳、エクスプローラー、またはデフォルトプロファイルのブラウザーは、起動をすでに実行中のプロセスに引き渡し、そのウィンドウはご自身のデスクトップ上に存在します。Ghost はこれを防ぐことはできません。アプリが非表示であると主張するのではなく、警告とともに
surface: "user"を報告します。
click、type、double_click、right_click、hover とスクロール、さらに単一キー用の ghost_key(WM_KEYDOWN/WM_CHAR による Enter/Tab/F キー/文字)をサポートします。background: true フラグは互換性のために受け入れられますが、これがデフォルトの動作です。
クリップボードと編集のコンボはバックグラウンドでも機能します - Ctrl+C、Ctrl+X、Ctrl+V、
Ctrl+Z、Ctrl+A は、アプリが実際に実装しているセマンティックメッセージ
(WM_COPY、WM_CUT、WM_PASTE、WM_UNDO、EM_SETSEL) として送信され、
GetKeyState を読み取るアプリが無視してしまうポストされた修飾キーとしては送信されません。このセット以外のコンボは、暗黙に破棄されるのではなく拒否されます。ポストではそれらのアプリが読み取る修飾キーの状態を設定できないためです。そのようなコンボには foreground ポリシーを使用してください。
ビジョン: あなたのエージェントがモデルです
Ghost は目と手であり、脳ではありません。モデルが MCP 経由で Ghost を操作するとき、見るのはそのモデルです。ghost_see はウィンドウを座標付きの構造化要素として渡し、ghost_see mode=text は読み取り可能なテキストを渡し、ghost_screenshot は構造では不十分なときにピクセルを渡します。Claude、GPT、Gemini、そして強力なオープンウェイトのビジョンモデルは、これらを直接読み取ります。設定すべきキーも設定するものもなく、Ghost がモデルの代わりに画像を解釈する必要は一切ありません。
オプションの組み込みビジョン階層は、独自のモデルを持たない呼び出し元 - CLI、HTTP API、インテントファイル - のために、また、ツリーを自分で読むよりも Ghost に解決してほしい場合の説明ターゲット (ghost_find description="the blue Submit button") の利便性のために存在します。これは、OpenAI 互換エンドポイント (OpenAI、Gemini、Groq、NVIDIA、またはローカルの vLLM / Ollama / LM Studio サーバー) の背後にあるツール対応の任意のビジョンモデル、または Anthropic で動作します。GHOST_VISION_BASE_URL と GHOST_VISION_MODEL をそのエンドポイントに向け、GHOST_VISION_API_KEY を設定してください (キー不要のローカルサーバーにはベース URL のみが必要です)。これがない場合、説明ターゲットは代替手段を明示した明確なエラーを返しますが、その他のすべてのツールは影響を受けません。
緊急停止
いつでも Ctrl+Alt+G を押すと、実行中のすべての呼び出しを即座に停止できます。読み取り専用クエリ (ghost_see、ghost_snapshot、ghost_window の一覧) は応答を続けるため、すべてが停止している間も何が起きたかを確認できます。
- キューに入ったすべてのアクションはキャンセルされます
- 保持されている修飾キー (Shift、Ctrl、Alt) は即座に解放されます
- キーのスタックも、修飾キー状態のスタックも発生しません
- 0.19 以降はセッション全体に適用されます。 この停止は名前付きカーネルイベント (
Local\ghost-emergency-stop-event) であるため、1 回押すだけで、たまたまホットキーを登録したプロセスだけでなく、ログオンセッション内のすべての Ghost プロセスが停止します。ghost_resetは、これらすべてに対して再度サービスを再開します。
要素ロケーター
session.find(By::name("Save")).await? // by accessible name (substring)
session.find(By::role("edit")).await? // by UIA control type
session.find(By::role("button")).await?
CLI から: ghost click --name "Save" または ghost click --role button。
インテント - 宣言的なフロー
再現可能なマルチステップのフローを JSON として記述します。FSM エグゼキューターは、リトライ、タイムアウト、および abort_if / retry_if 用の JSONLogic 条件をサポートします。
{
"ops": [
{ "op": "launch", "exe": "notepad.exe" },
{ "op": "focus_window", "name": "Notepad" },
{ "op": "type", "role": "edit", "text": "hello" },
{ "op": "hotkey", "mods": ["Ctrl"], "key": "s" }
]
}
ghost run flow.json、POST /run、または MCP 経由の ghost_execute_intent で実行します。
アーキテクチャ
ghost-cli ghost-http ghost-mcp Rust SDK
\ | / | |
\ | / | |
+-----> ghost-session <-----|-----------+ ← safe Rust API
/ \ |
ghost-core ghost-linux | ← one cfg alias picks the engine
| | |
Win32 UIA, AT-SPI2 over | ← ghost-core: SendInput, DXGI/GDI
posted msgs D-Bus, XTEST | ← ghost-linux: portal / uinput
| | |
Windows OS Linux +-> ghost-browser ← CDP over the DevTools port,
engine-independent
サポートするクレート: ghost-cache (UIA スナップショット + デルタ)、ghost-intent (FSM + JSONLogic エグゼキューター)、ghost-ground (ロケーター階層のカスケード)、ghost-platform (OS ごとに報告されるケイパビリティマトリクス)。
組み込みビジョン層(Set-of-Marks)
このセクションでは、上記のオプション層について説明します。MCP 経由で Ghost を操作するエージェントは、ghost_see から同じ情報を取得できるため、これは不要です。
自然言語の説明で要素を特定する場合(ghost_find description="the blue submit button"、または名前/テキストの検索が失敗して VLM にエスカレーションされた場合)、Ghost はモデルにピクセル座標を推測させません - モデルはそれに関して信頼できないためです(テストでは、単純な「equals ボタンの座標を教えて」という指示は、ターゲットから約 250px ずれた位置を返しました)。代わりに Set-of-Marks を使用します。ウィンドウで検出された要素に番号付きバッジを重ね、そのマーク付きスクリーンショットと各バッジのアクセシブル名ラベルを送信し、モデルにどの番号が一致するかを尋ねます。番号はその要素の正確な矩形にマッピングされるため、結果は実際の要素上の座標であり、回帰による推測ではありません。
Calculator でのライブチェックでは、4 つの説明(「equals ボタン」「plus ボタン」「数字の 7 キー」「multiply ボタン」)がいずれも正確に正しいボタン上に位置しました - 座標回帰では約 250px ずれていたのとは対照的です。
正直な範囲: 検出された要素がアクセシブル名を持つ場合(ほとんどのアプリ)、ラベルが曖昧さの解消の大部分を担います。ラベルのないアイコンでは、モデルはバッジの視覚的な位置/外観に頼ります。
Canvas / アクセシビリティツリーなしのアプリ。 UIA ツリーが疎な場合(カスタム描画 UI、リモートデスクトップ画面、ゲームキャンバス)、Ghost は Set-of-Marks の候補を組み込みの CPU 古典的 CV 検出器(ghost_ground::cv_detect)で補強します: エッジ密度 → 連結成分 → サイズ/アスペクト比フィルタで、GPU もモデルのダウンロードも不要です。これにより、アクセシビリティツリーに何もない場所でも VLM が選択できる実際のボックスが得られます。これは学習済み検出器よりも粗いものです - オプションの OmniParser ONNX 層(--features yolo + GHOST_YOLO_MODEL)は、GPU モデルが利用可能な場合に同じ Set-of-Marks パスに接続されます。CV マーク → VLM 選択のエンドツーエンドには、設定済みのビジョンキーが必要です。
ベンチマーク - 「呼び出しが ok を返したか」ではなくタスクの成功
bench/ には再現可能なエンドツーエンドのベンチマークがあります。実際の ghost-mcp バイナリを 14 の Windows デスクトップタスクを通じて操作し、各タスクを実際の結果を再観察することで採点します(Calculator の表示は本当に 42 を表示しているか? 入力された値は本当に存在するか?)。ツール呼び出しの戻り値を信頼することは決してありません。
最新の実行(bench/results/latest.md を参照):
14/14 タスク合格(100%)、タスクあたりの中央値は約 2.7 秒(アプリ起動を含む完全な実時間)- 知覚、クリック/キーボード操作+検証、待機、ウィンドウ管理(一覧/最小化/復元)、テキスト抽出、曖昧さの解消、フローの連鎖、クリップボードの往復、構造化エラー、要素のスクリーンショット、値の検証。
また、失敗することも証明します: --self-test は意図的に誤ったネガティブコントロールを実行し(表示が 42 のときに 99 と表示されるとアサートするなど)、ハーネスがそれらすべてを FAIL と採点した場合にのみ合格します - したがって、上記のグリーンの実行は本物のシグナルであり、お墨付きではありません。
任意の Windows 10/11 マシンで再現:
cargo build --release -p ghost-mcp
python bench/run_bench.py # exit 0 iff every task passed
python bench/run_bench.py --self-test # exit 0 iff the harness caught every planted failure
信頼性ソーク
bench/soak.py は多数の操作→検証サイクルを実行し、単体テストでは見えないシグナルでゲートします: verified が null/false で返ってくる頻度、フォーカス喪失率、エラー率、各操作の実際の効果が発生したかどうか(表示は再観察され、戻り値は決して信頼されない)、およびレイテンシのパーセンタイルです。
最新(160 操作): PASS - verify-null 0.0、フォーカス喪失 0.0、効果不一致 0(100% 正確)、p50 85ms / p95 117ms。
bench/results/soak.mdを参照。
python bench/soak.py # exit 0 iff every reliability threshold holds
python bench/soak.py --cycles 250 # ~1000 acts
python bench/soak.py --self-test # exit 0 iff the harness flags a planted-wrong effect
私たちは Ghost 自身の測定値のみを公開することを意図しており、他のツール向けにでっち上げた列を掲載することは決してありません。bench/README.md には、Playwright-MCP / Computer Use / UI-TARS と比較するための正直なプロトコルが記載されており、素朴な同一スイート比較が対等でない理由(Playwright はブラウザ専用、ビジョンエージェントには API + VM が必要)を説明しています。
マイクロベンチマーク
| 操作 | 計測値 |
|---|---|
| リージョンキャプチャ、GDI、任意サイズ | 約16.5 ms |
| リージョンキャプチャ、DXGI、1600x900 | 約70〜83 ms |
| BGRA→RGBA 変換、400x300 リージョン | 約206 µs |
| JSONLogic eq/var | 32.2 ns |
| Intent コンパイル(3op) | 1.49 µs |
エンドツーエンドのキャプチャ計測(release、crates/ghost-core/tests/capture_latency_probe.rs)は
v0.10.0 の前提を修正しました。DXGI の acquire が支配的で、大きなウィンドウで崖にぶつかるため、
リージョンキャプチャ(act-verify、スクリーンショット、Set-of-Marks)は v0.11.0 でフラットな約16.5ms の
GDI BitBlt を経由します。フルスクリーンは依然として DXGI を使用します。変換マイクロベンチを実行:
cargo bench -p ghost-core --bench convert。以前のベースライン:
docs/benches/v030-baseline.md。
要件
- Windows 10 build 19041 以降
- Linux で
at-spi2-coreとデスクトップセッション(X11 または Wayland); Wayland の入力とキャプチャにはさらにxdg-desktop-portal-gnomeが必要 ghost_browser_*/ghost_tab_*ツール専用の Chromium 系ブラウザ(Chrome、Comet、Edge、または Brave); デスクトップ動詞には不要- Rust stable(ソースからのビルド時のみ)
ライセンス
MIT - Copyright 2026 Northtek
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。