🚀 BrowserControl
BrowserControl は、AIエージェントにブラウザの完全なアクセス権を与えるMCPサーバーです。ビジョンファーストなアプローチを採用しており、CSSセレクタやXPathを必要とせず、単に番号を指定するだけでウェブサイトとの対話が可能です。
🚀 クイックスタート
インストール
pip install browsercontrol
uv add browsercontrol
サーバーの起動
browsercontrol
python -m browsercontrol
fastmcp run browsercontrol.server:mcp
AIエージェントへの接続
BrowserControlは、MCP互換のAIエージェントまたはIDEと連携します。使用するプラットフォームを選択してください。
Claude Desktop
Claudeの設定ファイルに以下を追加します。
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"browsercontrol": {
"command": "browsercontrol"
}
}
}
Claude Desktopを再起動してから、以下のように問いかけます。
"Go to GitHub and star the browsercontrol repo"
💎 Gemini CLI / Google AI Studio
Gemini CLIまたはMCPサポート付きのGoogle AI Studioを使用する場合:
export MCP_SERVERS='{"browsercontrol": {"command": "browsercontrol"}}'
Google AI Studioの場合は、MCP設定パネルで設定します。
🔧 Cline (VS Code Extension)
- Cline拡張機能をインストールします。
- Clineの設定(歯車アイコン)を開きます。
- "MCP Servers"に移動します。
- 新しいサーバーを追加します。
{
"browsercontrol": {
"command": "browsercontrol"
}
}
🤖 Continue.dev (VS Code/JetBrains)
Continueの設定ファイル(~/.continue/config.json)に以下を追加します。
{
"mcpServers": [
{
"name": "browsercontrol",
"command": "browsercontrol"
}
]
}
🎯 Cursor IDE
- Cursorの設定を開きます。
- "Features" → "Model Context Protocol"に移動します。
- サーバー設定を追加します。
{
"browsercontrol": {
"command": "browsercontrol"
}
}
🔌 Zed Editor
Zedの設定ファイル(~/.config/zed/settings.json)に以下を追加します。
{
"context_servers": {
"browsercontrol": {
"command": {
"path": "browsercontrol"
}
}
}
}
🐍 カスタムPython統合
MCP Python SDKを使用して、BrowserControlを独自のエージェントに統合します。
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
server_params = StdioServerParameters(
command="browsercontrol",
args=[],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
result = await session.call_tool("navigate_to", {
"url": "https://github.com"
})
🚀 uvまたはpipxでの使用
uv または pipx でインストールした場合は、完全なパスを使用します。
{
"mcpServers": {
"browsercontrol": {
"command": "uvx",
"args": ["browsercontrol"]
}
}
}
またはpipxの場合:
{
"mcpServers": {
"browsercontrol": {
"command": "pipx",
"args": ["run", "browsercontrol"]
}
}
}
🔧 高度な設定
環境変数を渡して、BrowserControlをカスタマイズすることができます。
{
"mcpServers": {
"browsercontrol": {
"command": "browsercontrol",
"env": {
"BROWSER_HEADLESS": "false",
"BROWSER_VIEWPORT_WIDTH": "1920",
"BROWSER_VIEWPORT_HEIGHT": "1080",
"LOG_LEVEL": "DEBUG"
}
}
}
}
すべての利用可能なオプションについては、設定を参照してください。
✨ 主な機能
このツールの特徴
| 項目 |
従来のアプローチ |
BrowserControl |
| 操作方法 |
複雑なDOM構造を解析し、CSSセレクタを推測する必要があり、JavaScriptのサポートやログインの永続化、デバッグツールがない。 |
レンダリングされたページを番号付きの要素で表示し、「click 5」や「type in 3」といった簡単なコマンドで操作できます。完全な動的JavaScriptサポート、再起動間でのセッションの永続化、完全なDevToolsアクセスが可能です。 |
| 例 |
"Find the button with class 'btn-primary' that contains 'Submit' and is inside form#contact-form..." |
"click(7)" |
マークセット(SoM)の秘密
すべてのスクリーンショットには、対話型要素に番号付きの赤いボックスが付けられています。
Found 15 interactive elements:
[1] button - Sign In
[2] input - Search...
[3] a - Products
[4] a - Pricing
[5] button - Get Started
エージェントはこれらの番号を見て、click(1) を呼び出すだけでサインインできます。CSSセレクタやXPath、推測は必要ありません。
主な利点
- マルチタブオーケストレーション:新しいウィンドウが開いても迷うことなく、
list_tabs() で開いているすべてのページ、タイトル、URLを確認でき、switch_tab(index) で異なるサイト間でマルチタスクが可能で、create_tab(url) で参照や並列ワークフローを開くことができます。
- セッションとクッキー管理:ログインフォームの問題を解決し、
set_cookie() で認証トークンを注入してすぐにログインでき、get_cookies() でセッションの問題をデバッグまたは状態をエクスポートでき、clear_cookies() でプロファイル全体をクリアすることなく新しいスタートができます。
- 信頼性の高いファイルアップロード:ほとんどのAIエージェントが
<input type="file"> に遭遇すると失敗しますが、BrowserControlはネイティブのブラウザエンジンフックを使用して upload_file(id, path) でボタンとローカルファイルを指定するだけでアップロードできます。
- 開発者ツールセット:他のツールでは提供されないツールを使用してプロのようにデバッグできます。
get_console_logs()
get_network_requests()
get_page_errors()
run_in_console(code)
inspect_element(5)
get_page_performance()
- セッション記録:
start_recording() で記録を開始し、ブラウジングを行って stop_recording() で記録を保存します。保存された記録はPlaywrightトレースビューアで表示できます。
start_recording() → Browse around → stop_recording()
↓
session_20260202.zip
(View with Playwright trace viewer)
- 動的ビューポート制御:
set_viewport(width, height) で再起動することなく解像度を変更し、レスポンシブデザインのテストやモバイル画面のエミュレーションができます。
- 真の永続性:クッキー、localStorage、セッショントークン、ログイン状態、ブラウザ履歴が永続化され、一度ログインするとセッション間でログイン状態が維持されます。
| 維持される項目 | BrowserControl | 他のツール |
| ---- | ---- | ---- |
| クッキー | ✅ | ❌ |
| localStorage | ✅ | ❌ |
| セッショントークン | ✅ | ❌ |
| ログイン状態 | ✅ | ❌ |
| ブラウザ履歴 | ✅ | ❌ |
📦 インストール
pip install browsercontrol
uv add browsercontrol
💻 使用例
ウェブリサーチ
You: "Go to Wikipedia and find out when Python was created"
Claude: *navigates to wikipedia.org*
*types "Python programming language" in search*
*clicks search result*
*reads the page*
"Python was created by Guido van Rossum and first released in 1991."
ウェブアプリのデバッグ
You: "Go to my app at localhost:3000 and check for any errors"
Claude: *navigates to localhost:3000*
*calls get_console_logs()*
"I found 2 errors:
[ERROR] Uncaught TypeError: Cannot read property 'map' of undefined
[ERROR] Failed to load resource: 404 /api/users"
*calls get_network_requests()*
"The /api/users endpoint returned 404. Check your API route."
記録付きの自動テスト
You: "Test the login flow on my site. Start recording."
Claude: *calls start_recording()*
*navigates to site*
*types email in element 3*
*types password in element 4*
*clicks Login button (element 5)*
*verifies successful redirect*
*calls stop_recording()*
"Login test passed! Recording saved to session_20260202.zip"
フォーム自動化
You: "Fill out the contact form on example.com"
Claude: *navigates to example.com/contact*
*types name in element 2*
*types email in element 3*
*types message in element 4*
*clicks Submit (element 5)*
"Form submitted successfully!"
📚 詳細ドキュメント
利用可能なツール
ナビゲーション
| ツール |
説明 |
navigate_to(url) |
URLに移動する |
go_back() |
前のページに戻る |
go_forward() |
次のページに進む |
refresh_page() |
ページを再読み込みする |
scroll(direction, amount) |
上/下/左/右にスクロールする |
インタラクション
| ツール |
説明 |
click(element_id) |
番号で要素をクリックする |
click_at(x, y) |
座標でクリックする |
type_text(element_id, text) |
入力フィールドにテキストを入力する |
press_key(key) |
キーボードのキーを押す(Enter、Tabなど) |
hover(element_id) |
要素の上にホバーする |
scroll_to_element(element_id) |
要素を表示領域にスクロールする |
upload_file(element_id, path) |
ファイルを入力フィールドにアップロードする |
wait(seconds) |
ページの読み込みを待つ |
タブ管理
| ツール |
説明 |
create_tab(url) |
新しいブラウザタブを開く |
switch_tab(index) |
インデックスでタブを切り替える |
close_tab(index) |
特定のタブを閉じる |
list_tabs() |
開いているすべてのタブとURLをリストする |
フォーム
| ツール |
説明 |
select_option(element_id, option) |
ドロップダウンオプションを選択する |
check_checkbox(element_id) |
チェックボックスをトグルする |
upload_file(element_id, file_path) |
ファイルを入力フィールドにアップロードする |
コンテンツ抽出
| ツール |
説明 |
get_page_content() |
ページをMarkdown形式で取得する |
get_text(element_id) |
要素のテキストを取得する |
get_page_info() |
URLとタイトルを取得する |
run_javascript(script) |
JavaScriptを実行する |
screenshot(annotate, full_page) |
スクリーンショットを撮る |
開発者ツール
| ツール |
説明 |
get_console_logs() |
ブラウザのコンソール出力を取得する |
get_network_requests() |
API呼び出しとレスポンスを取得する |
get_page_errors() |
JavaScriptのエラーを取得する |
run_in_console(code) |
コンソールでJSを実行する |
inspect_element(id) |
要素のスタイル/プロパティを取得する |
get_cookies() |
ブラウザのクッキーをリストする |
set_cookie(name, value, ...) |
クッキーを設定する |
delete_cookie(name) |
クッキーを削除する |
clear_cookies() |
すべてのクッキーをクリアする |
set_viewport(width, height) |
ウィンドウサイズを変更する |
get_page_performance() |
ロード時間、ウェブバイタルを取得する |
記録
| ツール |
説明 |
start_recording() |
セッションの記録を開始する |
stop_recording() |
記録を保存する |
take_snapshot() |
スクリーンショットとHTMLを保存する |
list_recordings() |
保存されたセッションを表示する |
設定
環境変数を使用して設定できます。
| 変数 |
デフォルト |
説明 |
BROWSER_HEADLESS |
true |
可視ウィンドウなしで実行する |
BROWSER_VIEWPORT_WIDTH |
1280 |
ビューポートの幅(ピクセル) |
BROWSER_VIEWPORT_HEIGHT |
720 |
ビューポートの高さ(ピクセル) |
BROWSER_TIMEOUT |
30000 |
ナビゲーションのタイムアウト(ミリ秒) |
BROWSER_USER_DATA_DIR |
~/.browsercontrol/user_data |
ブラウザのプロファイルパス |
BROWSER_EXTENSION_PATH |
— |
ブラウザ拡張機能のパス |
LOG_LEVEL |
INFO |
ログの詳細度 |
例:
BROWSER_HEADLESS=false browsercontrol
BROWSER_VIEWPORT_WIDTH=375 BROWSER_VIEWPORT_HEIGHT=812 browsercontrol
LOG_LEVEL=DEBUG browsercontrol
🔧 技術詳細
アーキテクチャ
┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
│ AI Agent │────▶│ BrowserControl │────▶│ Browser │
│ (Claude/Gemini) │◀────│ MCP Server │◀────│ (Chromium) │
└─────────────────┘ └──────────────────┘ └─────────────┘
│ │ │
│ "click(5)" │ mouse.click() │
│◀───────────────────────│◀─────────────────────│
│ [annotated │ [screenshot + │
│ screenshot] │ element map] │
動作原理
- AIがコマンドを送信する —
click(5)
- サーバーが要素を見つける — 最後のスクリーンショットから要素 #5 を検索する
- ブラウザがアクションを実行する — 要素の座標でクリックする
- 状態をキャプチャする — 新しいスクリーンショットを撮り、要素を検出する
- アノテーションを付ける — 対話型要素に番号付きのボックスを描画する
- AIに返す — アノテーション付きの画像と要素リストを送信する
プロジェクト構造
browsercontrol/
├── __init__.py # パッケージエクスポート
├── __main__.py # CLIエントリポイント
├── server.py # MCPサーバーのセットアップ
├── browser.py # SoM付きのBrowserManager
├── config.py # 環境設定
└── tools/
├── navigation.py # ナビゲーションツール
├── interaction.py # クリック、入力、ホバーツール
├── forms.py # フォーム処理ツール
├── content.py # コンテンツ抽出ツール
├── devtools.py # 開発者ツール
├── recording.py # セッション記録ツール
└── tabs.py # タブ管理ツール
📄 ライセンス
MITライセンス — 自由に使用できます。
🤝 コントリビューション
コントリビューションは大歓迎です!詳細については、コントリビューションガイドを参照してください。
コントリビューションのアイデア:
- [ ] Firefox/WebKitサポート
- [ ] DOM差分検出(変更を検出する)
- [ ] アクセシビリティ監査ツール
- [ ] モバイルエミュレーションプリセット
- [ ] クッキーのインポート/エクスポートファイル
git clone https://github.com/adityasasidhar/browsercontrol
cd browsercontrol
uv sync
uv run pytest
uv run fastmcp dev browsercontrol/server.py
🔧 トラブルシューティング
"Missing X server" エラー
BROWSER_HEADLESS=true を設定するか、xvfbで実行します。
xvfb-run browsercontrol
ブラウザが起動しない
Chromiumは初回実行時に自動インストールされます。インストールに失敗した場合は、手動でインストールします。
python -m playwright install chromium
セッションが永続化されない
BROWSER_USER_DATA_DIR が書き込み可能であることを確認します。
ls -la ~/.browsercontrol/
接続が拒否される
他のインスタンスが実行されていないことを確認します。
pkill -f browsercontrol
browsercontrol
セッション記録を表示する
Playwrightトレースビューアで記録を開きます。
npx playwright show-trace ~/.browsercontrol/recordings/session.zip
ウェブを見る必要のあるAIエージェント向けに構築されました。
⭐ GitHubでスターをつける •
🐛 バグを報告する •
💡 機能要求をする