message / plugins /browser /README.md
hunian
refactor(plugins): 插件短名并统一 MCP tool 为 {plugin}-{tool}
cc826a1
|
Raw
History Blame Contribute Delete
6.8 kB
# browser
浏览器 MCP 插件(v3.0):**纯 Lightpanda 单后端透传**,提供 28 个通用浏览器 MCP 工具,
为各环境 agent 暴露与 Lightpanda 上游一致的浏览器能力。
## 设计理念
Lightpanda 的 `lightpanda mcp` 子命令本身就是一个标准 stdio MCP server,自带 28 个工具(27 browser tool + save)
(含 JSON Schema 与标准化错误码)。本插件**不重新发明浏览器语义**,只做四件事:
1. **子进程生命周期**:单例长驻 `lightpanda mcp` 子进程,复用会话,支持链式操作
`goto``click``extract`)。
2. **JSON-RPC 透传**:行分隔协议,`initialize` 握手 + `tools/call` 透传。
3. **run_log 埋点**:每次调用创建 run,记录 init/call/complete/error 事件。
4. **错误码归一**:上游错误归一为 `BrowserError`,前端可据 code 给修复指引。
工具名、参数、返回结构、错误码全部由 Lightpanda 上游决定——平台层零手写 schema、零漂移。
## 为什么纯 Lightpanda
云端服务器资源不足以运行 Chrome。Lightpanda 是轻量无头浏览器,无需 Chrome/Chromium,
适合资源受限环境。Playwright 兜底依赖 Chrome,在本场景下失效,已移除。
## 28 个工具
| 类别 | 工具 |
|---|---|
| 导航 | `browser-goto` `browser-search` `browser-getUrl` |
| 读取 | `browser-markdown` `browser-html` `browser-links` `browser-evaluate` `browser-extract` `browser-tree` `browser-nodeDetails` `browser-interactiveElements` `browser-structuredData` `browser-detectForms` `browser-findElement` `browser-consoleLogs` `browser-getCookies` `browser-getEnv` |
| 交互 | `browser-click` `browser-fill` `browser-scroll` `browser-hover` `browser-press` `browser-selectOption` `browser-setChecked` |
| 等待 | `browser-waitForSelector` `browser-waitForScript` `browser-waitForState` |
| 录制 | `browser-save`(把会话存为可复用 agent 脚本,写磁盘) |
工具名格式为 `browser-{上游名}`(保留 camelCase);入参统一 `params: dict` 透传给上游,校验由 Lightpanda 负责。
完整参数说明见 `/api/tools` 端点或各工具 description。
## 架构
```
agent ──FastMCP──▶ mcp.py(28 个 @mcp_tool 薄壳)
LightpandaClient(单例长驻)
├─ initialize 握手(一次性)
├─ tools/list 缓存(一次性,漂移校验)
└─ tools/call 透传(每次调用)
ProcessSupervisor(stderr→日志文件)
lightpanda mcp 子进程(stdio JSON-RPC)
```
```
plugins/browser/
├── plugin.json 元数据 + binary_dependencies
├── main.py Plugin 类(on_enable/on_disable/check_readiness/get_status)
├── api.py FastAPI 路由
├── mcp.py 28 个 @mcp_tool(工厂从 tools_meta 生成)
├── frontend/index.html 静态 UI
└── browser/
├── binary_locator.py 探测 lightpanda 二进制(env/PATH/常见路径/WSL)
├── process_supervisor.py 子进程监管(stderr→文件)
├── mcp_client.py 行分隔 JSON-RPC 客户端
├── client.py LightpandaClient 单例
├── tools_meta.py 28 工具元数据(27 browser tool + save)
└── errors.py BrowserError + 错误码(对齐上游)
```
## 配置
### 环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
| `LIGHTPANDA_BINARY` | 自动探测 | Lightpanda 可执行文件绝对路径 |
### 子进程
- **懒启动**:插件 enable 时不预启动;首次工具调用时拉起子进程并握手。
- **长驻**:子进程持续运行,复用会话;`on_disable` 或 `/process/stop` 时关闭。
- **日志**:stderr 重定向到 `data/lightpanda/mcp.log`(stdio 协议强约束:stderr 不能走 PIPE)。
## 安装
详见 [INSTALL.md](./INSTALL.md)。快速概览:
- **Linux / macOS**:下载 nightly release 二进制
- **Windows**:Lightpanda 无原生二进制,需 WSL2 或 Docker
- **HuggingFace Spaces**:Dockerfile 内置 nightly release
## 使用
### 通过 MCP 客户端(Claude Desktop 等)
插件通过平台 FastMCP 暴露 28 个工具,agent 直接调用 `browser-goto` / `browser-markdown` 等。
### 通过平台 UI
1. 访问 `/tool/browser`
2. 顶部"Lightpanda 二进制"卡片显示状态;未找到时按 OS 显示安装命令
3. "工具调用"面板选工具 + 填参数,点"执行"
4. "运行日志"与"结果"区展示调用过程与返回
5. "健康检查"显示二进制/子进程/工具缓存状态及漂移校验
### 通过 HTTP API
```bash
# 探测二进制
curl http://localhost:7860/plugins/browser/api/binary-check
# 列出工具
curl http://localhost:7860/plugins/browser/api/tools
# 健康检查
curl http://localhost:7860/plugins/browser/api/health
# 调用 goto
curl -X POST http://localhost:7860/plugins/browser/api/mcp/browser-goto \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'
# 查看子进程日志
curl http://localhost:7860/plugins/browser/api/process/logs?tail=50
```
## 限制
- **Lightpanda 是 Beta**:参考 https://lightpanda.io/#status,部分网站可能不兼容
- **WSL2 局限**:Windows 上 WSL 与主进程通信经 stdin/stdout 转发,可能比 Linux 直接调用慢
- **工具集漂移**:`tools_meta.py` 是静态锚点;上游新增工具时需同步。`/health` 端点提供漂移校验预警
## 故障排查
| 现象 | 原因 | 解决 |
|---|---|---|
| `BINARY_NOT_FOUND` | PATH 中无 lightpanda | 按顶部卡片安装命令安装;或设 `LIGHTPANDA_BINARY` |
| `PROCESS_NOT_READY` | 子进程启动/握手失败 | 查看 `/process/logs`;可能二进制损坏或版本不兼容 |
| `PROTOCOL_TIMEOUT` | 子进程未及时响应 | 增大 timeout;查 `/process/logs` 找根因 |
| `NODE_NOT_FOUND` | selector 未命中元素 | 先用 `browser-tree`/`browser-findElement` 定位元素 |
| `FRAME_NOT_LOADED` | 未先 goto 导航 | 先调 `browser-goto` 加载页面 |
## 变更记录
见 [CHANGELOG](#v30)。v3.0 相对 v2.0:废弃多 driver 抽象与 Playwright/CDP,改为纯 Lightpanda 透传;
工具数 12 → 28(与上游对齐);修复 v2 多个必现 bug。
### v3.0
- 纯 Lightpanda 单后端,删除 Playwright/CDP/lightpanda_driver/registry/driver 抽象
- 28 个工具从上游 `tools.zig` 静态提取,工厂生成,零手写 schema
- 单例长驻子进程,复用会话
- 修复 v2 的 `mcp_markdown` params.timeout 崩溃、`/binary-check` import 错、registry key 失效等