Skip to main content
Glama

parallel-browser-mcp

Give an AI agent many isolated browsers at once. An MCP server that runs Playwright MCP's own browser tools in many separate sessions, in parallel, inside one Chrome.

CI Node 24 TypeScript strict MCP stdio server Tests: 90 unit, 24 end to end License: MIT

The result. The same 8 slow pages took 22.86 s one tab at a time and 6.38 s with 4 isolated sessions in parallel: 3.58x faster, with every value checked against the synthetic data. Measured on an Apple M1 laptop under load. A busier run gave 2.68x (both runs).

Terminal output of npm run demo: 8 pages on a local mock site, before with concurrency 1 the wall clock was 22.86 seconds, after with concurrency 4 it was 6.38 seconds, a speed-up of 3.58x, and all pages loaded with every value matching the synthetic catalogue.

From docs/demo-output.txt, the saved output of npm run demo. The per page table is cut for space where it says ....

Quickstart

Needs Node.js 24 and Google Chrome.

npm ci
npm test
npm run demo

npm test builds and runs the end to end smoke test. npm run demo prints the before and after report and saves it to docs/demo-output.txt.

Related MCP server: playwright-parallel-mcp

Use it in Claude Code

From the repo folder, after npm ci:

npm run build && claude mcp add parallel-browser -s user -- node "$(pwd)/dist/index.js"

Remove it with claude mcp remove parallel-browser -s user. Any MCP client that speaks stdio works the same way.

The problem

  • AI agents and scrapers usually drive one browser tab at a time. Every page waits for the page before it.

  • Running jobs side by side in one shared browser is risky. Cookies and logins from one job leak into the next. Two agents clicking in the same tab collide.

  • Giving every job its own browser process fixes that, but it eats memory fast on a normal laptop.

The result

The same 8 slow pages, read first one tab at a time, then 4 isolated sessions at a time:

Before

After

How

run_parallel with concurrency 1

run_parallel with concurrency 4

Wall clock

22.86 s

6.38 s

Pages ok

8 of 8

8 of 8

Values correct

8 of 8

8 of 8

3.58x faster, 72% less waiting. Every page in both runs was checked against the synthetic data.

  • Measured with npm run demo on a local mock site (127.0.0.1) where every page takes 1.5 s to answer. Synthetic data only.

  • Measured on an Apple M1 laptop with 8 GB RAM, with other work running (load average 8.9). Your numbers will differ.

  • Why not a full 4x: every task opens its own fresh session and page, and 4 pages loading at once share the CPU.

  • Speed depends on machine load. A later run at load average 24.6 gave 18.95 s before and 7.08 s after, 2.68x faster. Both reports are below.

  • Full report: docs/demo-output.txt.

The run in the table, saved as docs/demo-output.txt:

parallel-browser-mcp demo: the same 8 pages, one tab at a time, then 4 at a time
Run 2026-10-21 on darwin arm64, Apple M1, 8 cores, 8 GB RAM, Node v24.13.1, Chrome 155, load average 8.9 at start
Synthetic data: 8 catalogue pages on a local mock site (127.0.0.1). Each page takes 1500 ms to answer.
Each task opens its page, then reads the SKU and stock with browser_evaluate, in its own throwaway session.

Chrome start and first page, not counted in either run: 5.06 s

BEFORE: concurrency 1
  server says: run_parallel: 8 tasks, 8 ok, 0 failed. Took 22.8s (one by one would be about 22.8s), concurrency 1.
  wall clock 22.86 s, pages ok 8, failed 0, data correct 8 of 8

AFTER: concurrency 4
  server says: run_parallel: 8 tasks, 8 ok, 0 failed. Took 6.4s (one by one would be about 25.3s), concurrency 4.
  wall clock 6.38 s, pages ok 8, failed 0, data correct 8 of 8

Seconds per page (each task, from the server report)
  page  SKU        stock  before  after
  1     DEMO-001   7      2.7s    3.3s
  2     DEMO-002   14     2.9s    3.1s
  3     DEMO-003   21     2.4s    3.1s
  4     DEMO-004   5      2.4s    3.1s
  5     DEMO-005   12     4.4s    3.2s
  6     DEMO-006   19     2.7s    3.2s
  7     DEMO-007   3      2.7s    3.2s
  8     DEMO-008   10     2.6s    3.1s

RESULT
  8 pages: 22.86 s before, 6.38 s after
  speed-up 3.58x, 16.48 s saved (72% less waiting)
  Lower bound from the page delay alone: 12.00 s one at a time, 3.00 s with 4 at a time.
  All pages loaded and every value matched the synthetic catalogue.

The later run, at load average 24.6:

parallel-browser-mcp demo: the same 8 pages, one tab at a time, then 4 at a time
Run 2026-10-21 on darwin arm64, Apple M1, 8 cores, 8 GB RAM, Node v24.13.1, Chrome 155, load average 24.6 at start
Synthetic data: 8 catalogue pages on a local mock site (127.0.0.1). Each page takes 1500 ms to answer.
Each task opens its page, then reads the SKU and stock with browser_evaluate, in its own throwaway session.

Chrome start and first page, not counted in either run: 1.42 s

BEFORE: concurrency 1
  server says: run_parallel: 8 tasks, 8 ok, 0 failed. Took 18.9s (one by one would be about 18.9s), concurrency 1.
  wall clock 18.95 s, pages ok 8, failed 0, data correct 8 of 8

AFTER: concurrency 4
  server says: run_parallel: 8 tasks, 8 ok, 0 failed. Took 7.1s (one by one would be about 28.3s), concurrency 4.
  wall clock 7.08 s, pages ok 8, failed 0, data correct 8 of 8

Seconds per page (each task, from the server report)
  page  SKU        stock  before  after
  1     DEMO-001   7      2.5s    3.5s
  2     DEMO-002   14     2.3s    3.5s
  3     DEMO-003   21     2.3s    3.5s
  4     DEMO-004   5      2.3s    3.5s
  5     DEMO-005   12     2.3s    3.5s
  6     DEMO-006   19     2.3s    3.5s
  7     DEMO-007   3      2.4s    3.5s
  8     DEMO-008   10     2.5s    3.5s

RESULT
  8 pages: 18.95 s before, 7.08 s after
  speed-up 2.68x, 11.87 s saved (63% less waiting)
  Lower bound from the page delay alone: 12.00 s one at a time, 3.00 s with 4 at a time.
  All pages loaded and every value matched the synthetic catalogue.

How it works

flowchart LR
    client["MCP client<br/>Claude Code or another agent"]
    subgraph proc["parallel-browser-mcp (one Node process)"]
        tools["MCP server<br/>4 session tools + 25 browser_* tools<br/>every browser_* call takes a session id"]
        rp["run_parallel<br/>many tasks, bounded concurrency"]
        mgr["SessionManager<br/>session cap, profile lock, idle timeout"]
        subgraph s1["session crm"]
            q1["call queue"] --> p1["Playwright MCP tool code"]
        end
        subgraph s2["session worker-1"]
            q2["call queue"] --> p2["Playwright MCP tool code"]
        end
    end
    subgraph chrome["one shared headless Chrome"]
        c1["context: own cookies,<br/>storage and tabs"]
        c2["context: own cookies,<br/>storage and tabs"]
    end
    profile["profile session<br/>its own Chrome, login kept on disk"]
    client -->|stdio| tools
    tools --> rp
    tools --> mgr
    rp --> mgr
    mgr --> q1
    mgr --> q2
    mgr -.-> profile
    p1 --> c1
    p2 --> c2
  • One Chrome, many contexts. A session is a browser context inside one shared Chrome. It has its own cookies, storage and tabs, and it is far lighter than a browser process per job.

  • Playwright MCP's own code, per session. Each session runs its own in-process instance of Playwright MCP against its context. Same 25 browser_* tools, same snapshots and refs. An upgrade is a version bump.

  • A session id on every tool. Calls on different sessions run at the same time. Calls on one session queue in order.

  • run_parallel. One tool call runs many tasks at once, server side. Each task is a list of browser_* steps.

  • Log in once, fan out. A profile session keeps its login on disk. cloneFrom copies cookies and storage into new workers.

Tools

Tool

What it does

browser_* (25)

Playwright MCP tools, plus an optional session (default "default")

session_create

Open a session with options: headed, profile, cloneFrom, device, viewport, userAgent, locale, timezoneId, blockResources

session_list

Open sessions, their tabs, busy or idle

session_close

Close one session, or all: true

run_parallel

Many tasks at once, each a list of browser_* steps

Patterns

Parallel subagents. Give each agent its own session id (agent-1, agent-2). They never share a tab.

Read many pages in one call.

{
  "tasks": [
    { "steps": [
      { "tool": "browser_navigate", "args": { "url": "https://example.com/products/1" } },
      { "tool": "browser_evaluate", "args": { "function": "() => document.body.innerText.slice(0, 2000)" } }
    ] },
    { "steps": [
      { "tool": "browser_navigate", "args": { "url": "https://example.com/products/2" } },
      { "tool": "browser_evaluate", "args": { "function": "() => document.body.innerText.slice(0, 2000)" } }
    ] }
  ],
  "concurrency": 4
}
  • A task without a session gets a throwaway session that closes when the task ends.

  • Steps can click or type with CSS selectors ("target": "#submit"). No snapshot needed.

  • Output defaults to each task's last step. Use "output": "all" for every step.

Log in once, fan out.

  1. session_create with { "session": "crm", "profile": "crm", "headed": true }, then log in by hand in the window. The login is saved to disk.

  2. Workers: session_create with { "session": "w1", "cloneFrom": "crm" }. They start logged in.

Settings

Flags go after dist/index.js in the MCP config.

Flag

Default

--headed

off (headless)

--browser chrome|msedge|chromium

chrome (the installed Google Chrome)

--max-sessions <n>

8

--concurrency <n>

4

--idle-minutes <n>

30 (headless sessions only, 0 means never)

--caps <list>

none, for example vision,pdf

--data-dir <path>

~/.parallel-browser (profiles and output files)

How it fails safely

  • Session cap. At most --max-sessions sessions are open (default 8). One more gets a clear error that lists the open sessions and says how to free one. run_parallel checks for free slots before it starts and lowers its concurrency to fit.

  • One failure stays one failure. A failing step marks only its own run_parallel task FAILED, with the step and the error. The other tasks keep running and their results still come back. The whole call is an error only when every task failed.

  • Timeouts. Each task has a time limit (taskTimeoutSeconds, default 180). Each tool call inside a session has a 5 minute limit that resets on progress.

  • Cancellation. If the client cancels, tasks that have not started are skipped and reported as cancelled. The cancel signal is passed on to the running tool calls.

  • Same-session queue. Calls on one session run one at a time, in order, so two agents never act on the same tab at once. A failed call does not block the next one. Different sessions never wait for each other.

  • Throwaway sessions always close. A task without a session id gets a fresh session that closes when the task ends, also after an error or a timeout. It can never take over a session someone else is using.

  • Profile lock. A saved login profile can be open in one session at a time. The error names the session that holds it and suggests cloneFrom.

  • Idle timeout. Headless sessions that sit idle for 30 minutes (--idle-minutes) close and free their memory. Headed windows are left for the person using them.

  • Recovery. If a window is closed by hand, the next call opens a fresh context. If Chrome fails to start, the call returns a tool error and the next call tries again.

  • Output budget. By default each task's text is capped at 6,000 characters, and lower for big batches so a whole batch stays under 80,000. A note says how much was cut. One batch cannot flood the client.

  • Clean shutdown. When the client disconnects, or on SIGINT or SIGTERM, the server closes every session and browser, waiting at most 5 seconds before it exits. The smoke test checks that no Chrome process is left behind.

  • Local only. It speaks MCP over stdio and opens no network port.

  • No automatic retries. A failed or timed out task comes back with its error, and the caller decides whether to run it again. A blind retry of a click or a form submit could repeat the action.

Tests

CI runs the typecheck, the unit tests with coverage and the smoke test on every push and pull request. There is no linter in this repo.

Unit tests: npm run test:coverage

90 tests on node:test, with mocks and no browser:

  • run_parallel gets a mock session manager.

  • The server is driven by a real MCP client over an in-memory transport, with a mock session manager.

  • Sessions get a fake browser pool, and the pool gets a fake chromium.launch.

  • Two tests load the real Playwright MCP package, to list its tools and to check a browser that cannot start. Neither launches a browser.

ℹ tests 90
ℹ suites 24
ℹ pass 90
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 657.536042
ℹ start of coverage report
ℹ -----------------------------------------------------------------
ℹ file         | line % | branch % | funcs % | uncovered lines
ℹ -----------------------------------------------------------------
ℹ src          |        |          |         | 
ℹ  browsers.ts | 100.00 |   100.00 |  100.00 | 
ℹ  config.ts   | 100.00 |   100.00 |  100.00 | 
ℹ  parallel.ts |  89.44 |    98.72 |   94.12 | 1-2 4-9 11-18 20-22
ℹ  server.ts   | 100.00 |    95.74 |  100.00 | 
ℹ  sessions.ts |  99.30 |    97.30 |   91.11 | 136-137
ℹ -----------------------------------------------------------------
ℹ all files    |  97.46 |    97.97 |   94.79 | 
ℹ -----------------------------------------------------------------
ℹ end of coverage report
  • parallel.ts lines 1 to 22 are type declarations. They compile away, and source-mapped coverage counts them as uncovered.

  • sessions.ts lines 136 and 137 forget a failed Playwright MCP connection so the next call reconnects. No unit test makes that connection fail.

  • index.ts is the process entry point. Loading it starts the stdio server, so the unit tests do not load it. The smoke test runs it end to end.

▶ shared browser
  ✔ launches one browser per mode and reuses it for every context (1.345792ms)
  ✔ uses the bundled Chromium channel only when asked (0.151125ms)
  ✔ relaunches after the browser disconnects (0.148541ms)
  ✔ forgets a failed launch so the next call tries again (0.339875ms)
  ✔ closeShared closes one mode and closeAll closes the rest (0.212792ms)
  ✔ a browser that fails to close does not stop shutdown (0.111625ms)
✔ shared browser (2.970042ms)
▶ profiles
  ✔ a profile gets its own persistent browser in the profile folder (0.174709ms)
✔ profiles (0.225542ms)
▶ context options
  ✔ applies a device first, then explicit options on top (0.182917ms)
  ✔ fails fast on an unknown device, before any browser starts (0.167875ms)
  ✔ blockResources aborts the listed resource types and lets the rest through (0.227042ms)
  ✔ no blockResources means no request routing (0.066958ms)
✔ context options (0.732416ms)
▶ loadConfig
  ✔ uses safe defaults when no flags are given (2.26725ms)
  ✔ parses every flag (0.46775ms)
  ✔ caps concurrency at the session limit (0.117917ms)
  ✔ keeps sessions and concurrency at 1 or more (0.085833ms)
  ✔ treats an empty --caps list as no extra capabilities (0.086958ms)
  ✔ rejects an unknown browser with the allowed list (0.303792ms)
  ✔ rejects numbers that are not whole and positive (0.157166ms)
  ✔ rejects unknown flags instead of ignoring them (1.093208ms)
✔ loadConfig (5.558166ms)
▶ USAGE and VERSION
  ✔ USAGE documents every flag (0.118209ms)
  ✔ VERSION comes from package.json (7.247625ms)
✔ USAGE and VERSION (7.492125ms)
▶ step validation
  ✔ rejects a step that is not a browser tool before anything runs (2.387333ms)
  ✔ browser_close is not a step, closeAfter is the way to close (0.121625ms)
✔ step validation (3.264709ms)
▶ session slots
  ✔ refuses up front when no session slots are free (0.176625ms)
  ✔ still runs tasks on open named sessions when every slot is taken (6.213208ms)
  ✔ reports a session that cannot be created as that task's error (0.640667ms)
✔ session slots (7.148375ms)
▶ concurrency
  ✔ runs at most `concurrency` tasks at once (44.164833ms)
  ✔ caps concurrency at the free session slots (46.332125ms)
  ✔ caps concurrency at the number of tasks and falls back to the server default (5.979208ms)
✔ concurrency (96.82625ms)
▶ results and failures
  ✔ returns the last step by default and every step with output: all (7.040542ms)
  ✔ one failing task does not sink the batch (2.612125ms)
  ✔ stops a task at its first failing step unless stopOnError is false (3.586375ms)
  ✔ flags the whole result as an error only when every task failed (6.189625ms)
  ✔ errorMessage reads Error objects and anything else (0.264084ms)
✔ results and failures (20.35425ms)
▶ sessions inside a batch
  ✔ throwaway tasks get their own session and always close it (0.870875ms)
  ✔ named sessions stay open unless closeAfter is set (1.694167ms)
  ✔ reuses an open named session and says its create options were ignored (2.171834ms)
  ✔ passes create options to a new named session (0.728083ms)
  ✔ ignores a stray session arg inside a step (2.104292ms)
✔ sessions inside a batch (7.95275ms)
▶ output budget
  ✔ truncates long text to maxChars and says how much was dropped (0.433042ms)
  ✔ keeps images and only counts text against the budget (0.34725ms)
  ✔ shrinks the default budget for big batches (0.517958ms)
✔ output budget (1.448291ms)
▶ timeouts and cancellation
  ✔ times out a slow task and still closes its session (53.169833ms)
  ✔ a request cancelled before it starts opens no sessions (0.630708ms)
  ✔ cancelling mid-batch skips the tasks that have not started (0.464167ms)
✔ timeouts and cancellation (54.666959ms)
▶ tool list
  ✔ has the session tools plus every Playwright MCP tool, each with an optional session arg (4.594167ms)
  ✔ tells the client its limits (1.642958ms)
✔ tool list (26.241167ms)
▶ browser_* routing
  ✔ sends each call to its session, "default" when none is given (2.905917ms)
  ✔ rejects a session that is not a string (0.966125ms)
  ✔ answers an unknown tool with a clear error (0.7415ms)
  ✔ turns manager errors into tool errors (0.78025ms)
  ✔ browser_close closes the session it names (0.895209ms)
✔ browser_* routing (6.445417ms)
▶ session tools
  ✔ session_create validates ids, profile names and options before creating anything (2.838167ms)
  ✔ session_create starts the session and says how to use it (0.910666ms)
  ✔ session_create closes the session again when the browser fails to start (0.632459ms)
  ✔ session_list shows the count and every session (0.761083ms)
  ✔ session_close closes one or all, and explains a bad request (1.063875ms)
✔ session tools (6.327709ms)
▶ run_parallel
  ✔ validates the batch before running anything (2.402458ms)
  ✔ runs the steps in the named session (1.297209ms)
✔ run_parallel (3.7695ms)
▶ session ids
  ✔ accepts letters, digits, dot, dash and underscore up to 64 characters (0.762792ms)
  ✔ rejects anything else with a clear message (0.650708ms)
  ✔ rejects a duplicate id (0.0835ms)
✔ session ids (3.512875ms)
▶ session cap
  ✔ refuses one more session than --max-sessions and lists what is open (0.133375ms)
  ✔ frees the slot when a session closes (0.157375ms)
✔ session cap (0.352709ms)
▶ profiles and cloneFrom
  ✔ validates profile names (0.142417ms)
  ✔ locks a profile to one session at a time (0.1195ms)
  ✔ refuses profile and cloneFrom together (0.074708ms)
  ✔ refuses to clone a session that is not open (0.067083ms)
  ✔ copies cookies and storage from the source session (0.270334ms)
✔ profiles and cloneFrom (0.786042ms)
▶ session lifecycle
  ✔ creating a session does not start a browser (0.112875ms)
  ✔ headed overrides the server default, otherwise the default applies (0.072375ms)
  ✔ start opens the context once and describe shows its tabs (0.108917ms)
  ✔ describe shows how long a session has been idle (0.134375ms)
  ✔ getOrCreate reuses an open session (0.067666ms)
  ✔ the shared browser closes only when its last session closes (0.418125ms)
  ✔ closing a profile session leaves the shared browser alone (0.092666ms)
  ✔ close only closes the exact session it was given (0.06075ms)
  ✔ closeAll closes every session and the pool (0.088583ms)
  ✔ a closed session refuses new calls (0.11925ms)
✔ session lifecycle (1.400417ms)
▶ recovery
  ✔ a window closed from outside is replaced on the next use (0.105292ms)
  ✔ a context that fails to open is retried on the next use (0.081541ms)
  ✔ through the real Playwright MCP code, a browser that cannot start is a tool error and is retried (17.238542ms)
✔ recovery (17.498042ms)
▶ call queue
  ✔ calls on one session run one at a time, in order (67.317833ms)
  ✔ different sessions do not wait for each other (22.103833ms)
  ✔ a failed call does not block the next one (43.652292ms)
  ✔ a call still queued when its session closes is refused (22.226417ms)
  ✔ every call carries a 5 minute timeout and the caller's abort signal (1.691916ms)
✔ call queue (157.301292ms)
▶ idle timeout
  ✔ closes idle headless sessions and leaves headed windows open (1.234833ms)
  ✔ --idle-minutes 0 never starts the timer (0.365917ms)
✔ idle timeout (1.756125ms)
▶ Playwright MCP tools
  ✔ lists Playwright MCP's own tool definitions without launching a browser (6.945125ms)
✔ Playwright MCP tools (6.993708ms)

Smoke test: npm test

24 end to end checks. It starts the built server over stdio, the way Claude Code does, and drives real headless Chrome against a local test site on 127.0.0.1. The parallel check compares the wall clock with the server's sum of task times, so it holds on a slow or busy machine.

PASS  lists Playwright tools plus session tools  (29 tools)
PASS  browser_* tools take a session arg
PASS  first call launches Chrome and navigates  (3198ms)
PASS  run_parallel returns every task result
PASS  run_parallel runs tasks at the same time  (3772ms for 4 pages that each take 2000ms, 4.0 at once on average)
      run_parallel: 4 tasks, 4 ok, 0 failed. Took 3.8s (one by one would be about 15.0s), concurrency 4.
PASS  throwaway batch sessions close afterwards
PASS  direct calls on different sessions run at the same time  (2842ms for 2 x 2000ms)
PASS  same-session calls run one after another  (2099ms)
PASS  sessions do not share cookies
PASS  cloneFrom copies the login into a new worker
PASS  session cap gives a clear error
PASS  run_parallel refuses when no slots are free
PASS  session_list shows open sessions
PASS  browser_close and session_close free their slots
PASS  run_parallel steps can target CSS selectors
PASS  named batch sessions stay open
PASS  failures are reported per task
PASS  rejects steps that are not browser tools
PASS  rejects bad session ids
PASS  session_close all
PASS  a profile can only be open in one session
PASS  profile login survives close and reopen
PASS  Chrome runs as a child of the server  (1 child process(es))
PASS  closing the client shuts every browser down

ALL PASSED

Stack

  • TypeScript, strict mode, compiled with tsc (TypeScript 7).

  • Node.js 24, in CI and for every number in this README.

  • @playwright/mcp 0.0.83 for the browser tools, and playwright-core to drive Chrome.

  • @modelcontextprotocol/sdk 1.32.1 for the MCP server and the in-process clients.

  • zod 4 for input validation.

  • node:test for unit tests and coverage. No test framework dependency.

  • GitHub Actions on ubuntu-latest, which ships Google Chrome.

Credits

Built on Playwright MCP by Microsoft, licensed Apache-2.0. This project installs it from npm and runs its tool code once per session. It does not copy or change its source.

What I would do next

  • Opt-in retries per task with backoff, for flaky pages. Off by default, because a retried click can submit a form twice.

  • A memory-aware cap, so new sessions are refused when Chrome nears a memory limit, not at a fixed count.

  • Progress per task, with MCP progress notifications, so a long batch shows which pages are done.

  • A per-site rate limit in run_parallel, to stay polite to one domain.

  • More CI runners: the smoke test on macOS and Windows too.

License

MIT. See LICENSE.

Available Tools

29 tools
browser_clickC
Destructive

Perform click on a web page

NameRequiredDescriptionDefault
buttonNoButton to click, defaults to left
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
modifiersNoModifier keys to press
doubleClickNoWhether to perform a double click instead of a single click

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is partially covered. The description adds nothing beyond the action itself: it does not mention that the click may navigate, open dialogs, or submit data, nor the permission role of the 'element' parameter. Given a destructive, open-world tool, this is a thin description that leaves meaningful behavior undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single, front-loaded sentence with zero waste, but it is undersized relative to a six-parameter destructive tool. Conciseness is achieved at the cost of all useful detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description should explain the post-click result (e.g., a new page snapshot). It also omits the session model, the permission flow implied by 'element', and the fact that clicking is open-world and potentially destructive. For a six-parameter, open-world interaction tool, this leaves major gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters (button, target, element, session, modifiers, doubleClick) are documented in the schema with enums and defaults. The description adds no extra semantic context for any parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('click') and resource ('web page'), making the action unambiguous. However, it does not differentiate from siblings like browser_hover, browser_drag, or browser_type, and adds no scope detail (e.g., that the target must come from a snapshot).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no exclusions, and no named alternatives. It does not say that the target reference must be obtained from browser_snapshot first, nor when to prefer browser_type or browser_fill_form over clicking.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_closeB
Destructive

Close this session: its tabs, cookies and storage. Profile sessions keep their saved login on disk.

NameRequiredDescriptionDefault
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known from structured data. The description does add real value beyond that: it names the exact scope of destruction (tabs, cookies, storage) and carves out an exception that profile sessions retain saved logins on disk. It says nothing about what happens if the session id is unknown or already closed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the destruction scope is front-loaded and the profile-login caveat follows as a qualifier. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with no output schema, the description covers the important behavioral question (what is lost, what survives). The remaining gap is routing: nothing tells the agent how this relates to session_close, which is the most likely misuse path given the sibling list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'session' parameter is documented in the schema as an isolated browser with a 'default' fallback. The description adds no meaning about the parameter, which is the correct baseline when the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Close) plus resource (this session), with an enumeration of what is torn down: tabs, cookies, storage. It stops short of distinguishing itself from the near-identical sibling session_close, which an agent would reasonably confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to call this versus session_close, or versus simply leaving the session open. Usage is only implied by the verb 'Close'. The default-session behavior (no argument) is also not addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_console_messagesC
Read-only

Returns all console messages

NameRequiredDescriptionDefault
allNoReturn all console messages since the beginning of the session, not just since the last navigation. Defaults to false.
levelYesLevel of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info".info
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoFile name to save the console messages to. Relative file names are resolved against the workspace root. If not provided, messages are returned as text.

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds no behavioral context beyond that: it does not mention filtering by level, navigation-scoped versus session-wide retrieval, session isolation, or file-saving behavior, all of which materially affect invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded and free of waste. However, for a tool with four parameters and meaningful filtering/session/file behavior, it is under-specified rather than genuinely concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the tool has four parameters, one required enum, and session/file behavior. A one-line description covering none of that leaves an agent reliant entirely on the schema and annotations for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so every parameter is already fully documented in the schema, including defaults and enum semantics. The description adds no parameter meaning beyond the schema; if anything, 'all console messages' is slightly at odds with the required level filter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: it returns console messages. It does not name or distinguish itself from siblings such as browser_network_requests or browser_evaluate, but the core purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, no mention of prerequisites (such as needing an active browser session), and no exclusions. The agent must infer usage entirely from the tool name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_dragB
Destructive

Perform drag and drop between two elements

NameRequiredDescriptionDefault
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
endTargetYesExact target element reference from the page snapshot, or a unique element selector
endElementNoHuman-readable target element description used to obtain the permission to interact with the element
startTargetYesExact target element reference from the page snapshot, or a unique element selector
startElementNoHuman-readable source element description used to obtain the permission to interact with the element

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose that this is a non-read-only, destructive, open-world interaction, but the description adds no behavioral context such as permission requirements, reliance on snapshot references, or what happens when an element is not found. It essentially restates the action without enriching the annotation profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. It states the action and the scope immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema and annotations are rich enough to make the tool callable, but the description omits important context for a browser interaction tool: it does not mention that element targets come from a page snapshot, nor does it explain drag semantics or failure behavior. Given the complexity, it is adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are well documented in the schema itself. The description adds no parameter-specific meaning, which meets the baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Perform drag and drop between two elements.' It is clear what the tool does, but it does not distinguish itself from nearby interaction siblings such as browser_drop, browser_click, or browser_hover.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives like browser_drop or browser_click, nor any stated prerequisites. The usage is only implied by the action described.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_dropB
Destructive

Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of "paths" or "data" must be provided.

NameRequiredDescriptionDefault
dataNoData to drop, as a map of MIME type to string value (e.g. {"text/plain": "hello", "text/uri-list": "https://example.com"}).
pathsNoAbsolute paths to files to drop onto the element.
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the risk profile is covered. The description adds the external-drag simulation framing and the required-input constraint, but says nothing about what side effects a drop triggers (upload handlers, navigation, listeners) or the permission role of the 'element' parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler, with the core action first and the precondition second. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world interaction tool with a nested 'data' object and no output schema, the description is thin: it omits what a successful drop produces, what the 'element' parameter does for permissions, and whether dropped files must exist locally. Adequate to call, but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds a real constraint not encoded in the schema: the schema requires only 'target', while the description imposes that at least one of 'paths' or 'data' must be supplied. That is meaningful beyond what the structured fields say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (drop) and resources (files or MIME-typed data) plus the semantic framing 'as if dragged from outside the page,' which implicitly separates it from browser_drag (in-page drag) and browser_file_upload (file input). It never names those siblings explicitly, so the differentiation is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance given is a precondition ('at least one of "paths" or "data" must be provided'), which is a constraint rather than a when-to-use rule. Nothing tells the agent when to prefer this over browser_file_upload or browser_drag, and no exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_emulate_mediaA
Destructive

Emulate CSS media features for the page, for example switch between the light and dark color scheme. Omitted parameters are left unchanged; null clears an override.

NameRequiredDescriptionDefault
mediaNoChanges the CSS media type of the page
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
contrastNoEmulates the prefers-contrast media feature
colorSchemeNoEmulates the prefers-color-scheme media feature
forcedColorsNoEmulates the forced-colors media feature
reducedMotionNoEmulates the prefers-reduced-motion media feature

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the mutation profile is covered. The description adds useful state-management behavior (omitted = unchanged, null = clear), but doesn't explain persistence across navigation, whether a reload is needed, or how session isolation affects the emulation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences with zero waste: the first states what it does with an example, the second states the state semantics. Nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, no-output-schema tool, the description covers purpose, example, and reset/omission semantics adequately. The only gap is that it doesn't describe lasting effect or interaction with navigation/reload, which an agent might reasonably wonder about for an emulation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each enum parameter. The description nonetheless adds cross-parameter semantics absent from the schema: omitted values are preserved and null resets an override, which materially guides correct invocation across all six params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (emulate) and resource (CSS media features for the page), with a concrete example (light/dark color scheme). An agent can distinguish this from siblings like browser_resize or browser_evaluate without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies state semantics ('Omitted parameters are left unchanged; null clears an override') but gives no explicit when-to-use guidance or alternatives. It doesn't say when emulation is preferable to, say, resizing the viewport or reloading, leaving usage context implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateC
Destructive

Evaluate JavaScript expression on page or element

NameRequiredDescriptionDefault
targetNoExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoFile name to save the result to. Relative file names are resolved against the workspace root. If not provided, result is returned as text.
functionYes() => { /* code */ } or (element) => { /* code */ } when element is provided

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, so the safety profile is known, but the description adds nothing about what arbitrary JS execution actually implies: page-context mutation, whether the page can navigate or fire network calls, how async/promises are handled, or what the result looks like. For a deliberately destructive, open-world capability, one sentence of behavioral context is a real gap beyond what the annotations carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded and free of filler, but 'appropriately sized' cuts both ways: for a destructive code-execution tool, one clause is under-specified rather than efficient. It is concise without being informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With five parameters, no output schema, and destructive annotations, the description should at minimum say what evaluation returns (text via filename, or the value) and what context it runs in. None of that is covered, so an agent must infer the entire return and side-effect model from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so target, element, session, filename, and function are all documented, and the function field even shows the two accepted signatures with and without an element argument. The description's contribution is limited to the phrase 'or element', which only loosely ties the element-scoped form together, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Evaluate JavaScript expression') and adds the scope 'on page or element', so the core action is unambiguous. It does not distinguish itself from a close sibling like browser_run_code_unsafe, leaving the agent to infer the difference between page-context evaluation and running code in the automation context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to reach for this tool instead of browser_run_code_unsafe, browser_find, or browser_console_messages, and no stated preconditions (page must be loaded, element must come from a snapshot). The agent is given no exclusions or alternatives whatsoever.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_file_uploadC
Destructive

Upload one or multiple files

NameRequiredDescriptionDefault
pathsNoThe absolute paths to the files to upload. Can be single file or multiple files. If omitted, file chooser is cancelled.
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and openWorldHint=true, so the safety profile is carried by structured data; the description adds no context about what gets overwritten, whether the upload is one-way, or how the set of files interacts with the page. For a destructive, open-world tool the description contributes essentially nothing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, so it is concise, but it is under-specified to the point of being non-informative for a multi-file, session-scoped, destructive operation. Brevity here comes at the cost of content rather than from trimming waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and a destructive, open-world annotation set, the description should explain the file-chooser workflow and the sibling relationship to browser_drop. Neither is present, leaving the agent to infer the entire invocation context from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the 'paths' and 'session' semantics, including the cancel-on-omit behavior and session isolation, are fully documented in the schema. The description repeats none of this and adds no meaning of its own.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Upload ... files'), which is clearer than a bare name, but adds nothing to distinguish it from the sibling browser_drop, which also delivers files into the page. An agent must open both schemas to tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this versus browser_drop, nor any precondition such as a file chooser needing to be open or a dialog being triggered. The only usage-relevant fact (omitting paths cancels the chooser) lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fill_formC
Destructive

Fill multiple form fields

NameRequiredDescriptionDefault
fieldsYesFields to fill in
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the risk profile is covered structurally. The description adds nothing beyond that — no note on what happens to unfilled or existing values, whether submission occurs, or what verification the caller should do afterward.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste. It is arguably under-specified rather than wordy, but as a structure it is tight and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a destructive, open-world browser mutation with no output schema, and the description says nothing about ordering of fills, element targeting prerequisites from a page snapshot, or what happens on partial failure. For a destructive tool in a large browser toolset, that leaves real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including per-field guidance for target, type, value, and element, and the session parameter. Baseline 3 applies since the schema already carries all parameter meaning and the description adds none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fill ... form fields') and the word 'multiple' implicitly distinguishes it from the single-action browser_type. It does not name or contrast with any sibling explicitly, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this batch fill versus browser_type, browser_select_option, or browser_click. The agent must infer from the name alone that this is the multi-field path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_findA
Read-only

Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.

NameRequiredDescriptionDefault
textNoPlain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both.
regexNoRegular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. "/error/i" for case-insensitive. Provide either text or regex, not both.
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoSave results to a file instead of returning them in the response. Relative file names are resolved against the workspace root.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value beyond that by disclosing the return format (snippets with surrounding lines, each under its path from the root) and the cost trade-off versus a full snapshot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the action and return shape front-loaded and the cost rationale trailing. Every clause contributes — nothing restates the tool name or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain return values, and it does (matching nodes plus context lines under their paths). Minor gaps remain: no mention of match limits, truncation, or what an empty result looks like, which matter for an agent deciding whether a miss is real.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so text/regex/session/filename are fully documented in the schema. The description only alludes to the text-vs-regex choice and adds no syntax, default, or exclusivity detail beyond it; baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search the accessibility snapshot of the current page') and names both the input forms (text or regex) and the output shape (matching snapshot nodes with surrounding context under their tree paths). This clearly differentiates it from browser_snapshot by framing it as the cheaper locate-an-element path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete selection rule: use this instead of capturing the whole snapshot 'when you only need to locate an element and its ref.' The alternative is described functionally rather than by sibling name, and no explicit when-not case is given, but the routing signal is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_handle_dialogC
Destructive

Handle a dialog

NameRequiredDescriptionDefault
acceptYesWhether to accept the dialog.
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
promptTextNoThe text of the prompt in case of a prompt dialog.

TDQS

C2.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false, so the safety profile is covered structurally. The description adds nothing beyond that: it never says that accepting a dialog commits the action (possibly a destructive confirm), that declining dismisses it, or how prompt input is supplied. With no annotations-vs-text conflict, this is a gap rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three words are not concision but under-specification, matching the low-calibration pattern. There is nothing to front-load because there is essentially no content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating, open-world tool with a required boolean that determines whether a page action is committed or cancelled, the description leaves the essential decision logic unexplained. The session isolation and promptText behavior must be inferred entirely from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains accept, session, and promptText; the baseline of 3 applies. The description contributes no additional semantics, such as what happens if promptText is omitted for a prompt dialog.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Handle a dialog" is nearly a restatement of the tool name and title. It does identify the resource (a browser dialog) but gives no indication of what handling entails — accepting, dismissing, or supplying prompt text — so an agent cannot distinguish it from siblings like browser_click or browser_press_key without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when a dialog exists or when to call this tool. It does not mention that dialogs block other page actions, nor how to discover a pending dialog (e.g., via browser_snapshot or browser_wait_for), and it names no alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_hoverC
Destructive

Hover over element on page

NameRequiredDescriptionDefault
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and openWorldHint=true, yet the description never explains what that means for a hover — e.g., that hovering can open menus, trigger tooltips, or change page state. With annotations carrying the safety flags, the description should still add context about side effects, but it adds none.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five words, front-loaded with the action and object, with zero padding. It is efficient, though the minimalism borders on under-specification rather than tight writing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and its parameters are fully documented in the schema, so an agent can mechanically invoke it. Still missing are any note about side effects of hovering and how the target reference should be sourced, which matters for a tool flagged as destructive and open-world.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 'target', 'element', and 'session' parameters are already fully documented in the schema. The description adds nothing beyond that, which is the baseline case when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (hover) and resource (element on page), so the basic action is unambiguous. However, it does nothing to distinguish this from closely related siblings like browser_click, browser_drag, or browser_find, all of which also target elements from a page snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use hover versus click, drag, or find, and no mention of prerequisites such as needing a fresh snapshot to obtain a target reference. The agent must infer everything about selection context from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateC
Destructive

Navigate to a URL

NameRequiredDescriptionDefault
urlYesThe URL to navigate to
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare openWorldHint=true, destructiveHint=true, and readOnlyHint=false, so the risky, outward-facing nature is covered structurally. The description adds nothing — it doesn't say whether navigating replaces current page state, whether it blocks until load completes, or that it may discard unsaved form content.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three words, front-loaded and waste-free, but the brevity comes at the cost of under-specification rather than disciplined editing. It is not verbose; it is simply thin.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The one required parameter is well documented in the schema and the safety profile is in annotations, so an agent can technically call it. However, for a destructive, open-world navigation tool with 29 siblings and no output schema, the description omits what actually happens on invocation (load waiting, state replacement, error behavior).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both url and session fully documented inline (including session isolation semantics). The description contributes no additional parameter meaning, which is acceptable at baseline 3 given the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description "Navigate to a URL" is a verbatim restatement of the tool's title and a near-restatement of its name (browser_navigate). It conveys the verb+resource but adds nothing an agent couldn't infer from the identifier, and it does not distinguish this from browser_navigate_back or browser_tabs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus alternatives such as browser_navigate_back, browser_tabs, or opening a session first. Usage is only implied by the name itself; no preconditions or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigate_backC
Destructive

Go back to the previous page in the history

NameRequiredDescriptionDefault
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the description's job is lighter, but it adds nothing beyond the mechanical action. It does not say what happens if there is no prior history (error vs no-op), whether the action is reversible, or that the session is isolated — all relevant for a destructive navigation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is arguably too terse for the tool's risk profile, but that is a completeness issue rather than verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter navigation tool with annotations covering the safety profile, the description is barely sufficient. The notable gap is the no-history edge case, which an agent calling this needs to anticipate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 'session' parameter is fully documented there, including default and isolation semantics. The description adds no parameter information, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('go back to the previous page') with the scope 'in the history', which cleanly separates it from the sibling browser_navigate (forward navigation). It stops short of explicitly naming that sibling, so the differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus browser_navigate or browser_tabs, and no mention of prerequisites such as needing an existing history entry. The agent must infer usage entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestA
Read-only

Returns full details (headers and body) of a single network request, or a single part if part is set. Use the number from browser_network_requests.

NameRequiredDescriptionDefault
partNoReturn only this part of the request. Omit to return full details.
indexYes1-based index of the request, as printed by browser_network_requests.
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoFile name to save the result to. Relative file names are resolved against the workspace root. If not provided, output is returned as text.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered and the bar is lower. The description adds only the coarse shape of the return (headers and body vs. a single part); it says nothing about potentially large or binary bodies, or that output format changes when `filename` is used, which are the traits an agent actually needs here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the primary behavior stated first and the sibling reference second. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden, and it does state that headers and body come back. It is not fully complete: the exact serialization (text vs. saved file via `filename`) and behavior for large/binary payloads remain unstated, though these are minor for a read-only fetch-by-index tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3. The description nevertheless adds real semantics beyond the schema by explaining the `part` parameter's effect on the return shape ('or a single part if `part` is set') and by tying `index` to the sibling tool's printed numbering.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns full details (headers and body) of a single network request') plus the conditional variant when `part` is set. It explicitly separates itself from the sibling lister browser_network_requests, so an agent can tell list-vs-detail without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence routes the agent to the correct prerequisite tool ('Use the number from browser_network_requests'), establishing the intended workflow. It stops short of stating exclusions (e.g., don't use for listing, or what to do when the index is out of range), so it is clear context rather than full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestsA
Read-only

Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.

NameRequiredDescriptionDefault
filterNoOnly return requests whose URL matches this regexp (e.g. "/api/.*user").
staticYesWhether to include successful static resources like images, fonts, scripts, etc. Defaults to false.
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoFile name to save the network requests to. Relative file names are resolved against the workspace root. If not provided, requests are returned as text.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful context the annotations don't: the results are numbered/indexed and scoped to the current page load, which tells the agent how to chain into the detail tool. It omits the filename-save behavior, but the schema documents that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the primary behavior front-loaded and the chaining guidance second. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only inspection tool with full annotations and complete schema coverage, the description supplies what's missing: the output is a numbered list and how to expand entries. Slightly short on whether results persist across navigations or how large the list can get, but nothing needed for correct invocation is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all four parameters (filter regexp, static toggle, session, filename) are already documented in the schema. The description only adds the numbering concept that connects to the sibling tool, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Returns a numbered list of network requests') with explicit temporal scope ('since loading the page'). It also names the sibling browser_network_request and its role, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use this tool to get the numbered list, then call browser_network_request with that number for full details. Clear context, though it doesn't mention when the filter/static options select this over other diagnostics like browser_console_messages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_press_keyC
Destructive

Press a key on the keyboard

NameRequiredDescriptionDefault
keyYesName of the key to press or a character to generate, such as `ArrowLeft` or `a`
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the safety profile is known. The description adds nothing beyond that — it doesn't warn that a key press can submit forms, trigger navigation, or fire dialogs, which is exactly the extra context this destructive tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single front-loaded sentence with no waste, but its brevity reflects under-specification rather than disciplined concision — there is room for a short clause on modifiers or focus prerequisites.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world browser action with no output schema, the definition is too thin: it says nothing about what state the page must be in, what side effects may follow, or how it relates to the other ~28 browser tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (key, session) are documented in the schema, including the example formats `ArrowLeft` and `a`. The description contributes no additional meaning, but baseline 3 applies when the schema carries the burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Press a key on the keyboard'), but it is essentially a restatement of the tool name and adds no distinguishing scope. With siblings like browser_type, browser_fill_form, and browser_click, an agent cannot tell from this sentence what makes key-press distinct (e.g., support for modifier chords or special keys).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives such as browser_type for entering text, and no note about requiring a prior focus/snapshot action. The agent must infer everything about sequencing from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_resizeC
Destructive

Resize the browser window

NameRequiredDescriptionDefault
widthYesWidth of the browser window
heightYesHeight of the browser window
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, but the description adds nothing about what 'destructive' means here (changing viewport state, possible reflow), whether the window must exist, or what the resulting size units are. It simply repeats the annotation title.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero waste and no burying of key information, though its brevity reflects under-specification rather than disciplined editing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With three parameters, a session-isolation model, and destructive/openWorld annotations but no output schema, the description should mention units, required preconditions (open session), and the visible effect of the resize. None of that is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including width, height and the session parameter, so the schema carries the semantics and baseline 3 applies. The description adds no units (pixels vs CSS px), no min/max bounds, and no explanation of how width/height interact with the session parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource ('Resize the browser window'), so an agent knows the general action, but it is essentially a restatement of the name and title with no differentiation from siblings such as browser_emulate_media or browser_take_screenshot (where viewport size matters).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus alternatives, no mention that a browser/session must already be open, and no indication of whether resizing affects screenshots or snapshots. The agent must infer all usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_run_code_unsafeA
Destructive

Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.

NameRequiredDescriptionDefault
codeNoA JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example: `async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }`
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoLoad code from the specified file. Relative file names are resolved against the workspace root. If both code and filename are provided, code will be ignored.

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is partly covered; the description adds genuinely new context by explaining WHY — arbitrary JS runs in the server process and is RCE-equivalent. It stops short of stating consequences (workspace filesystem access, credential exposure) or that the snippet's return value is passed back.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, with the risk warning placed immediately after the purpose so it cannot be missed before the agent crafts a snippet.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The danger is well communicated and parameters are self-documenting, but with no output schema the description never states that the returned value of the async function is surfaced to the caller, nor whether side effects persist across sessions. Adequate but with a visible gap for a high-risk tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters (code, session, filename) are fully documented in the schema, including the precedence rule when both code and filename are supplied. The description adds nothing beyond that, which matches the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Run a Playwright code snippet') with an explicit safety qualifier naming the execution context (Playwright server process). It is distinguishable from page-scoped siblings like browser_evaluate, though it never names that sibling to make the contrast airtight.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance and no explicit alternatives — the description never says to prefer browser_evaluate or session-scoped tools for normal interaction. The 'Unsafe' label hints at last-resort use but leaves the routing decision entirely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_select_optionC
Destructive

Select an option in a dropdown

NameRequiredDescriptionDefault
targetYesExact target element reference from the page snapshot, or a unique element selector
valuesYesArray of values to select in the dropdown. This can be a single value or multiple values.
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the safety profile is covered. The description adds no behavioral context beyond the annotation data, such as whether selection triggers change events, how multi-select behaves, or what happens when values do not match options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler. It is efficiently structured, though the brevity borders on under-specification rather than optimal concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has four parameters, full schema descriptions, and annotations covering safety and openness. The description is minimally adequate but omits useful context about permission requirements for the 'element' parameter and the practical distinction from other form-interaction tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented directly in the schema. The description mentions 'dropdown' and 'option' but adds no syntax, format, or matching semantics beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Select') and resource ('an option in a dropdown'), so the basic action is clear. It does not distinguish this from siblings like browser_fill_form, browser_type, or browser_click, which also interact with form elements.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides no guidance on when to use this tool versus alternatives such as browser_fill_form, browser_type, or browser_click. The agent must infer that this is for select/dropdown elements from the word 'dropdown' alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_snapshotB
Read-only

Capture accessibility snapshot of the current page, this is better than screenshot

NameRequiredDescriptionDefault
boxesNoInclude each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect)
depthNoLimit the depth of the snapshot tree
targetNoExact target element reference from the page snapshot, or a unique element selector
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoSave snapshot to a file instead of returning it in the response. Relative file names are resolved against the workspace root.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, destructiveHint=false, so the safety profile is covered. The description contributes the relative-value claim versus screenshots, but says nothing about snapshot size, verbosity, truncation, or what the returned tree looks like — relevant for a tool with no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with no wasted words; the purpose leads and the comparative claim follows. The run-on comma splice makes it slightly less polished but not less usable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only browser tool with five optional parameters and no output schema, the agent is left guessing about the return format (text accessibility tree) and whether output can be large enough to warrant the filename option. Adequate but thin given the parameter surface.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (boxes, depth, target, session, filename) is already documented in the schema. The description adds no additional semantics, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Capture accessibility snapshot of the current page'. It also positions the tool relative to a sibling capability ('better than screenshot'), though it does not name the actual sibling tool (browser_take_screenshot) or browser_find.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The clause 'this is better than screenshot' implies a preference over browser_take_screenshot but gives no condition under which the alternative is still correct, and no guidance on when to prefer browser_find or browser_evaluate for extracting page data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_tabsC
Destructive

List, create, close, or select a browser tab.

NameRequiredDescriptionDefault
urlNoURL to navigate to in the new tab, used for new.
indexNoTab index, used for close/select. If omitted for close, current tab is closed.
actionYesOperation to perform
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered upstream. The description adds nothing beyond repeating the action list: it does not say that 'close' discards tab state, that 'list' is a harmless read within an otherwise destructive tool, or that the four modes have very different risk profiles.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the verb enumeration comes first. It is efficient, though the terseness is part of why usage context is thin rather than a fault of structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a multi-mode tool bundling a safe read ('list') with destructive operations ('close'), with no output schema and no annotations explaining per-mode differences. Given the crowded sibling set (browser_navigate, browser_close, session_create), the one-line description leaves the agent without enough context to route between tools confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and every parameter (url, index, action, session) has a documented meaning including conditional use ('used for close/select', default session semantics). The description adds no parameter meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (browser tab) and enumerates the four supported verbs (list, create, close, select), so the agent knows exactly what capability it exposes. It does not differentiate from close siblings such as browser_navigate or browser_close, which a reader might reasonably confuse with 'new' and 'close' here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to pick this tool over browser_navigate for opening a URL or browser_close for shutting down, nor any stated preconditions such as requiring an existing page. The agent is left to infer that 'new' supersedes navigation behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_take_screenshotA
Read-only

Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.

NameRequiredDescriptionDefault
typeNoImage format for the screenshot. If unset, inferred from the filename extension, otherwise png.
scaleYesImage resolution scale. "css" produces a screenshot sized in CSS pixels (smaller, consistent across devices). "device" produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css.css
targetNoExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
filenameNoFile name to save the screenshot to. Relative file names are resolved against the workspace root. If not specified, the screenshot is saved into the output directory as `page-{timestamp}.{png|jpeg|webp}`.
fullPageNoWhen true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a safe read-only, open-world operation. The description adds important context beyond annotations: the screenshot is visual output and cannot be acted upon, so agents must not confuse it with DOM/interaction data from browser_snapshot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with the main purpose front-loaded and no wasted wording. The limitation and alternative are stated immediately after the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a screenshot tool with rich schema coverage and safety annotations, the description gives enough guidance to select and invoke it correctly. The main minor gap is that it does not describe the return value or where the screenshot is saved, though the filename parameter hints at this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all seven parameters, including format, scale, target, filename, and fullPage. The description adds no parameter-specific semantics, which is acceptable when the schema is this complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: taking a screenshot of the current page. It also distinguishes the tool from its sibling browser_snapshot by explaining that screenshots cannot be used to perform actions, so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear usage boundary: use browser_snapshot when you need to perform actions, and use this tool only to capture a screenshot. It does not explicitly state when to prefer full-page or element screenshots, but the core alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeC
Destructive

Type text into editable element

NameRequiredDescriptionDefault
textYesText to type into the element
slowlyNoWhether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once.
submitNoWhether to submit entered text (press Enter after)
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is covered. The description adds only 'editable element' as a constraint and never says whether existing text is replaced or appended, nor what happens on failure or with submit=true — a real gap for a destructive write tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with no filler and the core action front-loaded. Its brevity is efficient, though it edges toward under-specification rather than genuine conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, destructive, open-world mutation tool with no output schema, the description should explain replacement semantics, session targeting implications, and interaction with submit. None of that is present, so an agent can call it but cannot predict its effects confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including the nuanced 'slowly' and 'submit' flags is documented in the schema itself. The description contributes nothing additional, which matches the baseline 3 when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Type') and resource ('text into editable element'), which is clearer than the bare name alone. It does not, however, distinguish itself from sibling tools like browser_fill_form or browser_press_key, leaving the agent to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus browser_fill_form, browser_press_key, or browser_select_option, and no prerequisites (e.g. needing a snapshot-derived target) are stated. The agent must infer usage entirely from the name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_wait_forB
Read-only

Wait for text to appear or disappear or a specified time to pass

NameRequiredDescriptionDefault
textNoThe text to wait for
timeNoThe time to wait in seconds, at most 30
sessionNoSession id (default "default"). Each session is an isolated browser (own cookies, tabs) that runs in parallel with the others. Created on first use.
textGoneNoThe text to wait for to disappear

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the behavioral modes of waiting for text or time, but does not explain timeout behavior or what happens when the condition is not met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with no wasted words. The core action and wait conditions are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterized browser wait tool with full schema coverage and annotations, the description is largely complete for selection and invocation. The main omission is timeout or failure behavior, but the schema covers individual parameters and annotations cover safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameter meanings are already documented in the schema. The description echoes the wait conditions covered by text, textGone, and time but adds no additional syntax or constraint details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb "Wait" and names the three wait conditions: text appearance, text disappearance, or elapsed time. It is clear what the tool does, though it does not explicitly contrast itself with sibling browser tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the wait modes but gives no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. An agent must infer usage context from the tool name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_parallelRun browser tasks in parallelA
Destructive

Run many browser tasks at the same time in ONE call. Each task is a list of browser_* steps run in order in its own session; tasks run concurrently server-side. Use it to visit or scrape many pages at once, or to repeat a flow across sessions. Steps cannot use snapshot refs they have not seen, so target elements with CSS selectors (target accepts a selector) or use browser_evaluate / browser_run_code_unsafe. Keep output small: end tasks with browser_evaluate returning only the data you need.

NameRequiredDescriptionDefault
tasksYes
outputNo"last" (default) returns each task's final step plus any errors. "all" returns every step.
maxCharsNoText cap per task. Default 6000, lower for big batches.
concurrencyNoHow many tasks run at once. Default from server settings, capped by free session slots.
stopOnErrorNoStop a task at its first failing step. Default true.
taskTimeoutSecondsNoTime limit per task. Default 180.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/openWorld/non-idempotent, so the description adds real context beyond them: tasks run concurrently server-side, each in an isolated session, and per-task output should be kept small. The key cross-step constraint (a task cannot use snapshot refs it hasn't seen) is a genuinely non-obvious behavioral trait. It does not discuss aggregate failure behavior across tasks, which would have made this a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the purpose and the concurrency model, then the targeting constraint, then the output-size tip. No filler and every sentence carries actionable content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a nested, high-complexity batch tool with no output schema, the description covers the mental model (independent sessions, concurrent execution), the main pitfall (snapshot refs), and output trimming. Remaining gaps such as result shape per task and cross-task error aggregation are either covered by the schema's `output`/`stopOnError` descriptions or minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the baseline is 3, but the description adds construction guidance for the required `tasks` parameter: steps run in order, each step targets a tool by name, and element targeting must use selectors rather than unseen refs. That is meaning beyond the schema's field-level text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run many browser tasks at the same time in ONE call') and immediately clarifies granularity: each task is an ordered list of browser_* steps in its own session. This clearly distinguishes it from the single-action browser_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete use cases ('visit or scrape many pages at once', 'repeat a flow across sessions') and points to workarounds (CSS selectors, browser_evaluate, browser_run_code_unsafe) when snapshot refs are unavailable. It does not explicitly say when not to use it, e.g. for a single task where individual browser_* tools suffice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

session_closeClose browser sessionsA
DestructiveIdempotent

Close one session, or all, and free their memory. Profile sessions keep their saved logins on disk.

NameRequiredDescriptionDefault
allNoClose every session.
sessionNoSession to close.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: memory is freed, and profile sessions persist saved logins to disk — telling the agent that closing is not uniformly lossy.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler, and the scope statement precedes the caveat about persistence. Every clause carries information an agent actually needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering destructiveness and idempotency, full schema coverage, and no output schema, the definition is nearly self-sufficient; the persistence note fills the main remaining behavioral gap. Minor omission: no returned identifier or error behavior when a named session does not exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema, including the session name pattern. The description only echoes the one-vs-all distinction without adding format, precedence, or conflict behavior (e.g., what happens if both are supplied), so it lands at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: closes sessions and frees their memory, with the one-vs-all scope stated up front. It does not distinguish itself from the sibling browser_close, which an agent could easily confuse with closing a whole session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'one session, or all' implies the choice between the `session` and `all` parameters, which is adequate minimum-viable guidance. There is no explicit statement of when to prefer this over browser_close, session_list, or session_create, nor any exclusion or prerequisite.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

session_createCreate browser sessionA

Open a new isolated browser session (own cookies, storage and tabs) with options. Optional: any browser_* call with a new session id creates a default session automatically. Use it for a visible window (headed), a saved login (profile), device emulation, faster scraping (blockResources), or a logged-in worker copied from another session (cloneFrom).

NameRequiredDescriptionDefault
deviceNoPlaywright device to emulate, for example "iPhone 15" or "Pixel 7".
headedNoShow a visible browser window, for watching or logging in by hand. Default is the server setting (headless).
localeNoFor example "en-ZA".
profileNoPersistent profile name. Cookies and logins are saved to disk and survive restarts. One session per profile at a time.
sessionYesNew session id, for example "crm" or "worker-1".
viewportNo
cloneFromNoCopy cookies and local storage from this open session, so a new worker starts logged in.
userAgentNo
timezoneIdNoFor example "Africa/Johannesburg".
blockResourcesNoSkip loading these resource types to speed up scraping, for example ["image", "media", "font"].

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: each session has isolated cookies/storage/tabs, and a session materializes implicitly on first browser_* call with an unknown id. It does not say what happens when the requested session id already exists or how many concurrent sessions are allowed, which matters given idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action before the caveat and the use-case list. The parenthetical isolation detail and per-option phrases all earn their place; only the use-case sentence is slightly dense with five items packed together.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter creator with no output schema, the description covers purpose, isolation semantics, the implicit-creation behavior, and the intent of the distinguishing options, while the rich schema handles formats and bounds and the annotations handle safety. Nothing an agent needs in order to call it correctly is clearly missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so a baseline of 3 is already earned by the schema. The description goes past it by giving the intent behind the notable options — headed for watching/logging in by hand, profile for logins that survive restarts, cloneFrom for starting a worker already logged in — though viewport, userAgent and timezoneId are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Open a new isolated browser session' — and immediately defines what isolation means (own cookies, storage and tabs). Against siblings like session_list and session_close, an agent can tell this is the creator without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Enumerates concrete selection reasons (headed window, saved profile, device emulation, blockResources, cloneFrom) and adds an important 'when not needed' note that any browser_* call with a new session id auto-creates a default session. It stops short of naming the complementary siblings (session_close, session_list) or stating cleanup expectations, so it is clear context rather than full routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

session_listList browser sessionsA
Read-only

List open sessions with their mode, tabs and whether they are busy.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and scope are covered. The description adds useful return context by naming mode, tabs, and busy status, though it omits ordering or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single efficient sentence with the main purpose and returned fields front-loaded. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool, the description plus annotations provide enough context to call it correctly. Although there is no output schema, the description names the key returned attributes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to explain; baseline 4 applies. Schema description coverage is 100%, leaving nothing ambiguous for the agent to supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb/resource (List open sessions) and states the returned attributes (mode, tabs, busy). It is clear what the tool does, though it does not explicitly differentiate itself from session_create or session_close.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, nor any exclusions or prerequisites. The usage is only implied by the name and one-line description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 29 tool updatesv1.0.0
    • First observedbrowser_click
    • First observedbrowser_close
    • First observedbrowser_console_messages
    • First observedbrowser_drag
    • First observedbrowser_drop
    • First observedbrowser_emulate_media
    • First observedbrowser_evaluate
    • First observedbrowser_file_upload
    • First observedbrowser_fill_form
    • First observedbrowser_find
    • First observedbrowser_handle_dialog
    • First observedbrowser_hover
    • First observedbrowser_navigate
    • First observedbrowser_navigate_back
    • First observedbrowser_network_request
    • First observedbrowser_network_requests
    • First observedbrowser_press_key
    • First observedbrowser_resize
    • First observedbrowser_run_code_unsafe
    • First observedbrowser_select_option
    • First observedbrowser_snapshot
    • First observedbrowser_tabs
    • First observedbrowser_take_screenshot
    • First observedbrowser_type
    • First observedbrowser_wait_for
    • First observedrun_parallel
    • First observedsession_close
    • First observedsession_create
    • First observedsession_list

TDQS

B3.2/5.0

Scored across 29 tools

Disambiguation4/5

Most tools map to distinct browser actions (click, type, hover, drag, navigate, snapshot, etc.), so an agent can usually choose correctly. However, session_close and browser_close both appear to close the current session, and browser_evaluate vs browser_run_code_unsafe overlap in executing JavaScript.

Naming Consistency4/5

Names are consistently snake_case and grouped with predictable browser_ and session_ prefixes. Minor deviations include run_parallel without a prefix and a mix of verb-based (browser_click) and noun-based (browser_snapshot, browser_tabs) names.

Tool Count3/5

29 tools is heavy for a single MCP server, even for full browser automation. Most actions are justified, but the redundant close-session tools and niche operations like browser_drop and browser_emulate_media make the surface feel larger than necessary.

Completeness4/5

The surface covers a broad browser-automation lifecycle: sessions, navigation, interaction, forms, dialogs, screenshots, snapshots, network inspection, and parallel execution. Minor gaps include no forward-navigation or explicit reload tool, though these can be worked around via browser_navigate or browser_evaluate.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers