隐藏的代币税
量化AI浏览器自动化的真实成本
每次点击复杂页面都会通过MCP默默地消耗10000多个令牌。 通过CLI进行相同的点击?只有35岁。
   
______________________________________________________________________
*一个经验基准揭示了标准MCP浏览器工具中2-5倍的令牌浪费,* *使用测量的CDP协议开销和混合路由解决方案。*
______________________________________________________________________
摘要
人工智能代理越来越依赖浏览器自动化进行网络交互,但 代币成本 对这些相互作用的理解仍然很差。我们提出了第一个系统的、实证的基准,比较了人工智能代理的四种浏览器自动化方法: @剧作家/cli (基于文件的快照), @剧作家/mcp (协议嵌入快照), 克劳德铬合金 (CDP中继),以及 原始CDP (Chrome DevTools协议)。
我们对4个真实世界网站(5-882个DOM元素)的测量表明 MCP在每个动作响应中嵌入完整的可访问性树,创建 O(n)上下文增长 这会默默地耗尽代理的上下文窗口。相比之下,CLI的基于文件的方法实现了 O(1)每次行动成本,通过以下方式减少代币总消费量 37-84% 在多步骤工作流程中。
对于每天运行50个浏览器自动化工作流的10名开发人员团队来说,这意味着 每年节省20890美元API成本 (按克劳德·索内特的定价)。
我们提供可重复的基准脚本、原始测量数据和实用的混合路由策略。
______________________________________________________________________
目录
- 每次操作令牌成本 - 多步骤工作流成本 - 上下文增长模型 - CDP协议深度学习 - 延时分析 - 成本影响分析
______________________________________________________________________
视觉摘要
______________________________________________________________________
主要发现
🔍 发现1:代币税
MCP在每个动作响应中都包含完整的ARIA快照。
已验证源代码: setIncludeSnapshot() 被召唤 browser_click, browser_type, browser_navigate以及所有交互工具。
每次点击、每次击键、每次导航——整个页面树都会被重新发送。
📊 发现2:规模
| 第页 | 每个操作的MCP | 每个动作的CLI | 比率 |
|---|---|---|---|
| 简单(5个元素) | 86托 | 35托 | 2.5倍 |
| 形状(44个元素) | 248托 | 35托 | 7.1x |
| 复合体(458个元素) | 3499托 | 41托 | 85倍 |
| 重(882种元素) | 10162托 | 35托 | 290x |
💰 发现3:成本
一个10人的团队每天运行50个浏览器工作流,浪费时间 20890美元/年 在冗余令牌上。
||MCP|CLI|节省| |--|-----|-----|---------| |每个工作流程(HN)|0.159美元|0.044美元|72%| |每位开发者/年|2900美元|811美元|2089美元| |10人团队/年|29000美元|8110美元| $20,890 |
*Claude Sonnet的投入定价为3美元/MTok*
⚡ 发现4:CDP原始开销
原始CDP可访问性树为 大15-157倍 与处理后的ARIA快照相比。
| 第页 | ARIA快照 | CDP原始A11y | 比率 |
|---|---|---|---|
| example.com | 232 B | 5807 B | 25x |
| httpbin | 912 B | 39311 B | 43x |
| 黑客新闻 | 40620 B | 631263b | 15.5x |
这表明Playwright的ARIA处理管道提供了大量的压缩,但MCP通过重新发送每个动作来否定这一点。
______________________________________________________________________
问题:隐形语境流失
当AI代理使用MCP浏览器工具时, 每个操作都会将整页可访问性树静默地注入上下文窗口:
Action 1: navigate → +10,162 tokens (full snapshot)
Action 2: click link → +10,167 tokens (full snapshot again)
Action 3: fill form → +10,162 tokens (full snapshot again)
Action 4: click btn → +10,167 tokens (full snapshot again)
Action 5: snapshot → +10,162 tokens (full snapshot again)
─────────────────────────────────────────────────────
Total: 50,820 tokens consumed (for 5 simple actions on Hacker News)使用CLI,相同的工作流程:
Action 1: navigate → +99 tokens (URL + title only)
Action 2: click link → +35 tokens (confirmation only)
Action 3: fill form → +35 tokens (confirmation only)
Action 4: click btn → +35 tokens (confirmation only)
Action 5: snapshot → +39 tokens (stdout) + 14,646 tokens (file, read once)
─────────────────────────────────────────────────────
Total: 14,889 tokens consumed (71% savings)区别?CLI将快照写入文件。MCP将它们嵌入到每个响应中。
上下文增长可视化
---
config:
themeVariables:
xyChart:
plotColorPalette: "#10B981, #F59E0B"
---
xychart-beta
title "Cumulative Token Cost Over 10 Actions (Medium Page, S=3000 tok)"
x-axis ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
y-axis "Total Tokens" 0 --> 35000
line "CLI (O(1) + on-demand read)" [3035, 3070, 3105, 3140, 6175, 6210, 6245, 6280, 6315, 6350]
line "MCP (O(n) every action)" [3035, 6070, 9105, 12140, 15175, 18210, 21245, 24280, 27315, 30350]CLI以35个令牌/操作的速度增长 (恒定)。MCP的生长速度为 3035个令牌/动作 (与页面大小呈线性关系)。 通过动作10,MCP已消耗 代币数量增加4.8倍 而不是CLI。
______________________________________________________________________
方法论
环境
| 参数 | 值 |
|---|---|
| 操作系统 | WSL2(Linux 6.6.87.2微软件标准-WSL2) |
| Node.js | v22.21.1 |
| @剧作家/cli | v0.1.1(剧作家1.59.0-alpha) |
| @剧作家/mcp | v0.0.68 |
| 浏览器 | Chromium(捆绑,无头) |
| 代币估算 | ceil(bytes / 4) (标准英文文本近似) |
目标页面
我们选择了4页,涵盖了复杂性范围:
| 页面 | URL | DOM元素 | HTML大小 | 复杂性 |
|---|---|---|---|---|
| example.com | https://example.com | 5 | 528 B | 最小 |
| httpbin表单 | https://httpbin.org/forms/post | 44 | 1419 B | 形状沉重 |
| 黑客新闻 | https://news.ycombinator.com | 882 | 34706B | 内容丰富 |
| GitHub趋势 | https://github.com/trending | 458 | 567849 B | 综合SPA |
测量方法
flowchart LR
subgraph "Three Independent Measurement Paths"
A["CLI\n(subprocess)"] --> D["stdout bytes\n+ file bytes"]
B["MCP-equivalent\nPlaywright API"] --> E["JSON response\nbytes"]
C["CDP Raw\n(DevTools Protocol)"] --> F["Protocol response\nbytes"]
end
D --> G["Token = ceil(bytes/4)"]
E --> G
F --> G
G --> H["Comparison\nTables"]- 命令行界面:实际
playwright-cli子进程调用,测量stdout和快照文件大小 - MCP等效物:剧作家API
ariaSnapshot(),包装在MCP JSON信封中 - CDP原始:直接
page.context().newCDPSession()用于原始协议测量
每次测量进行3次;我们报告中位数。
可重复性
所有基准脚本和原始数据都包含在此存储库中。 看 重现我们的结果 以获取说明。
______________________________________________________________________
结果
1.每次行动代币成本
基本指标: 每种方法每次浏览器操作消耗多少令牌?
CLI标准输出与MCP响应(每次操作)
| 页面 | CLI标准输出 | MCP响应 | MCP/CLI比率 |
|---|---|---|---|
| example.com | 35托 | 86托 | 2.5倍 |
| httpbin格式 | 35tok | 248tok | 7.1x |
| 黑客新闻 | 35 tok | 10162 tok | 290x |
| GitHub趋势 | 41 tok | 3499 tok | 85倍 |
关键洞察:CLI标准输出为 恒定 (约35个标记),与页面复杂性无关。 它只包含URL、标题和文件链接。快照已写入磁盘。
读取CLI快照文件时
| 页面 | CLI文件 | MCP响应 | 比率 |
|---|---|---|---|
| example.com | 79托 | 86托 | 1.1倍 |
| httpbin格式 | 420托 | 248托 | 0.6倍\* |
| 黑客新闻 | 14646 tok | 10162 tok | 0.7倍\* |
| GitHub趋势 | 6625 tok | 3499 tok | 0.5x\* |
*\*由于元素引用(e1,e2,…)和YAML格式,CLI文件有时会更大。* *但文件已被读取 一次,当MCP在上发送快照时 每一个行动.*
**这是关键的见解:每个快照,MCP和CLI都是相似的。但MCP发送了N次;CLI发送它K次(K\ 55000 bar "CLI (1 snapshot read)" [254, 595, 14821, 6800] bar "MCP (snapshot every action)" [430, 1370, 53090, 18745]
|第页| CLI总计| MCP总计|节省|节省百分比|
|------|----------|----------|---------|-----------|
|example.com | 254托| 430托| 176托| 41%|
|httpbin表单| 595 tok | 1370 tok | 775 tok | 57%|
| **黑客新闻** | **14821托** | **53090托** | **38269托** | **72%** |
|GitHub趋势| 6800托| 18745托| 11945托| 64%|
> **公式**:
>
> - CLI: `C(n) = n × 35 + k × S(page)` 其中k=快照读取(通常为1-2)
> - MCP: `C(n) = n × (35 + S(page))` --每个操作都包括完整快照
#### 7-动作表单填写工作流(httpbin)
导航→ 快照→ 填充×3→ 点击→ 快照
|模式|总字节数|令牌|与MCP|
|------|------------|--------|--------|
|命令行界面(标准)|4637 B|~1159| **节省39%** |
|CLI(优化,1次读取)|2921 B|~730| **节省62%** |
|MCP(标准)|7658 B|~1914 |基线|
#### 6-Action复杂页面(黑客新闻)
导航→ 快照→ 点击→ 快照→ 点击→ 快照
|模式|总字节数|令牌|与MCP|
|------|------------|--------|--------|
|命令行界面(标准)|122764 B|~30691| **节省52%** |
|命令行界面(优化,1次读取)|41788 B|~10447| **节省84%** |
|MCP(标准)|254826 B|~63706|基线|
### 3.情境增长模型
动作和上下文消费之间的数学关系:
CLI: C(n) = n × 35 + k × S(page) // k = snapshot reads (1-3 typical) MCP: C(n) = n × (35 + S(page)) // snapshot in every response CDP: C(n) = n × (35 + R(page)) // R >> S (raw >> processed)
对于 `n = 10` 行动:
|页面大小(S)|CLI(k=2)|MCP|CDP原始|MCP/CLI|CDP/CLI|
|---------------|-----------|-----|---------|---------|---------|
|50托(最小值)| 450 | 850 | 15000+| 1.9倍| 33倍|
|500托(形式)|1350|5350|10000+|4.0x|74x|
|3000托(中等)|6350|30350|1500000+|4.8x|236x|
|10000托(重)|20350|100350|--| **4.9倍** | — |
> **交叉点**:CLI优势在以下情况下变得显著 `S > 200 tokens` (任何包含>10个交互元素的页面)。
### 4.CDP协议深度学习
我们测量了原始CDP协议输出,以了解Playwright的ARIA处理压缩了什么。
#### CDP响应大小比较
|页面|DOMSnapshot |完整A11y树|ARIA快照|A11y/ARIA比率|
|------|------------|----------------|---------------|-----------------|
|示例.com | 999 B | 5807 B | 232 B| **25倍** |
|httpbin表单|1002 B|39311 B|912 B| **43x** |
|黑客新闻| 1001 B | 631263 B | 40620 B| **15.5x** |
|GitHub趋势| 999亿| 1036亿| 1436亿| 0.7倍\*|
*\*GitHub Trending显示CDP A11y输出异常低(1036 B),可能是由于动态内容加载或反抓取措施影响了CDP会话。*
> **洞察**:剧作家的ARIA处理管道提供 **15-43x压缩** 基于原始CDP可访问性数据。
> 这是一项有价值的工作,但MCP通过在每个操作上重新发送压缩结果来抵消这一好处。
#### 数据管道
flowchart LR A["Raw DOM\n(34-567KB HTML)"] --> B["CDP Accessibility\ngetFullAXTree\n(1-631KB)"] B --> C["ARIA Snapshot\nProcessing\n(232B-40KB)"] C --> D{"Delivery Method"} D -->|"MCP"| E["Embedded in\nevery response\n❌ O(n) growth"] D -->|"CLI"| F["Written to file\nread on demand\n✅ O(1) growth"] D -->|"chrome"| G["Same as MCP\n+ 15% CDP relay\n❌ O(n) growth"]
style E fill:#FEF3C7,stroke:#F59E0B style F fill:#D1FAE5,stroke:#10B981 style G fill:#EDE9FE,stroke:#6366F1
#### 克劳德铬分析
`claude --chrome` 内部使用相同的Playwright MCP服务器,通过CDP WebSocket中继连接:
Claude CLI → MCP JSON-RPC → Playwright MCP Server → CDP WebSocket → CDPRelayServer → WebSocket → Chrome Extension → Native Messaging → Chrome
源代码分析 `cdpRelay.js` 确认:
- 与MCP相同的ARIA快照处理
- 额外的WebSocket中继开销(~15%)
- **WSL2上不可用** (需要Chrome UI+原生消息桥)
**预计代币成本**: `C_chrome(n) ≈ 1.15 × C_mcp(n)`
### 5.延迟分析
令牌效率和延迟代表了一种权衡:
|操作|CLI|MCP|CDP Direct|
|-----------|-----|-----|------------|
|冷启动(浏览器启动+导航)|3200-6100ms|590-1500ms|50-910ms|
|温快照|130-350ms |16-345ms |8-140ms|
|点击/填充动作|~1200ms|~200ms|不适用|
> **CLI的每次操作延迟更高** (~1.2s)由于Playwright代码生成。
> 但 **工作流总成本更低** 因为:
>
> 1. 更少的上下文标记=更快的LLM推理
> 1. 所需往返次数减少(按需快照)
> 1. 代币节省远远超过大规模的延迟成本
### 6.成本影响分析
#### 每个工作流程成本(Claude Sonnet,3美元/MTok输入)
|页面|MCP成本|CLI成本|节省|
|------|----------|----------|---------|
|简单页面(5个操作)|$0.001|$0.001| ~$0|
|表单填写(7项操作)|0.006|0.002|0.004美元|
|复杂页面(5个操作)| **$0.159** | **$0.044** | **$0.115** |
|GitHub抓取(4个操作)|0.056美元|0.020美元|0.036美元|
#### 年化影响
|规模|MCP年度|CLI年度| **年度储蓄** |
|-------|-----------|-----------|-------------------|
|单人开发者(10人/天)|580美元|162美元| **$418** |
|活跃开发者(50人/天)|2900美元|811美元| **$2,089** |
|10人团队(每人每天50人)|29000美元|8110美元| **$20,890** |
|企业(100名开发人员)|290000美元|81100美元| **$208,900** |
> *承担复杂的页面繁重的工作负载。实际节省因页面复杂性分布而异。*
> *Claude Opus定价(15美元/公吨)将使节省增加5倍。*
______________________________________________________________________
## 体系结构比较
flowchart TB subgraph CLI ["@playwright/cli (Token-Efficient)"] direction LR A1["Agent"] -->|"subprocess"| A2["playwright-cli"] A2 -->|"35 tok stdout"| A1 A2 -->|"file write"| A3[".playwright-cli/page.yml"] A3 -.->|"read on demand"| A1 end
subgraph MCP ["@playwright/mcp (Standard)"] direction LR B1["Agent"] -->|"JSON-RPC"| B2["MCP Server"] B2 -->|"response + full snapshot\n(100-10,000+ tok)"| B1 end
subgraph Chrome ["claude --chrome (Extension)"] direction LR C1["Agent"] -->|"JSON-RPC"| C2["MCP Server"] C2 -->|"CDP WebSocket"| C3["Relay"] C3 -->|"Native Msg"| C4["Chrome"] C2 -->|"response + snapshot\n+ 15% overhead"| C1 end
subgraph CDP ["Raw CDP (Reference)"] direction LR D1["Agent"] -->|"CDP Session"| D2["Browser"] D2 -->|"Full A11y Tree\n(15-157x larger)"| D1 end
style CLI fill:#D1FAE5,stroke:#10B981,stroke-width:3px style MCP fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px style Chrome fill:#EDE9FE,stroke:#6366F1,stroke-width:2px style CDP fill:#FEE2E2,stroke:#EF4444,stroke-width:2px
### 为什么CLI不同
关键的架构差异是 **何时以及如何交付快照**:
|特性|CLI|MCP|chrome|
|--------|-----|-----|--------|
|快照传递|磁盘上的文件|每次响应中|每次响应+中继|
|代理读取快照|需要时(0-3次)|强制(每次操作)|强制|
|每次操作开销|~35个令牌(常数)|~S个令牌(取决于页面)|~1.15S个令牌|
|上下文增长| **O(1)** | **O(n)** | **O(n)** |
|元素引用| `e1`, `e2`, ...(指针ID)|全树重新解析|全树再次解析|
______________________________________________________________________
## 解决方案:混合路由
根据我们的测量结果,我们建议 **混合路由策略**:
flowchart TD A["Browser Action Request"] --> B{"Action Type?"} B -->|"Deterministic\n(click, fill, type,\npress, goto)"| C["CLI\n✅ 35 tok/action"] B -->|"Exploratory\n(unknown page,\ndebugging)"| D["MCP\n📊 Full tree access"] B -->|"Visual/Manual\nCollaboration"| E["chrome\n🖥️ GUI needed"]
C --> F{"Need snapshot?"} F -->|"Yes (first time\nor state changed)"| G["Read file\n(one-time cost)"] F -->|"No (using refs)"| H["Skip\n(0 extra tokens)"]
style C fill:#D1FAE5,stroke:#10B981 style D fill:#FEF3C7,stroke:#F59E0B style E fill:#EDE9FE,stroke:#6366F1
### 路由决策表
|用例|推荐|令牌比率与MCP |原因|
|----------|-------------|-------------------|--------|
|表单填写(5+个字段)| **命令行界面** |节省1.9倍|元素引用,无重复快照|
|点击顺序| **命令行界面** |2-5倍的节省|每次行动节省O(1)|
|大页面抓取(>500个元素)| **命令行界面** | **节省4.9倍** |基于文件的快照,读取一次|
|CI/CD E2E测试| **命令行界面** |节省4.8倍|子流程友好,成本低|
|未知页面探索| **主控程序** |基线|发现所需的完整树|
|实时调试| **MCP/铬** |--|交互式树、状态管理|
|GUI协作| **铬** |--|视觉上下文,不支持WSL2|
______________________________________________________________________
## 重现我们的结果
### 先决条件
Node.js 18+ required
node --version # v18.0.0+
Install dependencies
npm install
Install Chromium browser
npx playwright install chromium
### 运行基准
Full benchmark (all 4 pages, all 3 approaches)
npm run benchmark
JSON output (for further analysis)
npm run benchmark:json > my_results.json
CLI workflow demo
npm run demo:cli
### 配置
对于未安装Google Chrome的环境(例如CI、WSL2):
Use bundled Chromium instead of Chrome
export PLAYWRIGHT_MCP_CONFIG=$(cat Summary Table (all measurements)
| 页面 | 方法 | 操作 | 令牌 | 字节 | 延迟(毫秒) |
|---|---|---|---|---|---|
| example.com | 命令行界面 | 打开 | 126 | 503 | 3356 |
| example.com | 命令行界面 | 快照(文件) | 79 | 315 | 130 |
| example.com | MCP | 导航 | 88 | 352 | 593 |
| example.com | MCP | 快照 | 78 | 312 | 22 |
| example.com | CDP | 全A11y树 | 1452 | 5807 | 22 |
| example.com | CDP | 已处理ARIA | 58 | 232 | 74 |
| httpbin | 命令行界面 | 打开 | 94 | 373 | 3529 |
| httpbin | 命令行界面 | 快照(文件) | 420 | 1677 | 149 |
| httpbin | MCP | 导航 | 258 | 1032 | 651 |
| httpbin | MCP | 快照 | 248 | 992 | 16 |
| httpbin | CDP | 全A11y树 | 9827 | 39311 | 43 |
| httpbin | CDP | ARIA已处理 | 228 | 912 | 77 |
| 黑客新闻 | 命令行界面 | 打开 | 99 | 396 | 3728 |
| 黑客新闻 | 命令行界面 | 快照(文件) | 14646 | 58637 | 284 |
| 黑客新闻 | MCP | 导航 | 10172 | 40688 | 830 |
| 黑客新闻 | MCP | 快照 | 10162 | 40648 | 125 |
| 黑客新闻 | CDP | 完整的A11y树 | 157,732 | 631,263 | 139 |
| 黑客新闻 | CDP | ARIA已处理 | 10142 | 40620 | 240 |
| GitHub趋势 | 命令行界面 | 打开 | 107 | 429 | 6096 |
| GitHub趋势 | 命令行界面 | 快照(文件) | 6625 | 26502 | 348 |
| GitHub趋势 | MCP | 导航 | 3509 | 14036 | 1499 |
| GitHub趋势 | MCP | 快照 | 3499 | 13996 | 345 |
| GitHub趋势 | CDP | 完整的A11y树 | 259 | 1036 | 8 |
| GitHub趋势 | CDP | ARIA已处理 | 359 | 1436 | 382 |
______________________________________________________________________
讨论
已验证的索赔
| 索赔 | 来源 | 我们的测量 | 状态 |
|---|---|---|---|
| CLI的令牌效率提高了4.2倍 | 微软 | 1.7-6.1倍(工作流) | ✅ 下限已确认 |
| 单个操作的CLI高达100倍 | Microsoft | 2.5-290x(每个操作的stdout) | ✅ 超过复杂页面的索赔要求 |
| 按需快照减少上下文 | 设计目标 | O(1)vs O(n)已验证 | ✅ 根据经验确认 |
| CLI的每次操作延迟较高 | 预期 | ~1.2s对~200ms | ✅ 已确认(代码生成步骤) |
局限性
- 代币估算:我们使用
ceil(bytes/4)作为代理。实际标记器输出可能变化±15% - 单次运行计时:延迟测量显示中位数为3次运行;网络方差影响结果
- GitHub趋势异常GitHub Trending的CDP A11y树显示出意外的低输出(1036 B),这表明动态内容或反机器人措施影响了CDP会话
- WSL2环境:
claude --chrome无法直接测量;令牌成本是通过源代码分析估算的 - 主控程序
ariaSnapshotDiff:@description/mcp中存在增量差异支持,但尚未广泛公开;如果可用,它将减少MCP的上下文增长
新颖的贡献
- 第一次实证测量 CLI、MCP和CDP中每个操作的令牌成本
- 源代码验证 MCP在每个动作响应中嵌入快照(
setIncludeSnapshot()) - CDP中继分析 确认
claude --chrome使用相同的ARIA管道,开销约为15% - 上下文增长模型 用数学公式:
C(n) = n × 35 + k × S对比C(n) = n × (35 + S) - 实用的路由策略 基于动作类型分类
未来工作
- 基准
ariaSnapshotDiff在MCP中广泛使用时 - 使用实际的LLM标记器(cl100k、o20k)进行测量,而不是基于字节的估计
- 扩展到其他MCP浏览器实现(例如Browsebase、Stagehand)
- 衡量端到端任务完成率(令牌效率与任务成功率)
______________________________________________________________________
参考文献
- 微软编剧团队。“@description/cli——AI代理的令牌高效浏览器自动化。”npm,2025。https://www.npmjs.com/package/@剧作家/cli
- 微软编剧团队。“@description/mcp——mcp的编剧工具。”npm,2025。https://www.npmjs.com/package/@剧作家/mcp
- 人类学。“与克劳德一起使用电脑——浏览器工具(
claude --chrome).《人类学文献》,2025年。https://docs.anthropic.com/en/docs/claude-code/browser-tool - Chrome DevTools协议。“可访问性域”。Chrome DevTools协议,2025年。https://chromedevtools.github.io/devtools-protocol/tot/Accessibility/
- W3C。“WAI-ARIA可访问的富互联网应用程序”。W3C推荐标准,2024年。https://www.w3.org/TR/wai-aria/
______________________________________________________________________
许可证
MIT许可证。看 许可证 了解详情。
______________________________________________________________________
如果这个基准帮助您优化了AI浏览器自动化成本, 请考虑给它一个⭐
*基于经验测量而非估计。*
