关于 Scout
Scout 是基于 Go 的浏览器自动化项目,以单个二进制文件提供 CLI、MCP 服务、聊天界面和 Go 库。其 MCP 工具通过 CDP 支持导航、交互、提取、诊断和录制。
主要功能
- 01导航并操作浏览器页面
- 02提取文本、表格和页面结构
- 03捕获截图并录制会话
- 04检查网络活动和诊断信息
- 05通过 CLI 或 Go 执行浏览器自动化
适用场景
- 01为 Agent 自动执行多步浏览器任务
- 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
浏览器自动化,一个二进制文件即可。 Playwright 的更简便替代方案——无需 Node、无需 Python、无需运行时。通过 Go、任意 shell、任意 AI Agent(内置 MCP 服务),或聊天界面来驱动真实浏览器。
一个静态链接的 scout 二进制文件,提供 CLI、包含 87 个工具的 MCP 服务(让任何支持 MCP 的 Agent——Claude Desktop、Cursor、Cline 或自定义 Agent——都能使用浏览器)、对话式聊天界面,以及采用类似 Gin 中间件组合方式的 Go 库。同一引擎,四种使用方式。
brew install --cask klarlabs-studio/tap/scout-mcp
与 Playwright 对比
| Scout | Playwright | |
|---|---|---|
| 安装 | 一个约 15 MB 的二进制文件 | npm + 约 600 MB 的浏览器缓存 |
| 运行时依赖 | 无(静态链接) | 始终需要 Node.js;Python/Java/.NET 以封装器形式提供 |
| 驱动方式 | Go、任意 shell、MCP、聊天界面 | 优先支持 TS/JS;其他语言支持滞后 |
| 原生支持 AI Agent | 内置 scout mcp serve | 独立的 playwright-mcp 项目 |
| 感知 Token 的提取 | DOM 差异、提炼、观测预算(减少 50–80% 的 Token) | 未提供 |
| 操作手册 | 记录并重放确定性的 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 的 Agent 都能使用浏览器。无需安装第二个项目,无需 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,录制不会中断,因此多页面演示也能生成一段连续视频:
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 }
如果 PATH 中有 ffmpeg,结果将编码为 WebM(libvpx-vp9)或 MP4(libx264)。如果没有,scout 会返回原始 JPEG 帧目录和 ffmpeg concat 列表,供你离线编码。结果始终是文件路径,而不是 base64——不会占用大模型的令牌预算。
实际帧率:典型页面约为 10–15 FPS,最高限制为 30 FPS。实现方式是轮询 Page.captureScreenshot(在 --headless=new Chrome 下,CDP Page.startScreencast 事件会被静默丢弃)。
浏览器 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 服务端负责处理 Agent 工作循环:大模型决定调用哪些 scout 工具,执行这些工具,并将浏览器状态增量流式传回前端。支持通过 --base-url 使用任何兼容 OpenAI 的端点。
Agent 包(Go)
面向希望在程序中嵌入 scout 的调用方的高级 Go API。提供结构化输出、自动等待,并支持 goroutine 安全。大多数用户通过上文所述的 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(10 项补丁:webdriver、plugins、WebGL 等) |
| 网络 | BlockResources、WaitNetworkIdle |
| 实用工具 | ScreenshotOnError、SlowMotion、Viewport |
CLI
CLI 有意设计为单次执行层:每条命令都会启动浏览器、导航、执行一次读取或诊断操作、打印结果,然后退出。
有状态的交互流程(点击→输入→提交、多标签页、实时 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)
安全
每次推送和 PR 都会通过 nox 运行漏洞扫描。扫描结果会上传至 GitHub 代码扫描,在 PR 中以内联注释标出,并与 .nox/baseline.json 进行比对,以阻止存在回归的合并。页眉中的状态徽章反映最新的主分支扫描结果。
nox 还用于替代 Dependabot 修复依赖问题——Nox Remediate 工作流每周运行一次(星期一 06:00 UTC),也可按需运行;它会根据最新的 OSV.dev 扫描结果执行 nox fix,并创建一个包含已验证升级项的 PR。
# Local scan
nox scan -severity-threshold high .
# Local fix
nox fix -input findings.json
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。