关于 Browsegrab
Browsegrab 是面向本地 LLM 的浏览器自动化库,适用于构建网页操作 Agent 的开发者。它结合 Playwright 可访问性树与 MarkGrab 内容提取,并提供 MCP 服务、CLI 和 Python API。
主要功能
- 01基于可访问性树定位元素
- 02使用 MarkGrab 提取网页内容
- 03提供 8 种浏览器自动化工具
- 04缓存成功流程以复用操作
- 05解析本地 LLM 的操作输出
适用场景
- 01让本地 LLM 浏览并操作网页
- 02提取网页的 Markdown 内容
- 03通过 MCP 客户端执行浏览器操作
MCP 相关
Browsegrab 内置 MCP 服务,向 MCP 客户端提供导航、点击、输入、快照、滚动、内容提取、返回和等待等 8 种浏览器工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
browsegrab
面向本地大模型的高效浏览器 Agent — Playwright + 无障碍树 + MarkGrab,原生支持 MCP。
browsegrab 是一款轻量级浏览器自动化库,专为本地大模型(8B-35B 参数)设计。它结合了 Playwright 的无障碍树与 MarkGrab 的 HTML 转 Markdown 功能,与 browser-use 等替代方案相比,每个步骤的 Token 用量减少 5-8 倍。
功能
- 高效使用 Token:约 500-1,500 个 Token/步骤(browser-use 约为 4,000-10,000)
- 优先支持本地大模型:针对 vLLM、Ollama 和兼容 OpenAI 的端点进行优化
- 原生支持 MCP:内置 MCP 服务,包含 8 个浏览器自动化工具
- 集成 MarkGrab:将 HTML 转换为简洁的 Markdown,以提取内容
- 无障碍树 + 引用系统:无需视觉模型即可获得稳定的元素引用(
e1、e2……) - 成功模式缓存:重复工作流无需调用大模型
- 5 阶段 JSON 解析器:稳健解析本地大模型输出的操作
- 依赖精简:核心部分仅依赖
playwright+httpx
安装
pip install browsegrab
playwright install chromium
安装可选功能:
pip install browsegrab[mcp] # MCP server support
pip install browsegrab[content] # MarkGrab content extraction
pip install browsegrab[cli] # CLI with rich output
pip install browsegrab[all] # Everything
快速开始
Python API
from browsegrab import BrowseSession
async with BrowseSession() as session:
# Navigate and get accessibility tree snapshot
await session.navigate("https://example.com")
snap = await session.snapshot()
print(snap.tree_text)
# - heading "Example Domain" [level=1]
# - link "Learn more": [ref=e1]
# Click using ref ID
result = await session.click("e1")
print(result.url) # https://www.iana.org/help/example-domains
# Type into search box
await session.navigate("https://en.wikipedia.org")
snap = await session.snapshot()
await session.type("e4", "Python programming", submit=True)
# Extract compressed content (AX tree + markdown)
content = await session.extract_content()
CLI
# Accessibility tree snapshot
browsegrab snapshot https://example.com
# JSON output
browsegrab snapshot https://example.com -f json
# Extract content (AX tree + markdown)
browsegrab extract https://en.wikipedia.org/wiki/Python
# Agentic browse (requires LLM endpoint)
browsegrab browse https://example.com "Find the about page"
MCP 服务
browsegrab-mcp # Start MCP server (stdio)
Claude Desktop / Cursor / VS Code 配置:
{
"mcpServers": {
"browsegrab": {
"command": "browsegrab-mcp"
}
}
}
8 个 MCP 工具:browser_navigate、browser_click、browser_type、browser_snapshot、browser_scroll、browser_extract_content、browser_go_back、browser_wait
工作原理
Agent 浏览循环
flowchart LR
A["🌐 URL + Goal"] --> B["Navigate"]
B --> C["AX Tree Snapshot\n~200–500 tokens"]
C --> D{"LLM\nDecision"}
D -->|"click / type / scroll"| E["Execute Action"]
E --> C
D -->|"goal reached"| F["Extract Content\n(MarkGrab)"]
F --> G["✅ Result"]
Token 效率
browsegrab 将结构(无障碍树)与内容(MarkGrab Markdown)分开,只向大模型发送其所需的信息:
flowchart TD
A["Raw HTML"] --> B["Accessibility Tree"]
A --> C["MarkGrab Markdown"]
B --> D["Structure: ~200–500 tokens\nInteractive elements with ref IDs"]
C --> E["Content: ~300–800 tokens\nClean markdown · on-demand"]
D --> F["Combined: ~500–1,300 tokens/step\n⚡ 5–8× fewer than browser-use"]
E --> F
Token 效率(实测)
| 页面 | 交互元素 | Token 数 | browser-use 等效值 |
|---|---|---|---|
| example.com | 1 | ~60 | ~500+ |
| Wikipedia 文章 | 452 | ~1,254 | ~10,000+ |
架构
browsegrab/
├── config.py # Dataclass configs (env var loading)
├── result.py # Result types (ActionResult, BrowseResult, ...)
├── session.py # BrowseSession orchestrator
├── browser/
│ ├── manager.py # Playwright lifecycle (async context manager)
│ ├── snapshot.py # Accessibility tree + ref system
│ ├── selectors.py # 4-strategy selector resolver
│ └── actions.py # navigate, click, type, scroll, go_back, wait
├── dom/
│ ├── ref_map.py # ref ID ↔ element bidirectional mapping
│ └── compress.py # AX tree + MarkGrab → compressed context
├── llm/
│ ├── base.py # LLMProvider ABC
│ ├── provider.py # vLLM, Ollama, OpenAI-compatible
│ ├── prompt.py # System prompts (~400 tokens)
│ └── parse.py # 5-stage JSON fallback parser
├── agent/
│ ├── history.py # Sliding window history compression
│ ├── cache.py # Domain-based success pattern cache
│ └── loop_guard.py # Duplicate action detection
├── __main__.py # CLI (click)
└── mcp_server.py # FastMCP server (8 tools)
配置
通过环境变量配置所有设置(前缀为 BROWSEGRAB_*):
# Browser
BROWSEGRAB_BROWSER_HEADLESS=true
BROWSEGRAB_BROWSER_TIMEOUT_MS=30000
# LLM (for agentic browse)
BROWSEGRAB_LLM_PROVIDER=vllm # vllm | ollama | openai
BROWSEGRAB_LLM_BASE_URL=http://localhost:8000/v1
BROWSEGRAB_LLM_MODEL=Qwen/Qwen3.5-32B-AWQ
# Agent
BROWSEGRAB_AGENT_MAX_STEPS=10
BROWSEGRAB_AGENT_ENABLE_CACHE=true
QuartzUnit 生态系统的一部分
| 库 | 作用 |
|---|---|
| markgrab | 被动提取(URL → Markdown) |
| snapgrab | 被动捕获(URL → 截图) |
| docpick | 文档 OCR → 结构化 JSON |
| browsegrab | 主动自动化(目标 → 浏览器操作 → 结果) |
开发
git clone https://github.com/QuartzUnit/browsegrab.git
cd browsegrab
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
playwright install chromium
# Unit tests (no browser needed)
pytest tests/ -m "not e2e"
# Full suite including E2E
pytest tests/ -v
许可证
属于 QuartzUnit 生态系统 — 用于数据收集、提取、搜索和 AI Agent 安全的可组合 Python 库。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。