agent-browser-relay について
agent-browser-relayは、ローカルリレー経由で明示的に接続したブラウザータブを操作するエージェント向けスキルです。読み取り前の準備確認と、並行作業でのタブ単位のリース管理を重視します。
主な機能
- 01ローカルリレーによるタブ接続
- 02準備状態と接続状態の確認
- 03並行実行向けのタブ単位リース
- 04ページのテキスト、リンク、メタデータ抽出
- 05JavaScript実行とスクリーンショット
活用シーン
- 01明示的に接続したページの読み取り
- 02別々のタブでの並行ワークフロー
- 03チャットやWhatsApp内容の絞り込み抽出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mindgames/ agent-browser-relay --skill agent-browser-relayインストール後、Claude Code で/agent-browser-relayを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEAGENTS.mdCHANGELOG.md.gitignoreREADME.mdSECURITY.mdCONTRIBUTING.mdpackage.jsonpnpm-lock.yamlrelay-server.js.github/pull_request_template.md.github/workflows/ci.ymlagents/openai.yamldocs/implementation-plan/2026-06-01-codex-for-oss-application.mdextension/manifest.jsonoptions.jsoptions.htmlpopup.htmlbackground.jspopup.jspackage.jsonscripts/sync-extension-version.jscodex-skill-link.shpreflight.shextension-install-helper.jsrelay-service.jsrelay-manager.jsextension-status.jsread-active-tab.jstests/contract.test.js詳細
Agent Browser Relay
このスキルを使うと、明示的にアタッチされたブラウザータブでローカルリレーゲートウェイを介して操作し、読み取り前に準備状態を確認できます。また、直接的なブラウザー制御ツールに切り替えることなく、リースの適用範囲内でタブの並行ワークフローを維持できます。
ドキュメントで主な対象としているのは Chrome です。拡張機能を読み込める Chromium ベースのブラウザーでも動作する場合があります。1 つのリレーポートに複数のブラウザー/プロファイルの拡張機能クライアントを同時に接続でき、リレーのステータスには各ブラウザー ID とアタッチ済みの tabRef 値が表示されます。
クイックスタート
新しいマシンでのルール:
skills addにより、インストール済みスキルが~/.agents/skills/agent-browser-relayに配置されることが保証されますskills addの後に保証される Chrome の読み込みパスは~/.agents/skills/agent-browser-relay/extensionです~/agent-browser-relay/extensionは、npm run extension:installで作成される任意の見やすい便利なコピーにすぎませんnpm run extension:path、npm run relay:start、npm run relay:global:installは、読み込むプライマリーフォルダーを表示しますnpm run extension:pathは、エージェントが現在の作業ディレクトリに依存せず呼び出せるよう、read-active-tab.jsとpreflight.shの安定した絶対パスも表示します- リレーの起動後に拡張機能のポップアップを一度開くと、拡張機能が起動し、Chrome が実際に読み込んだことを
npm run extension:statusで確認できるようになります - 新しいマシンでは、アタッチ/読み取りの手順に進む前に、人間が
chrome://extensionsでプライマリーパスを読み込む必要があります。見やすい便利なコピーが存在しないことを、サンドボックスやソケット権限の問題として扱わないでください。
デフォルト値はコード内で設定されています:
- ホスト:
127.0.0.1 - ポート:
18793 - アタッチのタイムアウト:
120000ms 必要に応じて、コマンドごとに--host、--port、--attach-timeout-msで上書きしてください。
-
依存関係をインストールしてリレーを起動する
Chrome で読み込むプライマリーの Chrome 拡張機能パスを表示し、可能な場合は見やすい便利なコピーも更新します。
npm run relay:start -- --status-timeout-ms 3000または、ホスト/ポートを明示的に指定します:
npm run relay:start -- --host "127.0.0.1" --port "18793" --status-timeout-ms 3000relay:startは、停止するかプロセスが再起動されるまで実行され続けます。実行時間を制限する場合は、--auto-stop-msを明示的に指定してください:node scripts/relay-manager.js start --auto-stop-ms 10800000 -
Chrome で拡張機能を読み込む
chrome://extensions- デベロッパーモードを有効にする
skills addの後に~/.agents/skills/agent-browser-relay/extensionからパッケージ化されていない拡張機能を読み込む- コマンドに拡張機能のパスが表示された場合は、その表示されたパスを正しいパスとして扱う
- 正確なパスを再度表示したい場合は、インストール済みスキルのディレクトリから
npm run extension:pathを実行する ~/agent-browser-relay/extensionは任意です。見やすいショートカットが必要な場合は、npm run extension:installで作成してください
-
Chrome で拡張機能が読み込まれていることを確認する
リレーの起動後に、ツールバーのポップアップを一度開いてください。ポップアップに
Relay connected on <port>と表示されるはずです。エージェントの要件:新しいマシンでアタッチする前に、人間にポップアップを一度開いてもらい、次のコマンドで確認してください:
npm run extension:status -- --port "18793" --wait-for-connected --connected-timeout-ms 120000これにより、リレーポートに接続されている各ブラウザのホスト/プロファイル ID が報告されます。
-
拡張機能を対象のタブにアタッチする(ツールバーのポップアップを開いて「アタッチ」をクリック)
通常の使用では、すべてのブラウザーでデフォルトのリレーポートを使い、各ブラウザーで対象のタブをアタッチしてください。リレーは
tabRef(browserId:tabId)でタブを名前空間化します。 エージェント自身に最初のバックグラウンドタブを作成させる場合は、ポップアップで Allow agent to create new background tabs を有効にしてください。エージェントの要件:
extension:statusで Chrome に拡張機能が読み込まれていることを確認した後、一旦停止して人間にこのアタッチ手順を依頼し、確認を待ってから続行してください。git fetchまたは pull の後に.agentsスキルフォルダーからextension/がなくなった場合は、リポジトリから修復してください:cd ~/.agents/skills/agent-browser-relay 2>/dev/null || cd ~/.agents/skills/private/agent-browser-relay git sparse-checkout disable git config --unset-all core.sparseCheckout || true git config --unset-all core.sparseCheckoutCone || true git checkout -- . -
準備状態とアタッチ状態を確認する
npm run relay:doctor -- --port "18793" --tab-id "<TAB_ID>" --jsonまずステータスから
<TAB_ID>または<TAB_REF>を解決してください(npm run relay:status -- --all --status-timeout-ms 3000)。 すべてのエージェント実行では、割り当てられたタブ ID またはタブ参照を使用してください:npm run relay:doctor -- --host "127.0.0.1" --port "18793" --tab-id "<TAB_ID>" --jsonnpm run relay:doctor -- --host "127.0.0.1" --port "18793" --tab-ref "<TAB_REF>" --jsonこのコマンドが成功を返した場合にのみ続行してください。
複数ブラウザーでの動作
- 1つのリレーポートで、複数の接続済みブラウザー/プロファイル拡張クライアントをサポートします。
- アタッチ済みタブには、
browserId:tabId形式のブラウザー固有のtabRefが含まれます。 - アタッチ済みタブの中にその ID のタブが1つだけある場合は
--tab-idを使用します。複数のブラウザーで同じ数値のタブ ID が使われている可能性がある場合は、--tab-refを使用します。 - 複数のブラウザーで
Target.createTargetが有効になっている場合は、使用するブラウザーを選択するために--browser-idを指定します。
高度なタブごとのリレーポートの動作
- デバッグや特殊なルーティング用に、複数のリレーポートを引き続き利用できます。
- 保存済みのリレーポートのマッピングがないタブでは、グローバルのデフォルトリレーポート(
18793)を使用します。 - アタッチに成功すると、拡張機能はそのタブに割り当てられたリレーポートを保存し、以降は自動的に再利用します。
- 閉じたタブのマッピングは自動的に削除されます。
エージェントの必須動作
- このリポジトリにある固定コマンドを使用してください。別のスクリプト名を「探さない」でください。
- ゲートウェイのみを使用するルール:必ずローカルリレーゲートウェイ(
/statusとnode scripts/read-active-tab.js)を介して通信してください。 - このワークフローでは、ブラウザーを直接制御するツール(Playwright、Puppeteer、Selenium、
agent-browser、その場で作成した Chrome 制御スクリプトなど)は使用しないでください。 - ランダムな Chrome ウィンドウやプロファイルを操作しないでください。
--tab-idまたは--tab-refを使って割り当てられた、明示的に接続済みの対象タブのみを操作してください。 - 新しいマシンでは、接続や読み取りを試みる前に、
npm run extension:pathが示すプライマリ拡張機能のパスを読み込むよう人間に明示的に伝えてください。skills addの後であれば、通常は~/.agents/skills/agent-browser-relay/extensionです。 - 正式なコマンド:
npm run extension:pathnpm run extension:statusnpm run relay:startnpm run relay:statusnpm run relay:doctornpm run relay:stopnode scripts/read-active-tab.js
- リレーのヘルスチェックでは、ハングを避けるため、必ずタイムアウトを明示してください。
npm run relay:status -- --status-timeout-ms 3000curl --max-time 3 -sS "http://127.0.0.1:18793/status"npm run relay:status -- --all --status-timeout-ms 3000
relay:startの後、一旦停止し、人間にポップアップを一度開くよう依頼してください。これにより、npm run extension:status -- --port "18793" --wait-for-connected --connected-timeout-ms 120000で Chrome が実際に拡張機能を読み込んだことを確認できます。extension:statusが成功した後に限り、読み取りの前に対象タブを接続するよう人間に依頼するか、最初のタブを作成するワークフローを開始する前に Allow agent to create new background tabs が有効になっていることを確認してください。- 読み取りの前に
npm run relay:doctor -- --host "127.0.0.1" --port "18793" --tab-id "<TAB_ID>" --jsonまたはnpm run relay:doctor -- --host "127.0.0.1" --port "18793" --tab-ref "<TAB_REF>" --jsonを実行し、成功した場合にのみ続行してください。 - ワークフローで
Target.createTargetによるタブの起動が必要な場合は、npm run relay:doctor -- --host "127.0.0.1" --port "18793" --require-target-create --jsonを実行し、成功した場合にのみ続行してください。 - すべてのエージェント実行(単独エージェントおよび並行実行)では、確認・読み取りコマンドに必ず
--tab-id <tabId>または--tab-ref <browserId:tabId>を渡し、すべての操作をリースの対象範囲内にしてください。 - 並行実行では、接続済みタブはリレーの共有状態ですが、1つの接続済みタブに割り当てられるアクティブなリースは同時に1つだけです。次の
--tab-id/--tab-refを選ぶ際は、npm run relay:status -- --all --status-timeout-ms 3000を確認し、leaseSummary.availableAttachedTabIds、attachedTabs[].tabRef、attachedTabs[].leasedSessionIdを優先して参照してください。 - doctor が
TAB_LEASED_BY_OTHER_SESSIONを返した場合、引き継ぎを試みないでください。そのセッションの完了を待つか、アクティブなリースのない別の接続済みタブを使って再試行してください。 Target.createTargetが有効な場合、人間が最初にタブを接続しなくても、拡張機能がセッション用のエージェント制御タブを最初に作成し、自動接続することがあります。- 人間からの依頼、または明示的に復旧が必要な場合を除き、タスク中にリレーを停止・再起動しないでください。
- コードがローカルで更新されたという理由だけでリレーを再起動しないでください。更新は、人間が明示的に承認して再起動した次のタイミングで適用されます。
- 要求された
tabIdがリレーのステータスにあるattachedTabsに見つからない場合は、停止し、続行する前にポップアップから対象タブを再接続するよう人間に依頼してください。 relay:startがタイムアウトした場合は、実際のリレーログ/エラーを報告してください。コマンド出力に具体的な権限エラーが示されていない限り、サンドボックスの制限について推測しないでください。- ページに人間による確認のゲート(「Are you human?」や CAPTCHA など)が表示された場合は、直ちに停止し、$attention-please を使って人間に知らせ、続行前に人間から明示的な確認があるまで待ってください。
-
構造化されたタブのペイロードを読み取る
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-id "<TAB_ID>" -
省略可能なワンコマンドのスモークテスト
./scripts/preflight.sh
これはローカルのスモークテスト用ラッパーです。エージェントのワークフローでは、タブに接続済みの場合は npm run relay:doctor -- --port "18793" --tab-id "<TAB_ID>" --json、最初のタブを作成するワークフローの場合は npm run relay:doctor -- --port "18793" --require-target-create --json が正式な事前チェックコマンドです。
現在の作業ディレクトリがインストール済みのスキルルートでない場合は、相対パスの node scripts/read-active-tab.js ではなく、npm run extension:path が出力する絶対パスの Stable read CLI path を使用してください。
機能
read-active-tab.js は、成功したすべてのペイロードで次の場所に機能メタデータを返します。
source.capabilities
バージョン互換性チェックの結果も source.extension に含まれます。
installedVersionsourceVersionrelayVersionobservedExtensionVersionversionMismatch
不一致が検出された場合、コマンドは実行のたびに、人が読みやすい形式の更新ヒントも stderr に出力します。
scripts/read-active-tab.jsのデフォルト抽出項目:url、title、text、links、metaDescription。- Relay セッションリース(
--tab-id、--tab-ref)により、1 つの Relay ポート上でタブごとにエージェントを分離できます。 --expression、--expression-file、または--expression-stdinを使ったRuntime.evaluate式モード。--screenshotによるスクリーンショット撮影モード(--screenshot-full-page、--screenshot-pathは任意)。- WhatsApp および汎用チャット監査用の、正規表現フィルターを備えたプリセット抽出。
--check --wait-for-attachによる接続状態のポーリング。
並行ワークフローに関する注意事項
- 並行実行でタブを選択する前に、
npm run relay:status -- --all --status-timeout-ms 3000を実行して確認してください。 - 現在使用可能な接続済みタブを把握するには、
attachedTabsとleasedSessionId/tabLeasesを確認してください。 - doctor が
TAB_LEASED_BY_OTHER_SESSIONを返した場合は、強制的に引き継がないでください。そのセッションがタブを解放するまで待つか、別の接続済みtabIdを選択してください。 - リース分離により、接続済みタブごとに Relay コマンドのルーティングが分離されます。ブラウザープロファイルが別になるわけでも、ブラウザープロセスの分離が強化されるわけでもありません。
プリセットとフィルター
--presetの値:default、whatsapp、wa、whatsapp-messages、chat-audit、chat。- 正規表現フィルター:
--text-regex、--exclude-text-regex、--link-text-regex、--link-href-regex。 - WhatsApp/チャット用フィルター:
--message-regex、--exclude-message-regex、--sender-regex、--exclude-sender-regex。
コマンドの一般的な例
エージェントのワークフローでは、--tab-id または --tab-ref を指定する形式を使用してください。スコープを指定しないコマンドは、手動でのローカルデバッグ専用です。
複雑な JavaScript を指定する場合は、インラインの --expression よりも --expression-file または --expression-stdin を優先してください。
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --pretty false
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-id 123 --pretty false
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-ref chrome-profile:123 --pretty false
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-id 123 --check --wait-for-attach --require-target-create --attach-timeout-ms 120000
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --expression "document.documentElement.outerHTML"
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-id 123 --expression-file "./tmp/expression.js"
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --tab-id 123 --expression-stdin < ./tmp/expression.js
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --screenshot --screenshot-full-page --screenshot-path "./tmp/page.png"
node scripts/read-active-tab.js --host "127.0.0.1" --port "18793" --preset whatsapp-messages --max-messages 200 --selector "#main"
node scripts/read-active-tab.js --preset chat-audit --selector "body" --message-regex ".*"
成功したすべてのコマンドは、relayHost、relayPort、relayStatusUrl、relayWebSocketUrl を含む source オブジェクトを返します。
エージェントを使った推奨フロー
自動化ワークフローでデータを取得する前に、軽量な事前チェックを 1 回実行し、Relay と接続済みタブの状態が準備できていることを確認してください。
1 つの Relay で複数のエージェントを動かす場合:
- Relay のステータスからタブ ID を特定します(
npm run relay:status -- --all --status-timeout-ms 3000)。 - エージェントごとにタブ ID を 1 つ割り当てます。
- そのエージェントの
read-active-tab.js呼び出しでは、すべて--tab-idまたは--tab-refを使用します。 - 拡張機能のインスタンスは共有されるものとして扱います。リースにより、2 つのコントローラーセッションが同じ接続済みタブを操作することは防げますが、別々の Chrome プロファイルや拡張機能プロセスが作成されるわけではありません。
relay:doctorがTAB_LEASED_BY_OTHER_SESSIONを報告した場合は、attachedTabs、tabLeases、およびブロッカーのdetailを確認し、別の接続済みタブを選ぶか、所有セッションがタブを解放するまで待ってください。