<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Token Costs on RockB</title><link>https://baeseokjae.github.io/tags/token-costs/</link><description>Recent content in Token Costs on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Jul 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/token-costs/index.xml" rel="self" type="application/rss+xml"/><item><title>Browser MCP Snapshot Token Cost 2026: What Browser Automation Actually Costs</title><link>https://baeseokjae.github.io/posts/browser-mcp-snapshot-token-cost-2026/</link><pubDate>Wed, 08 Jul 2026 12:00:00 +0000</pubDate><guid>https://baeseokjae.github.io/posts/browser-mcp-snapshot-token-cost-2026/</guid><description>A practical 2026 guide to browser MCP snapshot token cost, pricing math, hidden multipliers, and cheaper automation patterns.</description><content:encoded><![CDATA[<p>Browser MCP snapshot token cost is not the price of one accessibility tree. In practice, it is tool schema tokens, page snapshots, chat history, model output, retries, and browser runtime added together. The right budget number is dollars per completed task, not dollars per million tokens.</p>
<h2 id="what-are-browser-mcp-snapshots-and-why-do-they-cost-tokens">What are browser MCP snapshots and why do they cost tokens?</h2>
<p>Browser MCP servers give an LLM a controlled way to inspect and operate a browser. Microsoft&rsquo;s Playwright MCP is the clearest example: it lets a model interact with pages through structured accessibility snapshots instead of relying only on screenshots or a vision model. That is useful because the model can see buttons, links, roles, labels, and text in a machine-readable form.</p>
<p>The trade-off is simple: the snapshot has to be placed in model context. If a page has a large navigation tree, repeated list items, hidden controls, chat widgets, cookie banners, modal markup, and verbose accessible names, the model may receive thousands or tens of thousands of input tokens before it has clicked anything.</p>
<p>I&rsquo;ve found that developers underestimate this because a snapshot feels like metadata, not &ldquo;content.&rdquo; But the model provider bills text-like structure as input tokens. Anthropic&rsquo;s tool-use docs are explicit that tool requests are billed on total input tokens, including the tools parameter, tool schemas, <code>tool_use</code> blocks, and <code>tool_result</code> blocks. OpenAI&rsquo;s computer-use guide describes a different loop, based on screenshots and UI actions, but the same economic shape appears: inspect state, send action, execute, inspect again.</p>
<p>That means the first pricing question should not be &ldquo;How much does Playwright MCP cost?&rdquo; Playwright itself is not the expensive part. The pricing question is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>completed_task_cost =
</span></span><span style="display:flex;"><span>  tool_schema_tokens
</span></span><span style="display:flex;"><span>+ snapshot_or_screenshot_tokens
</span></span><span style="display:flex;"><span>+ conversation_history_tokens
</span></span><span style="display:flex;"><span>+ model_output_tokens
</span></span><span style="display:flex;"><span>+ retry_tokens
</span></span><span style="display:flex;"><span>+ browser_runtime
</span></span><span style="display:flex;"><span>+ review_or_failure_handling
</span></span></code></pre></div><p>If you only measure one snapshot, you are measuring the cheapest visible component and missing the multipliers that show up in production.</p>
<h2 id="what-is-the-2026-browser-automation-cost-stack">What is the 2026 browser automation cost stack?</h2>
<p>As of July 8, 2026, the public pricing numbers make the token side concrete. OpenAI listed <code>gpt-5.5</code> at $5.00 per 1M input tokens and $30.00 per 1M output tokens, <code>gpt-5.4-mini</code> at $0.75/$4.50, and <code>computer-use-preview</code> at $1.50/$6.00. Anthropic listed Claude Opus 4.8 at $5 per 1M base input tokens and $25 per 1M output tokens, while also calling out that newer tokenizers for Opus 4.7+ and Claude 5-family models can produce about 30% more tokens for the same text than earlier models.</p>
<p>Browser infrastructure usually looks cheap next to model tokens. Browserbase&rsquo;s plan docs list browser-hour overages at $0.12/hr on Developer and $0.10/hr on Startup, with browser time billed by the minute and a one-minute minimum per session. A five-minute browser session at $0.12/hr is about one cent. A few oversized snapshots sent to a frontier model can cost more than that.</p>
<p>Here is the cost stack I use when estimating a browser agent:</p>
<table>
  <thead>
      <tr>
          <th>Cost component</th>
          <th style="text-align: right">What creates it</th>
          <th>Why it surprises teams</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Tool schemas</td>
          <td style="text-align: right">MCP server exposes tools and argument schemas</td>
          <td>Repeated in context depending on client and model loop</td>
      </tr>
      <tr>
          <td>Page snapshots</td>
          <td style="text-align: right">Accessibility tree, DOM-like structure, extracted text</td>
          <td>Expands with nav, tables, repeated cards, modals, hidden UI</td>
      </tr>
      <tr>
          <td>Chat history</td>
          <td style="text-align: right">Prior instructions, previous observations, results</td>
          <td>Grows every step unless summarized or truncated</td>
      </tr>
      <tr>
          <td>Model output</td>
          <td style="text-align: right">Reasoning summaries, tool calls, extracted data</td>
          <td>Output tokens cost more than input tokens on most APIs</td>
      </tr>
      <tr>
          <td>Retries</td>
          <td style="text-align: right">Bad selectors, auth redirects, flaky pages, captcha screens</td>
          <td>Multiplies the whole loop, not just the failed click</td>
      </tr>
      <tr>
          <td>Browser runtime</td>
          <td style="text-align: right">Cloud browser minutes or local compute</td>
          <td>Usually small, but minimum session billing matters</td>
      </tr>
      <tr>
          <td>Human review</td>
          <td style="text-align: right">Manual validation after uncertain extraction</td>
          <td>Often larger than token cost for business-critical tasks</td>
      </tr>
  </tbody>
</table>
<p>When people argue about browser MCP snapshot token cost, they often compare only one row in this table. Real production budgets need all of them.</p>
<h2 id="what-does-each-browser-automation-method-send-to-the-model">What does each browser automation method send to the model?</h2>
<p>There are four common ways to let an agent use the web. They expose different state, and they have different token behavior.</p>
<table>
  <thead>
      <tr>
          <th>Method</th>
          <th>What the model receives</th>
          <th>Best use</th>
          <th>Cost profile</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Search API</td>
          <td>Query results, snippets, URLs</td>
          <td>Finding candidate pages</td>
          <td>Lowest context, no browser state</td>
      </tr>
      <tr>
          <td>Fetch/HTTP extraction</td>
          <td>HTML, markdown, or text from one URL</td>
          <td>Static content and documents</td>
          <td>Low to medium, no JavaScript execution</td>
      </tr>
      <tr>
          <td>Accessibility snapshot</td>
          <td>Structured page tree with roles and labels</td>
          <td>Forms, dashboards, authenticated apps</td>
          <td>Medium to high, depends on page structure</td>
      </tr>
      <tr>
          <td>Screenshot/computer use</td>
          <td>Pixels plus action loop</td>
          <td>Visual layout, canvas, maps, non-semantic UI</td>
          <td>Can be high because every step needs a fresh observation</td>
      </tr>
  </tbody>
</table>
<p>Browserbase describes Search as a fast, token-efficient first step before moving to Fetch or full browser sessions. Its Fetch docs make the same point from the other direction: Fetch is lightweight, does not execute JavaScript, has a 5 MB content limit, and is a better fit when content is enough and cost/performance matter.</p>
<p>That ladder matches my own experience. If I need the latest pricing table from a public docs page, I do not start a logged-in browser. I search, fetch, parse, and only move to a real browser when JavaScript, auth, hover state, file upload, or visual layout becomes the core problem.</p>
<p>For teams already thinking about model economics, this is the same discipline I recommend for coding agents: do not hand the model a large object when a smaller, deterministic result will do. I made a similar point in my <a href="/posts/claude-sonnet-5-review-2026/">Claude Sonnet 5 pricing guide</a>: large context is powerful, but you still pay when you keep stuffing avoidable context into the loop.</p>
<h2 id="how-does-the-cost-math-look-for-a-real-browser-agent-task">How does the cost math look for a real browser-agent task?</h2>
<p>Take a realistic internal workflow: log in to an admin dashboard, search for a customer, open the billing tab, verify the latest invoice, and export a CSV. Assume the agent uses a browser MCP server with accessibility snapshots.</p>
<p>A conservative run might look like this:</p>
<table>
  <thead>
      <tr>
          <th>Step</th>
          <th style="text-align: right">Snapshot input</th>
          <th style="text-align: right">Output/tool-call tokens</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Open login page</td>
          <td style="text-align: right">8,000</td>
          <td style="text-align: right">500</td>
      </tr>
      <tr>
          <td>Submit credentials</td>
          <td style="text-align: right">6,000</td>
          <td style="text-align: right">400</td>
      </tr>
      <tr>
          <td>Load dashboard</td>
          <td style="text-align: right">22,000</td>
          <td style="text-align: right">900</td>
      </tr>
      <tr>
          <td>Search customer</td>
          <td style="text-align: right">16,000</td>
          <td style="text-align: right">700</td>
      </tr>
      <tr>
          <td>Open billing tab</td>
          <td style="text-align: right">20,000</td>
          <td style="text-align: right">900</td>
      </tr>
      <tr>
          <td>Export invoice CSV</td>
          <td style="text-align: right">14,000</td>
          <td style="text-align: right">600</td>
      </tr>
      <tr>
          <td>Final extracted answer</td>
          <td style="text-align: right">2,000</td>
          <td style="text-align: right">900</td>
      </tr>
  </tbody>
</table>
<p>That is 88,000 input tokens and 4,900 output tokens before retries. If the same run uses <code>gpt-5.4-mini</code> pricing from July 8, 2026, the token cost is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>input:  88,000 / 1,000,000 * $0.75 = $0.0660
</span></span><span style="display:flex;"><span>output:  4,900 / 1,000,000 * $4.50 = $0.0221
</span></span><span style="display:flex;"><span>total:                                   $0.0881
</span></span></code></pre></div><p>On <code>gpt-5.5</code>, the same token counts are more expensive:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>input:  88,000 / 1,000,000 * $5.00  = $0.4400
</span></span><span style="display:flex;"><span>output:  4,900 / 1,000,000 * $30.00 = $0.1470
</span></span><span style="display:flex;"><span>total:                                    $0.5870
</span></span></code></pre></div><p>Now add reliability. If 15% of runs hit an auth redirect, stale dashboard state, or missing export button and need two extra browser steps, your expected cost rises. If a failed run requires a human to check the dashboard manually, token math becomes the smaller problem.</p>
<p>This is the rough estimator I use in planning docs:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">browser_task_cost</span>(
</span></span><span style="display:flex;"><span>    input_tokens: int,
</span></span><span style="display:flex;"><span>    output_tokens: int,
</span></span><span style="display:flex;"><span>    input_price_per_million: float,
</span></span><span style="display:flex;"><span>    output_price_per_million: float,
</span></span><span style="display:flex;"><span>    browser_minutes: float,
</span></span><span style="display:flex;"><span>    browser_hour_price: float,
</span></span><span style="display:flex;"><span>    retry_rate: float,
</span></span><span style="display:flex;"><span>    retry_multiplier: float <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.35</span>,
</span></span><span style="display:flex;"><span>) <span style="color:#f92672">-&gt;</span> float:
</span></span><span style="display:flex;"><span>    token_cost <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>        input_tokens <span style="color:#f92672">/</span> <span style="color:#ae81ff">1_000_000</span> <span style="color:#f92672">*</span> input_price_per_million
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">+</span> output_tokens <span style="color:#f92672">/</span> <span style="color:#ae81ff">1_000_000</span> <span style="color:#f92672">*</span> output_price_per_million
</span></span><span style="display:flex;"><span>    )
</span></span><span style="display:flex;"><span>    browser_cost <span style="color:#f92672">=</span> max(browser_minutes, <span style="color:#ae81ff">1</span>) <span style="color:#f92672">/</span> <span style="color:#ae81ff">60</span> <span style="color:#f92672">*</span> browser_hour_price
</span></span><span style="display:flex;"><span>    expected_retry_cost <span style="color:#f92672">=</span> token_cost <span style="color:#f92672">*</span> retry_rate <span style="color:#f92672">*</span> retry_multiplier
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> token_cost <span style="color:#f92672">+</span> browser_cost <span style="color:#f92672">+</span> expected_retry_cost
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(browser_task_cost(
</span></span><span style="display:flex;"><span>    input_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">88_000</span>,
</span></span><span style="display:flex;"><span>    output_tokens<span style="color:#f92672">=</span><span style="color:#ae81ff">4_900</span>,
</span></span><span style="display:flex;"><span>    input_price_per_million<span style="color:#f92672">=</span><span style="color:#ae81ff">0.75</span>,
</span></span><span style="display:flex;"><span>    output_price_per_million<span style="color:#f92672">=</span><span style="color:#ae81ff">4.50</span>,
</span></span><span style="display:flex;"><span>    browser_minutes<span style="color:#f92672">=</span><span style="color:#ae81ff">3</span>,
</span></span><span style="display:flex;"><span>    browser_hour_price<span style="color:#f92672">=</span><span style="color:#ae81ff">0.12</span>,
</span></span><span style="display:flex;"><span>    retry_rate<span style="color:#f92672">=</span><span style="color:#ae81ff">0.15</span>,
</span></span><span style="display:flex;"><span>))
</span></span></code></pre></div><p>The exact numbers will change by vendor and model. The method matters more than the sample output: count the whole loop, include expected retries, and price per completed task.</p>
<h2 id="how-do-playwright-mcp-playwright-cli-browserbase-smooth-and-subroutines-compare">How do Playwright MCP, Playwright CLI, Browserbase, Smooth, and subroutines compare?</h2>
<p>The 2026 tool landscape is converging on one idea: full browser control is useful, but you should not pay for low-level navigation when the task can be expressed more directly.</p>
<table>
  <thead>
      <tr>
          <th>Tool or pattern</th>
          <th>What it optimizes for</th>
          <th>Cost trade-off</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Playwright MCP</td>
          <td>General browser control through MCP and accessibility snapshots</td>
          <td>Great interaction surface, but snapshots and tool schemas can be verbose</td>
      </tr>
      <tr>
          <td>Playwright CLI plus skills</td>
          <td>Terminal-native browser automation for coding agents</td>
          <td>Avoids loading large MCP schemas and full trees into model context</td>
      </tr>
      <tr>
          <td>Browserbase Browse CLI</td>
          <td>Hosted browser sessions, search, fetch, debug, cloud sessions</td>
          <td>Lets agents choose lighter search/fetch before real browser control</td>
      </tr>
      <tr>
          <td>Smooth CLI</td>
          <td>Higher-level browser tasks instead of raw click/type/scroll loops</td>
          <td>Can reduce action count, but shifts trust to its task abstraction</td>
      </tr>
      <tr>
          <td>Stagehand cached actions</td>
          <td>Repeated browser actions with cached <code>act()</code> calls</td>
          <td>Repeated cached calls can avoid LLM inference and token cost</td>
      </tr>
      <tr>
          <td>Recorded subroutines</td>
          <td>Deterministic replay after initial recording</td>
          <td>Cheapest hot path, but brittle when product UI changes</td>
      </tr>
  </tbody>
</table>
<p>The Microsoft Playwright CLI README makes a blunt point that I agree with: CLI plus skills can be more token-efficient than MCP because concise CLI invocations avoid large tool schemas and verbose accessibility trees in model context. That does not make MCP wrong. It means MCP is a better fit when the agent needs persistent introspection and flexible interaction, while CLI scripts are a better fit when the task is stable enough to run as a command.</p>
<p>Browserbase&rsquo;s Browse CLI and Stagehand point in the same direction. Start with search and fetch. Use a browser when you need interaction. Cache repeated actions. Record deterministic routines for the workflows that happen every day.</p>
<p>For teams building developer workflows, this connects directly to reusable agent behavior. I covered that from a different angle in <a href="/posts/openai-codex-skills-guide/">OpenAI Codex Skills Guide</a>: when a repeated procedure becomes a skill or script, the model stops rediscovering the same steps on every run.</p>
<h2 id="what-hidden-multipliers-make-snapshot-costs-worse">What hidden multipliers make snapshot costs worse?</h2>
<p>The hidden multipliers are not exotic. They are the normal mess of web apps.</p>
<p>Auth is the first one. A session expires, the agent gets bounced to SSO, and the next snapshot is no longer the dashboard. It is an identity provider page with different controls and different failure modes. If your agent tries to recover autonomously, it may burn several extra snapshots before returning to the original task.</p>
<p>Second, page structure changes. A dashboard that looked cheap in staging can become expensive in production because it has 80 customer rows, announcement banners, live support widgets, A/B test variants, and hidden accessibility labels. Tokenizers also differ. The Anthropic pricing note about newer tokenizers producing about 30% more tokens for the same text is a reminder that &ldquo;10 KB of snapshot text&rdquo; is not a stable billing unit across models.</p>
<p>Third, tool schemas can be larger than people expect. A broad MCP server with many tools may be convenient, but every exposed tool definition has context cost depending on how the client packages tools. Keep the browser server focused on the job. If the task only needs navigate, snapshot, click, type, and extract, do not expose a kitchen-sink tool surface.</p>
<p>Fourth, long chat history quietly turns a cheap task into an expensive one. If the model sees every prior snapshot, every failed action, and every verbose result block, step seven costs more than step one. Summarize or truncate aggressively.</p>
<p>I see the same issue in broader automation benchmarks: raw model capability matters, but orchestration overhead decides whether the workflow is affordable. That is why I recommend reading any <a href="/posts/ai-workflow-automation-benchmarks-2026/">AI workflow automation benchmark</a> through the lens of completed tasks, not isolated model calls.</p>
<h2 id="how-can-you-reduce-browser-mcp-token-usage-without-breaking-reliability">How can you reduce browser MCP token usage without breaking reliability?</h2>
<p>The cheapest strategy is not &ldquo;use the smallest model for everything.&rdquo; The cheapest strategy is to avoid unnecessary browser observations and only use expensive model calls where judgment is needed.</p>
<p>Start with this decision ladder:</p>
<ol>
<li>Use Search when you only need to find a page.</li>
<li>Use Fetch when static content is enough.</li>
<li>Use extraction APIs when the page has predictable structured data.</li>
<li>Use accessibility snapshots when the task needs interaction with semantic UI.</li>
<li>Use screenshots or computer use when visual state matters.</li>
<li>Promote repeated workflows into scripts, cached actions, or recorded subroutines.</li>
</ol>
<p>Then put guardrails in your agent config. I like explicit budgets because they make failures visible during development:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">browser_agent</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">observation_order</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">search</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">fetch</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">snapshot</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">screenshot</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">max_snapshots_per_task</span>: <span style="color:#ae81ff">8</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">max_snapshot_tokens</span>: <span style="color:#ae81ff">12000</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">summarize_after_steps</span>: <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">retry_budget</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">auth_recovery</span>: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">selector_failure</span>: <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">extraction_validation</span>: <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">escalation</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">require_human_review_after_failed_exports</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>The specific keys are not a vendor standard. They are the policy I want in the system: cap observations, summarize history, constrain retries, and escalate when the browser state no longer matches the task.</p>
<p>On the implementation side, four tactics usually pay off quickly:</p>
<table>
  <thead>
      <tr>
          <th>Tactic</th>
          <th>Why it works</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Scope snapshots by region</td>
          <td>The model sees the billing panel, not the entire application shell</td>
      </tr>
      <tr>
          <td>Strip repeated navigation</td>
          <td>Headers and sidebars rarely change after step one</td>
      </tr>
      <tr>
          <td>Cache stable actions</td>
          <td>Stagehand v3 caching can return repeated cached <code>act()</code> calls without LLM inference</td>
      </tr>
      <tr>
          <td>Validate with deterministic code</td>
          <td>Use Playwright assertions or DOM checks after the model chooses the path</td>
      </tr>
  </tbody>
</table>
<p>The last point is easy to skip. Do not ask the model to visually confirm every success state if a selector, URL, downloaded file, or API response can prove it deterministically.</p>
<h2 id="when-is-a-full-browser-worth-paying-for">When is a full browser worth paying for?</h2>
<p>A full browser is worth paying for when the browser is the product surface, not just a transport layer.</p>
<p>I would pay for browser MCP snapshots in these cases:</p>
<table>
  <thead>
      <tr>
          <th>Use case</th>
          <th>Why browser control is justified</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Authenticated SaaS dashboards</td>
          <td>Data only exists after login and client-side rendering</td>
      </tr>
      <tr>
          <td>Complex forms</td>
          <td>The agent needs labels, validation errors, and step state</td>
      </tr>
      <tr>
          <td>Admin workflows</td>
          <td>The UI is the supported interface and APIs may not exist</td>
      </tr>
      <tr>
          <td>QA reproduction</td>
          <td>The browser state is the bug, especially with modals or dynamic UI</td>
      </tr>
      <tr>
          <td>Visual or canvas workflows</td>
          <td>Accessibility trees do not capture enough state</td>
      </tr>
  </tbody>
</table>
<p>I would avoid full browser loops for public documentation, pricing pages, API references, static reports, RSS feeds, and anything that already has a stable JSON or HTML endpoint. Fetch it, parse it, and keep the model out of the page navigation business.</p>
<p>OpenBrowser claims benchmark token counts of 299,486 for Chrome DevTools MCP, 158,787 for Playwright MCP, and 50,195 for OpenBrowser MCP. Treat numbers like that as directional, not universal. Vendor benchmarks are useful for spotting the shape of the problem, but your page structure, tokenizer, model, and agent loop determine your actual bill.</p>
<h2 id="how-should-you-estimate-dollars-per-completed-automation">How should you estimate dollars per completed automation?</h2>
<p>Use a small measurement pass before committing to an architecture. Do not debate the cost from memory. Run five representative tasks and log the data.</p>
<p>Here is the minimum log record I want:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;task&#34;</span>: <span style="color:#e6db74">&#34;export_latest_invoice_csv&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;model&#34;</span>: <span style="color:#e6db74">&#34;gpt-5.4-mini&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;browser_method&#34;</span>: <span style="color:#e6db74">&#34;playwright_mcp_snapshot&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;steps&#34;</span>: <span style="color:#ae81ff">7</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;snapshot_input_tokens&#34;</span>: <span style="color:#ae81ff">88000</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;tool_schema_tokens&#34;</span>: <span style="color:#ae81ff">4500</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;output_tokens&#34;</span>: <span style="color:#ae81ff">4900</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;browser_minutes&#34;</span>: <span style="color:#ae81ff">3</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;retry_count&#34;</span>: <span style="color:#ae81ff">1</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;completed&#34;</span>: <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;human_review_required&#34;</span>: <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>After that, calculate:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>cost_per_completed_task =
</span></span><span style="display:flex;"><span>  total_spend_for_attempts / successful_completed_tasks
</span></span></code></pre></div><p>This metric handles the uncomfortable part of browser agents: failures count. If ten runs cost $4.00 in model and browser usage but only seven complete correctly, your cost is not $0.40 per task. It is $0.57 per completed task, before human review.</p>
<p>My practical checklist:</p>
<ol>
<li>Measure snapshot token counts on real production-like pages.</li>
<li>Include tool schemas and tool results in input token accounting.</li>
<li>Track output tokens separately because they are usually more expensive.</li>
<li>Record retries by reason: auth, selector, extraction, timeout, policy.</li>
<li>Compare browser MCP against Search plus Fetch for the same task.</li>
<li>Promote any workflow repeated more than 20 times per week into a script, cached action, or subroutine.</li>
<li>Review the model choice after measuring. Do not pick the flagship model by default.</li>
</ol>
<p>That last point is where many teams overspend. A frontier model may be right for ambiguous recovery and reasoning-heavy tasks. A smaller model or deterministic script may be right for repetitive clicks after the path is known.</p>
<h2 id="what-questions-come-up-most-often-faq">What questions come up most often? (FAQ)</h2>
<h3 id="what-is-browser-mcp-snapshot-token-cost">What is browser MCP snapshot token cost?</h3>
<p>Browser MCP snapshot token cost is the input and output token cost created when an LLM-controlled browser sends structured page state to the model. It includes accessibility snapshots, tool schemas, tool results, chat history, model output, and retries. The useful production metric is cost per completed task.</p>
<h3 id="is-playwright-mcp-more-expensive-than-screenshots">Is Playwright MCP more expensive than screenshots?</h3>
<p>Not always. Playwright MCP snapshots can be cheaper than screenshot loops when the page has good semantic structure and the model can act with fewer observations. Screenshots can be better when the important state is visual, such as canvas, layout, maps, or poorly labeled controls. Measure both on your actual workflow.</p>
<h3 id="how-many-tokens-does-an-accessibility-snapshot-use">How many tokens does an accessibility snapshot use?</h3>
<p>There is no universal number. A simple login page may be a few thousand tokens, while a dense dashboard with tables, sidebars, banners, and hidden labels can be tens of thousands. Tokenizer choice also matters, and some newer model families tokenize the same text differently.</p>
<h3 id="how-do-i-reduce-mcp-browser-automation-cost">How do I reduce MCP browser automation cost?</h3>
<p>Use Search and Fetch before opening a browser, scope snapshots to the relevant region, summarize chat history, limit retries, cache repeated actions, and turn stable workflows into scripts or recorded subroutines. The biggest savings usually come from avoiding unnecessary browser observations.</p>
<h3 id="should-i-use-browser-mcp-or-a-cli-script">Should I use browser MCP or a CLI script?</h3>
<p>Use browser MCP when the agent needs flexible inspection and interaction with changing UI. Use a CLI script when the workflow is stable, repetitive, and can be expressed deterministically. In practice, I prototype with MCP, then graduate high-volume workflows into Playwright CLI scripts, cached Stagehand actions, or recorded subroutines.</p>
]]></content:encoded></item></channel></rss>