返回资讯中心
外部精选
软件工程
#开发者实时流

turbo-browser-mcp 发布:为 MCP 浏览器自动化批量合并表单操作并加入提交保护

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

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

Hacker News 最新tthanh2k62026/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 选择器、可见文本、标签或视口(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 或 jpeg,支持 quality、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、深度 request/response 检查(reqId + part)、已完成的下载以及对话框自动处理(dialogPolicy: accept/dismiss)。

可复现基准测试(npm run benchmark)

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

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

打开原文
去社区讨论 →