入门 📋 6 个步骤 第 607 / 608 篇

用 tiny-browse 给本地 Agent 装一个免 API Key 的联网工具:doctor 自检、MCP 接入与硬 token 预算实操

tiny-browse 是一个 126 kB、零运行时依赖的 MCP server,复用本机 Chrome 给 Agent 提供 web_search 与 web_fetch,无需搜索 API Key。本教程按官方 README 与 TOOLS.md 六步落地:doctor 自检、三种安装、接入四类客户端、带 max_tokens 硬预算的检索、focus 与 cursor 精读、HTTP 服务供多 Agent 共用,含 Windows 未测试与不可信内容标记等边界。

2026.11.09· 18 分钟阅读· 约 2609 字· 🌐 tiny-browse / 🔍 免密钥联网检索

本地模型跑得挺好,一问到「这个库上周改了什么」就开始编;想给它接联网检索,又不想为搜索 API 再开一张账单、把密钥塞进五个客户端配置里。tiny-browse 是一条更轻的路:它复用你机器上已装好的 Chrome,用两个 MCP 工具把搜索与读页结果整理成带硬上限的 Markdown,包体约 126 kB、零运行时依赖、不内含大模型、不需要任何 API Key。本教程按官方 README 与 docs/TOOLS.md 六步落地,从 doctor 自检到多 Agent 共用 HTTP 服务,全部命令都可照抄。

🔰 适合谁:跑本地模型(Ollama、llama.cpp 等)或不想为联网搜索单独付费的开发者;也想给 Agent 读最新官方文档的业务人员。前置:Node.js 22 或更高、Chrome / Chromium / Edge / Brave 之一,或走不依赖 Chrome 的 HTTP 模式。主线不需要 API Key。

先弄清:它给 Agent 的是两件工具,不是一个浏览器

官方把能力压成两个 MCP 工具,其余都是参数与输出格式。理解这张表,后面每步的取舍就清楚了:

工具做什么关键参数
web_search搜索并读取排名靠前的页面query、max_results、read、max_tokens、site、freshness
web_fetch按 URL 精读页面urls、focus、cursor、render、max_tokens

搜索先走 Google,被挡或超出速率预算时回退 DuckDuckGo 与 Bing;结果页用布局、无障碍树、选择器三种方式各读一遍再按投票合并,页面改版也不容易全崩。读页默认走纯 HTTP 且关闭脚本,需要 JavaScript 的站点才升级成完整 Chrome 加载,并把这个选择按站点记住。

先记住三条边界:① 官方明确写着已在 macOS 与 Linux 测试、Windows 未测试,Windows 读者遇到 Chrome 启动问题请按文末排障表处理;② 遇到机器人校验的站点只会被报告成 blocked,工具不会尝试绕过;③ 目前不支持 PDF。别把它当成爬虫框架来用。

Step 1:确认 Node 与浏览器版本

1 把环境门槛卡在起手处
node -v
# 需要 v22.x 或更高;低于 22 请先升级 Node

# 之后由 doctor 统一体检浏览器、速率预算与端口
tiny-browse doctor

README 要求 Node.js 22+,加上 Chrome、Chromium、Edge 或 Brave 之一。若机器上没有浏览器,也可以选 no-Chrome 模式,让工具走 HTTP 抓取而不启动本地浏览器,代价是依赖 JavaScript 的页面读不到完整内容。

💡 不想全局安装?任何支持 stdio MCP 的客户端都可以直接用 npx -y @shubhamcodess/tiny-browse mcp,由 npx 临时拉取。团队机器建议先固定版本,再用下面的全局安装路线。

Step 2:安装并跑一次 doctor

2 三种装法,体检通过再接客户端
# npm(推荐)
npm install -g @shubhamcodess/tiny-browse
tiny-browse doctor

# 从最新 GitHub Release 的 tgz 安装
npm install -g https://github.com/shubhamcodess/tiny-browse/releases/latest/download/tiny-browse.tgz

# 从源码
git clone https://github.com/shubhamcodess/tiny-browse.git
cd tiny-browse
npm ci
npm run build
npm link

doctor 会显示浏览器是否找得到、搜索暂停与预算状态、HTTP 端口占用情况。它也是后面 CAPTCHA 与端口冲突时的排障入口。

chrome_not_found 怎么处理:装一个受支持的浏览器,或用 --browser-path / 环境变量 TINY_BROWSE_CHROME 指到可执行文件。Ubuntu 24.04 上 Chrome 起不来时,官方文档给的临时解法是 sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0,这会改动内核开关,请先确认自己了解影响。

Step 3:把它接进日常用的 Agent 客户端

3 一条命令或一段 JSON,客户端就多了两个工具

Claude Code 用内置命令最省事;其它客户端把下面这段写进各自的 MCP 配置即可(路径按本机实际位置替换):

# Claude Code
claude mcp add tiny-browse -- npx -y @shubhamcodess/tiny-browse mcp

# 让工具帮你打印对应客户端的配置片段
tiny-browse config claude-code
tiny-browse config vscode
tiny-browse config cursor

# Cursor / Claude Desktop 等通用写法
{
  "mcpServers": {
    "tiny-browse": {
      "command": "npx",
      "args": ["-y", "@shubhamcodess/tiny-browse", "mcp"]
    }
  }
}

VS Code(GitHub Copilot)用 .vscode/mcp.json,结构是 servers 下写 type: stdio;tiny-browse config 支持 claude-code、claude-desktop、cursor、vscode、codex、generic 六种,直接复制输出最稳妥,省得记各家字段差异。

🔌 接入验证:让 Agent 列一次可用工具,应能看到 web_search 与 web_fetch;再让它搜一个近一周才更新的库,能返回带 URL 的 Markdown 就说明链路通了。

Step 4:用 web_search 做一次带硬预算的检索

4 把「读几篇、最多给多少字」写成参数

官方 TOOLS.md 给出的参数与默认值如下,照着设就能控制住塞进上下文的体量:

web_search 参数(官方默认值)
query        字符串,必填;支持 site: 与引号等 Google 运算符
max_results  整数 1-10,默认 5,参与排序的结果数
read         整数 0-10,默认 3,真正打开并阅读的结果数;0 只回列表
max_tokens   整数 200-200000,默认 6000,整份答案的硬上限
site         字符串,限定域名
freshness    any / day / week / month / year,默认 any
return_images 布尔,默认 false

# 给 Agent 的一句指令示例
用 web_search 查 "Node.js 22 stream backpressure",
max_results=5,read=2,max_tokens=2000,freshness=month,
把结论连同每条来源 URL 一起给我。

输出是按结果标题组织的 Markdown,读过的页面放在对应标题下,其余结果只给标题、URL 与摘要;长页面按标题切段,只保留与查询相关的段落塞进 max_tokens。给 query 直接传一个 URL 时,工具会把它当作页面来读。

网页内容是不可信输入:官方在每个页面外包裹 begin untrusted content 一类的注释标记,让 Agent 能区分「资料」与「指令」。别把检索结果当成可执行命令,也别让 Agent 因为页面里写着「忽略之前的要求」就改行为;工具还禁止访问私有网络、读页时不带你的 cookies,这些默认约束不要主动关掉。

💡 使用 MCP 协议 2025-06-18 或更新的客户端,结果还会带 structuredContent,里面有结果列表、页面、token 计数、cursor 与耗时,便于做日志与回归;老客户端会退回纯文本 Markdown。

Step 5:用 web_fetch 精读长文档,也当代码库来调

5 focus 与 cursor 解决「太长读不完」
web_fetch 参数(官方默认值)
urls         字符串数组 1-10,以 http(s) 开头的完整地址
max_tokens   整数 200-200000,默认 8000,多个 URL 共用
focus        字符串,只返回与该问题最相关的段落
cursor       字符串,续读上次被截断的页面
render       auto / http / browser,默认 auto
return_images 布尔,默认 false

# 库方式调用(先 npm install @shubhamcodess/tiny-browse)
import { webSearch, webFetch } from "@shubhamcodess/tiny-browse";

const { results, pages, markdown } =
  await webSearch({ query: "node.js stream backpressure", read: 2 });
const docs = await webFetch({
  urls: ["https://go.dev/doc/effective_go"],
  focus: "goroutines", max_tokens: 2000
});
console.log(docs.pages[0].markdown);

urls 与 cursor 二选一:页面被 max_tokens 截断时,输出末尾会给出续读提示与一个 cursor,把它传回去就能接着读。想复用同一个 Chrome 会话可用 createClient(),完全跳过浏览器用 mode: "http",错误处理读 TinyBrowseError.code。

📖 适合 Coding Agent 的用法:把官方文档 URL 交给 web_fetch 并设 focus,只取与当前报错相关的章节,代码块与表格会原样保留在 Markdown 里。页面读出来偏薄时改成 render: "browser",让工具走完整 Chrome 渲染。

搜索被挡不等于读页失效:搜索引擎可能因自动化访问弹 CAPTCHA,官方建议跑一次 tiny-browse login,期间搜索会改用其它引擎;读取具体页面不受影响。站点主动拒绝自动化时被标成 blocked,工具明确不绕过,遇到就换官方镜像或本地文档。

Step 6:开 HTTP 服务,让多个 Agent 共用一个热 Chrome

6 从 stdio 切到本机 Streamable HTTP
# 默认只监听回环地址
tiny-browse serve --http 7777

# 需要显式指定主机或加访问令牌时
tiny-browse serve --http 7777 --host 127.0.0.1 --token SECRET

# 端点
POST /mcp      MCP over Streamable HTTP
POST /search   JSON API,返回 markdown / data / images
POST /fetch    JSON API,参数同 web_fetch
GET  /health   { ok, name, version }

# VS Code 的 HTTP 客户端配置
{ "servers": { "tiny-browse": {
  "type": "http", "url": "http://127.0.0.1:7777/mcp" } } }

HTTP 模式给每个客户端保持一个热的 Chrome,并在缓存目录写端口文件,使库方式调用在 useServer: "auto" 时自动复用。多个 Agent 同时查资料时,这就省掉了反复冷启动浏览器的开销。

别把它暴露到公网:服务默认只监听 127.0.0.1;官方写明,想监听其它地址必须先设 --token 或 TINY_BROWSE_TOKEN,客户端通过 Authorization: Bearer 传递,否则拒绝启动。服务端还会做 Origin 检查以挡住网页发起的请求与 DNS rebinding。端口被占用时先停掉旧进程或换端口,tiny-browse doctor 能看当前状态。

常见问题速查

现象排查方向
chrome_not_found装 Chrome / Edge / Brave,或设 --browser-path 与 TINY_BROWSE_CHROME
Google 一直出 CAPTCHA跑一次 tiny-browse login;期间自动改用 DuckDuckGo 与 Bing,doctor 可看暂停与预算
页面内容很薄用 render: "browser",站点可能需要 JavaScript 或拒绝自动化
读 PDF 没反应当前版本不支持 PDF,先自行转成 HTML 或纯文本
答案被截断调大 max_tokens,或拿输出末尾的 cursor 交给 web_fetch 续读
端口已被占用另一个 serve 还在跑,停掉它或换一个端口
Windows 上启动异常官方只测试过 macOS 与 Linux;先用 no-Chrome 模式验证读页链路,再单独排查浏览器路径

做到哪一步算成功

依次应看到:tiny-browse doctor 报告浏览器可用;客户端里能列出 web_search 与 web_fetch;一次设了 max_tokens=2000 的检索返回带 URL 的 Markdown 且没有撑爆上下文;把一篇长文档交给 web_fetch 并设 focus,输出保留代码块与标题,必要时能用 cursor 续读;serve --http 7777 起来后 /health 返回版本信息,第二个 Agent 通过同一个 /mcp 也能检索。故意不设 token 却把 --host 指到非回环地址,应当被拒绝——这条反例能证明你确实理解了服务边界。项目为 MIT 许可。

📌 可选增强:return_images 会把页面主图作为 MCP 图片块返回(PNG / JPEG / GIF / WebP,默认至多 4 张、每张不超过 1 MB);freshness 设成 week 适合追新版本,site 限定官方文档域名能明显减少噪声。
← 返回教程中心