Scout について
Scout は Go 製のブラウザー自動化プロジェクトで、単一バイナリに CLI、MCP サーバー、チャット UI、Go ライブラリを備えています。MCP ツールは CDP 経由で、ページ操作、抽出、診断、録画に対応します。
主な機能
- 01ブラウザーページの移動と操作
- 02テキスト、表、ページ構造の抽出
- 03スクリーンショット撮影とセッション録画
- 04ネットワーク動作と診断情報の確認
- 05CLI または Go によるブラウザー自動化
活用シーン
- 01エージェントの複数手順のブラウザー操作を自動化
- 02ウェブページから構造化情報を抽出
- 03複数ページにまたがる操作手順を録画
MCP 対応
組み込み MCP サーバーは `scout mcp serve` で起動し、ブラウザーの移動、操作、抽出、キャプチャ、録画、診断ツールを公開します。複数の操作にわたってブラウザーセッションを維持します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/felixgeelhaar/scout:1.10.0ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/felixgeelhaar/scout:1.10.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Scout
バイナリ1つでブラウザーを自動化。 Playwrightをよりシンプルにした代替ツールです。NodeもPythonもランタイムも不要。Go、任意のシェル、あらゆるAIエージェント(MCP サーバーを内蔵)、またはチャットUIから実際のブラウザーを操作できます。
静的リンクされた単一のscoutバイナリで、CLI、87個のツールを備えたMCP サーバー(MCP 対応エージェントなら、Claude Desktop、Cursor、Cline、カスタムエージェントなど、どれでもブラウザーを利用できます)、対話型チャットUI、Ginのようなミドルウェア合成が可能なGoライブラリを利用できます。同じエンジンに、4つのアクセス方法を用意しています。
brew install --cask klarlabs-studio/tap/scout-mcp
Playwrightとの比較
| Scout | Playwright | |
|---|---|---|
| インストール | 約15 MBのバイナリ1つ | npmと約600 MBのブラウザーキャッシュ |
| ランタイム依存関係 | なし(静的) | 常にNode.jsが必要。Python/Java/.NETはラッパーとして利用 |
| 操作方法 | Go、任意のシェル、MCP、チャットUI | TS/JSを第一級でサポート。他は遅れています |
| AIエージェント対応 | 組み込みのscout mcp serve | 別プロジェクトのplaywright-mcp |
| トークンを考慮した抽出 | DOM差分、蒸留、観察予算(トークンを50~80%削減) | 非対応 |
| アクションプレイブック | 決定論的なJSONを記録して再生 | コード生成で、自分で保守するスクリプトを作成 |
| コンテナーへのデプロイ | scratchまたはdistrolessに配置 | Nodeとブラウザーバイナリを同梱 |
| CDPアクセス | 抽象化なしの直接WebSocket | CDP経由の内部プロトコル |
クイックスタート
# CLI — visible browser, one-shot commands
scout observe https://example.com # structured page snapshot
scout markdown https://news.ycombinator.com # page as compact markdown
scout screenshot https://github.com # save screenshot
scout extract https://example.com h1 # extract element text
scout frameworks https://react.dev # detect React, Vue, etc.
# MCP Server — give AI agents browser superpowers
claude mcp add scout -- scout mcp serve
# Browser UI — conversational browser automation
scout ui serve --provider=ollama --model=mistral
cd ui && npm install && npm run dev # open http://localhost:3000
インストール
# Homebrew
brew install --cask klarlabs-studio/tap/scout-mcp
# Direct binary
curl -fsSL https://raw.githubusercontent.com/klarlabs-studio/scout/main/install.sh | bash
# Go
go install go.klarlabs.de/scout/cmd/scout@latest
# As a library
go get go.klarlabs.de/scout
MCP サーバー — 77個のツール
scout mcp serveを実行すれば、MCP 対応エージェントでブラウザーを利用できます。別のプロジェクトをインストールする必要も、NodeランタイムやPythonインタープリターも不要です。バイナリがそのままサーバーになります。任意のMCP クライアントで設定できます。
claude mcp add scout -- scout mcp serve # Claude Code
{"mcpServers": {"scout": {"command": "scout", "args": ["mcp", "serve"]}}}
ツールのカテゴリ
| カテゴリ | ツール |
|---|---|
| ナビゲーション | navigate、observe、observe_diff、observe_with_budget |
| 操作 | click、click_label、click_text、type、hover、double_click、right_click、select_option、scroll_to、scroll_by、focus、drag_drop、dispatch_event |
| フォーム | fill_form、fill_form_semantic(チェックボックス/ラジオボタン+状態のエコー)、discover_form |
| 抽出 | extract、extract_all、extract_table、auto_extract、scroll_and_collect、markdown、readable_text、accessibility_tree |
| キャプチャ | screenshot、annotated_screenshot、pdf |
| ネットワーク | enable_network_capture、network_requests |
| タブ | open_tab、switch_tab、close_tab、list_tabs |
| フレームワーク | wait_spa、detect_frameworks、component_state、app_state |
| 再生 | start_recording、stop_recording、save_playbook、replay_playbook |
| 動画 | start_screen_recording、stop_screen_recording |
| スマートヘルパー | check_readiness、suggest_selectors、session_history |
| ビジョン | hybrid_observe、find_by_coordinates |
| 一括処理 | execute_batch |
| iframe | switch_to_frame、switch_to_main_frame |
| トレース | start_trace、stop_trace |
| Cookie | cookies_list、cookies_clear、cookies_set、dismiss_cookies |
| 診断 | detect_dialog、detect_auth_wall、console_errors(ネットワークの4xx/5xxを含む)、failed_requests、compare_tabs、upload_file |
| ユーティリティ | has_element、wait_for、configure、set_viewport、web_vitals、select_by_prompt |
すべてのツールには、スマートな自動承認のための MCP アノテーション(ReadOnly、OpenWorld、ClosedWorld、Idempotent)が付与されています。observe、extract、screenshot などの読み取り専用ツールは、許可を求めずに実行されます。
ランタイム設定
再起動せずにヘッドレスブラウザーと表示ブラウザーを切り替え、ローカル開発ワークフロー(ループバック、プライベート IP)を有効にできます。
Agent: configure(headless: false) → browser window appears
Agent: navigate("https://...") → watch it work
Agent: configure(headless: true) → back to headless
Agent: configure(allow_private_ips: true) → unlock localhost / 192.168.* / 10.*
Agent: navigate("http://127.0.0.1:4173/") → drive your local dev server
MCP サーバーは、信頼できる環境で一度だけ切り替える設定として、起動時に SCOUT_ALLOW_PRIVATE_IPS=1 も読み取ります。
画面録画(動画)
アクティブなページを動画として録画します。CDP のみを使用し、ヘッドレスでも動作します。Playwright は不要です。録画中に navigate、open_tab、switch_tab を呼び出しても録画は継続するため、複数ページにまたがるデモも1本の連続したクリップになります。
Agent: start_screen_recording({ width: 1280, height: 800, fps: 15, format: "webm" })
Agent: navigate("https://example.com")
Agent: click("#cta")
Agent: navigate("https://example.com/dashboard") # recording continues across pages
Agent: stop_screen_recording()
→ { path: "/tmp/scout-rec-XXX.webm", format: "webm", encoder: "ffmpeg",
frame_count: N, duration_ms: N }
ffmpeg が PATH にある場合、結果は WebM(libvpx-vp9)または MP4(libx264)にエンコードされます。ない場合、scout は JPEG の生フレームディレクトリと ffmpeg の連結リストを返すため、オフラインでエンコードできます。結果は常にファイルパスであり、base64 ではありません。LLM のトークン予算を消費することもありません。
実際の FPS は一般的なページで約10~15、上限は30です。実装では Page.captureScreenshot をポーリングします(CDP の Page.startScreencast イベントは --headless=new の Chrome では通知されずに破棄されます)。
ブラウザー UI
会話形式のブラウザー自動化インターフェースです。自然言語を入力すると、ブラウザーがリアルタイムで応答する様子を確認できます。
# Start the AG-UI server (Go backend)
scout ui serve --provider=ollama --model=mistral # local, no API key
scout ui serve --provider=claude # needs ANTHROPIC_API_KEY
scout ui serve --provider=openai --model=gpt-4o # needs OPENAI_API_KEY
scout ui serve --provider=groq --base-url=https://api.groq.com/openai --model=llama-3.3-70b-versatile
# Start the Vue frontend
cd ui && npm install && npm run dev # http://localhost:3000
UI は SSE 経由で AG-UI プロトコルイベントをストリーミングします。
- Markdown 表示とクイックアクションのピルを備えたチャットパネル
- スクリーンショットのストリーミングと URL バーを備えたライブブラウザービューポート
- ツール呼び出しをリアルタイムで表示するアクティビティタイムライン
- ストリーミング中に処理をキャンセルする停止ボタン
Go サーバーはエージェントのループを処理します。LLM が呼び出す scout ツールを決定し、実行して、ブラウザー状態の差分をフロントエンドにストリーミングで返します。--base-url を介して、OpenAI 互換の任意のエンドポイントをサポートします。
エージェントパッケージ(Go)
scout をプログラムに組み込みたい呼び出し元向けの、高レベルな Go API です。構造化出力、自動待機、ゴルーチンセーフに対応しています。ほとんどのユーザーは、上記の CLI または MCP サーバーを通じて scout を利用します。このセクションでは Go ライブラリを使う方法を説明します。
session, _ := agent.NewSession(agent.SessionConfig{Headless: true})
defer session.Close()
// Navigate and observe
session.Navigate("https://example.com")
obs, _ := session.Observe() // links, inputs, buttons, text + action costs
// DOM diff — only what changed (saves 50-80% tokens)
session.Click("#submit")
_, diff, _ := session.ObserveDiff()
// diff.Classification: "modal_appeared"
// diff.Summary: "Modal/dialog appeared: Login required"
// Semantic form filling — no CSS selectors
session.FillFormSemantic(map[string]string{
"Email": "user-example", "Password": "secret",
})
// Visual grounding — click by number, not selector
result, _ := session.AnnotatedScreenshot() // numbered labels on elements
session.ClickLabel(7) // click element [7]
// Multi-tab coordination
session.OpenTab("pricing", "https://example.com/pricing")
session.SwitchTab("default")
// Framework detection (19 frameworks)
frameworks, _ := session.DetectedFrameworks() // ["react", "nextjs"]
state, _ := session.ComponentState("#app") // read React/Vue state
// Network capture — read API responses directly
session.EnableNetworkCapture("/api/")
captured := session.CapturedRequests("/api/users")
// Action replay — record once, replay without LLM
session.StartRecordingPlaybook("login-flow")
// ... do stuff ...
pb, _ := session.StopRecordingPlaybook()
agent.SavePlaybook(pb, "login.json")
// Later: session.ReplayPlaybook(pb) // 100x cheaper
// Persistent profiles
session.SaveProfile("session.json") // cookies + localStorage
session.LoadProfile("session.json")
// Content distillation (5 levels)
session.Markdown() // ~2-8KB compact markdown
session.ReadableText() // ~1-4KB main content only
session.AccessibilityTree() // ~1-4KB semantic tree
session.ObserveWithBudget(500) // fit in ~500 tokens
コアライブラリ(Go)
ミドルウェアの合成に対応した、Gin に似た Engine/Context/Group/HandlerFunc です。最も低レベルな Go API です。タスクのライフサイクル、名前付きグループ、ミドルウェアチェーンを完全に制御したい場合に使用してください。
engine := browse.Default(browse.WithHeadless(true))
engine.MustLaunch()
defer engine.Close()
engine.Use(middleware.Stealth())
engine.Use(middleware.Retry(middleware.RetryConfig{MaxAttempts: 3}))
engine.Use(middleware.Timeout(30 * time.Second))
admin := engine.Group("admin", middleware.BasicAuth("admin", "secret"))
admin.Task("export", func(c *browse.Context) {
c.MustNavigate("https://app.example.com/admin")
table, _ := c.ExtractTable("#users")
c.Set("data", table)
})
engine.RunGroup("admin")
ミドルウェア
| カテゴリ | ミドルウェア |
|---|---|
| レジリエンス | Retry、Timeout、CircuitBreaker、RateLimit、Bulkhead |
| 認証 | BearerAuth、BasicAuth、CookieAuth、HeaderAuth |
| 検出回避 | Stealth(webdriver、plugins、WebGL など、10 個のパッチ) |
| ネットワーク | BlockResources、WaitNetworkIdle |
| ユーティリティ | ScreenshotOnError、SlowMotion、Viewport |
CLI
CLI は意図的にワンショット向けの階層として設計されています。各コマンドはブラウザーを起動し、ページに移動して、読み取りまたは診断のアクションを 1 つ実行し、結果を出力して終了します。
状態を保持する対話型のフロー(クリック→入力→送信、複数タブ、Cookie やネットワークのリアルタイム操作)は、アクション間でセッションを維持する MCP サーバー(scout mcp serve)とチャット UI(scout ui serve)で実行します。
CLI はデフォルトでブラウザーを表示します(非表示にするには --headless を指定します)。
scout navigate <url> # page info as JSON
scout observe <url> # structured observation
scout markdown <url> # compact markdown
scout readable <url> # main readable content (boilerplate stripped)
scout accessibility <url> # semantic accessibility tree
scout screenshot <url> [--output f] # save screenshot
scout pdf <url> [--output f] # save PDF
scout extract <url> <selector> # extract text
scout table <url> <selector> # extract a table as structured rows
scout auto-extract <url> # auto-detect dominant data pattern
scout eval <url> <expression> # run JavaScript
scout form discover <url> # discover form fields
scout frameworks <url> # detect frameworks
scout app-state <url> # global app/store state (JSON)
scout aria <url> # ARIA violation report (JSON)
scout vitals <url> # Core Web Vitals (JSON)
scout console <url> # console errors + network 4xx/5xx (JSON)
scout dialog <url> # detect visible modal/dialog (JSON)
scout auth-wall <url> # detect login/auth wall (JSON)
scout cookies <url> # list cookies (values redacted)
scout watch <url> [--interval=5s] # live-watch page changes
scout pipe <command> [selector] # batch process URLs from stdin
scout record <url> [--output f] # interactive recording → playbook
scout mcp serve # start MCP server
scout ui serve [flags] # start chat UI
scout version # print version
アーキテクチャ
scout/
├── browse.go, engine.go, context.go # Gin-like API
├── page.go, selection.go # CDP page & element interaction
├── recorder.go # Action playbook recording (Navigate/Click/Type → JSON)
├── middleware/ # stealth, resilience, auth, network
├── agent/ # AI agent API (50+ methods)
│ ├── session.go # Session lifecycle, Navigate, Click, Type
│ ├── observe.go, diff.go # Observe, ObserveDiff, cost estimation
│ ├── content.go # Markdown, ReadableText, AccessibilityTree
│ ├── form.go # DiscoverForm, FillFormSemantic, MatchFormField
│ ├── annotate.go # AnnotatedScreenshot, ClickLabel
│ ├── network.go # EnableNetworkCapture, CapturedRequests
│ ├── spa.go # DetectedFrameworks, ComponentState, GetAppState
│ ├── tabs.go # OpenTab, SwitchTab, CloseTab, ListTabs
│ ├── playbook.go # StartRecording, ReplayPlaybook, SavePlaybook
│ ├── interact.go # Hover, DragDrop, SelectOption, ScrollTo
│ ├── profile.go # CaptureProfile, ApplyProfile, SaveProfile
│ ├── selector.go # Playwright :text() selector translation
│ ├── budget.go # ObserveWithBudget, EstimateTokens
│ ├── nlselect.go # SelectByPrompt, fuzzy NL element matching
│ ├── batch.go # ExecuteBatch, sequential multi-action
│ ├── vision.go # HybridObserve, FindByCoordinates
│ ├── trace.go # StartTrace, StopTrace, action tracing
│ ├── screencast.go # StartScreenRecording / StopScreenRecording — video via captureScreenshot polling + ffmpeg encode
│ ├── iframe.go # SwitchToFrame, SwitchToMainFrame
│ └── vitals.go # WebVitals (LCP/CLS/INP)
├── internal/cdp/ # WebSocket CDP client (context-aware)
├── internal/launcher/ # Chrome process management
├── cmd/scout/ # CLI + MCP server (87 tools)
└── docs/ # Landing page (GitHub Pages)
セキュリティ
脆弱性スキャンは nox を使用して、すべてのプッシュと PR で実行されます。検出結果は GitHub code scanning にアップロードされ、PR 上にインラインで注釈が付けられ、.nox/baseline.json と照合されます。そのため、リグレッションがあるとマージがブロックされます。ヘッダーのステータスバッジには、最新の main ブランチのスキャン結果が反映されます。
nox は Dependabot の代わりに依存関係の修正も行います。Nox Remediate ワークフローは毎週(月曜日 06:00 UTC)およびオンデマンドで実行され、新たに取得した OSV.dev の検出結果に対して nox fix を実行し、検証済みのアップグレードを 1 件の PR にまとめて作成します。
# Local scan
nox scan -severity-threshold high .
# Local fix
nox fix -input findings.json
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。