本地模型跑得挺好,一问到「这个库上周改了什么」就开始编;想给它接联网检索,又不想为搜索 API 再开一张账单、把密钥塞进五个客户端配置里。tiny-browse 是一条更轻的路:它复用你机器上已装好的 Chrome,用两个 MCP 工具把搜索与读页结果整理成带硬上限的 Markdown,包体约 126 kB、零运行时依赖、不内含大模型、不需要任何 API Key。本教程按官方 README 与 docs/TOOLS.md 六步落地,从 doctor 自检到多 Agent 共用 HTTP 服务,全部命令都可照抄。
先弄清:它给 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 与浏览器版本
node -v
# 需要 v22.x 或更高;低于 22 请先升级 Node
# 之后由 doctor 统一体检浏览器、速率预算与端口
tiny-browse doctor
README 要求 Node.js 22+,加上 Chrome、Chromium、Edge 或 Brave 之一。若机器上没有浏览器,也可以选 no-Chrome 模式,让工具走 HTTP 抓取而不启动本地浏览器,代价是依赖 JavaScript 的页面读不到完整内容。
npx -y @shubhamcodess/tiny-browse mcp,由 npx 临时拉取。团队机器建议先固定版本,再用下面的全局安装路线。Step 2:安装并跑一次 doctor
# 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 客户端
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 六种,直接复制输出最稳妥,省得记各家字段差异。
web_search 与 web_fetch;再让它搜一个近一周才更新的库,能返回带 URL 的 Markdown 就说明链路通了。Step 4:用 web_search 做一次带硬预算的检索
官方 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,这些默认约束不要主动关掉。
structuredContent,里面有结果列表、页面、token 计数、cursor 与耗时,便于做日志与回归;老客户端会退回纯文本 Markdown。Step 5:用 web_fetch 精读长文档,也当代码库来调
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。
web_fetch 并设 focus,只取与当前报错相关的章节,代码块与表格会原样保留在 Markdown 里。页面读出来偏薄时改成 render: "browser",让工具走完整 Chrome 渲染。搜索被挡不等于读页失效:搜索引擎可能因自动化访问弹 CAPTCHA,官方建议跑一次 tiny-browse login,期间搜索会改用其它引擎;读取具体页面不受影响。站点主动拒绝自动化时被标成 blocked,工具明确不绕过,遇到就换官方镜像或本地文档。
Step 6:开 HTTP 服务,让多个 Agent 共用一个热 Chrome
# 默认只监听回环地址
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 限定官方文档域名能明显减少噪声。