返回资讯中心
外部精选
软件工程
#社区热议

开发者发布 Turbo-Browser-MCP,将浏览器操作整合为批量工具以减少 LLM token 消耗

来源标题:Show HN: Turbo-Browser-MCP – Batch forms, DOM deltas and submit guards for MCP

turbo-browser-mcp 是一个基于 Playwright 的 MCP 服务器,把 25-33 个细粒度浏览器原语合并为 10 个批量工具,以减少 LLM 的 token 消耗和多轮延迟。其功能包括增量 DOM 快照、单轮表单预填、直接磁盘文件上传、并行标签页会话,以及默认启用的提交前人工确认保护。据其基准测试,在 10 字段表单场景中,浏览器执行时间从 574 毫秒降至 82 毫秒,并省去 10 次 LLM 推理往返和约 71,800 个重放历史 token。

Hacker Newstthanh2k62026/11/15 · 今天30 分钟阅读

以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

turbo-browser-mcp 是一个基于 Playwright 的 Model Context Protocol(MCP)服务器,目标是减少浏览器自动化中的 LLM token 浪费和多轮延迟。它把 25–33 个细粒度浏览器原语整合为 10 个批处理工具,具备增量 DOM 快照、单轮完成 React/Shadow DOM/iframe 表单预填、直接从磁盘上传文件(上下文中不出现 Base64)、并行标签页会话、网络阻断预设,以及默认开启的人在回路 Submit 守卫。

以下所有数据来自 benchmarks/benchmark.mjs(npm run benchmark),在本地以无头 Chromium 运行,并使用精确的 OpenAI o200k_base 分词(tiktoken 0.14.0):

关于延迟与 LLM 推理轮次的说明:在一个 10 字段表单上省去 10 次往返,既能在浏览器执行上节省 7 倍时间(574 ms -> 82 ms),也能省去 10 次独立的 LLM 推理往返(在 agent 循环中每轮 2–5 秒),外加约 71,800 个被重放的历史 token。

标准 MCP 服务器会为每一次快照、字段填写、<select> 选择、上传和验证检查都消耗一次 LLM 往返。每一轮都会把不断增长的对话历史重新发回模型。

sequenceDiagram autonumber participant Agent as LLM Agent participant Std as Standard MCP (Playwright / DevTools) participant Turbo as turbo-browser-mcp Note over Agent,Std: 标准 MCP(12+ 次 LLM 轮次,每一步都重放完整 ARIA 树 + 历史) Agent->>Std: 1. snapshot() -> 完整 ARIA(约 3,568 tok) loop 在字段、选择框、复选框、上传上重复 10+ 次 Agent->>Std: fill / select_option / click Std-->>Agent: 完整 ARIA 或确认信息重新加入历史 end Agent->>Std: 12. 内联上传或点击文件选择器 Note over Agent,Turbo: turbo-browser-mcp(共 2 次 LLM 轮次,增量与内联快照) Agent->>Turbo: 1. inspect_compact(mode: "forms") -> 紧凑引用(1,135 tok) Agent->>Turbo: 2. smart_fill_form(fields: [...10 个字段 + 磁盘 PDF...], returnSnapshot: true) Turbo-->>Agent: 填入 10 个字段 + Submit 前守卫 + 内联快照(811 tok) Loading turbo-browser-mcp 支持的功能

  1. 连接与会话隔离 4 种连接模式(--mode auto|cdp|persistent|launch): auto(默认):先探测 --cdp http://127.0.0.1:9222,以便 agent 复用已有的已登录浏览器会话,失败后再回退到启动 Chromium。 cdp:直接连接到正在运行的 Chromium/Chrome/Edge 远程调试端口。 persistent:使用可复用的 --user-data-dir 配置文件跨多次运行启动。 launch:启动一个干净的浏览器会话(默认 --headless,或使用 --headed)。 自动发现二进制文件(src/playwright-loader.mjs):检查 Windows、macOS 和 Linux 上的 playwright-core 缓存版本、系统中安装的 Google Chrome、Microsoft Edge、Brave 和 Chromium,或使用显式的 --executable <path>。 按标签页隔离(tabs_batch):在命名的隔离 isolatedContext 沙箱中打开标签页,各自拥有独立的 cookie 和存储;批量打开最多 10 个并发 URL(open_many);支持激活、刷新、前进/后退、调整视口大小,以及模拟 colorScheme、media、reducedMotion、contrast、forcedColors 或自定义 userAgent。
  2. DOM、iframe 与 Shadow DOM 检查(inspect_compact) 快照模式:interactive、forms、article 和 all。 跨边界遍历:扁平化主框架 DOM、子 iframe(includeFrames、frameIdx)和开放的 Shadow DOM。注入一个初始化脚本,挂接 Element.prototype.attachShadow(WeakMap + WeakRef/FinalizationRegistry + window.__tbmGetShadowRoot),使初始化后关闭的 Shadow root 仍可检查和受守卫保护;遍历 <slot> 的 assignedNodes({ flatten: true }),并支持 Form-Associated Custom Elements。 Token 控制:onlyChanged: true 仅输出自上次快照以来新增或变更的元素;query 支持按正则或子串过滤;boxes: true 仅在需要时追加 [box=x,y,w,h];maxChars 限制载荷大小;savePath 将完整输出写入磁盘。
  3. 单轮智能表单引擎(smart_fill_form) 在一次 MCP 调用中预填整个表单,并在受控输入之间冲刷微任务和宏任务: act_fast 动作:click、dblclick、hover、focus、clear、fill、type(slowly、delayMs、submit)、select、check、uncheck、drag、drop(file、files 或自定义 MIME dropData)、press(key + 修饰键:Alt、Control、ControlOrMeta、Meta、Shift)、scroll(dx、dy)、wait(ms、state、loadState、text、textGone、url)和 upload。 定位选项:紧凑的 [eN] 引用、CSS 选择器、可见文本、label,或视口 (x, y) 坐标,并支持 button(left、right、middle)和 frameIdx。 batch_actions:在一次 MCP 调用中按顺序执行一组 DOM 动作和嵌套的 smart_fill_form 步骤;若被 Submit 守卫拦截则安全停止,也可选择在步骤出错时继续(continueOnError)。
  4. 干净提取、求值与媒体捕获(extract_clean_text、evaluate_js、capture_page) extract_clean_text:从 main/article 容器和 iframe 中提取可读的纯文本或紧凑 Markdown(format: "text" | "markdown"),去除 script 和 style 噪声。 evaluate_js:在任意 frame(frameIdx)中运行 JS 表达式或 (el, arg) 元素函数,结果以 JSON 序列化,并可选通过 savePath 导出。 capture_page:整页或元素范围的截图(png,或带 quality 的 jpeg;css 或 device 缩放;可选 returnImage),以及生成 PDF 并保存到受限的 savePath。
  5. 网络阻断、存储状态与诊断(network_session、page_diagnostics) network_session 预设:turbo、no-images、no-media 和 clean(解除所有阻断),同时支持自定义 blockResources 和 blockUrls 模式。 会话与存储管理:读取/写入/清除浏览器 cookie、localStorage/sessionStorage,以及导出或重新加载完整的 Playwright storageState JSON 文件(saveStorageStatePath、loadStorageStatePath)。 page_diagnostics:默认仅报错(level: "errors"、statusFilter: "errors"),干净地暴露失败而不淹没上下文;同时支持 all、includeStatic、urlFilter、深度请求/响应检查(reqId + part)、已完成的下载,以及对话框自动处理(dialogPolicy: accept/dismiss)。 可复现的基准测试(npm run benchmark)

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →