onesvm-browser-server/docs/mcp-usage-20260901.md
chii 983259836d chore: init workspace with onesvm-dev-md + casa-commander
docs: 联网搜索服务架构方案全套(plan-final/design-arch/选型决策/整合导览/MCP文档/部署预设/联调手册)
bench: 5 方案 + 代理 + 站点矩阵本机实测工程(无密钥)
部署目标:primary mgr1 先行测试(待批准后执行)
2026-09-01 15:19:52 +08:00

312 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
type: runbook
status: active
created: 2026-09-01
step: P3 / plan-20260901-02
---
# onesvm-browser-server MCP 使用文档(消费者智能体接入指南)
> 面向消费方智能体(Vlepontas / EAI / 其它注册主体)的开发者。读完本文即可独立完成接入与正确使用。
> 版本:v0 设计版(2026-09-01)。**§4 能力数据范围为真实实测**(2026-09-01 本机 Docker,darwin arm64;生产 amd64 部署后同架构复测,数字可能微调)。
> 地址/端口为**预设值,部署后以正式通知为准**。
---
## 1. 接入信息
### 1.1 Endpoint
| 项 | 值(预设) |
|---|---|
| 协议 | MCP over **Streamable HTTP**(`POST /mcp`,2026 无状态规范;无 SSE 旧路径;2025 兼容腿待 O9 决策,首版不带) |
| 内网直连(overlay) | `http://browser-server:8640/mcp` |
| 经反代 | `{网关地址}/bs-api/mcp`(urlapi 前缀 strip 后转发) |
| HTTP 兜底(非 MCP 消费者/调试用) | `POST /bs-api/v1/search`、`POST /bs-api/v1/read`(同一内核、同一错误码) |
### 1.2 认证
- 头:**`X-Service-Token: bs_<你的key>`**。🔴 **禁止**把 key 放进 `Authorization: Bearer`(下游按 JWT 解析会 401)。
- key 形态:`bs_` 前缀 + 随机串。**明文只在签发时回传一次**,服务端只存 hash,丢失只能吊销重签。
### 1.3 key 获取流程
```
你的主体(如 vlepontas)→ 向管理员注册(主体名 + 联系人 + 用途说明)
→ 管理员 CLI 签发 key(绑定 scopes/限额)→ 明文回传一次 → 你存入己方密钥管理
吊销:找管理员,即时生效(服务端缓存收敛 ≤10s)
```
### 1.4 Scopes(能力分级)
| scope | 默认 | 能做什么 |
|---|---|---|
| `search` | ✅ 默认 | 关键词搜索发现(`search` 工具) |
| `read` | ✅ 默认 | 单 URL 精读(`read` 工具,fit markdown) |
| `extract` | ❌ 特权申请 | JSON Schema 结构化抽取(`read` 的 `extract` 参数) |
| `browse` | ❌ 特权申请 | 多步交互(协议预留,首版未实现) |
| `screenshot` / `rawHtml` | ❌ 特权申请 | 截图 / 原始 HTML 返回(token 与内存开销大) |
每把 key 另有:`rpm` 速率、日/月配额、并发会话数上限(由管理员按主体需求设定)。
---
## 2. 工具清单与调用
### 2.1 `search` — 搜索发现
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
| `query` | string | **必填** | 关键词 |
| `region` | `domestic` \| `overseas` | **必填,无默认** | 国内直连 / 国外代理(能力差异见 §4.1,请按你的数据需求显式选择) |
| `max_results` | int ≤20 | 5 | 返回条数 |
| `time_range` | `day`/`week`/`month`/`year` | 不限 | 时间过滤(引擎支持时生效) |
| `lang` | string | 自动 | 如 `zh-CN` / `en-US` |
**调用示例 1(国内政策搜索,JSON-RPC):**
```json
{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "search",
"arguments": {
"query": "跨境电商 出口退税 政策 2026",
"region": "domestic",
"max_results": 5,
"time_range": "year",
"lang": "zh-CN"
}
}
}
```
**调用示例 2(国外调研):**
```json
{
"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": {
"name": "search",
"arguments": {
"query": "best bluetooth earbuds 2026",
"region": "overseas",
"max_results": 10,
"lang": "en-US"
}
}
}
```
**典型响应**(示例性质:由 2026-09-01 实测样本改写为统一信封格式,字段真实、数值为示例):
```json
{
"ok": true,
"kind": "search",
"request_id": "01K3…ulid",
"took_ms": 633,
"query": "跨境电商 出口退税 政策 2026",
"answer": null,
"results": [
{
"id": "r1",
"title": "海关总署 税务总局关于跨境电子商务出口退运商品税收优惠政策…",
"url": "https://hainan.chinatax.gov.cn/xxgk_6_1/06163393.html",
"content": "一、对自2026年1月1日至2027年12月31日期间在跨境电子商务海关监管代码(1210、9610、9710、9810)项下申报出口,因滞销、退货原因…",
"score": 0.92,
"engine": "baidu",
"published_at": null
},
{
"id": "r2",
"title": "雨果跨境-跨境电商品牌出海产业互联网平台",
"url": "https://m.cifnews.com/",
"content": "雨果跨境以雨果网作为流量依托,致力于为跨境电商从业者提供全球产业出海…",
"score": 0.71,
"engine": "bing"
}
],
"usage": { "credits": 1, "engine": "searxng-cn", "tokens_estimate": 350 },
"provenance": { "adapter": "searxng-cn", "proxy_exit": "none", "cached": false, "retrieved_at": "2026-09-01T11:41:15+08:00" },
"error": null
}
```
字段纪律:`results` 为空时是 `[]` 而非 `null`;`content` 为 ≤800 字符的 query 相关片段(**非全文**,全文请用 `read`);`answer` 恒为 `null`(本服务不做 LLM 答案合成)。
### 2.2 `read` — 单页精读
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
| `url` | string | **必填** | 目标页 URL(仅 http/https,80/443) |
| `formats` | string[] | `["markdown"]` | 可选加 `links` / `images`;`html` / `screenshot` 为特权 scope |
| `max_chars` | int | 20000 | 正文截断;截断时响应 `truncated=true` |
| `extract` | object | 无 | **特权**:`{schema: {...}, prompt?: "…"}`,JSON Schema 结构化抽取 |
**调用示例 1(政策页精读):**
```json
{
"jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": {
"name": "read",
"arguments": { "url": "https://hainan.chinatax.gov.cn/xxgk_6_1/06163393.html" }
}
}
```
**调用示例 2(带结构化抽取,特权):**
```json
{
"jsonrpc": "2.0", "id": 4, "method": "tools/call",
"params": {
"name": "read",
"arguments": {
"url": "https://example-shop.com/products/item-1",
"formats": ["markdown"],
"extract": { "schema": { "type": "object", "properties": { "price": {"type":"string"}, "title": {"type":"string"} } } }
}
}
}
```
**典型响应**(示例性质:由实测样本改写;该税务公告页实测 5/5 提取成功、1122 字、无导航残渣):
```json
{
"ok": true,
"kind": "read",
"request_id": "01K3…ulid",
"took_ms": 58,
"url": "https://hainan.chinatax.gov.cn/xxgk_6_1/06163393.html",
"final_url": "https://hainan.chinatax.gov.cn/xxgk_6_1/06163393.html",
"title": "财政部 海关总署 税务总局关于跨境电子商务出口退运商品税收优惠政策的公告(…2026年第16号)",
"description": null,
"markdown": "| 索引号 | 11460000008174507Q/2026-14228 | …\n\n为支持跨境电子商务新业态发展,现将…公告如下:\n\n一、对自2026年1月1日至2027年12月31日期间…",
"truncated": false,
"char_count": 1122,
"metadata": { "status_code": 200, "content_type": "text/html", "language": "zh", "retrieved_at": "2026-09-01T11:42:45+08:00" },
"links": null, "images": null, "html": null, "screenshot_url": null,
"extracted": null,
"usage": { "credits": 1, "engine": "trafilatura", "tokens_estimate": 281 },
"provenance": { "adapter": "trafilatura-http", "proxy_exit": "none", "cached": false, "retrieved_at": "2026-09-01T11:42:45+08:00" },
"error": null
}
```
字段纪律:默认唯一内容字段是 `markdown`(fit 提纯后正文);`links/images/html/screenshot_url` 只在 `formats` 点名时非 null;截图只给可过期 URL、绝不给 base64;`extract` 失败时 `extracted=null` + `warnings`,正文不吞。
---
## 3. 错误码与重试纪律
错误同时出现在 HTTP 状态码与 MCP `isError` 信封的 `error.code`,两面一致:
| code | HTTP | 语义 | 重试纪律 |
|---|---|---|---|
| `rate_limited` | 429 | 超 rpm/并发 | 按响应 `Retry-After` 秒数退避;带 `X-RateLimit-*` 头 |
| `quota` | 402 | 日/月配额耗尽 | **不重试**,联系管理员提额或等窗口重置 |
| `timeout` | 504/200信封 | 上游超时 | 可重试,指数退避 ≤2 次 |
| `upstream` | 502/200信封 | 上游站点故障/反爬空结果 | 可重试 ≤2 次;持续出现见 FAQ-6 |
| `blocked` | 200信封 | 目标站拦截(WAF/CF/验证页)或超体积/类型限制 | **不要换参数硬刷**;确认为能力边界(§4.2) |
| `denied` | 403 | **合规拦截**(域名/词表/robots/SSRF) | **禁止重试对抗**。被拦就是没数据 |
| `extract_failed` | 200信封 | 结构化抽取失败 | 去掉 `extract` 降级重试(正文仍可用) |
| 401 | 401 | key 缺失/无效/放错头 | 检查是否用了 `X-Service-Token` 而非 Bearer |
| 503 | 503 | 队列满/系统压力(只拒新不杀旧) | 按 `Retry-After` 退避;响应带 `running/queued` 现状 |
队列语义:请求被排队**不算失败**;`ADMIT_MAX=60`(running+queued 合计)超限时才返回 503。浏览器会话并发另有 `X-Session-Remaining` 提示头,请自行退避。
---
## 4. 能力数据范围(当前实测版 · 2026-09-01)
> 本节每个断言均来自 2026-09-01 本机 Docker 实测(`bench/` 产物与站点矩阵探针),未测项标「未验证」。生产部署后可能有小幅漂移。
### 4.1 搜索发现(`search`)
**国内(region=domestic)**——SearXNG 聚合四引擎,单发质量满分(政策类 query 实测 5/5 断言通过):
| 引擎 | 单发可用性 | 高并发突发表现(60 同发实测) | 含义 |
|---|---|---|---|
| 必应中国 | ✅ 稳定 | **60/60 扛住** | 主力 |
| 360 | ✅ 稳定 | 53/60 | 主力 |
| 百度 | ✅ 单发好 | 4/60(CAPTCHA) | 突发时可能缺席 |
| 搜狗 | ⚠️ 连续调用第 3 次起 CAPTCHA | 0/60 | 仅低速补充 |
→ 你的体验:常规节奏搜索结果完整(多引擎聚合);**若你的上游短时间猛打,结果会变少**(不是故障,是上游反爬)。服务端已做排队限速(对上游钳 4–8 并发 + 短缓存)尽量消化。
**国外(region=overseas)**——**当前仅 Bing 可用**:实测 Google / DuckDuckGo / Brave / Startpage / Qwant 在现有数据中心代理出口下全部 CAPTCHA/429。Bing 结果可能存在偏题(实测出现过把多词 query 截成首词的样本)。**禁止假定多源聚合能力**;需要对等多源质量请联系管理员(决策点:更优代理 / Brave API)。
### 4.2 URL 直取(`read`)——站点三分能力表(20 站 × 2 通道实测)
服务自动路由「纯 HTTP 提取 → 轻量 JS 渲染 → 保真渲染」降级链,你无需关心;只需知道边界:
| 分类 | 能力 | 实测站点 |
|---|---|---|
| ✅ 稳取 | 公开资讯 / 文档 / Wiki / 代码托管 / 政策页(走 JS 通道) / 企业公开页 | Wikipedia、GitHub、MDN、BBC、TechCrunch、LinkedIn 公开公司页、gov.cn、36氪、HN、新华英文 |
| ⚠️ 部分 | Shopify 系独立站:商品 URL 常 302 到集合页,**能拿到系列与价格,不保证落到指定 SKU** | Allbirds 实测 |
| ❌ 打不过(返回 `blocked`) | **Amazon 详情页(WAF)、Medium(Cloudflare)、Reddit(匿名 403)、X(登录墙)、知乎(403)、微博(302 访客墙)、百度百科(滑块)、StackOverflow(CF)、YouTube(无正文结构)** | 当前代理出口客观限制,升级住宅代理/强对抗档前请勿规划这些源 |
### 4.3 性能档位(实测)
| 指标 | 值 |
|---|---|
| 国内搜索 p50 / p95 | 0.63s / 0.79s |
| 国外搜索 p50 / p95 | 4.7s / 4.9s(Bing 经代理) |
| 正文读取 p50 / p95 | 0.06s / 0.12s(纯 HTTP 通道);JS 通道约 1–2s |
| 渲染吞吐 | 轻渲染 2.13 jobs/s(4 槽);保真渲染 0.81 jobs/s(单槽 FIFO) |
| 队列深度 | 60(running+queued;超时硬顶 120s) |
### 4.4 体积 / 类型 / 格式限制
- 下载体积上限 `max_download_bytes`(部署值以管理员通知为准);Content-Type 白名单:html / xml / json / pdf / text。
- 默认只产 fit markdown;`rawHtml` / 截图为特权 scope。
- 单页正文默认截断 20000 字符(`max_chars` 可调,截断必显式 `truncated=true`)。
---
## 5. 合规使用规则(消费侧必须遵守)
以下规则同时写在 MCP server instructions 中;**违反会被 `denied` 拦截并记入审计**:
1. 不得将本服务用于任何违反中国法律法规的数据获取。
2. 不得用于绕过登录墙 / 支付墙 / 验证码(本服务默认也不具备此能力)。
3. 不得进行整站搬迁式 crawl(每 host 有频率上限;60 会话封顶本身也是合规阀)。
4. 不得把公开网页中的个人信息汇总成档案再分发;响应中的疑似 PII 默认已被脱敏,不要试图还原。
5. **不得把包含境内个人信息的 query 发给 `region=overseas`**(query 会经境外代理出口)。
其它纪律:普通 key 遵守 robots.txt;`denied` / `blocked` 的语义是「没数据」,**不要重试对抗、不要换出口绕过**——反复对抗触发审计告警并可能导致 key 被吊销。
---
## 6. FAQ 与排错
**Q1:401 Unauthorized?**
九成是把 key 塞进了 `Authorization: Bearer`。改用 `X-Service-Token: bs_…`。其余是 key 已吊销/过期,找管理员。
**Q2:403 `denied`?**
合规拦截命中(域名黑名单 / 词表 / robots / SSRF 防护)。响应里有 `rule_id`;确认你的请求没踩 §5 红线。确属误判,带 `request_id` 找管理员复核规则。
**Q3:429 / 503?**
429 = 你自己超 rpm,按 `Retry-After` 退避;503 = 系统队列满(60),同样按 `Retry-After`。两者都只拒新请求,在途任务不受影响。持续 503 说明该错峰或找管理员扩容。
**Q4:402 `quota`?**
日/月配额耗尽,不可重试。找管理员提额。
**Q5:`read` 返回的 markdown 很短或为空?**
两种典型:① 目标站是「壳页」(如部分政府网联播页),纯 HTTP 通道会宁可弃取也不给脏数据——服务端会自动升级 JS 通道重试;② 目标站在 §4.2 ❌ 清单里,此时应是 `blocked` 而非空正文。若 `ok=true` 但正文质量差,带 `request_id` 反馈。
**Q6:搜索结果突然变少 / 引擎变少?**
上游反爬波动(尤其百度/搜狗在突发后 CAPTCHA)。服务端引擎矩阵在监控;非故障,通常数分钟自恢复。持续异常找管理员看引擎成功率矩阵。
**Q7:国外搜索质量不满意?**
已知限制:当前仅 Bing(§4.1)。需要 Google/DDG 级多源质量,向管理员提(代理升级或官方 API 通道,涉出境合规评估)。
**Q8:能不能爬 Amazon / Reddit / …?**
当前不能(§4.2 ❌ 清单)。这是出口 IP 信誉问题,不是服务故障;强对抗能力在预留档(Camoufox + 住宅代理),启用与否由产品决策。
---
*机制细节权威:`docs/design-arch-20260901.md`;能力数据来源:`docs/decision-candidates-20260901.md` §6 与 `.dsh/artifacts/run-20260901-browser-arch/site-matrix.md`。*