Chrome 拡張機能と CLI で、エージェントがあなたの実際のブラウザを操作 — ログイン状態、拡張機能、Cookie がすでに利用可能。ヘッドレスインスタンス不要、ボット検出なし、余分なメモリ消費なし。GitHub で Star。
他のブラウザ MCP は新しい Chrome を起動します — ログインなし、拡張機能なし、即座にボット検出、メモリ2倍消費。RunBrowser は実行中のブラウザに接続します。Chrome 拡張機能1つで、完全な CDP アクセス、すでにログイン済みのすべてのサイトにアクセス可能。
はじめに
3ステップでエージェントがブラウジングを開始。
- CLI をインストール:
npm i -g @jiweiyuan/runbrowser
-
Chrome に拡張機能をロード:
chrome://extensions/を開き、デベロッパーモードを有効化、パッケージ化されていない拡張機能を読み込むをクリック、packages/extension/distフォルダを選択 -
タブの拡張機能アイコンをクリック — 緑色に変わります。使い始めましょう:
runbrowser navigate https://example.com runbrowser snapshot runbrowser click @e5
セッション管理は不要 — 最初のコマンドでセッションが自動作成されます。拡張機能がブラウザを localhost:19988 のローカル WebSocket リレーに接続します。CLI がリレーを通じて CDP コマンドを送信。リモートサーバーなし、アカウント不要。
skill もインストールしましょう — エージェントに RunBrowser の使い方を教えます:
npx -y skills add runbrowser/runbrowser
拡張機能アイコン 緑 = 接続済み。グレー = このタブに未接続。
仕組み
タブの拡張機能アイコンをクリック — chrome.debugger で接続し、ローカルリレーへの WebSocket を開きます。エージェント(CLI または MCP)が同じリレーに接続。CDP コマンドが拡張機能を通じて直接 Chrome に流れます — Playwright なし、中間層なし。
┌─────────────────────┐ ┌──────────────────────┐ ┌─────────────────┐ │ BROWSER │ │ LOCALHOST │ │ CLIENT │ │ │ │ │ │ │ │ ┌───────────────┐ │ │ WebSocket Server │ │ ┌───────────┐ │ │ │ Extension │<───────┬───> :19988 │ │ │ CLI / MCP │ │ │ └───────┬───────┘ │ WS │ │ │ └───────────┘ │ │ │ │ │ /extension │ │ │ │ │ chrome.debugger │ │ │ │ │ v │ │ v │ │ v │ │ ┌────────────┐ │ │ ┌───────────────┐ │ │ CDPExecutor │ │ │ HTTP API │ │ │ │ Tab 1 (green) │ │ │ (direct CDP) │ │ │ /api/* │ │ │ │ Tab 2 (green) │ │ └──────────────────────┘ │ └────────────┘ │ │ │ Tab 3 (gray) │ │ │ │ └─────────────────────┘ Tab 3 not controlled └─────────────────┘
リレーはセッションを多重化するため、複数のエージェントや CLI インスタンスが同時にブラウザを操作可能。すべてのブラウザコマンドは CDP で直接実行 — Playwright 依存なし。
コラボレーション
エージェントがあなたのブラウザで動作するため、コラボレーションが可能。すべてをリアルタイムで確認 — クリックごとにターゲット要素に緑のハイライトが表示され、コマンドごとに微妙なボーダーの光が点滅。CAPTCHA が出たらあなたが解決。Cookie 同意が出たら、クリックして通過。エージェントが詰まったら、そのタブで拡張機能を無効化、手動で修正、再度有効化すれば、エージェントは中断したところから再開。
リモート画面を見ているのでも、事後にログを読んでいるのでもない。ブラウザを共有しているのです。
アクセシビリティスナップショット
エージェントは操作前にページを見る必要があります。アクセシビリティスナップショットは、すべてのインタラクティブ要素をテキストで返し、@ref ラベルが付きます。スクリーンショットの 100KB+ に対して 5~20KB — 安価、高速、ビジョンなしで解析可能。
runbrowser snapshot # 出力: # - banner: # - link "Home" @e1 # - navigation: # - link "Docs" @e2 # - link "Blog" @e3 # - main: # - heading "Welcome" @e4 # - button "Get started" @e5
各行の @ref をコマンドに直接渡せます。スナップショットをページを読む主要な方法として使用。
# スナップショットの ref でインタラクション runbrowser click @e5 runbrowser fill @e3 "検索キーワード" runbrowser get text @e4 # インタラクティブ要素のみフィルタ runbrowser snapshot -i # CSS セレクタでスコープ runbrowser snapshot -S "main"
CLI コマンド
RunBrowser はカテゴリ別に整理された 50+ コマンドを提供。すべてのコマンドが --json 出力と自動セッション作成をサポート。
# ナビゲーション runbrowser navigate https://example.com runbrowser back runbrowser forward runbrowser reload runbrowser close # 観察 runbrowser snapshot # @refs 付きアクセシビリティツリー runbrowser snapshot -i # インタラクティブ要素のみ runbrowser screenshot shot.png # スクリーンショット保存 runbrowser get url # 現在の URL runbrowser get title # ページタイトル runbrowser get text @e5 # 要素のテキスト runbrowser is visible @e5 # 要素状態チェック # インタラクション runbrowser click @e5 # 要素クリック runbrowser fill @e3 "hello world" # 入力フィールドクリア+入力 runbrowser type "検索キーワード" # 現在のフォーカスでタイプ runbrowser press Enter # キー押下 runbrowser select @e5 "option-value" # ドロップダウン選択 runbrowser check @e5 # チェックボックス runbrowser scroll down # スクロール runbrowser hover @e5 # ホバー runbrowser viewport 1280 720 # ビューポートサイズ設定 # 待機条件 runbrowser wait @e5 # 要素が表示されるまで待機 runbrowser wait 2000 # ミリ秒待機 runbrowser wait --text "Welcome" # テキスト出現待機 # セマンティックロケーター runbrowser find role button click --name "Submit" runbrowser find text "ログイン" click # タブ&フレーム管理 runbrowser tab list runbrowser tab new https://example.com runbrowser frame "iframe#embed" runbrowser frame main # 実行 runbrowser eval 'document.title' # ブラウザで JS 実行 runbrowser cdp Page.captureScreenshot '{}' # 生の CDP コマンド
ホットパスにはフラットコマンド。管理にはサブグループ。eval はその他すべて。
サイトコマンド
任意のウェブサイトを CLI コマンドに変換。サイトコマンドは TypeScript プラグインで、ナビゲーション、スクレイピング、データ抽出を再利用可能なコマンドにカプセル化。1つのコマンドで構造化 JSON を取得。
# GitHub トレンドリポジトリを構造化データとして取得 runbrowser github trending --limit 5 # RANK NAME STARS LANGUAGE # --- ---- ----- -------- # 1 denoland/deno 5.2k Rust # 2 tauri-apps/tauri 3.8k Rust # エージェント向け JSON 出力 runbrowser github trending --limit 3 --json
~/.runbrowser/commands/ に .ts ファイルを置くだけでカスタムコマンドを作成。TypeScript、IDE サポート完備。
// ~/.runbrowser/commands/github/trending.ts export const description = 'GitHub trending repositories' export const columns = ['rank', 'name', 'stars', 'language'] export const args = { limit: { type: 'number', default: 20, description: 'Number of items' }, } export async function run(ctx, args) { await ctx.navigate('https://github.com/trending') const data = await ctx.evaluate(` [...document.querySelectorAll('article.Box-row')].map(el => ({ name: el.querySelector('h2 a')?.textContent?.trim(), stars: el.querySelector('.octicon-star')?.parentElement?.textContent?.trim(), language: el.querySelector('[itemprop="programmingLanguage"]')?.textContent?.trim(), })) `) return data.slice(0, args.limit).map((item, i) => ({ rank: i + 1, ...item })) }
TypeScript プラグイン。構造化データ。ナビゲーション→スナップショット→解析の代わりに1コマンド。
コマンド拡張
runbrowser/commands リポジトリからコミュニティメンテナンスのコマンドをインストール。クローン不要、ビルド不要 — インストールしてすぐに使用。
# 利用可能なコマンド拡張を一覧表示 runbrowser commands list # Available command extensions: # # reddit # youtube # x ✓ installed # hackernews # producthunt # 拡張をインストール runbrowser commands install reddit # ✓ Installed reddit/ # → ~/.runbrowser/commands/reddit/hot.ts # → ~/.runbrowser/commands/reddit/search.ts # すぐに使用可能 runbrowser reddit hot --limit 5 runbrowser reddit search "ブラウザ自動化" # アンインストール runbrowser commands uninstall reddit # ✓ Uninstalled reddit/
コミュニティコマンドは TypeScript ファイルとして ~/.runbrowser/commands/<site>/ にダウンロードされます。カスタムサイトコマンドと同じ形式 — 閲覧、修正、フォークが可能。
仕組み: CLI が runbrowser/commands GitHub リポジトリから .ts ファイルを取得しローカルに保存。リレーサーバーが jiti で実行時にロード — コンパイル不要。各拡張は1つ以上のコマンドファイルを含むディレクトリ。
自分のコマンドを貢献: runbrowser/commands リポジトリにディレクトリを作成し、.ts ファイルを置いて PR を提出。あなたのコマンドが runbrowser commands install で全員に利用可能に。
一貫したサブコマンドパターン。コミュニティメンテナンス。カスタムコマンドと同じ TypeScript 形式。
セッション
セッションは自動作成 — コマンドを実行するだけで動作。高度な用途では明示的にセッションを管理。
runbrowser session new # セッション作成、id を出力 runbrowser session list # セッションと状態キーを表示 runbrowser session delete 1 # セッション削除
複数のエージェントを同時に実行しても互いに干渉しません。各セッションは独立したサンドボックス。ブラウザタブは共有、セッション状態は独立。
# 明示的なセッション指定 runbrowser navigate https://a.com -s 1 runbrowser navigate https://b.com -s 2 # デフォルトセッションの設定 export RUNBROWSER_SESSION=1 runbrowser snapshot # セッション1を使用
画面録画
エージェントの操作を MP4 動画として録画。chrome.tabCapture を使用し拡張機能コンテキストで実行するため、ページナビゲーション後も継続。
# 録画開始 runbrowser record start -o recording.mp4 # ナビゲーション、インタラクション — 録画はページをまたいで継続 runbrowser navigate https://example.com runbrowser click @e5 # 停止して保存 runbrowser record stop
ネイティブタブキャプチャ。ナビゲーションを越えて持続。H.264 MP4 に自動トランスコード。
MCP 連携
RunBrowser は 2ツールの MCP モデル — skill と run。ツールの肥大化なし、スキーマの膨張なし。
{ "mcpServers": { "runbrowser": { "command": "npx", "args": ["-y", "@jiweiyuan/runbrowser-mcp@latest"] } } }
エージェントは skill で利用可能なコマンドを学習し、run で実行:
skill() → 完全な CLI ドキュメント + サイトコマンドを返す
run({ command: "navigate https://example.com" })
run({ command: "snapshot" })
run({ command: "click @e1" })
run({ command: "eval document.title" })
run ツールは CLI と同じ構文。エージェントは別の API を学ぶ必要なし。
┌──────────────────────────────────────────────────────────────────────┐ │ MCP クライアント │ │ (Claude, Cursor, Windsurf...) │ └──────────────┬──────────────────────────────┬────────────────────────┘ │ │ skill() run(command) │ │ v v ┌──────────────────────────────────────────────────────────────────────┐ │ RunBrowser MCP サーバー │ │ │ │ ┌─────────────────┐ ┌──────────────────────────┐ │ │ │ skill ツール │ │ run ツール │ │ │ │ │ │ │ │ │ │ CLI ドキュメント │ │ コマンド文字列を解析 │ │ │ │ + サイトコマンド │ │ リレーに転送 │ │ │ │ 一覧を返す │ │ 結果を返す │ │ │ └─────────────────┘ └────────────┬─────────────┘ │ │ │ │ └─────────────────────────────────────────────────┼───────────────────┘ │ HTTP / WS │ v ┌─────────────────────────┐ │ リレー :19988 │ │ CDPExecutor │ └────────────┬────────────┘ │ chrome.debugger │ v ┌─────────────────────────┐ │ あなたの Chrome │ └─────────────────────────┘
比較
他の選択肢との比較。
| Playwright MCP | RunBrowser | |
|---|---|---|
| ブラウザ | 新しい Chrome を起動 | あなたの Chrome を使用 |
| 拡張機能 | なし | 既存のものをそのまま |
| ログイン状態 | 新規 | ログイン済み |
| ボット検出 | 常に検出される | 回避可能 |
| コラボレーション | 別ウィンドウ | ユーザーと同じブラウザ |
| BrowserUse | RunBrowser | |
|---|---|---|
| 言語 | Python | TypeScript / Node.js |
| ブラウザ | 新しい Chrome を起動(Playwright) | あなたの Chrome を使用 |
| アプローチ | AI エージェントフレームワーク(LLM が判断) | CLI + MCP ツール(エージェントがコマンド送信) |
| ログイン状態 | 新規 | ログイン済み |
| CLI | なし | あり — 50+ コマンド |
| Agent Browser | RunBrowser | |
|---|---|---|
| ブラウザ | ヘッドレス Chromium を起動 | 実行中の Chrome |
| コマンド数 | ~90(肥大化) | ~50(精選) |
| コマンド拡張 | なし | あり — コミュニティコマンドをインストール |
| CLI | Rust CLI → Node デーモン | Node CLI → リレー(シンプル) |
| ボット検出 | 常に検出される | 回避可能 |
| リアルタブ | いいえ | はい |
リモートアクセス
リモートマシンの Chrome を操作 — ヘッドレス Mac mini、クラウド VM、devcontainer。パブリックバインドとトークンでリレーサーバーを起動。
# ホストマシンで — リレーサーバー起動 runbrowser serve --host 0.0.0.0 --token <secret> # どこからでも — 環境変数を設定して通常通り使用 export RUNBROWSER_HOST=192.168.1.10 export RUNBROWSER_TOKEN=<secret> runbrowser navigate https://example.com
devcontainer や Docker にも対応 — RUNBROWSER_HOST=host.docker.internal を使用。
セキュリティ
すべてがあなたのマシンで動作。リレーは localhost:19988 にバインドし、拡張機能からの接続のみ受付。リモートサーバーなし、アカウント不要、テレメトリなし。
- ローカルのみ — WebSocket サーバーは localhost にバインド。データがマシンから出ることはない。
- オリジン検証 — RunBrowser 拡張機能のオリジンのみ受付。悪意あるサイトは接続不可。
- 明示的同意 — 拡張機能アイコンをクリックしたタブのみ制御。バックグラウンドアクセスなし。
- 可視の自動化 — 制御中のタブに自動化バナーを表示。すべてのエージェント操作に視覚フィードバック(緑のハイライト)。