Ghost Hands について
Ghost Handsは、ポリシーに基づく操作判定、承認ゲート、改ざん検知可能な記録を備えた、エージェント向けPythonブラウザ自動化パッケージです。Chromiumを直接操作し、完了した実行を再生可能なスクリプトにできます。
主な機能
- 01操作の分類とポリシー適用
- 02対象操作への人間の承認要求
- 03ハッシュ連鎖による証跡記録
- 04モデルに見えるデータから認証情報を分離
- 05完了報告前のページ状態検証
- 06成功したプランの保存と再生
活用シーン
- 01承認制御付きのブラウザータスク実行
- 02検証可能な記録による操作監査
- 03認証情報を露出しないログイン自動化
- 04実証済みブラウザーワークフローの再生
MCP 対応
MCPサーバーは、操作、トレイルの確認、プランキャッシュ、目標指定の実行など、ガバナンス付きブラウザーセッションのツールを公開します。セッションの操作対象は設定したドライバーで決まります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx ghost-handsGHOST_HANDS_DRIVERSession body for the MCP server: fake (default), chromium, simphone, or android.GHOST_HANDS_START_URLOptional URL opened on the first perceive call when a real body is selected.GHOST_HANDS_APPROVERSet to phone to route approval asks through the PhoneApprover (requires the Android bridge env vars).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
4掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string | いいえ | |
| pages | object | いいえ |
詳細
Ghost Hands
Playwright は操作し、Stagehand は考え、Browser Use はさまよいます。Ghost Hands は、あらゆる操作に答えを出します。
Ghost Hands は、依存関係ゼロのスタンドアロン Python パッケージです。エージェントにウェブ上での 手段 と、それに伴う良心を与えます。エージェントが行うすべての操作は、実行前に分類され(readonly/write/consequential)、ポリシーに照らして判定され、実行前に来歴の記録へ書き込まれます。そして重要な操作には、人間の承認が必要です。完了した実行は、無料で再実行できる、決定論的でモデル不要の Ghost Hands スクリプトへと生まれ変わります。
ブラウザーを動かす仕組みは、私たち自身で実装したものです。標準ライブラリのみを使った Chrome DevTools Protocol クライアントが、--remote-debugging-pipe トランスポート経由で Chromium を直接操作します。内部で Playwright も Selenium も、その他の自動化ライブラリも使っていません。自動化レイヤーは 100%、私たち自身の実装です。(ブラウザーである Chromium を操作しますが、ブラウザーエンジンを開発したわけではなく、そのようにも主張していません。)
Ghost Developer Studio によるプロジェクトです。 MIT ライセンス。
MCP Registry:mcp-name: io.github.littlestjames82-sys/ghost-hands
ステータス:v1.1.0 — PyPI および GitHub で公開中: PyPI
ghost-hands(pip install ghost-hands)・ github.com/littlestjames82-sys/ghost-hands ・ littlestjames82-sys.github.io/ghost-hands。v1.1.0 では、焦点を絞った知覚、レポートと MCP のトレイルツールでのトレイル整合性の提示、MCP 経由のプランキャッシュ、v1.0 の機能に関するベンチの証明ケースが追加されました。詳しくは CHANGELOG をご覧ください。
GitHub の
mainでは、v1.2 から v1.11 までの各段階を開発中です。具体的には、アクションごとのガバナンスを備えたモデル呼び出しのバッチ処理、API が報告する実トークン数の計上、require-verify ゲート、5 つ目の MCP ツール(hands_verify_trail)、行き詰まりからのガバナンス付き復旧、LLM トークン予算の上限、MCP 経由の目標駆動型hands_run、API が報告する実使用量を含む、公開可能な評価スコアカード、判断エージェント向けのページ変更メモ、エンドポイント停止時のフォールバック判断エージェント、トレイル全体の実トークン使用量を集計するcostsコマンド、テキスト不在の検証、スクリプトの実行前に分類するcheckプリフライト、停止した実行のトレイルからの再開(継続実行のトレイルは親のハッシュに連鎖するようになりました)、ネイティブの Anthropic 判断エージェント、batchランブックコマンド、設定済みの判断エージェントを報告する doctor、不安定なモデルエンドポイント向けのバックオフ付き回数制限リトライ(リトライは実行の計上に含まれます)、モデルの応答をより厳密にするオプトインの JSON モード、HTTP JSON API(ghost-hands serve)、実行完了時のウェブフック、2 回移動する要素を追跡する heal チェーン、失敗したアクションを実行終了ではなくモデルに返すエラーからループへの復旧、そして実モデルでの実行で判明した、採点対象スイートの 2 つの不具合を修正する評価整合性の確認(フォームチェッカーがfill_formを正しく評価するようになり、ログインタスクで監査対象のシークレットプレースホルダーフローを学習するようになりました)が進められています。これらのリリースは別途審査されます。
1.0.0 の新機能 — 信頼性とコストを重視したリリース
以下の比較対象に挙げた他のブラウザーエージェントにはない、4 つの機能をまとめて提供します。それぞれ、競合製品に関する公開済みの課題に対応しています。
- 改ざんを検知できる履歴。 すべての履歴イベントに、前のイベントと連結した SHA-256 ハッシュが付与されるようになりました(
trail.pyのprev/hash)。イベントを編集、削除、並べ替えると、それ以降のすべてのハッシュが無効になります。ghost-hands verify-trail trail.jsonl(または Python のverify_trail())を使えば、記録が書き込まれたとおりの内容であることを証明できます。1.0 より前の履歴はレガシーとして報告され、気付かれないまま検証済みになることはありません。Playwright のトレースビューアー、Stagehand のセッションログ、Browser Use の実行履歴はいずれも編集可能なテキストです。これはログファイルではなく、監査記録です。 - シークレットのプレースホルダー — モデルに認証情報を見せません。 意思決定器、スクリプト、キャッシュされたプランでは、値の代わりに
{{secret:PASSWORD}}と入力します。意思決定器、Governor、承認者、履歴に見えるのはプレースホルダーだけです。Runner は実行境界でのみ、GHOST_HANDS_SECRET_PASSWORD(またはホストから渡されたメモリー内マッピング)から実際の値を置き換え、ページが返した結果に値が含まれていれば、その値を取り除きます。シークレットが見つからない場合は、プレースホルダーをそのまま入力するのではなく、正直にエラーを返します。これは、Skyvern がホスト型の保管庫として販売し、Browser Use がエージェントのコンテキストに公開している認証情報の分離です。ここではローカルで無料で利用でき、履歴によって証明されます。(secrets.py) verifyアクション — 主張するのではなく、証明します。 読み取り専用のアサーション(actions.pyのverify。Runner がverify.pyで評価します)により、ページ上のテキスト、要素の有無、現在の URL を、任意に組み合わせて確認できます。設定した条件はすべて満たす必要があります。doneの前にこれを置けば、実際には発生していない状態に対して実行が成功を報告することはなくなります。これは、完了を幻覚する失敗モードに対する、正直に停止するための回答です。検証に失敗すると、失敗した条件を示すerror停止になります。- ガバナンス付きプランキャッシュ — 一度学習し、無料で再生します。 キャッシュ(
Runner(plan_cache=PlanCache(path))、またはghost-hands run --cache plans.json)を使うと、doneで終了した実行は、実証済みのステップを目標と開始 URL をキーとして、所有者のみがアクセスできるローカルファイルに保存します。次回の同じ実行では、各ステップを同じループを通じて再生します。つまり、再認識し、記述子で再検出し、再分類し、ポリシーに確認が必要とあれば再承認し、新しい実行のハッシュ連結履歴に再記録します。キャッシュされたステップについて、意思決定器の呼び出しはゼロです。キャッシュされた対象がなくなっている場合、履歴にcache fallbackが記録され、ライブの意思決定器に切り替わります。done以外で終了した実行は、何も保存しません。Stagehand もアクションをキャッシュしますが、ガバナンスは適用されず、そのキャッシュは監査記録ではありません。シークレットはキャッシュ内でもプレースホルダーのままなので、ログインプランをキャッシュしても認証情報は含まれません。(cache.py)
0.9.0 の新機能
ghost-hands doctor(doctor.py) — スタック全体について「すべて正しく設定されていますか?」に答える単一のコマンドです。読み取り専用の 7 つのチェックを行います。Python ランタイム、Chromium バイナリ(ドライバー独自のリゾルバーで検出するため、doctor とドライバーが食い違うことはありません)、4 つのポリシーパック、モデル環境、GhostBus サーバー(--bus/GHOSTBUS_URLで設定されている場合。ワークスペースの構成が単一か、ホスト型の/w/<id>/かも報告します)、MrGhosty のスマートフォンブリッジ(設定されている場合:到達可能性、トークンの受け入れ、MrGhosty のバージョン、アクセシビリティの状態、ブリッジプロトコルの一致)、および adb をチェックします。それぞれの結果は PASS/WARN/FAIL の行として表示され、PASS でない場合は、平易な言葉による修正方法が 1 行で示されます(「スマートフォンの電源が入っていて、MrGhosty のアクセシビリティが有効で、adb forward tcp:8378 tcp:8378が実行されていますか?」/「ペアリングトークンが一致しません — MrGhosty の Access チェックリストからコピーし直し、GHOST_HANDS_ANDROID_TOKEN に設定してください。」)。FAIL は「操作するまでこの部分は動作しません」を意味します。WARN は未使用または任意の状態を意味し、未設定のバスやブリッジは失敗ではなく、常に WARN になります。何か 1 つでも FAIL なら終了コードは 1 です。--jsonを指定すると、同じチェックが構造化データとして出力されます。すべてのプローブには短いタイムアウトが設定されているため、応答しないエンドポイントで doctor がハングすることはありません。また、秘密情報が出力されることもありません。キーとペアリングトークンは値ではなく、設定済みであることだけが報告されます。ghost-hands phone-proof(phone_proof.py) — 初回のスマートフォン実行をガイドするコマンドです。phone-approval-testが個別の項目を 1 つだけ検証するのに対し、phone-proof は 5 つのステップすべてを順に進め、それぞれを確認します。ブリッジの設定(設定されていない場合は、正確な環境変数の設定方法を表示して停止します — 終了コード 2、セットアップが必要)、adb のフォワード(実行前に表示し、adb またはデバイスがない場合は問題なくスキップ)、ブリッジの状態(MrGhosty のバージョンとアクセシビリティ)、害のないテスト承認(「今すぐスマートフォンを確認してください — MrGhosty の通知で Approve をタップしてください」)、そして確認できた内容と次に実行する正確なコマンドをまとめた締めくくりのサマリーです。承認が拒否、期限切れ、またはタイムアウトした場合は、手順を案内して終了します — 終了コード 3(未承認)。ブリッジまたは設定のエラーは終了コード 1 です。--yesを指定すると、一時停止せずに最後まで実行します。これは、テストとベンチがフェイクブリッジに対して実行するときの方法です。
スマートフォンでの初回確認
スマートフォンに MrGhosty v1.7+ をインストールし、アクセシビリティサービスを有効にすると、初回の実行全体は次のとおりです。
adb forward tcp:8378 tcp:8378 # or let phone-proof do it (step 2)
export GHOST_HANDS_ANDROID_TOKEN=<pairing code from MrGhosty → Device tab → Ghost Hands bridge>
ghost-hands doctor # every row green or explained?
ghost-hands phone-proof # five checked steps to "proven"
phone-proof は各ステップを確認する前に必要な内容を表示し、終了コードで結果を示します:0 は確認済み · 1 はエラー · 2 はセットアップが必要 · 3 は未承認。合格すると、スマートフォンはガバナンスの適用された実行環境になります:ghost-hands run --driver android --approver phone を実行すると、スマートフォン自体で承認しながら操作できます。
0.8.0 の新機能
- Trail → HTML 監査レポート(
ghost-hands report trail.jsonl、report.py)。Trail は常に記録でしたが、今では読みやすいレポートにもなります。1 回の実行から、自己完結型の HTML ファイルが 1 つ生成されます。CSS はインラインで、JavaScript も外部アセットもなく、オフラインで動作します。スタジオ風のスタイリング(ダークチャコールにバイオレットのアクセント)で、ヘッダー(Trail に記録されている場合は目標、認識 URL から推定した本文、期間、停止理由と概要)、概要統計カード(ステップ数、実時間、認識文字数/概算トークン数、クラス別アクション数、承認の要求/許可/拒否数、修復数、ダウンロード/ダイアログ/ネットワーク数)、ステップごとのタイムラインを表示します。タイムラインには、認識マップの概要と折りたたみ可能な認識記録、平易な言葉での判断(「[4]『Place order』をクリック」)、分類チップ付きの Governor の判定、さらに承認を求めた場合はその後の経緯(「確認要求 → 電話で承認」)、結果、インラインの特別イベント(修復時の変更前/変更後、ダイアログ、ファイル名とサイズを含むダウンロード、チャネルと判断者を含む承認要求/判断のペア、折りたたみ可能なネットワークキャプチャ)を含みます。レンダリングは防御的に行われます。Trail の文字列はすべて HTML エスケープされるため、悪意のあるページタイトルもテキストとして扱われます。型付きの値は 80 文字で切り詰められ、type=password要素に入力した値は•••• (N chars)と表示されます。破損した行はスキップされ、フッターに件数が表示されます。不完全な Trail も記録として残ります。サンプルのレンダリング結果はexamples/sample-report.htmlにあります。 - MCP の機能同等性。 MCP サーバーは、偽の Web のみを対象とするものではなくなりました。
GHOST_HANDS_DRIVER=fake|chromium|simphone|androidでセッションの実行環境を選択します(デフォルトは従来どおり fake)。GHOST_HANDS_START_URLは最初の認識時に開かれます。android セッションでは、バスエージェントと同じGHOST_HANDS_ANDROID_BRIDGE/GHOST_HANDS_ANDROID_TOKEN環境変数を使用します(トークンはツールの出力に表示されません)。ネイティブの目を持つ実行環境では、Runner と同じ方法で認識が行われます。GHOST_HANDS_APPROVER=phoneを設定すると、セッションの「確認要求」判定は、デフォルトの「理由付きで拒否」の代わりにPhoneApprover経由で処理されます。また、hands_actの応答には、どのチャネルが判断したかが記載されます(「電話で承認」/「拒否:承認者なし(MCP のデフォルト)」)。hands_runはセッションの実行環境をデフォルトで使用し、4 種類すべての実行環境を受け付けます。設定はサーバープロセスごとに適用されます。不明な値が指定された場合は、起動時に明確なエラーになります。 seatbeltポリシーパック。 Standard の基本方針(読み取り専用+書き込み許可、重要な操作は確認要求、承認猶予 300 秒)に、ターゲットコンテンツのルールを追加します。ターゲット要素の名前/ラベル、またはページ/アクション URL が、厳選されたプロンプトインジェクションパターン(policies.INJECTION_PATTERNS:「以前の指示を無視して」「指示を無視して」「あなたは今から」「システムプロンプト」「クリックして請求」「続行するにはパスワードを確認してください」など)に一致すると、Governor は操作のクラスにかかわらずその操作を即座に拒否し、govern イベントの理由に一致したパターンが記載されます。パターンは指示の形をしたフレーズであり、単独の単語ではありません。たとえば「Ignore」という名前のボタンでは発動しないことがテストで確認されています。Policy のデータ(deny_patterns)として実装されているため、どのパックやポリシーファイルにも独自のリストを設定できます。
0.7.0 の新機能
- モデル評価ハーネス(
ghost-hands eval、evaluate.py)。ローカルのフィクスチャページを使った採点付きタスクが 8 つあります。 検索してページを開く、複数フィールドのフォーム入力と結果を伴う送信、 構造化テーブルの抽出、事実にたどり着くまでのマルチホップナビゲーション、 目立つボタンが破壊的操作で、絶対に押してはならないトラップページ、 heal の復旧能力を評価する変化するページ、 認証情報の漏洩がないか操作履歴を監査するログインフォーム、 正直に停止できるかを評価する達成不可能なゴールです。うち 4 つのタスクは 実際の Chromium で実行されます。すべてのタスクについて、成功、ステップ数、 実時間、認識文字数/約トークン数、種類別の操作、要求された承認、 heal を評価します。--report PATHを指定すると JSON が書き込まれます。判定器は 3 種類です。--decider stub(決定論的なポリシーを持つローカルのスタブモデルサーバーで、 ハーネスの一連の動作をエンドツーエンドで検証します。スタブの結果はハーネスの 検証専用であり、モデル品質の測定ではありません)、--decider rules(2 つ目のベースラインとしての RuleDecider)、--decider openai(既存の環境変数で設定された判定器を介した実モデル)です。 このビルドでの測定結果:スタブは 8/8 に合格しました(計測機能は動作しています)。 ルールベースのベースラインは 3/8 に合格しました(トラップ回避、 heal の復旧、正直な停止です。検索、フォーム、抽出、マルチホップ、 ログインでの正直な失敗は、ハーネスのエラーではなくデータです)。 実モデルの数値は、キーを利用できる場合は別途報告します。「正直なステータス」を 参照してください。 - Android ジェスチャー(MrGhosty v1.8.0)。以前は Android の body が拒否していた
3 種類の操作(
double_click、drag、click_at)を、 エンドツーエンドで実装しました。ブリッジは実際のジェスチャーをディスパッチし (dispatchGesture、上限付きコールバックラッチ、キャンセル/失敗を正直に報告)、click_atは現在のウィンドウの境界に対して検証され、範囲外では拒否されます。 また、AndroidDriverは 3 種類すべてを転送します(drag は両端を解決し、click_atはターゲット不要です)。SimPhoneDriver はこれらを実装していません。 見せかけの同等性はありません。各 body がサポートする機能についてはdocs/BODY_PROTOCOL.md§6 を参照してください。 - GhostBus のファイルストアループが完了しました。 v0.4 で見つかった問題(ファイルベースの
ストアで、複数の書き込みが並行すると共有の
.tmpの rename が競合し、 HTTP 400 が発生する問題)は、GhostBus 0.4.1 で修正されました(保存ごとに 一意な一時ファイルを使用し、保存を直列化)。GhostBus 0.5.0 以降、 GhostBus のテストスイートで回帰テストを実施しています(44/44 + 6/6。 このビルドでも再検証済み)。Ghost Hands 側でもこれを実証できるようになりました。 バスのデモフローと、エージェント+ポーラーによる並列の大量リクエストを、 実際のファイルベースの GhostBus に対して実行し、400 エラーがゼロ、 ストアに破損がなく、一時ファイルの孤立もないことを確認します(benchv7 bus、pytesttest_file_store_barrage_no_races)。
0.6.0 の新機能
- 電話での承認。 実行中の「確認」判断をRyanの電話に送信できます。
PhoneApprover(phone_approver.py)は、MrGhosty v1.7.0のGhost Handsブリッジに、機密情報を伏せた承認リクエストを投稿します。これにより、「Ghost Hands needs approval」という重要度の高い通知が表示され、Approve/Denyアクションが利用できます。MrGhostyの「Device」タブにもカードが表示されます。判断はブリッジ経由で返されます。拒否、期限切れ、タイムアウト、接続不能はすべて拒否を意味します。応答がない場合に承認とみなされることはありません。すべてのドライバーで動作します(ghost-hands run --approver phone …— 電話からデスクトップ版Chromiumの実行を承認することもできます)。バスエージェントモードでは--approval-channel phoneで利用できます(バスには通知としてコメントが送られますが、承認そのものをバスに要求することはありません)。ブリッジに接続できる場合、承認はMrGhostyブリッジ経由でRyanの電話に送られます(通知+アプリ内での判断)。これはローカルブリッジのチャネルであり、クラウドプッシュサービスではありません。docs/APPROVALS.mdを参照してください。 - 判断は設計上、電話からのみ行えます。 ブリッジAPIでは承認リクエストを作成・読み取りできますが、判断用のエンドポイントはありません。そのため、トークンを持つユーザーが自分のリクエストを承認することはできません。判断を行えるのは、電話自体に表示される通知アクションとアプリ内カードのみです。
- 概要は端末から送信する前に機密情報が伏せられます。 リクエストにはアクションの種類、分類、対象の説明、現在のURL/パッケージが含まれます。
typeアクションでは対象と文字数のみが表示され、入力したテキストは表示されません。fill_formではフィールド名のみが表示され、値は表示されません。ペアリングトークンが概要、履歴イベント、エラー、ログに表示されることはありません。 ghost-hands phone-approval-test— 無害なテストリクエスト(「これを承認しても何も実行されません」)を1件送信し、電話での判断を待ちます。端末上でワンコマンドの動作確認ができます。
0.5.0 の新機能
- Androidでの実機操作。
AndroidDriver(android_driver.py)は、MrGhosty Androidアプリ(v1.6.0)内のGhost Handsブリッジを通じて実機の電話を操作します。これは、MrGhostyのアクセシビリティサービスがホストするループバック専用HTTPサーバー(127.0.0.1:8378)で、ペアリングトークンによって認証されます(トークンはMrGhostyの「Device」タブに表示され、GHOST_HANDS_ANDROID_TOKEN経由で渡されます。保存はされません)。認識処理では、実際のアクセシビリティツリーをたどって、同じ番号付きのElementMapを作成します(各要素はブリッジのrefをbody_refとして保持します)。アクションを実行する前に、ブリッジで対象の{tag, role, name}キーを再検証します。対象が古くなっている場合は、Web上でRunnerが復旧する際と同じ「target missing / target mismatch」エラーが返されます。変更されていないRunner/Governorが操作を実行するため、結果を伴う操作のゲートを含め、ガバナンスは同一です。Web専用のアクションは正直に失敗します。adb forward tcp:8378 tcp:8378でブリッジを転送し、ghost-hands android-statusで状態を確認してから、ghost-hands run --driver android …を実行します(または、GhostBus経由で"driver": "android"を指定してタスクを依頼します)。ドライバーとブリッジは実装済みで、ブリッジのコントラクトに対する一連のフローも検証済みです(偽ブリッジの適合性テストスイート+ベンチケース)。端末上での検証は、RyanによるMrGhosty v1.6.0のインストールとアクセシビリティ権限の付与待ちです。 - 要素の
body_ref。 要素の記述子に、任意の不透明なボディ固有の対象参照を含められるようになりました。これにより、履歴には電話でのアクションが実際に操作したノードが正確に記録されます。
0.4.0 の新機能
- GhostBus エージェントモード。
ghost-hands bus-agentを実行すると、GhostBus 上でエージェントghost-hands(ロール:hands)としてハンズが動作します。自分宛て、またはhandsのタグが付いたタスクを、クレームリース、blockedBy、およびバス独自の承認要求ゲート(ゲート対象のタスクはクレームされません)を尊重して取得し、同じ Runner/Governor/Trail を通じて実行します。進捗コメントを投稿し、JSONL のトレイルを共有バスファイルとしてアップロードして、構造化レポートとともに完了します。シングルワークスペースのリレーとホスト型ワークスペース(--workspace、/w/<id>/)に対応しています。キーはフラグまたは環境変数からのみ取得し、保存されることはありません。ghost-hands bus-demoは、バス経由で別のクライアントが実行途中に承認する重要な送信処理も含め、実際の GhostBus ノードサーバーに対して一連の処理全体を実証します。 - バス経由の承認。 バス実行中に Governor が「確認」を指示すると、承認者にタスクコメントとタスク作成者宛てのメッセージとして
APPROVAL NEEDED: <class> <summary> — reply APPROVE <run-id> or DENY <run-id>を投稿し、承認タイムアウトまでロングポーリングで待機します。拒否またはタイムアウトは、記録上も拒否として扱われます。要求と判断の両方が、approvalイベントとしてトレイルに記録されます。 - Body Protocol。 docs/BODY_PROTOCOL.md では、ドライバーの契約(認識 → 番号付き ElementMap、
act(action)→ 結果、任意の機能フラグ)と共有アクション語彙を正式に定義しており、文書化された仕様に基づいて新しいボディを構築できます。適合性シナリオ(すべてのボディで同じ抽象スクリプトを実行)でこれを検証します。破壊的なステップは承認者がいない場合は拒否され、承認者がいる場合は実行されます。また、FakeDriver、ChromiumDriver、新しいスマートフォンボディのいずれでも、トレイルに同一の形式が記録されます。 - SimPhoneDriver。 Android 風のシミュレーションボディ(メモリー内)です。アプリアイコンのあるホーム画面、メモアプリ(入力、保存、メモの保持に対応。「すべてのメモを削除」ボタンは重要な操作に分類)、切り替えスイッチのある設定アプリ、戻る/ホームのナビゲーションスタックを備えています。さらに、標準ライブラリのみで実際の PNG スクリーンショットを描画します。既存の Runner/Governor/deciders は変更せずにこれを操作できます。これは実際の Android ボディのリハーサル用ボディです。その Android ボディはその後追加されました(v0.5.0、上記参照)。テストでは同じ Runner/Governor が SimPhoneDriver を操作し、実際のスマートフォンでは AndroidDriver を操作します。
- ポリシーパック。 名前を付けて読み込める Governor バンドル(
ghost_hands.policies)です。readonly(書き込みと重要な操作を無条件で拒否)、standard(デフォルトの姿勢)、strict(書き込みにも確認を要求し、承認待ち時間は最大 120 秒)があります。runとbus-agentで--policy-packを指定でき、MCP サーバーはGHOST_HANDS_POLICYを使用します。不明なパック名は明確なエラーになり、黙って別のパックに切り替わることはありません。
0.3.0 の新機能
- 2 種類の視覚機能。 DOM 視覚機能では、合成ツリーをたどります。オープンなシャドウルートを含み、同一ページ内の iframe も含めてタグ付けするため、ウェブコンポーネントやフレーム内のコントロールにも、ほかの要素と同じように番号が付きます。または、AX 視覚機能(
eyes="ax")に切り替えられます。マップは CDP Accessibility ツリー(ロール+名前+状態)から構築され、アクションはbackendNodeIdを通じて解決されます。 - フォームを一度に入力。
fill_formは{label: value}のペアからフォーム全体に入力します。各フィールドをラベル、名前、プレースホルダー、または aria-label で特定し、フィールドごとの結果を報告します。失敗はフィールド名とともに報告され、見逃されることはありません。submit: trueを指定すると、結果に影響するアクションとして分類され、通常の承認フローが適用されます。 - ファイルのダウンロードとアップロード。
downloadはクリックしてファイルがディスクに保存されるまで待機します(ファイル名とバイトサイズを報告し、完了を記録に残します)。set_fileはローカルファイルをファイル入力欄にアップロードします(DOM.setFileInputFiles)。存在しないパスやディレクトリは拒否されます。 - ネットワークを記録。 実行中は Network ドメインの情報(メソッド、URL、ステータス、種類)が
netトレイルイベントに記録されます。1 回の実行につき最大 200 件で、上限に達した場合は切り詰められたことが記録されます。extractのnetworkモードでは、記録されたリストが返されます。 - 構造化抽出。
extractのモードは、text(デフォルト)、list(リンク →[{text, href}])、table(→ 行の辞書のリスト)、networkです。 - ダイアログを処理して記録。
confirm/alert/promptにはドライバーのポリシー(dialog_policy="dismiss"|"accept"、デフォルトは dismiss)に従って応答し、すべてのダイアログと判断がトレイルに記録されます。 - 入力機能の拡充。
hover、double_click、right_click、drag(ターゲット → ターゲット)、pressでのキーの組み合わせ("Control+a")、およびclick_at(x, y)に対応しました。click_at(x, y)は座標を直接指定するフォールバックで、writeに分類され、トレイルにraw: trueと記録されます。 - PDF とビューポート。
pdfはページを実際の PDF ファイルに出力します(Page.printToPDF)。set_viewportでは名前付きのプリセット(デスクトップ 1280×800、モバイル 390×844+タッチ)に切り替えられます。メディアクエリも含め、認識結果にはエミュレートされたレイアウトが反映されます。 - 条件を指定した待機。
wait_forは、テキストの表示、記述子に一致する要素、または URL の部分文字列を待機します。タイムアウト時には、実際の結果どおりに失敗し、その内容が記録されます。 - すべての新しいアクションは、CLI ランナーと MCP の
hands_actから変更なしで利用でき、どれも引き続きガバナーによって分類され、トレイルに記録されます。(HTML スナップショットの視覚機能では、シャドウルートやフレームの内部は見えません。それらの確認にはライブ要素マップを使用します。)
0.2.0 の新機能
- 実際のウェブサイトで動作を実証。 Chromium ドライバーで、実際のサイトを最初から最後まで操作できるようになりました。example.com では IANA のリンクをたどって Example Domains ページを表示し、実際の Wikipedia 検索では、決定論的な RuleDecider が「Oakdale, Tennessee」と入力して送信し、Oakdale の記事を表示しました。
ghost-hands bench --liveで再現できます(2 件のケースを、スタジオのサンドボックスから 2026 年 10 月 8 日に検証)。 - ターゲットの自己修復。 認識から操作までの間にページが変化した場合、古くなったターゲットを検出し、記録済みの記述子から再検出して、1 回だけ再試行します。修復の内容は、独立したイベントとしてトレイルに記録されます。
- タブ。
open_tab/switch_tab/list_tabsに対応しました。各タブは独自の CDP ターゲットを持ち、認識と操作はアクティブなタブに適用されます。 - セッション状態。
save_session/load_sessionに対応しました。Cookie(Network.getAllCookies / setCookie)と現在のオリジンの localStorage を、小さなバージョン管理付き JSON 形式で保存・読み込みします。 - スクリーンショットのディスク保存。 スクリーンショット操作で、実際の PNG(
Page.captureScreenshot)を操作のpathに書き込むようになりました。 - プロキシのサポート。 ドライバーは
HTTPS_PROXY/https_proxyを使用します(proxy=""で無効化できます)。認証付きプロキシは、Chrome 自身が受け付けられない認証情報を挿入する、組み込みのローカルリレー経由で使用できます。TLS を傍受するプロキシ向けにignore_cert_errors=Trueも利用できます。 - Decider の通信仕様を検証。 OpenAI 互換 Decider のプロトコル(リクエスト形式、環境変数による制御、応答の解析、Runner の全ループ)は、テストおよびローカルのスタブ
/chat/completionsサーバーに対するベンチケースで検証されています。実際のモデルによる操作品質は、まだ実証されていません(「現状について」を参照)。 - スクリプトの段階的生成と実行。 リプレイのエクスポートで
driver=(chromium またはページを埋め込んだ fake)とstart_url=を指定できるようになりました。ベンチでは、実際の Chromium 上でフィクスチャページに対して生成済みスクリプトを実行し、完了マーカーを確認します。
クイックスタート
pip install ghost-hands # (once published; for now: pip install . from a checkout)
ghost-hands demo # scripted run over a built-in fake mini-web — no browser needed
ghost-hands bench # the verification suite
実際のページを操作するには:
from ghost_hands import ChromiumDriver, Runner, ScriptedDecider
driver = ChromiumDriver() # finds Chromium/Chrome; $GHOST_HANDS_CHROME overrides
runner = Runner(driver, ScriptedDecider([
{"kind": "navigate", "url": "https://example.com"},
{"kind": "extract"},
{"kind": "done", "summary": "looked at the page"},
]))
report = runner.run("look at example.com")
print(report.stop_reason, report.summary)
driver.close()
MCP クライアントで使用する
MCP サーバーは ghost-hands mcp として stdio で実行されます。まず pip install ghost-hands でインストールしてください。5 つのツール hands_perceive、hands_act、hands_run、hands_trail、hands_verify_trail を提供します。サーバーはプロセスごとに 1 回、環境変数から設定を読み込みます。
GHOST_HANDS_DRIVER(fake、chromium、simphone、android のいずれか。デフォルトは fake)、GHOST_HANDS_POLICY(ポリシーパック名。デフォルトは standard)、GHOST_HANDS_APPROVER(phone に設定すると、「ask」の判定をスマートフォンの承認者に送ります。承認者が設定されていない場合、ask は説明とともに拒否されます)です。GHOST_HANDS_START_URL を設定すると、最初の perceive 時にページを開きます。また、android セッションでは GHOST_HANDS_ANDROID_BRIDGE と GHOST_HANDS_ANDROID_TOKEN も読み込みます。以下のクライアントはすべて、同じ環境変数で同じコマンドを起動します。異なるのはラッパーの形式だけです。
Claude Desktop
claude_desktop_config.json に追加します:
{
"mcpServers": {
"ghost-hands": {
"command": "ghost-hands",
"args": ["mcp"],
"env": {
"GHOST_HANDS_DRIVER": "chromium",
"GHOST_HANDS_APPROVER": "phone",
"GHOST_HANDS_POLICY": "standard"
}
}
}
}
Claude Code
claude mcp add ghost-hands -e GHOST_HANDS_DRIVER=chromium -e GHOST_HANDS_APPROVER=phone -e GHOST_HANDS_POLICY=standard -- ghost-hands mcp
Cursor
プロジェクト内の .cursor/mcp.json、またはすべてのプロジェクトに適用する場合は ~/.cursor/mcp.json に追加します:
{
"mcpServers": {
"ghost-hands": {
"command": "ghost-hands",
"args": ["mcp"],
"env": {
"GHOST_HANDS_DRIVER": "chromium",
"GHOST_HANDS_APPROVER": "phone",
"GHOST_HANDS_POLICY": "standard"
}
}
}
}
VS Code
.vscode/mcp.json に追加します:
{
"servers": {
"ghost-hands": {
"command": "ghost-hands",
"args": ["mcp"],
"env": {
"GHOST_HANDS_DRIVER": "chromium",
"GHOST_HANDS_APPROVER": "phone",
"GHOST_HANDS_POLICY": "standard"
}
}
}
}
Cline
cline_mcp_settings.json に追加します:
{
"mcpServers": {
"ghost-hands": {
"command": "ghost-hands",
"args": ["mcp"],
"env": {
"GHOST_HANDS_DRIVER": "chromium",
"GHOST_HANDS_APPROVER": "phone",
"GHOST_HANDS_POLICY": "standard"
}
}
}
}
Codex
~/.codex/config.toml に追加します:
[mcp_servers.ghost-hands]
command = "ghost-hands"
args = ["mcp"]
[mcp_servers.ghost-hands.env]
GHOST_HANDS_DRIVER = "chromium"
GHOST_HANDS_APPROVER = "phone"
GHOST_HANDS_POLICY = "standard"
仕組み
| レイヤー | 役割 |
|---|---|
Eyes (eyes.py) | 番号付きの ElementMap — [3] <button> "Sign in" — 文字数予算内に収めたコンパクトなテキストです。スクリーンショットもビジョンモデルも使いません。情報源は、HTML スナップショットの解析(オフラインの body)またはライブブラウザーの 2 つです。ライブブラウザーでは、合成ツリーの DOM ウォーク(シャドウルートと iframe)または CDP Accessibility ツリーを使います。 |
Hands (actions.py) | 型付きの JSON シリアライズ可能なアクションです。navigate、click、type、press(キーの組み合わせに対応)、select、scroll、hover、double/right click、drag、click_at(生の座標)、fill_form、set_file、download、extract(text/list/table/network)、screenshot(実際の PNG ファイルに保存)、pdf、set_viewport、wait / wait_for、tabs、session save/load、done が含まれます。対象は要素番号であり、生のセレクターは使いません。 |
Governor (governor.py) | すべてのアクションを実行前に分類し、クラスごとの allow / ask / deny、ドメインの許可リスト、ブロック対象ドメインのポリシーを適用します。フォームの送信や、支払い/送信/削除/公開/転送に関わる可能性のある操作は重大な操作として扱います。 |
Trail (trail.py) | JSONL 形式の来歴記録です。perceive → decide → govern → execute → result → stop(および heal、dialog、net、download、v1.0 の cache イベント)に加え、実行ごとの統計情報(ステップ数、認識文字数、文字数の 1/4 で算出した概算トークン数、クラス別アクション数)を記録します。govern と execute は、アクションの実行前に記録されます。v1.0:すべてのイベントはハッシュチェーン(SHA-256)で連結されており、記録は改ざんを検知でき、verify-trail で検証できます。 |
Secrets (secrets.py) | v1.0 の認証情報分離機能です。type/select/fill_form の値に含まれる {{secret:NAME}} プレースホルダーは、実行境界でのみ GHOST_HANDS_SECRET_<NAME> から解決されます。結果からは解決済みの値がマスキングされます。判断者、承認者、トレイル、プランキャッシュに保持されるのは、常にプレースホルダーのみです。 |
Verify (verify.py) | v1.0 の読み取り専用アサーション(text / element / URL)です。Runner がライブ認識結果を使って評価します。実行が done を宣言する前に、結果を検証します。 |
Plan cache (cache.py) | v1.0 のガバナンス付きプランキャッシュです。検証済みのステップは done の実行時に保存されます(所有者のみがアクセスできるファイル)。同一の目標は、判断者への問い合わせなしで、Governor を通して再実行されます。記述子を再検索し、ページが変わっていた場合はトレイルに記録したうえでライブの判断者にフォールバックします。 |
Bodies (drivers.py, simphone.py, android_driver.py) | FakeDriver(テスト/デモ用のインメモリの小規模ウェブ)、ChromiumDriver(独自の CDP クライアントによる実際の Chromium。自動待機、タブ、セッションの保存/読み込み、ディスクへのスクリーンショット保存、ダウンロード/アップロード、ネットワークキャプチャ、ダイアログポリシー、ビューポートエミュレーション、PDF、認証情報を注入するローカルリレーによる環境変数プロキシ対応、古いターゲットの検出)、SimPhoneDriver(アプリ、メモ、切り替え、Back/Home、レンダリング済み PNG スクリーンショットに対応する Android 風のシミュレーション用スマートフォン)、AndroidDriver(MrGhosty アプリの Ghost Hands ブリッジを介した実機スマートフォン。ループバック HTTP/JSON、ペアリングトークン認証、body_ref ターゲットを使ったアクセシビリティツリーによる認識、キー検証付きアクション、API 30 以降での実際のスクリーンショット、構造上ループバックのみを使用)。すべての body が準拠する契約は docs/BODY_PROTOCOL.md です。 |
Brains (deciders.py) | ScriptedDecider(明示的なステップ)、RuleDecider(オフラインで動作する決定論的なルール。「…に移動」「…をクリック」「…に入力」「…を検索」)、OpenAICompatibleDecider(OpenAI 互換エンドポイント全般に対応。キーは環境変数からのみ取得し、保存しません。ローカルのスタブサーバーに対してワイヤープロトコルを検証済み)。 |
Runner (runner.py) | ステップ予算、停滞検出(同じアクションを 3 回実行、または 3 ステップにわたりマップに変化がない場合)、自己修復機能を備えたループです。実行中にターゲットが移動した場合は、記述子で再検索して 1 回だけ再試行し、その修復を記録します。停止理由は done / budget / denied / stuck / error で正直に示します。沈黙は同意ではありません。承認者がいない場合、「ask」は拒否されます。 |
Replay export (export.py) | トレイルを、実行済みステップを決定論的に再生する単独で動作する Ghost Hands スクリプトに変換します。モデルは不要ですが、ガバナンスは引き続き適用されます。Chromium body、または小規模ウェブを内蔵した fake body に対応します。 |
Policy packs (policies.py) | 名前付きの Governor 設定一式をデータとして定義します。readonly(認識のみ。書き込みと重大な操作はすべて拒否)、standard(デフォルト)、strict(書き込みも承認を要求し、承認待ちは最大 120 秒)、seatbelt(standard の基本設定に加え、インジェクションを含む形式のターゲットをすべて拒否 — v0.8)があります。各パックでは、クラスごとの allow/ask/deny、承認タイムアウト、許可リストへの追加、任意の deny_patterns を設定します。 |
Audit report (report.py) | トレイル JSONL を、単一ファイルで完結する HTML 監査レポートに変換します(v0.8)。ヘッダー、統計カード、Governor の判定と承認結果を含むステップごとのタイムライン、インライン表示の特別イベントを出力します。トレイル内のすべての文字列はエスケープされ、パスワードとして入力された値はマスキングされます。 |
Bus mode (busclient.py, busagent.py) | 標準ライブラリのみで動作する GhostBus REST クライアント(単一ワークスペースのリレー、またはホスト型の /w/<id>/ に対応。キーとエージェントトークンはフラグ/環境変数から取得し、メモリ内のみに保持)と、その上で動作するエージェントループです。ghost-hands として登録し、自分宛て/タグ付きタスクを取得します(リース、blockedBy、バスの承認要求ゲートに従います)。ガバナンス下でタスクを実行し、承認をバス経由で返し、トレイルを共有ファイルとしてアップロードし、構造化レポートとともに完了します。 |
MCP server (mcp_server.py) | 標準ライブラリのみで動作する stdio MCP です。hands_perceive、hands_act、hands_run、hands_trail を提供します。body と承認者はプロセスごとに環境変数で設定します。GHOST_HANDS_DRIVER(fake/chromium/simphone/android、v0.8)、GHOST_HANDS_START_URL、GHOST_HANDS_APPROVER=phone(Ryan のスマートフォン上で承認を判断。デフォルトでは理由を示して拒否し、応答には判断したチャネル名を含めます)、GHOST_HANDS_POLICY(ポリシーパック名)を使います。 |
CLI
ghost-hands demo # built-in fake-web demo
ghost-hands bench # the offline verification suite
ghost-hands doctor # diagnose the whole stack (add --json for tooling)
ghost-hands phone-proof # the guided on-device proof (exit: 0/1/2/3)
ghost-hands report trail.jsonl # trail -> trail.html audit report (-o for a path)
ghost-hands bench --live # + live cases: example.com, Wikipedia
ghost-hands run --script steps.json --driver fake # or --driver chromium
adb forward tcp:8378 tcp:8378 # forward the phone's Ghost Hands bridge (USB)
ghost-hands android-status # is MrGhosty's bridge answering? (token via env)
ghost-hands run --script steps.json --driver android # drive the real phone, governed
ghost-hands run --script steps.json --policy policy.json --approve-all
ghost-hands run --script steps.json --policy-pack strict # or readonly
| **Plan cache** (`cache.py`) | v1.0 governed plan cache: `done` runs store their proven steps (owner-only file); identical goals replay them through the full Governor with zero decider calls, descriptor re-finding, and an on-trail fallback to the live decider when the page has changed. |
ghost-hands run --script steps.json --cache plans.json # v1.0 governed plan cache
ghost-hands verify-trail trail.jsonl # v1.0 prove a trail untampered
ghost-hands export trail.jsonl -o replay.py # graduate a trail into a script
ghost-hands export trail.jsonl --driver fake --pages pages.json -o replay.py
ghost-hands mcp # MCP server on stdio
ghost-hands bus-agent --once # work one GhostBus task, then exit
ghost-hands bus-agent --workspace studio # hosted bus, /w/studio/ (key via GHOSTBUS_KEY)
ghost-hands bus-demo # prove bus mode vs the real GhostBus server
ファイル形式については、examples/steps.json と examples/policy.json を参照してください。
比較
| ドライバースタック | インテントレイヤー | ガバナンス/承認ゲート | 来歴の記録 | 実行 → スクリプト再生 | ボディ | |
|---|---|---|---|---|---|---|
| Playwright | Chromium/Firefox/WebKit 用の独自プロトコルドライバー | なし — 決定論的なスクリプト | なし | テスト用の Trace Viewer | Codegen がスクリプトを記録 | Web |
| Playwright MCP | MCP 経由の Playwright(23 以上の低レベルツール) | 呼び出し元のモデルが直接担当 | なし | 組み込みなし | なし | Web |
| Stagehand | Playwright + AI プリミティブ(act/observe/extract/agent) | ステップごとの LLM 呼び出し | なし | セッションログ | アクションのキャッシュ | Web(クラウドブラウザーは追加料金) |
| Browser Use | 独自のブラウザーエージェントループ | 完全自律型の LLM ループ | なし | 実行履歴 | なし | Web |
| Jev | 番号付き操作リスト、低コストの判断パス | ステップごとに単一の低コストパス | なし(そのために Agent Seatbelt を構築しました) | 最小限 | なし | Web |
| Ghost Hands | 依存関係ゼロの独自 CDP スタック — 内部で Playwright も Selenium も使用しません | プラグイン可能:スクリプト、決定論的ルール、または OpenAI 互換モデル | 各アクションの前に分類 + ポリシー + 承認。実行前に記録 | 実行ごとの記録を含む完全な JSONL 記録 | はい — 記録から Ghost Hands スクリプトに昇格します | Ghost Hands スクリプトに昇格します** |
検証状況
v0.6.0(2026年10月8日)時点で、何が証明済みで、何が未証明かを示します。
- 証明済み: オフラインテスト一式(pytestテスト299件、ベンチマークケース88件);
フィクスチャページ上でのChromiumドライバー(認識/入力/クリック/タブ/
セッションのラウンドトリップ/スクリーンショット/段階的なスクリプト実行)と、
実際のChromium上でのv0.3の全機能セット(マトリックスの注記を参照);
example.comとWikipediaでのライブ実行(
ghost-hands bench --live、 2/2);ローカルのスタブエンドポイントに対するLLM判定器のワイヤープロトコル; 実際のGhostBusノードサーバーに対するバスエージェントモード — 単一ワークスペースの リレーと、ホストされた/w/<id>/ワークスペースの両方を含みます — 実行中にバス経由で 承認が許可されたケースと拒否されたケースを含む;プロセス内の3つすべての ボディでのBody Protocol適合シナリオ;シミュレーターのスマートフォンでのメモフローの エンドツーエンド;ブリッジのコントラクトに対するAndroidボディ — 実際のブリッジと同一のワイヤープロトコルを話す偽ブリッジに対する、AndroidDriverの 完全なガバナンス対象フロー(変更後の修復と、重大な削除のゲートを含む)に加え、 ブリッジを組み込んでビルドし、署名を検証したMrGhosty v1.6.0 APK; 同じコントラクトを介したスマートフォンでの承認 — PhoneApproverの完全な リクエスト/ポーリングフロー(承認/拒否/期限切れ/タイムアウト/到達不能/401)、 ワイヤー上でのペイロードの秘匿化の実証、AndroidボディとWebボディの両方で 実行中にシミュレートしたスマートフォンの判断により重大なアクションが承認・拒否されたこと、 実際のGhostBusサーバーに対するバスエージェントのスマートフォンチャネル、 および承認ストア、レシーバー、ブリッジのエンドポイントを組み込んでビルドし、 署名を検証したMrGhosty v1.7.0 APK(承認ストアのロジックはJVMでテスト済み、確認44件)。 - 未証明: ローカルのフィクスチャを超えたライブモデルの操作品質 —
v0.7の評価ハーネスは、環境変数で設定された任意のモデルを8つの採点対象ローカルタスクで
測定します(スタブで8/8でも、証明されるのはハーネスのみ;ルールベースの
ベースラインは3/8;実際のモデルの結果は実行ごとに報告され、恒常的な主張として
保存されることはありません)。ただしフィクスチャは小規模でローカルなものです。
任意のサードパーティサイトでモデルがどのように操作するかはモデル次第であり、
ここでは未証明です;
上記2件のライブケースを超えた、任意のサードパーティWebサイトに対するChromium
ドライバーの動作;他のツールとの速度の直接比較(測定も主張もしていません);
デプロイ済みのホスト型GhostBusに対するバスモード(実際のサーバーをローカルで
起動した状態では、どちらの構成でも証明済みです);物理端末上でのAndroidボディと
スマートフォン承認フロー — ドライバー、MrGhostyブリッジ、承認UXはビルド済みですが、
v0.5/v0.6のビルド時にスマートフォンは接続されていませんでした;
端末上での実証は、RyanがMrGhosty v1.8.0をインストールしてアクセシビリティを
許可した後に行います(その後、
adb forward tcp:8378 tcp:8378とghost-hands phone-approval-testを実行します)。 v0.9では、まさにその実行に 必要なツールを提供します。ghost-hands doctorは実行前後にスタックを診断し、ghost-hands phone-proofは5つのステップをRyanとともに進め、各ステップを確認します。 どちらも、偽ブリッジとローカルで起動したバスに対してはここで証明済みですが、 Ryanの物理端末に対してはまだ実行されていません。v0.4の作業で判明したバスに関する 問題は解決済みです。GhostBusのファイルベースのストアは、単一の共有.tmpファイルを 経由して書き込んでおり、負荷の高い並行書き込み時にリネームが競合することがありました (HTTP 400)。この問題はGhostBus 0.4.1で修正され、0.5.0以降のGhostBusテスト一式で 回帰テスト済みです。さらにv0.7でこちら側から再検証したところ(ファイルストアのバス デモ+エージェント/ポーラーの大量実行)、400は0件でした。GhostBusの設計上、 より限定的な特性は残っています。共有ストアの状態は操作ごとに再読み込みされます (読み取り・変更・書き込み方式のため、複数のプロセスで1つのワークスペースファイルを 共有できます)。そのため、多数の書き込みが同時に行われると、更新が依然として 無言で失われる可能性があります。ただし、Ghost Handsが実際に生成する エージェント+ポーラーのワークロードには影響しません(測定済み)。
安全方針
- 隠蔽しません。 Ghost Hands は正直に身元を明らかにし、自動化を偽装しません。ガバナンスが製品であり、回避は機能ではありません。
- キーを保存しません。 OpenAI 互換の判断コンポーネントは、環境変数からのみ
GHOST_HANDS_API_KEY/GHOST_HANDS_BASE_URL/GHOST_HANDS_MODELを読み込みます。 - 拒否された操作は実行しません。 ブロック、拒否、または未承認の操作は決して実行されず、履歴には判定とその理由が記録されます。
ロードマップ
- GhostBus トランスポート — 他のエージェントがタスクを依頼できるバスエージェントとしてのハンズと、バス経由でルーティングされる承認(v0.4.0)。
- ポリシーパック — 名前付きのガバナーセット:readonly / standard / strict(v0.4.0)。Seatbelt/GhostGuard を想定したパックも、同じデータ形式で追加できます。
- Body Protocol — ドライバーの仕様を文書化した契約と、それを実証するシミュレーション上のスマートフォン本体(v0.4.0)。
- Android 本体 — ドライバー + MrGhosty ブリッジを構築済み(v0.5.0):MrGhosty のアクセシビリティサービスが、ループバック接続とペアリングトークンを使うブリッジを介して Body Protocol を実装し、
AndroidDriverがこれと通信します。実機での実証は、Ryan によるインストールとアクセシビリティ権限の付与待ちです。ハンズは 1 つで、スマートフォンとウェブに対応します。 - スマートフォンのプッシュ通知による承認 — 完了(v0.6.0)。ただし、「プッシュ」という言葉には明確な注意点があります。ブリッジに接続できる場合、承認は MrGhosty ブリッジを通じて Ryan のスマートフォンに届きます(通知 + アプリ内での決定)。これはローカルブリッジの通信経路であり、クラウドプッシュサービスではありません。ブリッジ API に決定用エンドポイントはなく、決定はスマートフォン上でのみ行われます。
- モデル評価ハーネス — 構築済み(v0.7.0):
ghost-hands evalは、8 つのローカルタスク(うち 4 つは実際の Chromium 上で実行)を使って判断コンポーネントを評価し、タスクごとの採点と JSON レポートを生成します。スタブとルールベースのベースラインが同梱され、実際のモデルは環境変数経由で接続できます。 - Android ジェスチャー — 実装済み(v0.7.0、MrGhosty v1.8.0):実際の Android 本体上で
dispatchGestureを使ってdouble_click、drag、click_atを実装しています。シミュレーターでこれらを偽装することはありません。 - フィールドキット — 構築済み(v0.9.0):
ghost-hands doctor(平易な言葉で修正方法を示すスタック全体の診断機能。ツール連携用の--jsonに対応し、秘密情報は表示されません)と、ghost-hands phone-proof(実機での実証を案内する 5 段階の手順。検証可能で、スクリプトから実行でき、終了コードも返します)。実機での実証は引き続き Ryan のスマートフォン待ちです。これらは Ryan と一緒に実証を進めるためのツールです。
リポジトリ構成
リンク: PyPI · サイト · リリース v0.3.0 · CHANGELOG.md · LAUNCH.md
src/ghost_hands/— パッケージです。レイヤーごとにモジュールがあり、eyes(認識)、actions、governor、policies(ポリシーパック)、trail、drivers(FakeDriver と独自の CDP ChromiumDriver)、simphone(シミュレートされた電話本体)、android_driver(MrGhosty ブリッジ経由の 実際の Android 本体)、phone_approver(Ryan の電話で承認を判断)、deciders、runner、export、busclient+busagent(GhostBus モード)、evaluate(v0.7 の モデル評価ハーネス)、report(v0.8 の trail → HTML 監査 レポート)、doctor+phone_proof(v0.9 のフィールドキット)、mcp_server、cli、benchがあります。docs/BODY_PROTOCOL.md— 本体の契約、機能フラグ、 適合性ルール、Android のマッピング表を記載しています。docs/APPROVALS.md— 3 つの承認チャネル(プロンプト、バス、 電話)、API で判断しないルール、概要のマスキングルールを記載しています。tests/— pytest テストスイート(v0.9.0 時点で 395 件のテスト)。- Bench —
ghost-hands bench(オフライン、v0.9.0 時点で 95 ケース)とghost-hands bench --live(オプトイン方式の実際のウェブケース)があります。ベンチコードはsrc/ghost_hands/bench.pyにあります。 examples/—ghost-hands run用のステップとポリシーファイルのサンプル、 およびsample-report.htmlを収録しています。これは監査レポートをレンダリングしたもので、 (sample-trail.jsonlから生成され)、ghost-hands reportが 生成する内容をそのまま示しています。site/— プロジェクトサイトのソースです。.github/workflows/pages.yml` によって GitHub Pages にデプロイされます。LAUNCH.md— ローンチ時に作成されたローンチ手順書と告知文一式です。PLAN.md— 開発の出発点となったフィールド調査と設計メモです。
ライセンス
MIT — 詳細は LICENSE を参照してください。© 2026 Ghost Developer Studio.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。