Skip to main content
Glama

Chrome Bridge

By frsorrentino · npm chrome-bridge-mcp · not affiliated with other projects named "chrome-bridge".

License: MIT Node 18+ Chrome 135+ Tests Chrome Web Store

Claude Code borrows a tab from the Chrome you are already using — signed in, with your extensions and your cookies — works in it, and hands it back. What only a person can do (a login, a 2FA code, a CAPTCHA, a choice) comes back to you through handoff: a banner in the page, you act, the agent continues.

Measured against the official browser extension (paired runs, 29/09/2026, n=5 per task, same model): filling a form, 4.7× fewer turns and 2.8× lower cost; finding one row in a 1,500-row table, 2.3× fewer turns and 3.4× lower cost; debugging a broken page, 9.3× fewer turns and 4.3× lower cost. 15 correct answers out of 15, against 12 (bench/RESULTS.md). ~3× the toolset and no paid plan. 60 web-development tools (navigation, DOM inspection, visual regression, audits, network mocking) over a local WebSocket bridge, plus a headless instance for CI. Self-hosted, local-only. Works on ChromeOS.

The same form filled in 3 turns instead of 14 — 4.7× fewer turns on the form, 2.8-4.3× lower cost on form, 1,500-row table and debugging (paired runs, 29/09/2026, n=5)

Quickstart

Requires Node.js 18+ and Chrome 135+.

git clone https://github.com/frsorrentino/chrome-bridge.git
cd chrome-bridge && ./install.sh
  1. Open chrome://extensions, enable Developer mode, click Load unpacked, select the extension/ folder.

  2. Restart Claude Code.

Then ask for something like "open localhost:3000, run an accessibility audit and find the Sign Up button": Claude Code calls navigate, audit and find_text. Because navigate already returns element refs, click(ref="n1") follows with no discovery turn in between.

On ChromeOS/Crostini install from the Chrome Web Store instead: an unpacked extension is dropped on every reboot, because the container isn't mounted when Chrome starts.

On Windows install.sh does not run from PowerShell or cmd. Use the plugin path below (claude plugin marketplace add frsorrentino/chrome-bridge, then claude plugin install chrome-bridge@chrome-bridge) with the extension from the Web Store, or run install.sh from Git Bash. The plugin's error log hooks run in Git Bash, as Claude Code runs every hook, and need Python 3.8+ as python3, python or py (the Microsoft Store python3 alias is skipped); without Python they stay silent and the tools work the same. For launch mode see CHROME_BRIDGE_BROWSER below: Google Chrome cannot load the extension there, Microsoft Edge can.

install.sh registers the MCP server with --scope user. To do it by hand: claude mcp add --scope user chrome-bridge node /path/to/server/index.js. For execute_js, enable Allow user scripts in chrome://extensions → Chrome Bridge → Details (on Chrome 135-137, enable Developer Mode instead).

As a plugin, without a clone: inside a Claude Code session, /plugin install chrome-bridge --marketplace frsorrentino/chrome-bridge (one command, Claude Code 2.1.275+; on older versions /plugin marketplace add frsorrentino/chrome-bridge then /plugin install chrome-bridge@chrome-bridge). From a shell, claude plugin install has no --marketplace option: run claude plugin marketplace add frsorrentino/chrome-bridge, then claude plugin install chrome-bridge@chrome-bridge. Either way the plugin registers the MCP server from npm (all capabilities) together with the recipes skill; clients that read Agent Plugins 1.0 get the same from plugin.json + mcp.json. The extension still comes from the Web Store or extension/. Pick one path: the plugin and install.sh would register the same server twice, and so would a plugin added from the Anthropic directory on claude.ai (it reaches Claude Code as chrome-bridge@synced) next to a marketplace install. In claude.ai chat the plugin loads only the recipes skill: the tools need Claude Code, or Cowork running on your computer, where the local MCP server can start.

Related MCP server: neuron-inspector

Your browser, your login

No blank profile, no debugging port, no cloud browser. The extension runs in your Chrome, so every site you are signed into is already open to the agent: webmail, the hosting panel, a client's back office, a staging site behind basic auth. Tabs the agent opens are marked as its own and closed when the session ends; your tabs stay yours.

When a page asks for something only you can give, the agent does not guess and never types credentials. handoff shows a banner in the page with what it needs — "complete the login with your 2FA, then press Done", "click the button you mean" — waits for you, and continues from where you left it, redirects included. It can also ask a question in the banner and read your typed reply, or let you pick one or more elements on the page.

Why Chrome Bridge?

Chrome Bridge

Claude in Chrome

Chrome DevTools MCP

Playwright MCP

ChromeOS / Crostini

Yes (real host)

No

Container only

Container only

Tools

60 (43 core)

22

29 default (56 with flags)

24 core (71 total)

Requires paid plan

No

Yes (Pro+)

No

No

Network mocking

Yes (stub/headers)

No

No

Yes

Visual regression

Yes (screenshot_diff)

No

No

No

Audits (a11y/SEO/sec)

Yes (one call, report on disk)

No

Lighthouse

No

Headless / CI

Yes

No

Yes

Yes

GIF / video

No

Yes

Partial

No

Breakpoints / heap

No

No

Yes

No

Codex for Chrome (OpenAI, May 2026) sits in the Claude in Chrome column: an official extension with the debugger permission, macOS and Windows only, the ChatGPT app required. Claude in Chrome documents Linux desktop since September 2026; ChromeOS and WSL stay out. Competitor figures measured on 2026-09-01 and 2026-09-11 (docs/analisi-2026-09-11-concorrenti.md).

It wins on round trips — short element refs instead of the screenshot-and-click loop, fill_form filling N fields in one call — and, on big pages, on payload: table filtering is done server-side. On the form, per single turn it actually costs slightly more.

The full benchmark — method, every raw run including the unfavourable ones, and what the harness can't measure — is in docs/EFFICIENCY.md.

Claude checks its own work: console errors, pixel diffs, network mocking and audits

Using it

The skill in skills/chrome-bridge/SKILL.md is what makes the tools discoverable: recipes with the phrase that triggers each one ("verify the email arrives", "test the checkout with a test card", "which plugin slows the page", "what fires before consent"), the tool sequence, and the zero-token CLI commands the model would otherwise never see. install.sh copies it to ~/.claude/skills/chrome-bridge; do the same by hand for other clients.

Beyond the MCP tools, two lanes keep work away from the model entirely.

Some jobs never touch the model: the CLI lane runs the same tools at zero tokens

CLI — batch operations, piped through grep or jq before anything reaches the context:

chrome-bridge navigate --url https://example.com
chrome-bridge read_console --level error | head -20
chrome-bridge assert --selector "#success" --text "Done"
chrome-bridge replay --file ./recordings/login.jsonl

Launch mode — a dedicated Chromium instance with an ephemeral profile, for isolated sessions or CI:

node server/index.js --launch --headless

It looks for Chromium, Microsoft Edge, Brave and last Google Chrome in their standard paths on Linux, macOS and Windows; CHROME_BRIDGE_BROWSER picks another binary. Google Chrome 137+ ignores --load-extension, so the extension never connects in it: use Chromium, Edge, Brave or Chrome for Testing.

Pair it with session_record + replay for smoke tests with no model in the loop. In launch mode execute_js falls back to new Function when the user-script toggle isn't available.

Tools

67 in total. core (44 tools, every tool used in 101 real sessions) loads by default; the other 23 sit in seven optional caps that the agent switches on mid-session with get_status({enable: ["visual"]}), with no restart (--caps still sets them at startup).

67 tools in eight groups, from clicking a button to tracing a page

Group

N

What's in it

Core & Navigation

13

tabs, windows, navigate, screenshot, tile_windows

Interaction

11

click, fill_form, upload_file, dialogs, clipboard

DOM & Inspection

12

read_page, extract, extract_table, query_dom, get_css_styles, watch_dom

Debugging & Network

8

execute_js, console, network log, mocking, track_events

Visual & Responsive

5

screenshot_diff, viewport and zoom, media emulation

Audits

2

audit (a11y, keyboard, SEO, security, links, vitals, css, resources, cache in one call), cookie_audit

State, Storage & Files

10

storage, fixtures, MHTML, capture_downloads (exports saved with no "Save as" dialog), recording, assert

Motion & Performance

6

animations, frames (long frames, CLS, INP), perf_trace, screencast, lighthouse and heap_snapshot (launch mode)

Every tool, with the notes that matter: docs/TOOLS.md.

How it works

It drives the Chrome you are logged into, over a local WebSocket bridge

Claude Code  <--stdio-->  MCP Server  <--WebSocket :8765-->  Chrome Extension
                          (server/)                          (extension/, MV3)

The Node.js server handles the protocol and tool logic; the MV3 extension executes commands through Chrome APIs. User scripts (execute_js) run via chrome.userScripts.execute().

Configuration and security

Environment variables, each with a matching CLI flag:

Variable

Default

Notes

CHROME_BRIDGE_PORT

8765

CHROME_BRIDGE_HOST / --host

127.0.0.1

0.0.0.0 only where the browser lives outside the container (ChromeOS/Crostini port-forward) — and only with a token

CHROME_BRIDGE_TOKEN

unset

Required on both ext_init and relay_init. Strongly recommended whenever the bind isn't loopback

CHROME_BRIDGE_CAPS / --caps

core

core, audits, visual, network, storage, dom, files, all. Optional caps can also be switched on at runtime with get_status({enable})

CHROME_BRIDGE_ALWAYS_LOAD / --always-load

22 most used tools

Tools kept in context when the client loads the server whole; the others carry _meta['anthropic/alwaysLoad'] = false and wait behind tool search (Claude Code 2.1.285+). all loads every tool; a comma list picks them

CHROME_BRIDGE_NO_JS / --no-js

unset

No arbitrary JavaScript in the page: execute_js and modify_dom leave the schema, wait_for(condition=function) and javascript:/data: URLs are refused. get_status reports js_evaluation

CHROME_BRIDGE_READ_ROOT / --read-root

unset

Where upload_file may read from. Unset: any file except keys and credentials (~/.ssh, ~/.aws, ~/.gnupg, .env*, id_*, *.pem, *.key, …), symlinks resolved first. Set: only files under this directory, whatever their name — the way to upload a certificate key on purpose

CHROME_BRIDGE_BROWSER

unset

Launch mode only: the browser binary, e.g. C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe. Unset: the first of Chromium, Edge, Brave, Google Chrome found in the standard paths (on Linux Chromium, then Google Chrome). Google Chrome 137+ cannot load the extension

CHROME_BRIDGE_OBSERVE

unset

off stops the local error log below. The plugin sets hook: its hooks keep the log and the server stays out of it

CHROME_BRIDGE_WRITE_ROOT / --write-root

unset

Every path the model chooses (save_to, output_path, exports) must be under this directory, checked before the browser does any work; the server's own state under ~/.config/chrome-bridge stays writable. The CLI is your shell and is not restricted

The bridge binds loopback, accepts extension connections only from a chrome-extension:// origin, and — when a token is set — requires it on both handshakes. Without one, any local process could act as a relay and reach execute_js inside your authenticated browser session. Secondary MCP instances connect via loopback and are acknowledged with relay_init_ok, so a foreign process holding the port fails fast instead of timing out per command.

What is not protected: page content reaches the model unfiltered, so a hostile page's text is untrusted input. get_storage, session_fixture, HAR exports and screenshots are not redacted and may carry cookies, tokens or personal data. Don't point the automation at pages holding secrets you wouldn't paste into a chat.

Threat model

chrome-bridge gives an AI agent your real, logged-in browser. Scanners that rate MCP servers by capability flag it, correctly, for code execution (execute_js), requests that carry your cookies (http_request) and reading private page data (get_storage, get_tabs). Those are the product, not bugs. What matters is who can reach them and what a hostile page can make the agent do with them.

  • Who can connect: see above — loopback bind, chrome-extension:// origin check, CHROME_BRIDGE_TOKEN on both handshakes.

  • Launch mode also opens a DevTools port on 127.0.0.1 (chosen by the system), for lighthouse and heap_snapshot. CDP has no authentication: any local process can drive that dedicated browser while it runs. Its profile is temporary and holds nothing of yours; your own Chrome never gets a port.

  • The debugger bar is the signal. click/press_key with trusted, emulate_media via: "debugger", perf_trace and screencast attach chrome.debugger to one tab only for that work; Chrome shows its "started debugging this browser" bar meanwhile, and cancelling it ends the work.

  • The real risk is prompt injection. A page can ask the agent to run JavaScript, send a request with your cookies, submit a form or upload a file. Treat every page you automate as untrusted input, and review what the agent proposes on sites that hold money or credentials.

  • Reduce the surface: --caps core (the default) exposes the smallest set; --no-js removes arbitrary JavaScript; --write-root fences every path the model writes; upload_file refuses keys and credentials, and --read-root fences it to one directory. For sessions that matter, automate in a separate Chrome profile.

  • --no-js is not a sandbox: inject_css stays, and CSS attribute selectors with url() can leak attribute values to a remote host.

  • What leaves your machine is what the browser sends on the agent's behalf. chrome-bridge itself has no telemetry; the error log below stays local unless you approve an issue.

Local error log

When one of its own tools fails, chrome-bridge adds a line to a local file, ${XDG_STATE_HOME:-~/.local/state}/claude-observe/chrome-bridge.jsonl (mode 0600, in a 0700 folder), in the claude-observe format (the plugin's copy is in observe/). With the plugin, a PostToolUseFailure hook writes it; with the npm server alone, the server does. The same error seen again is one line with a count.

  • Kept: the tool name, the error text after scrubbing (your home folder becomes ~; emails, URL queries, secrets and typed values are removed), the names of the parameters and the length of text values, the chrome-bridge version, the OS, the name of the working folder and of the Claude Code config folder. With the plugin, also the Claude Code and model versions, the session id and the names of the last three tools called.

  • Never kept: parameter values — no URLs, selectors, typed text or page content.

  • Nothing leaves your computer unless you say yes. With the plugin, once a few errors have piled up (or one has waited a few days, or one is marked as a defect), a line at the end of a turn tells you so, and Claude may offer, at a natural moment, to send them as one GitHub issue: it shows you the anonymized text first, then asks with buttons (from your GitHub, or not now) and sends only what you chose. /chrome-bridge:observe send does the same on demand; list, mark and add read and triage the log. The server alone never sends or offers anything.

  • Security observations (a read or write outside the perimeter, a secret exposed, unwanted code execution, data leaving the computer) never enter a public issue: /chrome-bridge:observe send --security prepares a private vulnerability report for the maintainers, see SECURITY.md.

  • Turn it off: {"enabled": false} in ~/.config/claude-observe/config.json (every plugin that uses claude-observe), or CHROME_BRIDGE_OBSERVE=off for the server. Keep the log but stop the offers: {"propose": false}.

Troubleshooting

Symptom

Cause / fix

Chrome extension not connected

Extension disabled, or its port differs from the server's. The error names the actual host/port; check them in the popup (⚙).

Port 8765 already in use

Expected: a second MCP session becomes a relay and shares the one bridge. Set CHROME_BRIDGE_PORT for a separate one.

Port N is held by a process that is not chrome-bridge

Something else owns the port. Free it or change CHROME_BRIDGE_PORT.

execute_js fails

Enable Allow user scripts in chrome://extensions → Chrome Bridge → Details (Chrome 138+; on 135-137 enable Developer Mode).

read_console returns note=Instrumentation not loaded

The page was opened before the extension, "Capture console & metrics" is off, or the page isn't injectable (chrome://). Reload it.

Screenshot times out, or image readback failed

A minimized or fully covered window stops producing frames; captures fail after 10 s. Bring the window forward.

wait_for/scroll return page_hidden: true, pages stop updating

Same cause: Chrome does not render a hidden page and slows its timers (after a few minutes, to one wake-up per minute). get_page_info reports visibility. Bring the window on screen, or create_tab with new_window and bounds.

screenshot presets says NOT APPLIED

Presets resize the window; they do not emulate a phone (no device pixel ratio, UA or touch). The window manager enforces a minimum width, and no window exceeds the screen (e.g. at most a 1536×686 viewport on a 1536×864 ChromeOS screen). For phone emulation use emulate_media with device (via debugger), or a headless browser for larger viewports.

type_text returns mismatch: true

The field rejected the value. Events from an extension have isTrusted: false, and some widgets (date pickers, search boxes with tokenizers) discard them. Try mode: 'keys', then the site's own controls (the calendar buttons), or handoff.

[media removed: request limit] instead of a screenshot

Written by the MCP client, not by the bridge: too many images in one request. Use save_to, or element_screenshot with region and a small scale.

Commands work, then stop

The MV3 service worker restarted and in-memory state (network log, diff baselines, HTTP auth) was reset. Re-run the monitoring call.

Extension dropped on every ChromeOS reboot

Install from the Web Store instead of Load unpacked.

Tool missing from the list

It's in an opt-in group. Check get_status → caps_available, then set CHROME_BRIDGE_CAPS=all.

claude mcp get shows no command, arguments or environment

Expected with the plugin: since Claude Code 2.1.285 it hides them for stdio servers that plugins provide (variable names stay). get_status reports the server and extension versions, mode, host, port and caps; /mcp shows the connection.

Popup says «In attesa: un altro browser è collegato», get_status lists refused_browsers

Two browsers with the extension reach the same port. The one already connected keeps the bridge; the other retries every 15 s and takes over when the first disconnects. get_status → browser names the connected one. Before this, the last one to connect took over silently.

Documentation

Tests

npm test (Chrome-free, ~22s) · npm run test:e2e (needs Chrome and a connected extension; with a bridge already on 8765: CHROME_BRIDGE_PORT=8799 node test/test-devtools.js --launch, which opens its own Chromium with extension/) · npm run measure (schema cost) · npm run bench:latency (milliseconds per tool, launches its own Chromium, writes docs/PERFORMANCE.md).

  • agent-webbridge — drives several Chrome profiles at once, with parallel tabs

  • awb-recipes — community-maintained, dated per-site recipes for automating logged-in websites

License

MIT

Available Tools

67 tools
animationsA

List the page animations: CSS animations, transitions, Web Animations and View Transitions, each with selector and ref, animated properties, duration, delay, easing (linear() curves included), iterations, play state, timeline (document, scroll, view). composited_estimate guesses whether only transform/opacity/filter move (an estimate, not the compositor's answer); fade_only marks opacity-only fades, what prefers-reduced-motion should leave. Without duration_ms: what runs now. With duration_ms: records every animation that starts in the window, optionally after an action (hover, click, scroll, key), since a 150 ms transition is over before a second call. Refuses on a hidden page. Pair with emulate_media reducedMotion to check the reduced version; how smoothly they run is frames.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax animations listed; the summary counts all
scopeNoCSS selector: only animations on this element or inside it
actionNoAction run right after recording starts
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
duration_msNoRecord for this many ms (max 30000) instead of a snapshot

TDQS

A4.8/5.0
Behavior5/5

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

Adds real behavioral context beyond the annotations: it discloses that recording runs an optional action (hover/click/scroll/key), that composited_estimate is only a guess rather than the compositor's answer, what fade_only means for prefers-reduced-motion, and that it refuses on a hidden page. No contradiction with the declared hints.

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?

Front-loads the resource and its categories, then the mode switch. It is a dense single paragraph with heavy punctuation, but nearly every clause carries load and nothing is repeated from structured fields.

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?

With no output schema, the description compensates by naming the returned fields (selector, ref, animated properties, duration, delay, easing, iterations, play state, timeline, composited_estimate, fade_only). Combined with mode behavior and the hidden-page constraint, an agent has everything needed to call it correctly.

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 baseline is 3, but the description adds meaning the schema lacks: the temporal rationale for duration_ms ('a 150 ms transition is over before a second call') and the action trigger set (hover, click, scroll, key). It does not explain tab_id/frame_id resolution beyond 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 ('List') and resource ('page animations') and enumerates the exact categories covered: CSS animations, transitions, Web Animations, and View Transitions. An agent can distinguish this from siblings like get_css_styles or track_events without opening a schema.

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

Usage Guidelines5/5

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

Clearly routes between modes ('Without duration_ms: what runs now. With duration_ms: records every animation that starts in the window') and names alternatives with conditions: pair with emulate_media reducedMotion for the reduced version, and note that frames handles smoothness. It also states the hidden-page refusal up front.

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

assertA
Read-onlyIdempotent

Assert a page condition, polling until timeout: element exists/visible (optionally with count or containing text), text on page, tab url/title. Patterns: substring, or "/…/" for regex. Recorded flows replay it as a test. Unlike wait_for, which returns found: false, a failure is an error naming what did not match; success returns passed and waited_ms.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoTab url pattern
textNoIn the element (with selector) or anywhere on the page
countNoExact match count for selector
stateNoattached means present in the DOM, visible also requires a rendered boxattached
titleNoTab title pattern
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
timeoutNoMax ms to wait for the condition before failing
selectorNoElement the assertion is about; ">>>" pierces shadow DOM

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description adds valuable behavioral detail: it polls until timeout, failure raises an error naming the mismatch, and success returns passed and waited_ms. This is useful since no output schema exists, though polling cadence and partial-match failure specifics are not covered.

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?

Three tight sentences, front-loaded with the core verb and polling behavior, followed by pattern syntax and the sibling contrast. No filler; every clause carries information an agent 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?

For an 8-param, output-schema-less tool, the description covers the essential behaviors: polling, failure semantics, and the shape of success/failure responses, with annotations covering safety. It is close to complete, missing only finer details like default timeout behavior and multi-condition interactions.

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 meaning beyond the schema by explaining the pattern syntax (substring vs "/…/" regex) and clarifying that count/containing-text are optional modifiers. These are not stated in the schema field descriptions and improve correct invocation.

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 ('Assert') and resource ('a page condition'), then enumerates the condition types (element exists/visible, text, url/title) so the agent knows exactly what can be tested. It also names and contrasts the sibling wait_for, making differentiation possible 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 frames the when: recorded flows replay it as a test, and contrasts behavior with wait_for (which returns found:false vs this erroring). This gives a clear selection rule against the closest alternative, though it stops short of stating exclusions for each condition type.

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

auditA
Read-onlyIdempotent

One-call page audit, pick the kinds: accessibility, keyboard (tab order and focus issues), SEO, security headers, broken links, Core Web Vitals, unused CSS, resources (which plugin/theme/module/host slows the page), cache (is the CDN serving the new version). A summary line per kind; with save_to the full Markdown report with every finding. Read-only. For one deep look at load speed use perf_trace, for Lighthouse scores lighthouse.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoDefault skips keyboard, css (slow, approximate), resources and cache
scopeNoa11y only: limit to this subtree
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the full Markdown report there and return the path instead of the content
max_linksNolinks only: cap on URLs fetched

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: it explains the output shape (a summary line per kind, or a full Markdown report when save_to is set). It does not mention the cost/slowness caveat for keyboard and css checks, which lives only in the 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?

Front-loaded with the core purpose and the kind list, then routing alternatives. Dense but every clause carries information; the kind parentheticals are the only mildly verbose portion.

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?

With no output schema, the description correctly carries the return-value burden by describing both the summary-per-kind mode and the full-report mode. Combined with 100% schema coverage and explicit sibling routing, an agent has everything needed to call it correctly.

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 baseline is 3, but the description goes beyond the enum by explaining what each kind actually checks (tab order/focus, plugin/theme/host cost, CDN freshness) and clarifies that save_to swaps content for a returned path.

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 (audit) plus the resource (page) and enumerates the exact check kinds, with parenthetical explanations of ambiguous ones like keyboard and resources. It is immediately distinguishable from sibling tools such as perf_trace, lighthouse, and cookie_audit.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'For one deep look at load speed use perf_trace, for Lighthouse scores lighthouse.' It also instructs how to choose kinds and notes the default behavior, so the selection decision is fully specified rather than inferred.

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

capture_downloadsA

Save files the page builds itself, with no browser download and no "Save as" dialog: blob and data URL links (a[download]), window.showSaveFilePicker writes, and downloads the page starts (cancelled at once, bytes fetched again with the browser cookies). arm with save_dir, then click Export/Download, then wait: it returns the saved paths. A file with a URL: http_request save_to instead. Names are cleaned, existing files never overwritten, size capped by max_mb.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesarm before the click; wait returns what arrived and stays armed; disarm restores the page
max_mbNoarm: per-file cap in MB (default 100, max 200); a bigger file is skipped
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
timeoutNowait: max ms for the first file
save_dirNoarm: absolute directory for the files; created if missing

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses the interception trick (downloads cancelled at once, bytes re-fetched with browser cookies), filename sanitization, the never-overwrite guarantee, and the max_mb cap with skip behavior. Annotations only cover the generic safety profile (readOnly=false, idempotent=false, destructive=false), so this richer detail is real added value, and it is consistent with them.

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?

Front-loads the key distinction (no browser download, no Save-as dialog) and packs the workflow into one dense paragraph where almost every clause carries information. It is somewhat run-on across three distinct ideas, but there is little dead weight.

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 stateful three-action tool with no output schema, the description covers the lifecycle, side effects, return value ('returns the saved paths'), and the cross-tool escape hatch. Nothing an agent needs to invoke it correctly is 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 100%, so the per-parameter semantics are already documented; the description's contribution is tying parameters to the stateful workflow ('arm with save_dir', cap via max_mb, wait returns paths). This adds a little context on how params combine across the arm/wait/disarm cycle, but largely reinforces what the schema says.

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?

Names a specific verb+resource ('Save files the page builds itself') and enumerates exactly the mechanisms covered: blob/data URL a[download], showSaveFilePicker writes, and page-initiated downloads. This cleanly separates it from siblings like save_page, manage_downloads, and http_request, which the description explicitly routes away.

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

Usage Guidelines5/5

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

Gives an explicit operational sequence ('arm with save_dir, then click Export/Download, then wait') and names the alternative for the out-of-scope case ('A file with a URL: http_request save_to instead'). Both when-to-use and when-not-to-use are stated.

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

clickA

Click an element by CSS selector or by a ref (n1, n2…) from get_interactives or navigate. A real pointer sequence: it can submit, open a dialog or navigate — use wait_after. Not idempotent; a native confirm() blocks the bridge: handle_dialogs first. Returns page_changed (url, title and DOM deltas: nodes, text, open, expanded, checked, dialogs, focus): the effect, without a screenshot; when the click opens or reveals something, the refs of the visible interactives follow, no get_interactives needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoFrom get_interactives, e.g. "n3"
countNo2 emits dblclick after the two clicks, which is what selects a word or opens an editor
forceNoClick even if occluded
buttonNoright opens the page context menu instead of activating the elementleft
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
trustedNoReal browser input (isTrusted) via chrome.debugger, main frame only: for widgets that ignore synthetic clicks
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorNoCSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
wait_afterNoSettle before returning: navigation waits for a page load, networkidle for quiet trafficnone

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and idempotentHint=false, so 'Not idempotent' is largely redundant, but the description adds genuinely non-schema behavior: a native confirm() blocks the bridge and requires handle_dialogs first, and the real pointer sequence can submit/open/navigate. It also describes the return payload (page_changed with DOM deltas) with no output schema present, which is real added value.

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?

Front-loaded with the core action and its addressing modes, then behavior, then return shape — no filler sentences. It is dense and slightly long for a single tool, but nearly every clause carries actionable information an agent needs.

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?

With 9 parameters, no output schema, and only annotations for safety, the description compensates for the missing return documentation by describing page_changed's contents (url, title, DOM deltas, dialogs, focus) and the follow-on refs. An agent has everything needed to call and interpret this correctly.

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 description coverage is 100%, so the baseline is 3, but the description adds cross-cutting semantics the schema does not: refs come from get_interactives/navigate, and wait_after is framed as a settle-before-return control. It does not re-derive per-parameter meanings like count or trusted, which the schema already covers well.

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 ('Click an element') and the two addressing modes (CSS selector or ref from get_interactives/navigate), immediately distinguishing it from sibling tools like hover and drag_and_drop. An agent knows exactly what this does 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 Guidelines5/5

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

Explicitly routes to alternatives ('ref from get_interactives or navigate') and states preconditions ('a native confirm() blocks the bridge: handle_dialogs first') plus the follow-up knob ('use wait_after'). It even tells the agent when it does NOT need a sibling ('when the click opens or reveals something, the refs ... follow, no get_interactives needed').

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

clipboardA
Idempotent

Read or write the system clipboard (text). Activates the tab and focuses its window first. write overwrites whatever the user had copied, which is not recoverable. To fill a field use type_text instead of write and paste; read checks what a Copy button copied, and an empty clipboard returns text "".

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoFor write
actionYeswrite takes text; read returns the current clipboard contents
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A3.7/5.0
Behavior1/5

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

The description states write 'overwrites whatever the user had copied, which is not recoverable' — a non-additive, irreversible replacement of existing data — while the annotations declare destructiveHint=false. Despite the otherwise valuable side-effect disclosure (tab/window activation, empty-clipboard behavior), the description directly contradicts the destructive annotation.

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?

Dense, front-loaded, and free of filler: purpose first, then side effects, then the routing advice. Tight overall, though the 'its window' antecedent is slightly loose and it packs several directives into one sentence.

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 usefully covers read's return edge case (empty clipboard -> ''), tab/window activation, and overwrite risk. It still says nothing about write's return value, but for a 3-param tool this is largely complete.

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% (action enum, text 'For write', tab_id fallback are all documented in the schema), so the baseline is 3. The description adds only one behavioral detail relevant to parameters (empty clipboard returns text ''), not additional semantics for text or tab_id beyond what the schema already says.

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 opening sentence gives a precise verb+resource ('Read or write the system clipboard') and scopes it to text, immediately distinguishing it from text-input siblings like type_text. An agent knows exactly what this operates on.

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

Usage Guidelines5/5

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

It explicitly routes the agent: 'To fill a field use type_text instead of write and paste,' and explains the read use case ('checks what a Copy button copied'). This is an explicit when-to-use / when-to-use-something-else statement, not just implied context.

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

create_tabA

Open a new tab, optionally at a URL, and make it the implicit target of later commands in this session. Each call creates another tab: reuse a tab_id or navigate() to move an existing one instead of piling up tabs.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoWindow y (new_window)
urlNoURL to open (default: new tab page)
leftNoWindow x on the virtual desktop (new_window)
widthNoWindow width px (new_window)
activeNofalse opens the tab in the background, leaving the current one focused
heightNoWindow height px (new_window)
new_windowNoOpen in a fresh window instead of a tab; with left/top it lands on the chosen monitor

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses that the new tab becomes 'the implicit target of later commands in this session' and that each call creates another tab, behaviors not captured by the annotations. This provides critical context about statefulness and side effects beyond the structured hints.

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, front-loaded with the primary action and followed by a practical usage tip. Every sentence contributes value with no redundancy.

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?

The description is fully self-contained for a state-changing tool: it explains the action, the session-wide implication, and the fallback to navigate(). It does not explicitly state the return value, but the mention of 'reuse a tab_id' implies a tab identifier is returned, which is sufficient given the tool's simplicity and the comprehensive 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 baseline is 3. The description adds minimal parameter-specific meaning beyond the schema, merely mentioning the optional URL, which is already documented. It does not introduce new information about parameters.

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 uses a specific verb ('Open') and resource ('new tab'), clearly distinguishing this from navigation tools. It explicitly contrasts with navigate(), stating 'reuse a tab_id or navigate() to move an existing one instead of piling up tabs.'

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: it tells the agent that each call creates a new tab and recommends reusing a tab_id or using navigate() to move an existing tab, preventing tab accumulation. This addresses when to use the tool versus alternatives.

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

dismiss_overlaysA
Idempotent

Dismiss cookie banners/modal overlays: OneTrust, Cookiebot, Usercentrics, then generic heuristic. Idempotent.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.7/5.0
Behavior5/5

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

Description complements annotations by detailing the specific overlay dismissal approach (vendor-specific plus heuristic). Annotations already mark destructiveHint false and idempotentHint true, and description reinforces idempotency, adding valuable context without contradiction.

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 pack the essential information: what it does, which overlays it targets, and idempotency. No wasted words.

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?

Given the simple input schema, annotations covering safety and idempotency, and the focused purpose, the description is fully adequate. No output schema needed for this straightforward action.

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% with a clear description for tab_id. The tool description adds the non-obvious default behavior: omitted means last tab navigated or active tab, which is helpful beyond 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?

Description clearly states the tool dismisses cookie banners/modal overlays, listing specific vendor patterns (OneTrust, Cookiebot, Usercentrics) and a generic heuristic. This sets it apart from sibling tools that interact with page elements in other ways.

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 mentions idempotency, signaling safe repeated use. Implicitly suggests use when overlays block interaction. No explicit when-not-to-use or alternatives, but context is clear given sibling tools.

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

drag_and_dropA

Drag an element onto another. html5 = DragEvent+DataTransfer; pointer = pointer/mouse events (sortable libraries). It scrolls the source into view and returns once the events are sent, without knowing whether the app accepted the drop (check with assert or query_dom); a missing element is an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoWhich event family to emit, since libraries listen to different oneshtml5
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
source_selectorYesElement to drag; ">>>" pierces shadow DOM
target_selectorYesDrop target; ">>>" pierces shadow DOM

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing that it scrolls the source into view, that it returns as soon as events are sent without knowing if the app accepted the drop, that a missing element raises an error, and what each event family emits. This optimistic/fire-and-forget behavior is exactly the kind of trait an agent needs and annotations do not convey.

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?

Front-loads the core action and packs mode semantics, side effects, and error behavior into three dense sentences with little waste. The semicolon-heavy style is slightly run-on but every clause carries information.

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 tricky interaction with no output schema, the description covers what an agent needs: purpose, mode choice, side effect (scrolling), optimistic return semantics, verification guidance, and the missing-element error. Nothing essential is 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 100% so the baseline is 3, but the description adds real meaning for mode ('html5 = DragEvent+DataTransfer; pointer = pointer/mouse events') beyond the schema enum text. It does not elaborate on tab_id/frame_id semantics, which the schema already covers.

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 ('Drag an element onto another') plus the two event modes, so an agent immediately knows the operation. It stops short of explicitly contrasting itself with sibling interaction tools like click or hover, so it is clear but not fully sibling-differentiated.

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 clear context for mode selection ('libraries listen to different ones', pointer for sortable libraries) and names follow-up verification paths (assert, query_dom). It does not state explicit exclusions or when this tool is preferred over sibling interactions, so no full when/when-not framing.

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

element_screenshotA
Read-onlyIdempotent

Screenshot cropped to one element or to a viewport region (PNG), optionally enlarged. Read-only. The cheapest image in the set, because it carries only the box you asked for — and with scale the way to read fine print: crop the box, zoom it, verify.

ParametersJSON Schema
NameRequiredDescriptionDefault
scaleNoEnlargement of the crop, 1-4; output still capped at 1568px
regionNoBox in viewport CSS px (the rect frame of get_interactives/query_dom), instead of selector
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selectorNoCSS selector; ">>>" pierces shadow DOM. The element is scrolled into view first

TDQS

A4.8/5.0
Behavior5/5

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

The description explicitly says 'Read-only,' matching the readOnlyHint and destructiveHint annotations. It also discloses behavior beyond the annotations, such as optional enlargement, output being capped at 1568px, and the selector parameter noting that 'The element is scrolled into view first.'

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 front-loaded with the main purpose and keeps additional explanation compact and purposeful. The cost and scale guidance is phrased efficiently, and no sentence is redundant or filler.

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?

The description, combined with the parameter details, gives an agent enough context to call the tool correctly: what it returns (PNG), how to target an element or region, how scaling behaves, and which tab is used. No output schema is present, but the textual description sufficiently covers the output format and key invocation details.

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

Parameters5/5

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

All four parameters have meaningful descriptions that go beyond the schema types. The scale parameter documents its default and bounds, region explains it is a viewport box in CSS pixels rather than a selector, tab_id explains fallback behavior, and selector explains shadow DOM piercing and pre-scroll behavior.

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 clearly states the tool's function: 'Screenshot cropped to one element or to a viewport region (PNG), optionally enlarged.' It also highlights the differentiating cost benefit, 'The cheapest image in the set, because it carries only the box you asked for,' which helps distinguish it from broader screenshot tools.

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 practical usage context by noting it is the 'cheapest image in the set' and that 'with scale the way to read fine print: crop the box, zoom it, verify.' It does not explicitly name sibling alternatives like screenshot or full_page_screenshot, but the cropping and viewport-region framing make the intended use case reasonably clear.

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

emulate_mediaA
Idempotent

Make the page believe it runs elsewhere, until reset or reload: prefers-color-scheme, prefers-reduced-motion, print mode, navigator.userAgent/platform. user_agent changes only what page JS reads — the request header is network_rules modify_header. via "page" (default for these) only patches matchMedia and, for reduce, zeroes every animation: the site's own @media rules do not apply. via "debugger" emulates like DevTools, so the site's @media (prefers-reduced-motion) rules really apply — use it to check reduced motion with animations — and adds contrast, CPU throttling, network profiles, device viewport with DPR, touch (these imply via debugger). via debugger keeps Chrome's "started debugging this browser" bar until reset: true; in launch mode nobody sees it. Pair with viewport_resize to emulate a device in page mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
viaNopage: script shim, no browser bar; debugger: real emulation (default when a debugger-only option is set)
resetNoRemove all emulations and detach the debugger
touchNoEmulate a touch screen (debugger)
deviceNoDevice metrics override (debugger)
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
networkNoDevTools network profile; none turns it off (debugger)
contrastNoValue reported to prefers-contrast queries (debugger)
printModeNoMake print media queries match, without opening a print dialog
user_agentNoOverrides navigator.userAgent and appVersion in the page (not the HTTP header)
colorSchemeNoValue reported to prefers-color-scheme queries
cpu_throttleNoCPU slowdown factor, e.g. 4 for a mid-range phone; 1 turns it off (debugger)
reducedMotionNoValue reported to prefers-reduced-motion queries

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations (idempotent, non-destructive): the emulation persists only 'until reset or reload', page mode patches matchMedia but leaves @media rules unapplied and zeroes every animation for 'reduce', and debugger mode leaves Chrome's 'started debugging this browser' bar visible until reset:true (avoided in launch mode). These side effects and limitations are exactly what an agent needs and cannot get from the schema or annotations.

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?

Front-loaded with the core purpose, then organized by mode, and it is informationally dense with no filler sentences. It is long for a single paragraph and repeats 'via debugger' several times, which slightly hurts scanning, but each clause carries distinct technical weight.

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 complex 12-parameter tool with no output schema, the description covers mode selection, persistence, and caveats thoroughly. It does not state what a successful call returns or confirms, but for an emulation toggle where the observable effect is the page state, this is a minor omission.

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 title/description semantics are already documented (baseline 3). The description goes further by explaining the interaction rules the schema cannot express: which options imply via=debugger, that user_agent does not affect the HTTP header, and that page mode's shim only covers matchMedia. This materially clarifies parameter behavior beyond the field-level descriptions.

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 ('Make the page believe it runs elsewhere') and enumerates the exact media features it controls (prefers-color-scheme, reduced motion, print mode, userAgent/platform). It explicitly separates itself from network_rules ('user_agent changes only what page JS reads — the request header is network_rules modify_header') and names viewport_resize as a companion, so an agent can place it among siblings 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 Guidelines5/5

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

Gives explicit when-to-use guidance for the two modes: 'via page (default for these)' for matchMedia-only patching, and 'via debugger' when the site's own @media rules must really apply, adding contrast, CPU throttling, network profiles, viewport DPR and touch (which imply via debugger). It also states when reset is needed ('until reset: true') and routes header-only overrides to a sibling.

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

execute_jsA
Destructive

Run JavaScript in the page (MAIN world). Requires the extension's "Allow user scripts" toggle; errors explain setup if disabled. Use it when no dedicated tool fits: extract or extract_table read data, query_dom inspects elements, inject_css restyles, and none of them needs the toggle. A promise is awaited up to timeout. A cut result stays valid JSON and says truncated; save_to writes the whole result to disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesJS evaluated in the page; the value of the last expression is returned
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the result (a string as is, anything else as JSON) there and return the path instead of the content
timeoutNoMax ms to wait for the result (default 30000); raise it for long async work
frame_idNoTarget iframe id from get_frames; omitted = main frame
max_lengthNoMax output chars

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare the risk profile (destructive, open-world, non-idempotent); the description supplies the operational context they cannot: the toggle prerequisite, awaiting promises up to timeout, the fact that a truncated result remains valid JSON and is marked as truncated, and that save_to returns a path instead of content. No contradiction with annotations.

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?

Five dense sentences with no filler; the capability and its key constraint (toggle) come first, the sibling-routing guidance second, and return-shape behavior last. Every sentence carries information an agent 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?

For a six-param arbitrary-code tool with no output schema, the description covers prerequisites, async/timeout behavior, truncation shape, and disk output. It does not address how non-JSON-serializable return values are handled or how the result behaves when the code throws, which is the only remaining gap.

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 real meaning for two params: max_length truncation still yields valid JSON flagged as truncated, and save_to writes the whole (untruncated) result to disk. tab_id and frame_id resolution rules remain schema-only.

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 with scope: "Run JavaScript in the page (MAIN world)". It immediately contrasts itself against named siblings (extract, extract_table, query_dom, inject_css), so an agent can distinguish it 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 Guidelines5/5

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

Explicit fallback semantics: "Use it when no dedicated tool fits," then names four alternatives and what each does. It also states the enabling prerequisite ("Allow user scripts" toggle) and that disabled-state errors explain setup, covering what to do when the call fails.

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

extractA
Read-onlyIdempotent

Read repeated non-tabular structures — product cards, list items, search results — as one record per item: item_selector matches the repeating block, fields map output names to selectors relative to it. Read-only, deterministic, parsed server-side from the main-document HTML. Default output: total and shown, then one tab-separated row per item under the field names; a field with no match is empty (null in json).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYesfield name → {selector, attr}
formatNolines is compact; json keeps one object per recordlines
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the records as JSON there and return the path instead of the content
max_itemsNoCap on records returned, in document order
max_lengthNoMax output chars
item_selectorYesCSS selector matching each item

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds meaningful traits: deterministic execution, server-side parsing restricted to the main-document HTML, and the default output shape with null semantics for unmatched fields. That parsing-scope limitation is genuinely useful given siblings like get_frames.

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?

One tightly packed paragraph that is front-loaded with purpose, then mechanics, then output semantics. Every clause carries information; there is no filler or redundancy.

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?

With no output schema, the description carries the return-value burden and does so (total/shown header, tab-separated rows, empty field → null in json). All 7 params are schema-documented and the two core ones are explained, so nothing needed to call it correctly is 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 100%, so baseline is 3, but the description adds a conceptual model beyond the schema: item_selector marks the repeating block and fields are resolved relative to it, with item_selector/fields being the required pair. It clarifies how the two key params compose rather than merely restating them.

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 (read/extract) and resource (repeated non-tabular structures) with concrete examples (product cards, list items, search results). The qualifier 'non-tabular' implicitly and usefully separates it from the sibling extract_table, so an agent can route between them without opening a 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?

Gives clear positive context via examples of what this tool is for, and 'non-tabular' implies tables belong to extract_table. However, no explicit alternative is named and no when-not-to-use condition (e.g., single elements, iframes/shadow DOM) is stated, so it stops short of full routing guidance.

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

extract_tableA
Read-onlyIdempotent

Read a real as JSON: thead cells become keys, each row an object. Only for tabular markup — where filters rows server-side, so one matching row out of 1500 costs a few hundred bytes instead of the whole document. row_count is the table total, match_count how many rows passed the filter. No table at index is an error saying how many the selector found; for cards and lists use extract.

ParametersJSON Schema
NameRequiredDescriptionDefault
indexNoWhich table to take when the selector matches several, 0-based
whereNo{column: substring} rows must match, case-insensitive (names too). Key "any" matches any cell.
offsetNoSkip N rows of the (filtered) set before applying max_rows.
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
columnsNoReturn only these columns per row.
max_rowsNoMax rows returned to you (output cap).
selectorNoThe table to read; ">>>" pierces shadow DOMtable
scan_rowsNoMax rows materialized in-page to scan/filter; raise for very large tables.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare a safe read (readOnlyHint, idempotentHint, destructiveHint=false), yet the description adds substantive behavior: `where` filters server-side with an explicit cost example (one row out of 1500 costs a few hundred bytes), the meaning of `row_count` vs `match_count` in the response, and the error behavior when no table matches the index. This is rich context beyond the structured fields.

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 output shape, then usage, then return semantics, then error behavior. Every sentence carries information an agent needs; nothing is padding.

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?

There is no output schema, so the description correctly carries the return-value burden (thead→keys, row objects, row_count/match_count) plus the error contract. With 8 parameters (all optional, 100% schema coverage) and annotations covering safety, the description is complete enough for correct invocation.

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 description coverage is 100%, so the baseline is 3, but the description earns extra credit by framing `where` as server-side filtering with a cost rationale and by explaining that a missing table at `index` yields an error reporting the selector's match count. It adds meaning beyond the schema's terse 'rows must match' wording.

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 precise verb and resource ('Read a real <table> as JSON') and immediately explains the output shape (thead cells become keys, each row an object). It explicitly distinguishes itself from the sibling 'extract' ('for cards and lists use extract'), 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 Guidelines5/5

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

It states the scope condition ('Only for tabular markup') and names the alternative for the excluded case ('for cards and lists use extract'), which is exactly the when-to-use/when-not guidance needed. The server-side filtering note further clarifies the intended use for large tables.

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

fill_formA

Batch fill form fields with React-compatible events. Handles input, select, checkbox, radio, and textarea. Fields and submit take a CSS selector or a ref (n1, n2…) from navigate/get_interactives. With submit_selector it also submits, so a repeated call submits twice — not safe to retry blindly; after a submit, after_submit carries url, title and the text the page gained (the confirmation or the errors). Each field reports value_after and mismatch; page_changed carries the DOM delta, and the refs of what appeared.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYes{selector or ref, value or checked} per field
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
submit_refNoSubmit button as a ref, instead of submit_selector
wait_afterNoSettle before returning: navigation waits for a page load, networkidle for quiet trafficnone
submit_selectorNoSubmit button to click after filling

TDQS

A4.4/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: it warns that a repeated call with submit_selector submits twice and is not safe to retry blindly (consistent with idempotentHint=false), and it details post-submit/lateral reporting (after_submit url/title/gained text, per-field value_after and mismatch, page_changed DOM delta). This is exactly the operational detail annotations cannot convey.

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?

It is front-loaded with the core action and control-type coverage, then layers the selector/ref mechanic, the submit caveat, and reporting. It is dense but every sentence carries load; the return-value detail in the final clauses makes it slightly heavy for two sentences.

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?

There is no output schema, so the description correctly compensates by explaining what comes back (after_submit, value_after, mismatch, page_changed refs). For a 6-parameter, non-idempotent mutation tool, the agent has enough to call it safely.

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?

With 100% schema description coverage the baseline is 3, but the description adds cross-parameter meaning: it clarifies that fields and submit accept either a CSS selector or a ref from navigate/get_interactives, and ties the submit parameters to the double-submit consequence. This goes modestly beyond the per-parameter schema 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?

The description gives a specific verb and resource ("Batch fill form fields with React-compatible events") and enumerates exactly which control types it covers (input, select, checkbox, radio, textarea). This clearly separates it from siblings like read_form (reading) and type_text (single-field typing) 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 Guidelines3/5

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

Usage context is implied rather than explicit: it explains that refs come from navigate/get_interactives and that submit_selector triggers a submit, but never states when to prefer this tool over alternatives such as type_text, click, or read_form. The reader can infer the workflow but is not routed.

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

find_settingA
Idempotent

Where is a setting in an unknown admin panel: follows the panel's menu links (same origin) until a page contains the keyword. Returns the URL, the menu path (Settings › Media) and the matching text; when nothing matches, how many pages it tried. Navigates the tab and leaves it on the last page visited, at most max_pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
keywordYesWhat you are looking for, e.g. "webp", "cron", "maintenance mode"
max_pagesNoPages visited at most
menu_selectorNoWhere the menu links arenav, aside, [role="navigation"], #adminmenu, .menu, .sidebar, .navbar, .tabs

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false yet destructiveHint=false, and the description supplies exactly the missing context for that split: it navigates the tab and leaves it on the last page visited, which explains why it is not read-only. It also adds the same-origin constraint on crawled links, the max_pages cap, and the return payload. It stops short of covering auth requirements or rate limits, but the key side effect is disclosed.

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 tight sentences, front-loaded with the purpose before the return values and side effects. Every clause carries information (mechanism, returns, navigation side effect, cap) with no filler, though the density borders on packed.

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 contract and does so well: URL, menu path, matching text, and a pages-tried count on failure. Combined with the disclosed tab-navigation side effect and the schema's parameter docs, an agent has what it needs; only keyword-matching semantics and permission prerequisites are left implicit.

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 defines tab_id, keyword, max_pages, and menu_selector. The description only echoes max_pages ('at most max_pages') and alludes to menu links; it adds no syntax or format detail beyond the structured fields. 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 (find) and resource (a setting), plus the exact mechanism: following the panel's menu links until a page contains the keyword. It is clearly distinguishable from siblings like click, navigate, or find_text, though it never names an alternative to disambiguate. The 'unknown admin panel' framing makes the intent unambiguous.

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 'in an unknown admin panel' implies the scenario in which to reach for this tool (you don't know where a setting lives), but there is no explicit when-not guidance and no sibling is named as an alternative to compare against. Usage is inferred rather than stated.

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

find_textA
Read-onlyIdempotent

Find text on the page: parent selector, context, visibility, position per match. Attaches nearby interactive elements (with refs for click/type_text/hover) for the first visible match. Use it when you know the words on screen but not the selector (query_dom needs one); no match returns count 0.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesLiteral text to find, not a regex
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
max_resultsNoCap on matches returned, in document order
case_sensitiveNoMatch case exactly

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, not open-world), so the bar is lower. The description goes beyond them by disclosing that interactive elements are attached with refs usable by click/type_text/hover and only for the first visible match, plus the count-0 failure signal. It stops short of describing ordering limits or result sizes.

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, all load-bearing, with the behavior front-loaded ahead of the when-to-use routing. The first sentence is telegraphic to the point of being terse ('root selector, parent selector, context, visibility, position per match'), which compresses rather than clarifies, but nothing is wasted.

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?

There is no output schema, so the description must carry the return-value burden, and it does list the salient fields plus the ref-bearing interactives and the zero-match case. Minor gaps remain around result ordering/pagination and how many nearby elements are attached.

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 text, tab_id, max_results, and case_sensitive. The description only hints at matching semantics ('the words on screen') and adds no syntax or default detail beyond the schema; baseline 3 applies.

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?

Specific verb+resource ('Find text on the page') plus an enumerated result shape (parent selector, context, visibility, position) and the side effect of attaching nearby interactives. It is clearly distinguishable from query_dom, which it explicitly contrasts.

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

Usage Guidelines5/5

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

Gives both the selecting condition ('when you know the words on screen but not the selector') and names the alternative with its constraint ('query_dom needs one'). It also states the no-match outcome, so the agent knows what a zero-result call looks like.

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

framesA

Record the page for duration_ms and report how smooth it ran: main-thread frame rate and dropped frames, Long Animation Frames (duration, blocking time, render and style/layout start, the scripts responsible), layout shifts with the elements that moved (CLS for the window only), and the slowest interaction (INP for the window, split into input delay, processing, presentation; needs trusted input, synthetic events have no interaction id). Optionally runs an action (click, hover, scroll, key) right after recording starts. Animations that started are counted too. Compositor-only animations can stay smooth while the main thread drops frames. Refuses on a hidden page: rAF and observers stop there. For load speed use perf_trace; for the settings of each animation, animations.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax long frames listed; counts include all
actionNoAction run right after recording starts
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
duration_msNoRecording window in ms (max 30000)
threshold_msNoLong frames shorter than this are not listed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false/idempotentHint=false without saying why; the description explains the cause (an optional click/hover/scroll/key action runs right after recording starts). It further discloses the hidden-page refusal, the trusted-input requirement for INP, and the compositor-vs-main-thread nuance that 'compositor-only animations can stay smooth while the main thread drops frames.'

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?

Front-loaded with the core purpose before caveats and alternatives, and every sentence carries information (metrics, action behavior, refusal, sibling routing). It is a dense block rather than skimmable bullets, which costs it a point but nothing reads as filler.

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?

With no output schema, the description carries the full burden of describing returns and does so thoroughly: the metric list, the INP breakdown (input delay/processing/presentation), CLS scope, and the LoAF sub-fields. An agent knows what it will get back and under what conditions the tool fails.

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 baseline is 3, but the description adds meaning beyond the schema: it frames the action as optional and run 'right after recording starts', and its trusted-input note maps directly onto the `trusted` parameter's purpose (why hover defaults to real input). The metric-to-parameter mapping (duration_ms window, limit, threshold_ms) is still left 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?

Opens with a specific verb+resource ('Record the page for duration_ms and report how smooth it ran') and enumerates the concrete metrics produced: main-thread frame rate, dropped frames, Long Animation Frames, layout shifts/CLS, and INP. It explicitly distinguishes itself from siblings by naming perf_trace and animations and the conditions that select them.

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

Usage Guidelines5/5

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

Gives explicit routing: 'For load speed use perf_trace; for the settings of each animation, animations.' It also states a hard exclusion ('Refuses on a hidden page: rAF and observers stop there') and the INP caveat ('needs trusted input, synthetic events have no interaction id'). When/when-not/alternatives are all covered.

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

full_page_screenshotA
Read-onlyIdempotent

Full-page capture by scrolling: stitched segments of ~2 viewports (≤1568px), or one image per viewport with stitch=false. Expensive: ~2.7k image tokens per segment, only max_segments returned, the rest via segment_offset. Reading the text you need is cheaper by an order of magnitude — prefer read_page, extract or find_text unless layout is the question.

ParametersJSON Schema
NameRequiredDescriptionDefault
delayNoms between captures (min 500, Chrome quota)
stitchNofalse = one image per viewport
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
max_scrollsNoCap on scroll steps: a taller page is captured only up to here
max_segmentsNoImages returned from the top (≈2.7k image tokens each); segment_offset for the rest
segment_offsetNoSkip the first N segments

TDQS

A4.8/5.0
Behavior5/5

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

Describes scroll behavior, segment stitching, token costs, and limits (max_scrolls, max_segments, offset). Consistent with readOnlyHint and idempotentHint; no contradiction, and the cost information adds transparency.

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 well-structured, front-loading the core purpose, then cost, then usage guidance. It is concise and contains no filler or redundancy, with all sentences contributing to clarity.

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?

The description covers the capture process, cost, when to use, and limits. It does not specify the exact return format (e.g., image URLs), but given the absence of an output schema, the provided information is reasonably complete for an agent to invoke it correctly.

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 descriptions are already thorough (100% coverage) and meaningfully explain each parameter. The description adds context about cost per segment, which enhances the understanding of max_segments, though not all parameters are further elaborated in the description itself.

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 clearly states the tool's function: full-page capture by scrolling, with stitching or separate viewport images. It distinguishes from other screenshot tools by mentioning the stitching behavior and segment limits.

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

Usage Guidelines5/5

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

Explicitly advises when to prefer text-based tools (read_page, extract, find_text) over this screenshot tool, and provides cost trade-offs. This gives clear guidance on when to use it versus alternatives.

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

get_css_stylesA
Read-onlyIdempotent

Why an element looks the way it does: for each CSS property the winning declaration — selector, stylesheet, rule position, !important, @layer, @media — and the ones it overrides, like the Styles panel of DevTools; query_dom gives the computed value, this gives who set it. Read-only, from the CSSOM: stylesheets of another origin without CORS are opaque and listed by href; user-agent styles, @container and @scope rules are not evaluated. properties narrows the output.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorYesCSS selector; ">>>" pierces shadow DOM. Only the first match is inspected
propertiesNoOnly these, e.g. ["margin-top","--brand"]; margin covers its longhands. Omitted = every property a matching rule sets
include_inheritedNoAlso inherited properties (color, font-*, custom properties) with the ancestor that sets them

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly/idempotent/non-destructive). The description goes well beyond: it discloses that output is scoped to the first selector match, that opaque cross-origin stylesheets are listed by href only, and which CSS features (user-agent styles, @container, @scope) are not evaluated — real behavioral caveats an agent needs.

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?

Information-dense and front-loaded: the purpose sentence comes first, followed by the distinctive comparison, then caveats, then the parameter note. Slightly long with heavy parenthetical enumeration, but nearly every clause carries signal.

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?

There is no output schema, and the description compensates by describing the return shape (per-property winning declaration with selector, stylesheet, rule position, importance, layer, media, plus overridden declarations). Combined with the disclosed evaluation limits, an agent has what it needs to call and interpret the 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 description coverage is 100%, so all five parameters are already documented in the schema (shadow-DOM piercing, frame/tab defaults, inherited handling). The description only restates that 'properties narrows the output', adding no syntax or format detail beyond the schema; baseline 3 applies.

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 — resolving which CSS declaration wins for an element — and immediately contrasts it with query_dom ('query_dom gives the computed value, this gives who set it'). An agent can route between the two without opening schemas.

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

Usage Guidelines5/5

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

Explicitly names the sibling alternative and the deciding criterion (computed value vs. originating declaration), and enumerates when the tool will not deliver useful results: cross-origin sheets without CORS, user-agent styles, @container and @scope.

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

get_framesA
Read-onlyIdempotent

List frames (main + iframes) with frameId, parent, URL — for the frame_id parameter of DOM tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds that the tool lists frames with specific fields, which is consistent with annotations and not contradictory.

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 16-word sentence that is front-loaded with the verb 'List' and resource. Every word adds value; no fluff.

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 simple listing tool with one optional parameter and no output schema, the description covers the purpose, output structure, and usage context. It is complete enough for an agent to understand and use the tool correctly.

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% for the single parameter tab_id, and the description does not add any additional semantics or details about the parameter beyond what the schema already provides. Baseline score of 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?

The description clearly states 'List frames (main + iframes) with frameId, parent, URL', specifying the verb (List), resource (frames), and output fields. It distinguishes from siblings like get_tabs by targeting frame IDs for DOM tools.

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 explicitly says 'for the frame_id parameter of DOM tools', indicating when to use this tool (to get frame IDs for DOM operations). It does not mention when not to use or list alternatives, but the usage context is clear.

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

get_interactivesA
Read-onlyIdempotent

List actionable elements (buttons, links, inputs, [role], [onclick]) with ready-to-use CSS selector, label, position, flags. Prefer this over dumping HTML to discover selectors. Document order, cut at limit (count equal to limit: there may be more), each with a ref (n1, n2…) for click, type_text and hover.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax elements returned; raise it on a dense page
scopeNoLimit search (CSS selector)
sinceNocursor from the previous list: only added (+), changed (~) and removed elements; same scope, frame and tab
formatNolines is compact; json adds full attributes per elementlines
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
visible_onlyNofalse also lists elements hidden or scrolled out of view

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral detail beyond that: results are in document order, and 'count equal to limit' signals possible truncation so the agent can raise the limit.

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?

Two dense sentences, front-loaded with what the tool returns before the routing advice and ref usage. Every clause carries information, though the parenthetical on limit is slightly terse.

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 listing tool with full schema coverage and no output schema, the description supplies the missing return-shape context (selector, label, position, flags, refs) and the truncation caveat. It is complete enough to call correctly, missing only explicit return formatting per 'format' value.

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 limit, scope, since, format, tab_id, frame_id and visible_only are all already documented with defaults. The description only reinforces the limit truncation semantics and does not add format or selector syntax beyond the schema, so baseline 3 applies.

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 (list actionable elements) and enumerates what counts as actionable (buttons, links, inputs, [role], [onclick]). It also routes the agent away from the sibling behavior of dumping HTML to find selectors, making it distinguishable without opening schemas.

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 says 'Prefer this over dumping HTML to discover selectors' and explains the ref (n1, n2…) feeds click, type_text and hover, giving clear context for use. It stops short of naming exclusions like when query_dom or read_form would be the better choice.

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

get_page_infoA
Read-onlyIdempotent

Page metadata: title, url, visibility, doctype, charset, meta tags, scripts, stylesheets, links and forms. visibility=hidden means the window is minimized, covered or in the background: the page does not render (screenshots fail) and its timers slow down. dev.server names a dev server (vite, webpack-dev-server, next, nuxt) and dev.overlay carries the compiler message when an error overlay is open: read it before treating the page as valid. For the text use read_page, for specific elements query_dom, for the bridge itself get_status.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, and the description goes further by explaining the operational consequence of visibility=hidden (no rendering, screenshots fail, timers slow) and decoding dev.server/dev.overlay fields. This is behavioral context an agent cannot get from the schema or annotations.

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?

Dense but front-loaded: the field inventory comes first, then semantics, then sibling routing. The long field enumeration is justified because there is no output schema, though the sentence is heavier than strictly necessary.

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?

With no output schema, the description compensates by enumerating return fields and explaining ambiguous states (hidden visibility, dev overlays). Combined with the sibling routing, an agent has everything needed to call and interpret this 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 description coverage is 100% and both parameters (tab_id, frame_id) already document their defaults and cross-references (get_frames). The description adds no parameter-level detail, so the baseline of 3 applies.

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 resource (page metadata) and enumerates the exact fields returned (title, url, visibility, doctype, charset, meta tags, scripts, stylesheets, links, forms), which is far more precise than the tool name alone. It also explicitly distinguishes itself from read_page, query_dom, and get_status.

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

Usage Guidelines5/5

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

Explicitly routes the agent to siblings: 'For the text use read_page, for specific elements query_dom, for the bridge itself get_status.' It also gives a conditional instruction for dev.overlay ('read it before treating the page as valid').

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

get_statusA
Idempotent

Status of the bridge itself, not of a page: call it when a tool you expect is missing or browser commands fail (connected=false: the extension is not reachable). Also reports mode (primary/relay), host, port, server and extension versions, js_evaluation (false under --no-js), write_root, read_root, session_tab_id (the implicit tab), owned_tabs (created by this session), uptime_sec. caps_active and caps_available: a missing tool lives in an inactive cap. enable is the only change it makes: it switches caps on for this session, no restart, and lists the tools added. Optional caps: audits (cookie_audit); visual (inject_css, measure_spacing, emulate_media, viewport_resize); perf (animations, frames, perf_trace, screencast, lighthouse, heap_snapshot); network (http_auth, set_geolocation, track_events); storage (get_storage, set_storage, session_fixture); dom (modify_dom, watch_dom, drag_and_drop); files (save_page, manage_downloads, session_record).

ParametersJSON Schema
NameRequiredDescriptionDefault
enableNoCaps to switch on now, all in one call; "all" = every cap

TDQS

A4.5/5.0
Behavior5/5

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

With readOnlyHint=false, the description carries the burden of explaining the mutation, and it does: 'enable is the only change it makes: it switches caps on for this session, no restart, and lists the tools added.' This confirms idempotency semantics and scopes the write precisely, adding context the annotations alone do not provide.

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 purpose is front-loaded, which is good, but the body is a dense run-on paragraph with heavy parenthetical nesting, and the trailing list of every cap-to-tool mapping is bulky. Most content earns its place given the missing output schema, but the structure is poor.

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?

There is no output schema, so the description correctly enumerates the returned fields (mode, host, port, versions, js_evaluation, write_root, read_root, session_tab_id, owned_tabs, uptime_sec, caps_active, caps_available) and explains the enable side effect. An agent has everything needed to call and interpret this diagnostic 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 baseline is 3, but the description goes further by mapping each cap value (audits, visual, perf, network, storage, dom, files) to the concrete tools it unlocks. That is meaningful added context for choosing enable values beyond the enum listing in 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?

The opening clause states a specific resource and scope: 'Status of the bridge itself, not of a page.' This immediately distinguishes it from page-oriented siblings like get_page_info, and the enumeration of reported fields (mode, host, port, versions, session_tab_id, caps) makes the resource concrete.

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?

It gives an explicit trigger ('call it when a tool you expect is missing or browser commands fail') and a diagnostic reading (connected=false means the extension is unreachable), plus the enable use case. It does not name a sibling alternative to reach for instead in other situations, so it falls short of a full 5.

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

get_storageA
Read-onlyIdempotent

Read localStorage, sessionStorage or cookies of the current origin (type=all for every one). Read-only. Cookies come with domain, path, expiry and the httpOnly/secure flags, so this also answers whether a session cookie is present — write them back with set_storage, or snapshot a logged-in state with session_fixture.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoall returns the three togetherall
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, etc. Description adds specifics about cookie details (domain, path, expiry, flags) and confirms read-only nature. Consistent and adds value.

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, front-loaded with verb and resource. No wasted words; each sentence contributes purpose and detail.

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?

No output schema, but description mentions cookie structure. For a simple read tool, it sufficiently covers behavior and output shape. Adequate given the tool's simplicity.

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 has 100% description coverage. Description adds context for 'type' (all returns three together) and 'tab_id' default behavior, complementing the schema well.

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?

Description clearly states the tool reads localStorage, sessionStorage, or cookies of the current origin. It differentiates from siblings set_storage and session_fixture by mentioning write and snapshot operations.

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?

Provides context on when to use, e.g., checking for session cookies, and hints at alternatives. Lacks explicit when-not-to-use but offers good guidance overall.

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

get_tabsA
Read-onlyIdempotent

List every open tab with id, url, title, active flag and mine (created by this session). Find a tab_id when the implicit target is not the one you mean. include_windows adds position, size, state and type of each window — needed before moving or tiling. Session tabs gone since the last call come back once in closed_session_tabs with the reason (closed, window_closed, replaced, closed_by_bridge).

ParametersJSON Schema
NameRequiredDescriptionDefault
include_windowsNoAlso return the windows with bounds, state, type and tab count

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. Beyond that the description adds genuinely useful behavioral detail: closed tabs resurface once in closed_session_tabs with a reason enum (closed, window_closed, replaced, closed_by_bridge). That is return-behavior context the annotations do not carry.

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 tightly packed sentences with the primary listing behavior front-loaded and no filler. The final sentence is dense with enumerated reasons but each clause is informative rather than redundant.

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 read-only, single-optional-param tool with no output schema, the description covers the returned fields, the parameter's effect and trigger, and the closed-tab edge case. Nothing an agent needs to call it correctly is 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 100%, so the schema already documents include_windows. The description adds value by reframing the returned window fields as 'position, size, state and type' and attaching the actionable rationale ('needed before moving or tiling'), which is more than the schema's terse 'bounds, state, type and tab count'.

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 ('List') and resource ('every open tab'), then enumerates the exact fields returned (id, url, title, active flag, mine). It also distinguishes its role from generic page tools by naming the tab_id lookup use case, so an agent can tell what it does 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 Guidelines4/5

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

Gives a clear when-to-use rule ('Find a tab_id when the implicit target is not the one you mean') and a conditional trigger for the parameter ('include_windows ... needed before moving or tiling'). It stops short of naming the alternative siblings (move_tab, tile_windows) explicitly, so it is strong context rather than full when/when-not routing.

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

handle_dialogsA
Idempotent

Auto-accept/dismiss future JS dialogs (alert/confirm/prompt), logging them. reset restores native dialogs and returns the log.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoaccept/dismiss auto-answer future dialogs; reset restores native behaviouraccept
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
prompt_textNoReturned by window.prompt on accept

TDQS

A4.1/5.0
Behavior4/5

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

Annotations provide idempotentHint=true, and the description adds logging behavior and the reset functionality. It discloses that dialogs are auto-handled and logged, but does not detail the log format or potential side effects like interference with user interaction.

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 sentences, concise, and front-loaded with the primary action. Every sentence adds value.

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 simple tool with clear schema and annotations, the description and schema together fully explain the tool's capabilities. The log return is mentioned, and optional parameters are covered.

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?

All three parameters have descriptions in the schema (100% coverage), so the description adds minimal extra value beyond what the schema already provides. The description mentions logging and reset but not parameter-specific details.

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 clearly specifies the tool auto-accepts or dismisses future JS dialogs (alert/confirm/prompt) and logging them, with a reset option. It uniquely identifies the resource and action among sibling tools.

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 implies usage for dialog handling but does not explicitly state when to use this tool vs alternatives or when not to use it. No context on prerequisites or exclusions.

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

handoffA
Idempotent

Hand the browser to the user for what only a person can do — 2FA, CAPTCHA, login, a choice — and wait: a banner in the page shows your message with Done/Cancel, the call returns on click or timeout, redirects included. pick_element: the user clicks an element and you get its selector. Never type credentials yourself. ask: the user types a reply in the banner ("which of the three?") and you get it as answer. pick_max: with pick_element, up to N elements; the user presses Done when finished.

ParametersJSON Schema
NameRequiredDescriptionDefault
askNoShow a text box in the banner; the reply comes back as answer
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
messageYesWhat the user should do, one line
timeoutNoms to wait for the click, default 5 min
pick_maxNoWith pick_element: up to N elements, the user presses Done when finished
in_terminalNoAlso ask in the Claude Code terminal (MCP elicitation) when the client supports it; the first answer wins. Not for pick_element
pick_elementNoAsk the user to click an element; returns its selector, text and box

TDQS

A4.7/5.0
Behavior5/5

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

Goes well past the annotations by describing the interaction contract: a banner with the message and Done/Cancel, return triggered by click or timeout, redirects included, default 5-minute wait. It also discloses the answer-passing behavior of ask and the selector/text/box return of pick_element, which the annotations do not cover.

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?

Front-loaded with the core purpose and the safety rule before the mode details, and every clause carries information. Slightly dense/long as a single run-on paragraph listing four modes, which costs a point versus a crisply structured alternative.

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 7-param, no-output-schema tool, the description supplies the missing return semantics (selector, answer, Done signal) and the safety constraint. It could say more about what happens on timeout expiry or Cancel, but nothing essential for correct invocation is 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 100%, so the baseline is 3, but the description adds genuine semantic context beyond the schema — it explains what the mode flags actually produce ('you get its selector', 'the reply comes back as answer', 'user presses Done when finished') and clarifies tab_id fallback and timeout behavior.

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 precise verb+resource+scope: handing the browser over to the human for actions only a person can perform, with named conditions (2FA, CAPTCHA, login, a choice). An agent can immediately separate this from automated siblings like click, type_text, and fill_form.

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

Usage Guidelines5/5

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

Explicitly enumerates when to use it (2FA, CAPTCHA, login, a choice) and adds a clear negative rule: 'Never type credentials yourself,' which routes the agent away from type_text/fill_form. The three mode flags (pick_element, ask, pick_max) are each paired with the situation that selects them.

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

heap_snapshotA
Destructive

Take a JS heap snapshot of the tab (after a garbage collection) and summarize it: object count, total size, detached DOM nodes, the classes that take most memory. With compare_to (an earlier snapshot file): which classes grew, to find a leak — snapshot, repeat the suspect action a few times, snapshot again. The .heapsnapshot file opens in DevTools > Memory. Works only in launch mode (chrome-bridge --launch [--headless]): it needs the DevTools port of the dedicated browser, which the extension in your own Chrome cannot provide: Chrome refuses the HeapProfiler domain to extensions.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoClasses listed
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the .heapsnapshot there and return the path instead of the content
compare_toNoAbsolute path of an earlier .heapsnapshot to diff against

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: a forced garbage collection, the launch-mode requirement and its rationale, the side artifact (.heapsnapshot opens in DevTools > Memory), and the file-vs-content behavior when saving. It does not explain why the tool is flagged destructiveHint=true (e.g. page pause / GC-induced disruption), so one behavioral thread is left dangling.

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?

Front-loads the core action and its outputs, then layers on the diff workflow and the launch-mode constraint in a logical order. It is dense and slightly run-on with chained colons, but no sentence is filler.

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?

No output schema exists, yet the description tells the agent exactly what a call yields (the summarized metrics or a saved file path) and what happens in compare mode. Combined with the capability constraint, an agent has everything needed to invoke it correctly.

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 already 100% (baseline 3), but the description adds real meaning: compare_to is framed as an earlier snapshot file used to identify grown classes, and save_to's path-vs-content tradeoff is implied by the return-format discussion. top and tab_id semantics 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 (take a JS heap snapshot of the tab) and enumerates what the summary contains: object count, total size, detached DOM nodes, top memory classes. It is clearly distinguishable from sibling diagnostics like perf_trace or lighthouse.

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

Usage Guidelines5/5

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

Gives the concrete leak-hunting workflow (snapshot, repeat the suspect action a few times, snapshot again, then diff with compare_to) and an explicit when-not/precondition: it only works in launch mode with chrome-bridge --launch, because Chrome refuses the HeapProfiler domain to extensions.

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

hoverA
Idempotent

Hover over an element, by CSS selector or ref. Default: synthetic mouseenter/mouseover/mousemove, which fire JS hover handlers but not CSS :hover. trusted moves the real mouse pointer (chrome.debugger), so CSS :hover rules and their transitions apply.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoFrom get_interactives
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
trustedNoReal browser pointer via chrome.debugger, main frame only: needed for CSS :hover
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorNoCSS selector; ">>>" pierces shadow DOM

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description discloses the non-obvious behavioral distinction: synthetic events fire JS handlers but not CSS :hover, while trusted drives the real pointer via chrome.debugger so CSS transitions apply. It does not cover failure modes or return behavior, but it discloses the trait that actually matters 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, front-loaded with the action and addressing modes, then the mode semantics. Every clause earns its place with no filler.

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 single-action interaction tool with full schema coverage and no output schema, the description is nearly complete: it covers addressing, modes, and the main-frame limitation (though that also appears in the schema). Return/error behavior is not described, a minor gap for a hover action.

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% and each param carries a description, so the baseline is 3. The description adds real meaning for the trusted flag, explaining the mechanism (chrome.debugger) and the consequence (CSS :hover applies), which is more than the schema's terse wording conveys.

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 (hover) and resource (an element), plus the two addressing mechanisms (CSS selector or ref). An agent can distinguish this from siblings like click or move it easily without opening the schema. It is a clean verb+resource statement.

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 clear guidance on when to choose the trusted mode (when CSS :hover rules and their transitions matter), which is the primary usage decision for this tool. It does not name alternative tools or explicit when-not conditions, but the mode-selection guidance is concrete and actionable.

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

http_authA
Idempotent

Set/clear credentials for HTTP Basic/Digest auth dialogs (browser-wide, in-memory only).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesset installs credentials for HTTP auth prompts; clear removes them
passwordNoRequired for action=set; kept in memory, never written to disk
usernameNoRequired for action=set

TDQS

A4.2/5.0
Behavior4/5

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

Annotations provide basic hints (readOnlyHint=false, destructiveHint=false, idempotentHint=true). The description adds valuable context: credentials are stored in-memory only, browser-wide. This is consistent with annotations and improves understanding beyond them.

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 sentence that captures verb, resource, scope, and key constraints. No wasted words, front-loaded with the core action.

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?

Given no output schema, the description adequately covers purpose, scope, and parameter dependencies. It could mention that credentials apply to all requests (global) or note potential security considerations, but for a simple set/clear tool, it is largely complete.

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% with clear descriptions for all three parameters. The description reinforces the action enum and indicates username/password are required for action=set. This adds marginal clarity, but the schema already 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?

The description clearly states the action (set/clear), the resource (credentials for HTTP Basic/Digest auth dialogs), and the scope (browser-wide, in-memory only). It is specific and distinct from sibling tools, which are unrelated to auth.

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 implies usage context ('for HTTP Basic/Digest auth dialogs'), providing clear context. It does not explicitly mention when not to use or alternatives, but the context is sufficiently narrow given the diverse sibling list.

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

http_requestA
Destructive

HTTP request sent from the browser, with the logged-in user's cookies: fetches what a server-side request gets a login page for (invoices, authenticated JSON, exports). Text bodies inline (capped by max_length); save_to writes the bytes — the way to read a PDF, since read_page returns nothing on a PDF tab, and the way to save any file that has a URL: no click on Download, no browser download, no "Save as" dialog.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesAbsolute URL. Cookies are sent for its origin
bodyNoRequest body (POST/PUT/PATCH)
methodNoHEAD fetches headers only, without the bodyGET
headersNoExtra request headers
save_toNoAbsolute path: write the response bytes here instead of returning them (PDF, images, archives)
max_lengthNoMax chars of body returned inline

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations it discloses non-obvious behavior: cookies are sent for the URL's origin, text bodies are inline but capped by max_length, and save_to redirects the bytes to disk. Its main gap is that it frames the tool purely as a fetch/read even though the schema permits POST/PUT/DELETE and the annotations flag destructiveHint=true — it does not contradict the annotations, but it undersells the mutation capability.

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?

Front-loaded with the core concept and every clause carries information (cookie auth, capping, PDF workaround, no download dialog). It is dense and slightly run-on across em-dashes, but wastes little.

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 6-parameter tool with a nested headers object and no output schema, the description covers the behavior an agent needs to call it correctly, including the key safeguards (cookie scope, inline cap, save_to). It stops short of mentioning write-method implications or failure modes, but is otherwise sufficient.

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 already 100%, so 3 is the floor, but the prose adds real meaning for max_length (the inline body cap) and save_to (writes bytes instead of returning them, for PDFs/images/archives) rather than merely restating 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?

It pairs a specific verb and mechanism ('HTTP request sent from the browser, with the logged-in user's cookies') with the exact contrast that matters: it reaches content a server-side request only sees a login page for. It also names the sibling it is not (read_page) and the download flows it replaces, so an agent can place it 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 Guidelines5/5

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

It gives explicit when-to-use cases (authenticated invoices, JSON, exports) and explicit when-not/when-else: use save_to for a PDF because read_page returns nothing on a PDF tab, and use this instead of clicking Download or 'Save as'. The routing to alternatives is concrete rather than implied.

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

inject_cssA
Idempotent

Inject a CSS rule into the page. Stays until the next navigation or reload, and re-injecting the same id replaces it rather than stacking. Affects only what is rendered — the stylesheet of the site is untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
cssYesOne or more CSS rules, as they would appear in a stylesheet
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.5/5.0
Behavior5/5

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

The description adds significant behavioral context beyond annotations: lifetime (until navigation/reload), idempotency (re-inject replaces), and non-destructive nature (stylesheets untouched). Annotations already indicate idempotent=true and destructive=false, but description enriches with concrete details.

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?

Three concise, front-loaded sentences with no redundancy. Each sentence adds essential information: purpose, behavioral details, and scope. Excellent efficiency.

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?

Given the tool's simplicity and the presence of detailed parameter schema, the description covers all necessary aspects: what it does, how it behaves (lifetime, idempotency), and its non-destructive nature. No missing essentials.

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% with adequate descriptions for both parameters. The description does not add new parameter-level information beyond what's in the schema. The mention of 'same id' in the description implies an identifier not present in the parameters, which could cause confusion but does not directly affect parameter semantics.

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 clearly states the verb 'inject' and the resource 'CSS rule into the page'. It distinguishes this tool from siblings like modify_dom or execute_js by focusing specifically on CSS injection.

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 explains persistence ('stays until next navigation') and idempotency ('re-injecting the same id replaces it'). It also clarifies it only affects rendered content, not the site's stylesheet. However, it does not explicitly state when not to use it or mention alternatives.

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

lighthouseA
Destructive

Run a full Lighthouse audit (performance included, unlike chrome-devtools-mcp, plus accessibility, best practices, SEO) and return scores, the five lab metrics and the failing audits that weigh most; the full report goes to .report.json and .report.html files. Works only in launch mode (chrome-bridge --launch [--headless]): it needs the DevTools port of the dedicated browser, which the extension in your own Chrome cannot provide. Loads the URL in a new tab of that browser; takes 20-60 s; the first call downloads Lighthouse through npx.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoPage to audit; omitted = the URL of the target tab
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path without extension: the report is written to <path>.report.json and <path>.report.html
categoriesNoSubset of categories; omitted = all four
form_factorNomobile emulates a mid-range phone with slow 4G, as PageSpeed Insights doesmobile

TDQS

A4.5/5.0
Behavior5/5

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

Adds rich context beyond annotations: launch-mode requirement, new-tab loading, first-call npx download, 20-60s duration, file output paths. Annotations say destructiveHint=true (odd for a read-only audit), but the description doesn't contradict this; it explains the operational profile clearly. Could note why destructive is true (file writes?) but the file output mentions that.

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?

Dense but front-loaded: purpose first, then use constraints, then timing. Three sentences cover a lot of ground efficiently. Slightly overpacked but every sentence earns its place for a complex tool.

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?

Complete for a complex audit tool: covers what it returns (scores, lab metrics, failing audits), file outputs, prerequisites (launch mode, DevTools port), timing, and first-call overhead. No output schema, but the description explains return content. Missing only explicit alternative comparison beyond chrome-devtools-mcp.

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 3. The description adds value by explaining the 'url' default (target tab's URL), 'categories' default (all four), 'form_factor' default (mobile emulation of mid-range phone on slow 4G like PageSpeed), and 'save_to' behavior (.report.json/.report.html). More than the schema alone in some cases.

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 (Run) and resource (full Lighthouse audit) with the exact scope (performance, accessibility, best practices, SEO) and output form (scores, five lab metrics, failing audits). Explicitly contrasts itself with chrome-devtools-mcp, differentiating from siblings like 'audit' and 'perf_trace'.

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?

Provides strong context: works only in launch mode (chrome-bridge --launch), loads in a new tab, takes 20-60s, first call downloads via npx. These are critical usage constraints. Doesn't explicitly name alternatives like 'perf_trace' or 'audit' but the chrome-devtools-mcp contrast implies positioning.

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

manage_downloadsA

List downloads, start one, or wait for the newest to finish. Files land in the browser Downloads folder, not on the server. download reports the real state: with Chrome set to ask where to save, it comes back waiting_for_user — bytes fetched, nothing moves until someone picks a destination. To save a file that has a URL use http_request with save_to instead: browser cookies, bytes on disk, no dialog; a file the page builds goes through capture_downloads.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoWhat to download (action=download); sent with the session cookies of its origin
limitNoMax download entries returned, newest first
actionYesdownload fetches with the browser cookies and reports the real state; wait_for_complete blocks until the newest finishes
timeoutNoMax ms (wait_for_complete)
filenameNoRelative path inside the Downloads folder (action=download)

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). The description adds substantial context beyond them: files land in the browser Downloads folder not on the server, and 'download' reports the real state, returning waiting_for_user with bytes fetched but nothing moved when Chrome asks where to save.

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?

Front-loaded with the three actions, then the storage location, then the state semantics, then the sibling routing. Dense but every sentence carries distinct, load-bearing information with no filler.

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?

No output schema exists, yet the description explains the meaningful return state (waiting_for_user) for the download action. Annotations carry the safety profile. Minor gap: it doesn't characterize what 'list' returns or key entries, but the essential call-correctness information is present.

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 all five parameters (baseline 3). The description adds meaning beyond it by explaining what each action does behaviorally, particularly 'download' fetching with browser cookies and reporting the true state with the waiting_for_user nuance.

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 three specific verbs (list, start/download, wait) against the resource 'downloads', and immediately names the sibling tools it is not (http_request with save_to, capture_downloads). An agent can distinguish this from those siblings 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 Guidelines5/5

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

Gives explicit routing rules: use http_request with save_to for a file that has a URL, and capture_downloads for a file the page builds. Both the alternative and the condition selecting it are spelled out, leaving nothing to inference.

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

measure_spacingA
Read-onlyIdempotent

Measure the gap, overlap and distance in CSS pixels between two elements, with their margins and paddings. Read-only. Values come from the current layout, so zoom and viewport size change them: viewport_resize({zoom:1}) and a fixed viewport_resize make results comparable across runs.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selector1YesFirst element; distances are measured from its box
selector2YesSecond element; ">>>" pierces shadow DOM

TDQS

A4.4/5.0
Behavior4/5

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

The description states 'Read-only' and explains that values depend on the current layout, zoom, and viewport size, which is important behavioral context. The annotations (readOnlyHint, destructiveHint false) align perfectly. It does not mention potential errors or edge cases, but the most critical behavioral traits are disclosed.

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?

The description is slightly longer than strictly necessary, containing about 40 words, but every sentence contributes valuable information: metrics, units, read‑only nature, layout dependence, and normalization advice. The structure is clear and front‑loaded with the core 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?

Without an output schema, the description implies that the tool returns numeric values for gap, overlap, and distance, but it does not explicitly describe the return format or whether additional data (e.g., margins) is included. Given the tool's simplicity, the essential context is present, though a brief note about the exact return shape would make it fully complete.

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

Parameters5/5

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

Every parameter has a meaningful description: `tab_id` explains its fallback behavior, `selector1` and `selector2` both clarify how distances are measured from their boxes and that `>>>` pierces shadow DOM. This adds semantic depth beyond simple name/type information and covers 100% of the parameters.

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 clearly states a specific action (measure), a specific resource (two elements), and the exact metrics (gap, overlap, distance) along with units (CSS pixels). It also includes the relevant scope (margins and paddings) and notes about layout dependence. This leaves no ambiguity about what the tool does.

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 provides practical guidance for obtaining consistent results by recommending `viewport_resize({zoom:1})` for comparability across runs. While it does not explicitly contrast with alternatives (none of the siblings perform measurements), it effectively communicates how to use the tool correctly in a layout‑dependent context.

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

modify_domA
Idempotent

Change an element in the live DOM: setAttribute, removeAttribute, addClass, removeClass, setStyle, setTextContent. Nothing is persisted — the next reload restores the page as the server sends it. For styling many elements at once inject_css is one call instead of N.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoAttribute name
valueNoAttribute value, style declaration, or text, per action
actionYessetStyle takes a CSS declaration in value; addClass/removeClass take className
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorYesCSS selector; ">>>" pierces shadow DOM. Only the first match is changed
classNameNoClass to add or remove (addClass/removeClass)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate idempotent and non-destructive. Description adds transparency that changes are not persisted across reloads and that only the first match is modified. No contradictions with annotations.

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 concise sentences plus a one-sentence alternative recommendation. No redundant information; every sentence adds value.

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?

Given the 7 parameters fully described in the schema, no output schema, and annotations providing safety profile, the description adequately covers core functionality and persistence behavior. Could enhance by contrasting with query_dom for read-only access.

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% with descriptive parameter names and descriptions. The description does not add additional context beyond the schema, so baseline score of 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?

The description clearly states the tool changes an element in the live DOM, enumerates specific actions (setAttribute, removeAttribute, etc.), and contrasts with inject_css for bulk styling. It differentiates itself from sibling tools like inject_css.

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 states when to use inject_css instead for many elements, providing clear guidance. Does not explicitly exclude other scenarios, but the contrast is sufficient for most use cases.

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

monitor_networkA
Read-onlyIdempotent

Monitor network requests. source=page: XHR/fetch hook (installed on first call); source=browser: all requests incl. static assets; source=websocket: connections and messages. format=har exports HAR 1.2. It only observes: to block, stub or rewrite requests use network_rules, to send one yourself http_request.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear buffer after read
limitNoMost recent; buffer 1000
sinceNocursor from the previous read: only newer entries, nothing deleted
formatNohar exports HAR 1.2 for external toolinglines
sourceNopage: XHR/fetch only; browser: static assets too; websocket: connections and messagespage
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds value beyond them by disclosing the side effect that the page hook is 'installed on first call' and reinforcing the observe-only contract ('It only observes'). It stops short of describing buffering/pagination behavior beyond what the schema notes.

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?

Three tight clauses, front-loaded with the verb and resource, then modes, then alternatives. Zero filler; every phrase conveys routing or behavior information.

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 observation tool with full annotation coverage and a complete schema, the description covers modes, output format, and sibling routing. It omits any hint about return shape (e.g. what lines/json/har contain), but with no output schema and safety fully declared, this is a minor gap.

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 documented in the schema; the description's source and format explanations largely restate the enum descriptions. Baseline 3 is appropriate since 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+resource ('Monitor network requests') and immediately decomposes the three source modes (page/browser/websocket), which distinguishes it from the many sibling read tools. An agent can tell exactly what this captures 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 Guidelines5/5

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

Explicitly routes the agent to alternatives by condition: 'to block, stub or rewrite requests use network_rules, to send one yourself http_request.' This is textbook when-to-use and when-to-use-something-else guidance, including the source selection criteria.

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

move_tabA
Idempotent

Move an existing tab into another window (chrome.tabs.move), keeping id, history and page state; works on chrome-untrusted:// tabs too. The destination must be a normal window: out of an app/popup window is fine, into one is refused. A ChromeOS Terminal tab can be pulled out (new_window, window_type popup) but never merged back: extensions cannot create app windows.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoNew window y (new_window)
leftNoNew window x (new_window)
indexNoPosition in the destination window; -1 appends at the end
widthNoNew window width px (new_window)
heightNoNew window height px (new_window)
tab_idYesTab to move; get it from get_tabs
window_idNoDestination window; get_tabs reports windowId for every tab
new_windowNoExtract the tab into a fresh window instead of an existing one
window_typeNonew_window only: popup has no tab strip nor omnibox, the terminal-window looknormal

TDQS

A4.4/5.0
Behavior5/5

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

The description goes beyond the annotations by detailing side effects and edge cases: it preserves id/history/state, works on chrome-untrusted:// tabs, only allows moving into normal windows, and clarifies that ChromeOS Terminal tabs can be pulled out but not merged back. This is extensive behavioral disclosure.

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 concise yet information-dense, packing all necessary constraints and nuances into two sentences without redundancy or filler. It is well-structured and easy to parse.

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?

Given the complexity of the tool (edge cases, constraints, parameter interactions), the description covers the essential usage rules comprehensively. It does not describe the return value or error behavior, but since there is no output schema and the primary usage context is clear, this is a minor gap.

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% and each parameter already has descriptive text in the schema. The main description does not add meaning beyond what the schema provides; it merely references get_tabs for tab_id and window_id, which is already in the schema descriptions. Thus 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?

The description clearly states the action (move an existing tab) and the target resource (into another window), while also providing key constraints (destination must be normal, etc.). It distinguishes itself from sibling tools like get_tabs or create_tab by focusing specifically on moving tabs.

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 concrete usage guidance: it explains where to get the tab_id (from get_tabs) and notes special cases like chrome-untrusted:// and ChromeOS Terminal tabs. However, it does not explicitly contrast with alternative tools (e.g., tab_action) or state when not to use this tool.

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

network_rulesA
Idempotent

Network interception, browser-wide, survives reloads until cleared: block, redirect, set/remove headers, stub a synthetic body, or record real API responses and replay them with forced errors/latency (local helper; from HTTPS pages the stub host must be trusted). It changes traffic, while monitor_network only observes it and http_request sends one request; each rule comes back as added, list shows them, clear removes them all.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoResponse body (action=stub)
nameNoFixture name for record/replay
actionYesrecord saves the page's API responses (url_filter) as a fixture, replay serves them with overrides; list/clear
headerNoHeader name for action=modify_header, e.g. "User-Agent"
statusNoaction=stub
overridesNoreplay: force a status, body or delay on matching URLs — error states a real backend will not produce
url_filterNodeclarativeNetRequest urlFilter, e.g. "||example.com/api/*"
content_typeNoaction=stubapplication/json
header_valueNoOmit to remove header
redirect_urlNoDestination for action=redirect
header_targetNoresponse = strip content-security-policy / x-frame-options, inject CORSrequest
resource_typesNoLimit the rule to these request types; omitted = all of them

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=true, and the description adds substantial context beyond them: persistence semantics ('survives reloads until cleared'), a prerequisite ('from HTTPS pages the stub host must be trusted'), and return behavior ('each rule comes back as added, list shows them, clear removes them all'). This is exactly the kind of extra behavioral detail that structured fields cannot convey.

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?

Front-loaded with the core purpose and capability list, then constraints and sibling differentiation. Two long, dense sentences pack a lot in with little waste, though the parenthetical constraints interrupt the flow slightly.

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 12-parameter tool with no output schema, the description covers capabilities, persistence, a trust prerequisite, and return-behavior ('added'/'list'/'clear'). It stops short of explaining per-action prerequisites, but the schema's 100% coverage fills that gap, leaving the definition largely complete.

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 each of the 12 parameters is already documented. The description loosely maps actions to capabilities but adds no parameter-level detail (formats, defaults, required pairings) beyond what the schema already states, so the baseline of 3 applies.

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 ('Network interception, browser-wide') and enumerates the concrete capabilities (block, redirect, set/remove headers, stub, record/replay). It explicitly distinguishes itself from siblings monitor_network and http_request, so an agent can identify it 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 Guidelines4/5

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

Names two alternatives and the condition that separates them: monitor_network 'only observes' traffic while http_request 'sends one request', positioning this tool as the one that changes traffic. Clear context, but it does not spell out when to pick each individual action or when-not to intercept at all.

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

perf_traceA
Destructive

Record a DevTools performance trace and return its conclusions, never the trace: LCP with its phases (TTFB, resource load delay and duration, render delay), FCP, CLS (session windows), INP, the document request, render-blocking resources, long tasks with the function responsible, long animation frames. The raw trace goes to a JSON file (path and size in the result) that DevTools > Performance can load. action record (default) = start, reload unless reload: false, optional action, wait duration_ms, stop. start/stop bracket anything else done meanwhile. Uses chrome.debugger: Chrome shows its debugging bar while tracing; in launch mode nobody sees it. Refuses on a hidden page. For smoothness during an interaction use frames, for scores lighthouse.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNorecord does start → wait → stop in one callrecord
reloadNoReload the page right after tracing starts (default true for record, false for start)
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the trace JSON there and return the path instead of the content
duration_msNorecord: how long to trace, max 60000
interactionNoAction run right after recording starts

TDQS

A4.6/5.0
Behavior4/5

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

Adds real side-effect context beyond the annotations: chrome.debugger usage, the visible Chrome debugging bar (and that launch mode hides it), the default page reload, and refusal on a hidden page — which partly accounts for the non-idempotent/destructive hints. It never states why destructiveHint=true or what, if anything, is mutated/discarded, so it falls just short of full disclosure.

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?

Front-loaded with purpose and return payload, then side effects, then alternatives — no filler sentences and each block earns its place. It is dense (one long run-on inventory of metrics) but not padded.

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 complex, nested-parameter tool with no output schema, the description carries the return-value burden itself (conclusions, never the trace; JSON file path/size) and covers the debugger requirement, refusal case, and action semantics. An agent has everything needed to call it correctly.

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 already 100%, so the baseline is 3, but the description adds relational meaning the schema does not: "record (default) = start, reload unless reload: false, optional action, wait duration_ms, stop" and the differing reload default between record and start. The interaction and save_to parameters are not elaborated beyond the schema, keeping it from a 5.

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 ("Record a DevTools performance trace") plus exactly what it returns (LCP with phases, FCP, CLS, INP, long tasks, LoAF, etc.). It also distinguishes itself from siblings by naming frames and lighthouse as alternatives, so an agent can route 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 Guidelines5/5

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

Explicit routing guidance: "For smoothness during an interaction use frames, for scores lighthouse." It also explains when to use each action mode (record = start+reload+wait+stop; start/stop bracket other work) and gives a refusal condition (hidden page), which is exactly the when/when-not/alternative structure.

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

press_keyA

Send a key to the focused element (or to selector, focusing it first) as a real keydown/keypress/keyup sequence, so framework handlers fire. For typing a value use type_text; this is for Enter, Tab, Escape, arrows and shortcuts. Not idempotent: two calls send the key twice. Returns page_changed like click; when the key opens or reveals something, the refs of the visible interactives follow.

ParametersJSON Schema
NameRequiredDescriptionDefault
altNoHold Alt
keyYese.g. "Enter", "Escape", "Tab", "ArrowDown"
ctrlNoHold Control
metaNoHold Meta (Command/Windows)
shiftNoHold Shift
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
trustedNoReal browser key (isTrusted) via chrome.debugger, main frame only
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorNoTarget (default: activeElement)

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, idempotentHint=false, destructiveHint=false. The description adds value beyond this by stating it is NOT idempotent ('two calls send the key twice') and that it returns page_changed like click, plus mentions that refs of visible interactives follow when something opens. This is useful context beyond annotations, though return format details are lightly covered.

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, front-loaded with the core behavior and usage guidance. Every part earns its place, including the non-idempotency note and return behavior. No wasted words.

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?

Given annotations covering safety profile and a 100%-covered schema, the description is nearly complete. It covers purpose, usage, non-idempotency, and return behavior. Minor gap: does not explain 'trusted' parameter behavior, but the schema covers that. Overall, an agent has what it needs to invoke correctly.

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 parameters like alt, ctrl, meta, shift, tab_id, trusted, frame_id are documented in the schema. The description clarifies that the key targets the focused element by default or a selector, which maps to the selector parameter, but adds no new syntax or format beyond schema. Baseline 3 is appropriate when 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 ('Send a key to the focused element') and explains the mechanism (real keydown/keypress/keyup sequence). It differentiates from the sibling type_text by explicitly stating that typing a value should use type_text, and this is for Enter/Tab/Escape/arrows/shortcuts.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'For typing a value use type_text; this is for Enter, Tab, Escape, arrows and shortcuts.' Names the alternative and the condition that selects it. Also notes it targets the focused element by default or a selector.

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

query_domA
Read-onlyIdempotent

Query DOM elements by CSS selector, returning structure, attributes, bounding rect and, with properties, computed styles. Use it when you already have a selector (no match: count 0); to find one, get_interactives or find_text; for the rule that set a style, get_css_styles.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax elements returned, from the top of the match list
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorYesCSS selector; ">>>" pierces shadow DOM. Matches all, not just the first
propertiesNoComputed styles to include, e.g. ["color"]

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered; the description adds that a non-matching selector yields count 0 and that computed styles are opt-in via properties. It stops short of describing result shape beyond the field list or pagination/truncation behavior relative to limit.

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; the capability statement comes first and the disambiguation clause follows. Every clause carries information an agent needs to choose or call the tool.

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?

With no output schema, the description carries the return-value burden and does so (structure, attributes, bounding rect, computed styles). Combined with 100% parameter coverage and read-only annotations, nothing essential for correct invocation is missing.

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 limit, tab_id, frame_id, selector and properties are all documented in the schema, including the '>>>' shadow-DOM syntax and the default tab fallback. The description only echoes the properties/computed-styles relationship, adding little beyond the schema baseline.

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 (query) and resource (DOM elements) plus the return payload (structure, attributes, bounding rect, optional computed styles). It explicitly distinguishes itself from get_interactives, find_text and get_css_styles, so an agent can route correctly 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 Guidelines5/5

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

Gives an explicit precondition ('when you already have a selector'), names the alternatives for the adjacent tasks (get_interactives, find_text for discovery; get_css_styles for style provenance), and notes the empty-result case. Both when-to-use and when-to-use-something-else are covered.

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

read_consoleA
Destructive

Read console messages captured since page load, incl. uncaught errors and unhandled rejections. clear deletes the messages it returns, hence not read-only; since=cursor reads only newer ones without deleting, and failed requests are in monitor_network.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear buffer after read
levelNoall merges every level in one chronological listall
limitNoMost recent; buffer 1000
sinceNocursor from the previous read: only newer entries, nothing deleted
formatNolines is compact; json keeps timestamps and stack traceslines
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
sourcemapNoResolve bundle.js:line:col frames to source files through their source maps

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds the crucial detail of WHAT is destroyed (the messages it returns) and offers the non-destructive since=cursor path. That is meaningful context beyond the annotations, though it says nothing about buffer limits or rate behavior (partly covered by the schema).

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?

Three tightly packed sentences with zero filler. The core purpose is front-loaded, and the destructive caveat and alternative are stated immediately after without redundancy.

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 7-parameter tool with no output schema, the description covers purpose, destructive semantics, the non-destructive alternative, and sibling routing. It leaves return-value shape implicit, but the format parameter and lack of an output schema make that acceptable.

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 seven parameters are already documented in the schema, including the clear and since semantics the description restates. The description adds only marginal cross-parameter meaning, so the baseline of 3 for fully-covered schemas 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 (Read) and resource (console messages captured since page load), and scopes it further by naming uncaught errors and unhandled rejections. It also distinguishes itself from the sibling monitor_network for failed requests, so an agent can route correctly without opening another schema.

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

Usage Guidelines5/5

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

Explicitly contrasts the two read modes: clear deletes what it returns (destructive), while since=cursor reads only newer entries without deleting. It also routes a specific need (failed requests) to monitor_network, giving a clear when-not to use this tool.

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

read_formA
Read-onlyIdempotent

Read a form as the user filled it — label, type, value, checked/selected, required-but-empty, browser validity — to check it against the project's documents before an irreversible Submit. Password and card values come back [redacted]. Read-only, on request; to change values use fill_form.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selectorNoThe form or container; omitted = every visible control on the page

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds genuinely new behavioral context: sensitive fields come back [redacted] and the tool is 'on request' (invoked deliberately rather than passively). The redaction rule is material information an agent cannot get from the annotations or schema.

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?

Front-loads the core action, then the returned fields, then the guardrail and alternative. The em-dash field list is dense but every clause carries distinct information; no filler sentences.

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?

No output schema exists, so the description carries the burden of describing return values — and it does so field by field, plus redaction behavior. With both optional params fully covered by the schema, nothing needed to invoke it correctly is missing.

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 optional parameters (tab_id, selector) are already fully documented in the schema, including the omission defaults. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

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 ('Read a form as the user filled it') and enumerates exactly what is returned — label, type, value, checked/selected, required-but-empty, validity. It explicitly distinguishes itself from the sibling fill_form, so an agent can separate read vs. write 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 Guidelines5/5

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

Gives the use case ('to check it against the project's documents before an irreversible Submit') and names the alternative for the opposite intent ('to change values use fill_form'). Both when-to-use and which-other-tool are stated explicitly.

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

read_pageA
Read-onlyIdempotent

Read the page as text (default), markdown, raw HTML, or accessibility tree. Read-only. markdown keeps headings, links and tables at a fraction of the HTML cost. Expensive on big pages: HTML on a large table costs tens of thousands of tokens for data you filter anyway — prefer extract_table/extract for repeated content, get_interactives for click targets.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNotext strips markup; markdown keeps headings/links/tables far cheaper than html; accessibility = a11y treetext
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
save_toNoAbsolute path: write the page there and return the path instead of the content
frame_idNoTarget iframe id from get_frames; omitted = main frame
max_lengthNoMax output chars

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses that the operation is read-only and that HTML mode can be token-expensive, adding useful behavioral context about resource usage.

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?

The description is well-structured and front-loaded with the purpose, but includes some redundancy around HTML cost and repeated mentions of the same idea, so it is slightly less concise than ideal.

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?

Provides sufficient context for selecting and using the tool, including cost implications and alternatives, though it does not cover potential output variations or errors beyond what the schema implies.

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?

The schema already provides 100% parameter description coverage with clear details for each param, so the tool description adds no extra parameter semantics; baseline of 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?

The description clearly states the tool reads a page in multiple modes (text, markdown, HTML, accessibility tree) and distinguishes it from siblings by advising when to use extract_table or get_interactives instead.

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

Usage Guidelines5/5

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

Provides explicit usage guidance: warns about high token costs on big pages and recommends alternative tools for repeated content or click targets, making the when-to-use decision clear.

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

save_pageA
DestructiveIdempotent

Save the full page (DOM, styles, images) as an MHTML archive file on the server filesystem. An offline copy Chrome reopens as it looked, for evidence or a later comparison (for an image use screenshot, for the text read_page); it overwrites output_path and returns path and size.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
output_pathYesAbsolute file path to write (e.g. /tmp/page.mhtml)

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds useful specifics: it overwrites output_path and returns path and size, which tells the agent what existing file data is destroyed and what comes 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?

The definition is two tight sentences, front-loaded with the core action and followed by purpose, alternatives, and side effects. Every clause 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?

With no output schema, the description still reports the return values (path and size). Combined with annotation safety hints and full schema coverage for parameters, it gives an agent everything needed to invoke the tool correctly.

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 baseline is 3, but the description adds behavioral meaning for output_path by stating it is overwritten. It does not add syntax or defaults for tab_id, leaving that 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?

The description states a specific verb and resource ('Save the full page ... as an MHTML archive file on the server filesystem') and names sibling alternatives ('for an image use screenshot, for the text read_page'). An agent can distinguish it from other capture tools 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 Guidelines5/5

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

It gives explicit use cases ('for evidence or a later comparison') and redirects to alternatives for image and text needs. This is clear when-to-use and when-to-use-another-tool guidance.

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

screencastA
Destructive

Record the tab as a video (.mp4 or .webm) to watch an animation or interaction frame by frame; returns the file path and size, never the frames. action record (default) = start, optional interaction, wait duration_ms, stop. start/stop bracket anything else done meanwhile (max 120 s). Chrome sends a frame only when the page changes; the video keeps the real timing. Needs the tab active and its window visible, and ffmpeg on the server machine (without it: the JPEG folder and the ffmpeg command). Uses chrome.debugger: Chrome shows its debugging bar while recording; in launch mode nobody sees it.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNoFrame rate of the output video
actionNorecord does start → wait → stop in one callrecord
formatNoVideo containermp4
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
qualityNoJPEG quality of the captured frames, 0-100
save_toNoAbsolute path: write the video there and return the path instead of the content
max_widthNoScale frames down to this width in px
duration_msNorecord: how long to record, max 120000
interactionNoAction run right after recording starts

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations with operational detail: needs the tab active and the window visible, requires ffmpeg on the server (with a stated fallback of the JPEG folder plus ffmpeg command), the 120 s recording cap, Chrome's change-driven frame emission with real preserved timing, and the chrome.debugger debugging-bar side effect including launch-mode behavior.

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?

Information-dense and front-loaded, with the core purpose in the first clause. Every sentence carries distinct value (return shape, action model, timing semantics, prerequisites, side effects), though the volume of caveats packed into one paragraph is heavy.

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 complex nine-parameter tool with a nested interaction object and no output schema, the description covers what matters: the return value (file path and size), prerequisites, fallback behavior, timing semantics, and the debugger side effect. Nothing an agent needs to invoke it correctly is 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 100%, so the baseline is 3, but the description adds real meaning on top: it defines the default 'record' action as start + optional interaction + wait + stop, explains that start/stop bracket intervening work, and restates the 120 s duration cap. This clarifies the interaction of parameters rather than merely repeating them.

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?

Opens with a specific verb+resource+artifact: 'Record the tab as a video (.mp4 or .webm).' It states the motivating use case ('watch an animation or interaction frame by frame') and explicitly contrasts its output with sibling frame-returning tools ('never the frames'), so an agent can tell it apart from screenshot 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 Guidelines4/5

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

Gives clear context for when to reach for this tool (frame-by-frame animation/interaction review) and explains the action lifecycle (record = start → interaction → wait → stop; start/stop bracket other work). It does not name alternatives or state when NOT to use it versus siblings like animations/watch, so it falls short of full routing guidance.

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

screenshotA
Read-onlyIdempotent

Screenshot of the visible viewport only (PNG), at the current scroll position, or one per viewport preset with presets. Read-only. Activates the tab in the background without stealing window focus, then restores the previous tab. Downscaled to ≤1568px: for fine print, element_screenshot with scale.

ParametersJSON Schema
NameRequiredDescriptionDefault
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
presetsNoResizes the window per preset, then restores it; not phone emulation. A refused width is reported, not shot. save_to = directory
save_toNoAbsolute path: write the PNG there and return the path instead of the content
if_changedNoSame pixels as the last screenshot of this tab: a note instead of the image. false = always send it

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the read-only/idempotent safety profile, but the description adds non-obvious behavior: background tab activation without stealing window focus, restoring the previous tab, and downscaling to ≤1568px. These are exactly the operational traits an agent could not infer from structured fields.

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?

Three dense sentences, all front-loaded and purposeful. The scope, behavior, and alternative are ordered by importance with zero filler.

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?

Covers output format (PNG), the save_to-vs-inline-content alternative, and the if_changed note, so even without an output schema an agent knows what to expect back.

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 are already documented. The description reinforces preset semantics ('resizes the window per preset... not phone emulation'), which adds slight clarity, but the heavy lifting is done by 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.

Purpose5/5

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

States a specific verb and output (PNG screenshot) plus precise scope: 'visible viewport only... at the current scroll position'. This implicitly contrasts with full_page_screenshot and element_screenshot, letting an agent differentiate from siblings without opening schemas.

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 fine-print needs to element_screenshot with scale, and describes preset usage. It does not explicitly name full_page_screenshot as the alternative for whole-page capture, leaving that to inference from 'viewport only'.

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

screenshot_diffA
Idempotent

Visual regression: save a named baseline (viewport, element, or a PNG such as the design mockup) and compare later — changed-pixel % and a red-highlighted diff; or compare_urls: production vs staging in this tab, pixels plus text diff, logged-in pages included. Baselines are in-memory (lost on service worker restart).

ParametersJSON Schema
NameRequiredDescriptionDefault
maskNocompare_urls: selectors hidden on both pages (dates, carousels, ads)
nameNoBaseline id: reuse the same one to compare across runsdefault
url_aNocompare_urls: reference page, e.g. production
url_bNocompare_urls: page under test, e.g. staging or a PR preview
actionYesbaseline stores, compare measures against it, compare_urls diffs url_a vs url_b here, clear drops baselines
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selectorNoCapture one element (default viewport)
from_fileNoaction=baseline: take it from this PNG (design mockup) instead of capturing
thresholdNoPer-channel tolerance 0-255

TDQS

A4.3/5.0
Behavior4/5

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

The description explicitly notes that baselines are in-memory and lost on service worker restart, which is important stateful behavior. It also mentions that 'clear drops baselines' in the action parameter. It does not fully detail navigation side effects for compare_urls, but the provided context exceeds the annotations alone.

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?

The description is dense but efficient, packing the core workflow into two sentences. The em-dash list and semicolon structure keep related ideas together, though there is slight redundancy between 'changed-pixel %' and 'pixels plus text diff'.

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?

Given the complexity of multiple actions and parameters, the description covers the essential workflow, output characteristics (changed-pixel percentage and diff highlight), and the in-memory limitation. It does not specify the exact return format, but the parameter-level descriptions and action enum cover most operational details.

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?

All 9 parameters have descriptions in the schema, and the main description adds meaningful context such as using from_file for design mockups and threshold as per-channel tolerance. The descriptions clarify the distinction between compare and compare_urls, so an agent can infer parameter usage without external documentation.

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 opens with 'Visual regression:' and clearly defines the tool's purpose: saving named baselines and comparing later, with support for viewport, element, or PNG baselines. It also distinguishes compare_urls for production-vs-staging diffs, making the intended use obvious.

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 explains when to use the tool for visual regression and specifically calls out compare_urls for production-vs-staging comparisons. It does not explicitly contrast it with sibling screenshot tools, but the regression-focused wording is enough to imply the alternative use cases.

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

scrollA

Scroll. action=to: once to element/coordinates; action=until: repeatedly until element visible, network idle, or no new content (infinite scroll). It moves the tab's scroll position and returns it (to) or stopped_reason and steps (until); full_page_screenshot scrolls by itself, wait_for waits without scrolling.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoAbsolute horizontal position in px (action=to, without selector)
yNoAbsolute vertical position in px (action=to, without selector)
untilNono_new_content stops when the page height stops growingno_new_content
actionNoto jumps to a position or element; until scrolls repeatedly to load moreto
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
step_pxNopx per step, default viewport height
behaviorNoinstant avoids waiting for smooth-scroll animationsauto
frame_idNoTarget iframe id from get_frames; omitted = main frame
offset_yNopx offset for fixed headers (to)
selectorNoTarget (to) or stop element (until=element)
containerNountil: selector that scrolls; default the document, or the largest scrollable element if the document does not scroll
settle_msNoPause ms after each step
max_scrollsNoCap on scroll steps, so an infinite feed terminates

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare the mutation/non-idempotent profile; the description goes further by disclosing the return shape per mode (scroll position for 'to'; stopped_reason and steps for 'until') and termination behavior (no_new_content stops when page height stops growing). No output schema exists, so this return information is valuable, though it isn't exhaustive about all 13 params.

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?

Front-loaded with a one-word purpose then dense semicolon-delimited clauses. Every clause carries mode/return/routing information, but the single long sentence is slightly crammed.

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 13-parameter tool with minimal annotations and no output schema, it covers the important call-shaping decisions (mode choice, stop conditions, return values, sibling alternatives). It omits secondary params (tab_id, frame_id, container, settle_ms, max_scrolls), which the schema handles, so it is nearly complete but not exhaustive.

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 schema itself already ties parameters to actions (e.g., x/y 'action=to, without selector', selector 'to or stop element (until=element)'). The description largely restates these action/parameter mappings rather than adding new syntax or format detail, so the baseline 3 applies.

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 ('scroll', 'the tab's scroll position') and cleanly separates its two modes: action=to jumps once to an element/coordinates, action=until scrolls repeatedly. It also names siblings it is not (full_page_screenshot, wait_for), so an agent can route without opening schemas.

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

Usage Guidelines5/5

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

Explicit mode-selection guidance: 'to' for a single jump, 'until' for infinite-scroll loading with three named stop conditions. It also carves out alternatives by noting full_page_screenshot scrolls by itself and wait_for waits without scrolling, giving clear when-not-to-use signals.

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

session_fixtureA
DestructiveIdempotent

Snapshot localStorage, sessionStorage and cookies of the current origin into a named fixture (a logged-in state, usually), restore one, or list them. save overwrites silently; restore writes on top without clearing and refuses on a different origin — cookies would attach to the wrong site.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRequired for save/restore
actionYessave snapshots the current origin; restore writes it back
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.1/5.0
Behavior5/5

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

The description is highly transparent about side effects: 'save overwrites silently' and 'restore writes on top without clearing' explicitly warn about destructive behavior, and the origin restriction is explained. This aligns with the destructiveHint annotation and adds specific detail beyond it.

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 concise, using two well-structured sentences. It packs all necessary information without redundancy or filler, making it easy to parse quickly.

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?

The description covers core functionality and safety caveats, but does not mention any return values or error cases beyond the origin refusal. Since there is no output schema, the agent might not know what 'list' returns. Still, for a simple tool, the given context is mostly sufficient.

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 parameter descriptions add meaningful context: 'name' is explained as required for save/restore (though optional in schema), 'action' describes save and restore semantics, and 'tab_id' is clear. However, the 'list' action is not explicitly described, and the conditional requirement for 'name' could be clearer. Since schema coverage is 100%, this is above 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?

The description clearly states the tool's three actions (snapshot, restore, list) and specifies it targets localStorage, sessionStorage, and cookies for the current origin into a named fixture. However, it doesn't explicitly differentiate itself from similar sibling tools like get_storage or set_storage, which might cause some ambiguity.

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?

It provides useful behavioral context (e.g., 'restore refuses on a different origin') but does not explicitly state when to use this tool over alternatives like session_record or get_storage/set_storage. The condition 'logged-in state' gives some guidance, but a clearer comparison to siblings would improve the score.

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

session_recordA

Record the commands of this session as a replayable jsonl (chrome-bridge replay --file ); observe what the user does in a tab ("watch how I do it") into the same format plus a readable procedure, never recording sensitive values; export a recording as a Playwright test for CI. Replays target the tab they navigate. Use it for a flow to repeat or a procedure to hand over; for one check now, assert.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRequired for start, observe and export (recording name, or a .jsonl path)
actionYesstart records this session; observe records what the USER does; stop writes the file; export makes a Playwright test
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
valuesNoobserve: record values of non-sensitive fields instead of {{field}} placeholders
save_toNoAbsolute path: write the exported .spec.ts there and return the path instead of the content

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare it writes (readOnlyHint=false) and is non-destructive, but the description adds genuinely useful behavioral context beyond them: 'never recording sensitive values', the replay targeting rule ('Replays target the tab they navigate'), and the replay CLI form. It does not mention permissions or persistence side effects, keeping it short of 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.

Conciseness4/5

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

The primary purpose is front-loaded and each clause carries information (modes, format, privacy, routing rule, alternative). The semicolon-chained style is dense and slightly hard to parse, but there is little pure filler.

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?

With no output schema and a six-value action enum, the description should say more about what status and list return. It explains the export return behavior only indirectly and leaves the non-mutating modes' outputs opaque, so it is adequate but incomplete for a multi-mode 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 description coverage is 100%, so the schema already documents every parameter including the action enum and save_to behavior. The description adds little parameter-level detail (only the replay --file hint), so baseline 3 is appropriate.

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 a specific verb+resource (record session commands as replayable jsonl) and enumerates its three modes: record, observe, and export to Playwright. It even distinguishes itself from the sibling 'assert' tool. It loses a point only because the scope sprawls across three loosely-related capabilities, making the single 'purpose' slightly diffuse.

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?

It gives explicit selection criteria ('for a flow to repeat or a procedure to hand over') and names the alternative for the opposite case ('for one check now, assert'). This is close to a full when/when-not rule, though it doesn't cover other exclusions or prerequisites.

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

set_geolocationA
Idempotent

Override navigator.geolocation with fixed coordinates (page-level patch). reset restores native. For location-based pages (store locators, delivery zones): it answers without a permission prompt, and a reload or navigation drops it, so call it after navigate.

ParametersJSON Schema
NameRequiredDescriptionDefault
resetNoRestore the real position and stop overriding
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
accuracyNoMeters
latitudeNoDecimal degrees, -90 to 90
longitudeNoDecimal degrees, -180 to 180

TDQS

A4.4/5.0
Behavior4/5

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

Goes well beyond annotations by disclosing that it answers without a permission prompt and that a reload or navigation drops the override. The annotations cover the safety profile, and the description adds real behavioral context, though return format is not described.

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 compact sentences: core behavior first, then the critical ordering caveat. Zero filler, and the most actionable info (call after navigate) is 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?

Covers purpose, lifecycle, and ordering for a 5-param tool with full schema coverage and no output schema. The permission-bypass and reload caveats fill the main gaps; only return-value format is omitted, which is minor here.

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, and the description adds meaningful semantics on top: 'reset restores native' and that the override is page-level and lost on navigation, which affects how latitude/longitude/tab_id should be used. It does not restate each parameter but adds the lifecycle insight.

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: overriding navigator.geolocation with fixed coordinates. The parenthetical 'page-level patch' clarifies scope, and no sibling among ~60 tools covers geolocation, so it 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 Guidelines4/5

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

Gives a concrete use case (store locators, delivery zones) and an explicit ordering instruction ('call it after navigate'), which is genuine when-to-use guidance. It lacks explicit when-not-to-use guidance or named alternatives, though no direct alternative exists.

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

set_storageA
DestructiveIdempotent

Write, delete or clear a localStorage/sessionStorage key, or a cookie with its path, domain and expiry. action=clear wipes every entry of that type for the origin and cannot be undone — on a site the user is logged into, clearing cookies logs them out. Read the current values first with get_storage.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoRequired for set/delete
pathNoCookie path (default /)
typeYescookie writes a real cookie, not a storage key
valueNoRequired for action=set
actionYesclear ignores key and wipes every entry of that type
domainNoCookie domain
secureNoCookie sent over HTTPS only
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
expiresNoUTC date string (cookie)
sameSiteNoNone requires secure=true
http_onlyNoCookie hidden from page JS

TDQS

A4.6/5.0
Behavior5/5

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

Beyond annotations (destructiveHint=true, idempotentHint=true), the description adds that clearing cookies logs the user out and cannot be undone, giving critical behavioral context for agent decision-making.

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 concise sentences with front-loaded core functionality and a critical warning. No wasted words; every sentence adds value.

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?

Given 11 parameters with full schema coverage and no output schema, the description covers the main behavior, destructive consequences, and prerequisite (read first). Could mention error conditions or parameter interactions, but sufficient for selection.

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?

With 100% schema coverage, baseline is 3. The description adds meaning by explaining action=clear wipes all entries of that type and that reading first is advisable, which goes beyond schema descriptions.

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 clearly states the tool writes, deletes, or clears localStorage, sessionStorage, or cookies. It specifies the action, storage type, and parameters like path, domain, and expiry, making it distinct from siblings like get_storage.

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 advises reading current values first with get_storage, providing clear context for safe usage. It does not explicitly list when not to use, but the destructive hint and warning about logout imply caution.

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

tab_actionA
Destructive

Tab lifecycle: close, activate, reload, back, forward, discard, mute, duplicate, close_session (only tabs this session created). close drops unsaved work and cannot be undone — it may be the user's tab. reload drops injected CSS, emulations and hooks. duplicate works where create_tab is forbidden (chrome-untrusted://) and lands in the source window, app windows included. discard replaces the tab id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesclose cannot be undone; discard frees memory (reloads on focus); reload drops injected CSS and hooks
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
bypass_cacheNoreload only

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses significant side effects beyond the annotations, such as close dropping unsaved work, reload dropping injections, and discard replacing the tab id. This goes well beyond the destructiveHint and idempotentHint flags, giving the agent clear expectations of consequences.

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 compact and information-dense, listing actions and consequences in a single readable paragraph. Every sentence contributes to understanding the tool's behavior and constraints, with no redundant or extraneous 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?

The description covers the main actions, side effects, and parameter semantics. It does not mention return values or error cases, but given the absence of an output schema and the operational nature of the tool, the context is adequately complete for most usage scenarios.

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?

The schema already provides descriptions for all parameters, including the enum meanings and the omission rule for tab_id. The tool description adds little extra semantic value beyond what is in the schema, so it meets the baseline for parameter coverage.

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 clearly identifies the tool as performing tab lifecycle actions, listing all supported operations explicitly. It distinguishes from similar tools by noting that duplicate works where create_tab is forbidden, helping disambiguate from sibling tools like create_tab or move_tab.

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?

It gives specific guidance on when to use certain actions, such as duplicate being available in restricted contexts and close_session applying only to tabs created in this session. It does not explicitly compare all actions to sibling tools, but the provided constraints are useful for agent decision-making.

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

tile_windowsA
Idempotent

Tile Chrome windows over one monitor in equal parts with no gap. Only Chrome windows. The monitor is the one of a window already on it, whose work area is read from a page there: at least one target needs a scriptable tab (not chrome://). Maximized windows are restored first, since maximized ignores bounds. To restore a saved arrangement use window_layout; to move one tab into another window, move_tab.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoMonitor area to fill, when no target window has a scriptable tab to read it from
layoutNocolumns splits left to right, rows top to bottom, grid keeps tiles as square as it cangrid
paddingNoPx of empty margin kept inside the work area
window_idsNoWindows to tile; omitted = every normal window on the reference monitor
include_typesNoWindow types to include; omitted = normal only
reference_window_idNoWindow whose monitor is used; omitted = the focused one

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing non-obvious behavior: monitor selection is derived from a window's page work area, a scriptable (non-chrome://) tab is required, and maximized windows are restored first because maximized ignores bounds. These are exactly the edge cases an agent would otherwise get wrong.

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?

Front-loaded with the core action and highly dense with zero filler, though several sentences are clause-heavy (the monitor/work-area sentence in particular) which slightly taxes readability.

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 mutation tool with no output schema, the description covers prerequisites, maximized-window edge case, monitor derivation, and alternative tools. Combined with annotations that declare idempotent and non-destructive semantics, an agent has everything needed to call it correctly.

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 schema already documents all six parameters, including the area nested object and the layout enum. The description adds context for why area exists (fallback when no scriptable tab) but does not elaborate on individual parameter syntax, so baseline 3 applies.

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 ("Tile Chrome windows") plus the precise scope ("over one monitor in equal parts with no gap"). It immediately rules out non-Chrome windows, letting an agent distinguish it from siblings like window_layout or move_tab.

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

Usage Guidelines5/5

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

Names two alternatives explicitly with their selecting conditions: "To restore a saved arrangement use window_layout; to move one tab into another window, move_tab." It also states prerequisites (only Chrome windows, at least one scriptable tab).

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

track_eventsA
Read-onlyIdempotent

Decode the tracking beacons the page fired (GA4, Meta Pixel, Google Ads, TikTok, LinkedIn, Pinterest, Microsoft Ads, GTM, Hotjar, Clarity) from the browser network log: one line per event with its key params. Read-only; POST-body params are flagged, not decoded.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoClear the browser log first — call it right before the action you want to observe
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
wait_msNoTime to wait before reading, for beacons sent after the action

TDQS

A4.4/5.0
Behavior5/5

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

The description explicitly states 'Read-only' and 'POST-body params are flagged, not decoded', which adds behavioral detail beyond the annotations. It also indicates output format (one line per event). No contradiction with annotations (readOnlyHint=true, etc.) and the additional limitation on POST-body is valuable.

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 concise, two sentences, front-loaded with the main purpose and the tracker list, and includes the read-only note and POST-body limitation. Every sentence adds value with no waste.

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 specialized decoding tool, the description explains what it does, which sources it covers, output format (one line per event), and read-only nature. It lacks a detailed output schema description, but the given summary is sufficient for an agent to understand the expected result. Given the tool's complexity, this is nearly complete.

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 fully documents all three parameters (clear, tab_id, wait_ms). The tool description does not add any parameter-specific semantics beyond what the schema provides, so the baseline of 3 applies.

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 clearly states the tool's purpose: decoding tracking beacons (GA4, Meta Pixel, etc.) from the browser network log, with output as one line per event. It is specific about the resource and lists the major tracker types, and it distinguishes itself from generic network tools like monitor_network.

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 clear context: it is for tracking beacons specifically, not all network traffic. However, it does not explicitly mention when not to use it or name alternatives, so it lacks explicit exclusions but provides enough context for an agent to infer appropriate use.

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

type_textA
Idempotent

Put text into an input, textarea or contenteditable, by selector or ref. Replaces the whole value through the native setter (React/Vue controlled inputs register it) and fires input and change. mode=keys emits keydown/input/keyup per character for autocomplete and masked fields: slower, use it only when mode=set leaves the field empty. Returns value_after; mismatch=true means the field did not keep the value: retry with mode=keys.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoFrom get_interactives, e.g. "n3"
modeNoset = assign value; keys = per-char events (autocomplete/masked); trusted = real input via chrome.debugger, main frameset
textYesValue to type; empty string clears the field
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
frame_idNoTarget iframe id from get_frames; omitted = main frame
selectorNoCSS selector; ">>>" pierces shadow DOM. Ignored when ref is given
wait_afterNoSettle before returning: navigation waits for a page load, networkidle for quiet trafficnone

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only establish the safety profile (readOnly=false, idempotent=true, destructive=false). The description adds substantive behavior beyond them: value is replaced through the native setter so React/Vue controlled inputs register it, input and change events fire, mode=keys emits keydown/input/keyup per character, and mismatch=true signals the field rejected the value.

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?

Four dense sentences with no filler, front-loaded with the core action and target, then mode semantics, then return/retry behavior. The density is appropriate given the description must carry return-value meaning in the absence of an output schema.

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?

With no output schema, the description correctly compensates by explaining the return signals (value_after, mismatch) and the recovery action. Combined with the mode tradeoffs and target scoping (selector vs ref), an agent has everything needed to call and interpret this 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 baseline is 3, but the description adds meaning the schema does not: the performance/reliability tradeoff between mode=set and mode=keys, the retry implication of mismatch, and what value_after reports. This goes beyond the schema's terse parameter blurbs.

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 ('Put text into an input, textarea or contenteditable, by selector or ref'), which is clear and actionable. It does not explicitly name or distinguish itself from overlapping siblings like fill_form or press_key, so it stops short of full sibling differentiation.

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?

It gives explicit selection guidance for the mode parameter: 'keys ... slower, use it only when mode=set leaves the field empty,' and prescribes a retry with mode=keys on mismatch. It offers no when-to-use guidance relative to alternative tools (fill_form, press_key), so guidance is strong within-parameters but absent across siblings.

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

upload_fileA

Set a file on input[type=file] from the server filesystem via DataTransfer (max 200 MB; over 6 MB it travels in pieces). Keys and credentials (~/.ssh, ~/.aws, ~/.gnupg, .env*, *.pem, .key, id_…) are refused, and a --read-root on the server limits the readable tree: the call fails with an error, nothing is read.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path on the server machine; keys and credentials (~/.ssh, .env, *.pem) refused
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selectorYesThe file input to fill; ">>>" pierces shadow DOM
mime_typeNoDefault: inferred from extension

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnly=false, destructive=false, idempotent=false). It discloses a 200 MB ceiling, chunked transfer above 6 MB, refusal of key/credential paths, the effect of the server's --read-root limit, and that a refused call reads nothing. This is exactly the behavioral context an agent cannot get from structured fields.

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?

Front-loads the core action before pivoting to constraints. Dense and punctuation-heavy, but nearly every clause carries distinct, useful information rather than restating the name.

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 write tool with no output schema, it covers limits, security refusals, and failure behavior well. It stops short of describing success-side effects (e.g. whether change events fire or an existing file is replaced), which is a minor gap.

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 baseline is 3. The description adds meaning beyond the schema by explaining the read-root tree restriction that governs the 'path' parameter and the failure mode when it is exceeded, plus the size/chunking behavior of the payload.

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: 'Set a file on input[type=file] from the server filesystem via DataTransfer.' This distinguishes it from siblings like fill_form or type_text by naming the exact target element type and the transfer mechanism.

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?

Usage is implied by the purpose (use this to populate a file input), and the size/credential constraints hint at conditions. However, no alternative is named and there is no explicit when-to-use versus fill_form or type_text guidance, leaving routing to inference.

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

viewport_resizeA
Idempotent

Resize the Chrome window to a preset (mobile 375x812, tablet 768x1024, desktop 1440x900) or explicit dimensions; the viewport is smaller by the browser chrome, action=get reports the real one. width/height override half a preset. A maximized window on ChromeOS ignores the request.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoWindow y on the virtual desktop
leftNoWindow x on the virtual desktop; on multi-monitor this is what picks the screen
zoomNoPage zoom for this origin, 1 = 100%; applied after the resize
stateNoApplied before bounds: a maximized window accepts left/top/width/height and ignores them
widthNoOverrides preset
actionNoget reports the current viewport without resizing anythingset
heightNoOverrides preset
presetNo375x812, 768x1024, 1440x900
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description clarifies that the viewport is smaller by browser chrome, that action=get reports the real viewport without resizing, and that a maximized window on ChromeOS ignores the request. These are useful behavioral details not covered by annotations.

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 tight three-sentence paragraph with no fluff. The main purpose is front-loaded, and every sentence adds relevant detail (presets, override behavior, viewport vs window, ChromeOS caveat).

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 tool with 9 parameters and no output schema, the description covers the core behaviors: resizing, presets, explicit dimensions, the get action, and the ChromeOS caveat. Parameters like top/left/tab_id are fully documented in the schema, so the description does not need to repeat them. The description is sufficient for an agent to invoke the tool correctly.

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?

With 100% schema coverage, the baseline is 3, but the description adds semantics: width/height override a preset, and action=get reports without resizing. These enrich understanding beyond the schema definitions.

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 (resize) and resource (Chrome window), defines preset dimensions, and distinguishes the viewport from the window. It implicitly differentiates from sibling layout tools like window_layout by focusing on viewport sizing, so an agent can tell it apart.

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 gives usage conditions such as the maximized-window-on-ChromeOS caveat and the action=get behavior, but it does not explicitly compare to alternatives like window_layout or tile_windows. An agent must infer when to prefer this tool over those siblings.

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

wait_forA
Read-onlyIdempotent

Block until a condition holds: element, text, function (JS expression; needs the "Allow user scripts" toggle), navigation (mode=spa for client-side routes), network_idle. Polls until timeout (10s element/function, 15s the rest) then returns found: false with a reason instead of raising: check it, or a failed wait reads as success. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNospa = pushState/popstate/hashchangeload
textNoLiteral text to wait for (condition=text), matched case-insensitively
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
idle_msNoQuiet period ms (network_idle)
timeoutNoMax ms (default 10000; 15000 navigation/network_idle)
visibleNoElement must also be visible
frame_idNoTarget iframe id from get_frames; omitted = main frame
intervalNoPoll ms, min 50
selectorNocondition=element; with condition=text it narrows the search to that subtree
conditionYeselement and text need selector or text; function needs expression
expressionNoJS expression (condition=function)

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses key behavioral details: it blocks execution, returns 'found: false' with a reason instead of raising an error on timeout, and mentions the 'Allow user scripts' toggle dependency for function conditions. This provides practical information about how the tool behaves in edge cases.

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, well-structured paragraph that efficiently lists the condition types, relevant parameters, timeouts, and return behavior without extraneous detail. It is easy to parse and directly addresses the core functionality.

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?

Given the tool's complexity (11 parameters, 5 condition types, enums), the description provides a solid high-level overview but does not explicitly cover every combination or edge case (e.g., interaction between selector and condition=navigation). However, the schema fills these gaps, so the description is sufficiently complete for most usage scenarios.

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 input schema already provides comprehensive descriptions for all 11 parameters (100% coverage). The description text adds extra value by clarifying the relationship between selector and text (narrowing search) and by noting the toggle requirement, though these are minor increments over the schema's own explanations.

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 clearly specifies that the tool blocks until a condition holds and enumerates the supported condition types (element, text, function, navigation, network_idle). It distinguishes itself from sibling tools like read_page or get_page_info by focusing exclusively on waiting for state changes, making its purpose unambiguous.

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 provides implicit usage guidance by explaining each condition type and the associated requirements (e.g., needing the 'Allow user scripts' toggle for function). It does not explicitly compare against alternatives, but the context is sufficient for an agent to decide when to invoke this tool for waiting on asynchronous conditions.

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

watchA
Idempotent

Keep watching a page in the background — "tell me when the pipeline is green / the Approve button appears / this number changes" — checked every interval_s by the extension. Events are collected, not pushed: action=poll, or a script blocking on "chrome-bridge watch --wait ". Survives extension idling, not a browser restart. poll returns one line per event (time, name, kind, url, value, previous); a change due within seconds is wait_for.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoWatch id
textNoText that appears / disappears
sinceNopoll: events after this ms timestamp
untilNoDefault: change with value_of, else match
actionNopoll = events since a timestampadd
reloadNoReload before each check, for pages that do not update live
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
selectorNoElement that appears (until=match) or disappears (until=gone)
value_ofNoElement whose text changing fires (until=change)
interval_sNoBetween checks, min 30
expires_minNoGive up after

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower, yet the description still adds real context: it survives extension idling but not a browser restart, and events are collected rather than pushed. It does not explain the mutation side of add/list/remove actions, leaving some lifecycle behavior implicit.

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?

Purpose is front-loaded in the first clause, followed by a quoted use-case and delivery model. The text is dense but each sentence carries distinct information (trigger meaning, delivery model, lifecycle, output format, alternative); the em-dash-heavy packing is slightly heavy but not wasteful.

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 an 11-parameter tool with no output schema, the description compensates well by describing the poll return line format (time, name, kind, url, value, previous) and the lifecycle limits. It falls short only on the add/list/remove actions and their outputs, which an agent would need to infer.

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 baseline is 3, but the description adds workflow meaning beyond the schema: it ties interval_s to the check cadence and clarifies how poll output is retrieved via a since timestamp. It still leaves the add/remove/list action semantics largely to the enum.

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 ('Keep watching a page in the background') and grounds it with concrete example triggers (pipeline green, Approve button, number changes). It explicitly distinguishes itself from the wait_for sibling by scope ('a change due within seconds is wait_for'), so an agent can choose between 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?

It gives clear routing guidance: use polling (action=poll) or the blocking 'chrome-bridge watch --wait' for collected events, and delegates immediate changes to wait_for. However, it never addresses other close siblings like watch_dom or track_events, and there is no explicit when-not-to-use statement.

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

watch_domA
Destructive

Watch DOM mutations (MutationObserver) under selector, to see what an action changed. First call installs the watcher in the page; later calls return the latest mutations (type, tag, attribute, nodes added/removed), clear deletes the ones returned, stop disconnects and empties the buffer. To wait for one element or text use wait_for.

ParametersJSON Schema
NameRequiredDescriptionDefault
stopNoDisconnect observer
clearNoClear buffer after read
limitNoMost recent mutations; buffer 1000
tab_idNoTarget tab; omitted = last tab navigated in this session, else the active one
subtreeNoObserve descendants too, not just the matched node
selectorNoSubtree to observe; ">>>" pierces shadow DOMbody
childListNoReport added and removed children
attributesNoReport attribute changes
characterDataNoReport text content changes

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the full lifecycle: install-on-first-call, buffer read-back, clear deleting returned mutations, and stop disconnecting plus emptying the buffer. This directly explains the destructiveHint=true semantics that the annotation only flags abstractly, and it names what is returned (type, tag, attribute, added/removed nodes).

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?

Three front-loaded sentences: purpose, then the stateful workflow and destruction semantics, then the alternative tool. No filler, and the most decision-relevant routing info sits at the end where it is easy to scan.

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 9-parameter stateful tool with no output schema, the description covers the lifecycle, return contents, and alternative routing adequately. It omits the buffer/limit interaction (1000 vs default 100) and the shadow-DOM piercing syntax, though those live in the schema.

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 baseline is 3, but the description adds real meaning for clear ('deletes the ones returned') and stop ('disconnects and empties the buffer') that sharpens the terse schema text. The observer flags (childList, attributes, characterData, subtree) 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 (Watch), resource (DOM mutations via MutationObserver), and scope (under selector), plus the intent ('to see what an action changed'). It is clearly distinguishable from siblings like query_dom, track_events, and wait_for 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?

Explains the stateful call pattern (first call installs, later calls read) and routes the agent to wait_for for single-element/text waiting. It does not, however, differentiate from adjacent siblings like track_events or monitor_network that also observe page activity, so the exclusion set is incomplete.

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

window_layoutA
DestructiveIdempotent

Save the current window arrangement under a name, restore, list or delete. save overwrites silently. Window ids do not survive a browser restart: restore matches windows by the overlap of their tab URLs and reports the ones it cannot recognise instead of guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLayout name, required except for list
actionYessave snapshots every window; restore repositions the recognised ones

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses key side effects and behaviors: save overwrites silently, and restore matches by tab URL overlap while reporting unrecognized windows. This goes beyond the annotations and gives the agent concrete expectations for action outcomes.

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 concise sentences, front-loading the primary purpose and then adding essential behavioral details. There is no redundancy or extraneous information.

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?

Given the tool's moderate complexity and absence of an output schema, the description covers the core functionality, key side effects, and the matching strategy for restore. It provides enough context for an agent to use the tool correctly without further documentation.

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?

The schema description covers 100% of parameters (action and name), so the baseline is 3. The tool description does not add further semantic details beyond what the schema already provides, so it remains at baseline.

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 clearly states the tool's purpose with specific verbs (save, restore, list, delete) and the resource (window arrangement under a name). It distinguishes itself from related window tools by focusing on named layouts rather than individual window actions.

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 provides important behavioral notes (silent overwrite, URL-based matching) but does not explicitly state when to use this tool versus alternatives like tile_windows or move_tab. It implies usage through its functionality but lacks direct comparison.

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. 1 tool updatev1.30.0
    • Addedcapture_downloads
  2. 23 tool updatesv1.28.0
    • Addedanimations
    • Changedclick1 field changed
      • addedInput schema / properties / trusted
        Added value: +{
        +  "default": false,
        +  "description": "Real browser input (isTrusted) via chrome.debugger, main frame only: for widgets that ignore synthetic clicks",
        +  "type": "boolean"
        +}
    • Changedemulate_media7 fields changed
      • addedInput schema / properties / contrast
        Added value: +{
        +  "description": "Value reported to prefers-contrast queries (debugger)",
        +  "enum": [
        +    "more",
        +    "less",
        +    "no-preference"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / cpu_throttle
        Added value: +{
        +  "description": "CPU slowdown factor, e.g. 4 for a mid-range phone; 1 turns it off (debugger)",
        +  "type": "number"
        +}
      • addedInput schema / properties / device
        Added value: +{
        +  "description": "Device metrics override (debugger)",
        +  "properties": {
        +    "dpr": {
        +      "default": 1,
        +      "description": "Device pixel ratio",
        +      "type": "number"
        +    },
        +    "height": {
        +      "description": "Viewport height in CSS px",
        +      "type": "number"
        +    },
        +    "mobile": {
        +      "default": false,
        +      "description": "Mobile viewport: meta viewport and overlay scrollbars apply",
        +      "type": "boolean"
        +    },
        +    "width": {
        +      "description": "Viewport width in CSS px",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / network
        Added value: +{
        +  "description": "DevTools network profile; none turns it off (debugger)",
        +  "enum": [
        +    "offline",
        +    "3g",
        +    "slow-4g",
        +    "fast-4g",
        +    "none"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / reset / description
        Previous value: -"Remove all emulations"New value: +"Remove all emulations and detach the debugger"
      • addedInput schema / properties / touch
        Added value: +{
        +  "description": "Emulate a touch screen (debugger)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / via
        Added value: +{
        +  "description": "page: script shim, no browser bar; debugger: real emulation (default when a debugger-only option is set)",
        +  "enum": [
        +    "page",
        +    "debugger"
        +  ],
        +  "type": "string"
        +}
    • Changedexecute_js2 fields changed
      • addedInput schema / properties / save_to
        Added value: +{
        +  "description": "Absolute path: write the result (a string as is, anything else as JSON) there and return the path instead of the content",
        +  "type": "string"
        +}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "description": "Max ms to wait for the result (default 30000); raise it for long async work",
        +  "type": "number"
        +}
    • Changedextract_table1 field changed
      • changedInput schema / properties / where / description
        Previous value: -"{column: substring} rows must match, case-insensitive contains. Key \"any\" matches any cell."New value: +"{column: substring} rows must match, case-insensitive (names too). Key \"any\" matches any cell."
    • Changedfill_form7 fields changed
      • changedInput schema / properties / fields / description
        Previous value: -"{selector, value} pairs"New value: +"{selector or ref, value or checked} per field"
      • addedInput schema / properties / fields / items / properties / checked
        Added value: +{
        +  "description": "Checkbox/radio instead of value: true checks, false unchecks",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / fields / items / properties / ref
        Added value: +{
        +  "description": "From navigate or get_interactives, e.g. \"n3\"",
        +  "type": "string"
        +}
      • addedInput schema / properties / fields / items / properties / selector / description
        Added value: +"CSS selector; ignored when ref is given"
      • addedInput schema / properties / fields / items / properties / value / description
        Added value: +"Text, option value or label; for checkbox/radio \"true\"/\"false\""
      • removedInput schema / properties / fields / items / required
        Removed value: -[
        -  "selector",
        -  "value"
        -]
      • addedInput schema / properties / submit_ref
        Added value: +{
        +  "description": "Submit button as a ref, instead of submit_selector",
        +  "type": "string"
        +}
    • Addedframes
    • Addedget_css_styles
    • Changedget_interactives1 field changed
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "cursor from the previous list: only added (+), changed (~) and removed elements; same scope, frame and tab",
        +  "type": "string"
        +}
    • Changedget_status1 field changed
      • addedInput schema / properties / enable
        Added value: +{
        +  "description": "Caps to switch on now, all in one call; \"all\" = every cap",
        +  "items": {
        +    "enum": [
        +      "all",
        +      "audits",
        +      "visual",
        +      "perf",
        +      "network",
        +      "storage",
        +      "dom",
        +      "files"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedhandoff3 fields changed
      • addedInput schema / properties / ask
        Added value: +{
        +  "default": false,
        +  "description": "Show a text box in the banner; the reply comes back as answer",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / in_terminal
        Added value: +{
        +  "default": true,
        +  "description": "Also ask in the Claude Code terminal (MCP elicitation) when the client supports it; the first answer wins. Not for pick_element",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pick_max
        Added value: +{
        +  "default": 1,
        +  "description": "With pick_element: up to N elements, the user presses Done when finished",
        +  "type": "number"
        +}
    • Addedheap_snapshot
    • Changedhover2 fields changed
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector; \">>>\" pierces shadow DOM. Triggers CSS and JS hover handlers"New value: +"CSS selector; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / trusted
        Added value: +{
        +  "default": false,
        +  "description": "Real browser pointer via chrome.debugger, main frame only: needed for CSS :hover",
        +  "type": "boolean"
        +}
    • Addedlighthouse
    • Changedmonitor_network1 field changed
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "cursor from the previous read: only newer entries, nothing deleted",
        +  "type": "string"
        +}
    • Addedperf_trace
    • Changedpress_key1 field changed
      • addedInput schema / properties / trusted
        Added value: +{
        +  "default": false,
        +  "description": "Real browser key (isTrusted) via chrome.debugger, main frame only",
        +  "type": "boolean"
        +}
    • Changedread_console1 field changed
      • addedInput schema / properties / since
        Added value: +{
        +  "description": "cursor from the previous read: only newer entries, nothing deleted",
        +  "type": "string"
        +}
    • Addedscreencast
    • Changedscreenshot2 fields changed
      • addedInput schema / properties / if_changed
        Added value: +{
        +  "default": true,
        +  "description": "Same pixels as the last screenshot of this tab: a note instead of the image. false = always send it",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / presets / description
        Previous value: -"One capture per preset, window restored; save_to = directory, one file each"New value: +"Resizes the window per preset, then restores it; not phone emulation. A refused width is reported, not shot. save_to = directory"
    • Changedscroll1 field changed
      • addedInput schema / properties / container
        Added value: +{
        +  "description": "until: selector that scrolls; default the document, or the largest scrollable element if the document does not scroll",
        +  "type": "string"
        +}
    • Changedtype_text2 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"set = assign value; keys = per-char events (autocomplete/masked)"New value: +"set = assign value; keys = per-char events (autocomplete/masked); trusted = real input via chrome.debugger, main frame"
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "set",
        -  "keys"
        -]New value: +[
        +  "set",
        +  "keys",
        +  "trusted"
        +]
    • Changedupload_file1 field changed
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path on the server machine"New value: +"Absolute path on the server machine; keys and credentials (~/.ssh, .env, *.pem) refused"
  3. 31 tool updatesv1.16.1
    • Removedaccessibility_audit
    • Addedaudit
    • Removedcheck_links
    • Addedcookie_audit
    • Changedelement_screenshot3 fields changed
      • addedInput schema / properties / region
        Added value: +{
        +  "description": "Box in viewport CSS px (the rect frame of get_interactives/query_dom), instead of selector",
        +  "properties": {
        +    "height": {
        +      "type": "number"
        +    },
        +    "width": {
        +      "type": "number"
        +    },
        +    "x": {
        +      "type": "number"
        +    },
        +    "y": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "x",
        +    "y",
        +    "width",
        +    "height"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / scale
        Added value: +{
        +  "default": 1,
        +  "description": "Enlargement of the crop, 1-4; output still capped at 1568px",
        +  "maximum": 4,
        +  "minimum": 1,
        +  "type": "number"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "selector"
        -]
    • Addedfind_setting
    • Changedfull_page_screenshot1 field changed
      • changedInput schema / properties / max_segments / description
        Previous value: -"Images returned, from the top (each ≈2.7k image tokens); raise or use segment_offset for the rest"New value: +"Images returned from the top (≈2.7k image tokens each); segment_offset for the rest"
    • Removedget_performance
    • Addedhandoff
    • Removedhighlight_elements
    • Removedlist_event_listeners
    • Changedmanage_downloads1 field changed
      • changedInput schema / properties / action / description
        Previous value: -"download fetches with the browser cookie jar and reports the real state; wait_for_complete blocks until the newest finishes"New value: +"download fetches with the browser cookies and reports the real state; wait_for_complete blocks until the newest finishes"
    • Changedmonitor_network2 fields changed
      • changedInput schema / properties / source / description
        Previous value: -"page sees XHR/fetch only; browser also sees static assets"New value: +"page: XHR/fetch only; browser: static assets too; websocket: connections and messages"
      • changedInput schema / properties / source / enum
        Previous value: -[
        -  "page",
        -  "browser"
        -]New value: +[
        +  "page",
        +  "browser",
        +  "websocket"
        +]
    • Removedmonitor_websocket
    • Changedmove_tab2 fields changed
      • changedInput schema / properties / new_window / description
        Previous value: -"Extract the tab into a fresh window instead — tabs.move needs an existing window, this does not"New value: +"Extract the tab into a fresh window instead of an existing one"
      • changedInput schema / properties / window_type / description
        Previous value: -"new_window only: popup has no tab strip and no omnibox — the terminal-window look for detached chrome-untrusted://terminal tabs"New value: +"new_window only: popup has no tab strip nor omnibox, the terminal-window look"
    • Changednetwork_rules4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"list and clear inspect and drop the rules already installed"New value: +"record saves the page's API responses (url_filter) as a fixture, replay serves them with overrides; list/clear"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "block",
        -  "redirect",
        -  "modify_header",
        -  "stub",
        -  "list",
        -  "clear"
        -]New value: +[
        +  "block",
        +  "redirect",
        +  "modify_header",
        +  "stub",
        +  "record",
        +  "replay",
        +  "list",
        +  "clear"
        +]
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Fixture name for record/replay",
        +  "type": "string"
        +}
      • addedInput schema / properties / overrides
        Added value: +{
        +  "description": "replay: force a status, body or delay on matching URLs — error states a real backend will not produce",
        +  "items": {
        +    "properties": {
        +      "body": {
        +        "type": "string"
        +      },
        +      "latency_ms": {
        +        "type": "number"
        +      },
        +      "status": {
        +        "type": "number"
        +      },
        +      "url_contains": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "url_contains"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedread_console1 field changed
      • addedInput schema / properties / sourcemap
        Added value: +{
        +  "default": false,
        +  "description": "Resolve bundle.js:line:col frames to source files through their source maps",
        +  "type": "boolean"
        +}
    • Addedread_form
    • Changedread_page1 field changed
      • changedInput schema / properties / mode / description
        Previous value: -"text strips markup, markdown keeps headings/links/tables far cheaper than html, accessibility returns the a11y tree"New value: +"text strips markup; markdown keeps headings/links/tables far cheaper than html; accessibility = a11y tree"
    • Changedscreenshot1 field changed
      • addedInput schema / properties / presets
        Added value: +{
        +  "description": "One capture per preset, window restored; save_to = directory, one file each",
        +  "items": {
        +    "enum": [
        +      "mobile",
        +      "tablet",
        +      "desktop"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changedscreenshot_diff6 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"baseline stores, compare measures against it, clear drops baselines"New value: +"baseline stores, compare measures against it, compare_urls diffs url_a vs url_b here, clear drops baselines"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "baseline",
        -  "compare",
        -  "list",
        -  "clear"
        -]New value: +[
        +  "baseline",
        +  "compare",
        +  "compare_urls",
        +  "list",
        +  "clear"
        +]
      • addedInput schema / properties / from_file
        Added value: +{
        +  "description": "action=baseline: take it from this PNG (design mockup) instead of capturing",
        +  "type": "string"
        +}
      • addedInput schema / properties / mask
        Added value: +{
        +  "description": "compare_urls: selectors hidden on both pages (dates, carousels, ads)",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / url_a
        Added value: +{
        +  "description": "compare_urls: reference page, e.g. production",
        +  "type": "string"
        +}
      • addedInput schema / properties / url_b
        Added value: +{
        +  "description": "compare_urls: page under test, e.g. staging or a PR preview",
        +  "type": "string"
        +}
    • Removedsecurity_headers
    • Removedseo_audit
    • Changedsession_record6 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"start begins recording, stop writes the file and returns its path"New value: +"start records this session; observe records what the USER does; stop writes the file; export makes a Playwright test"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "start",
        -  "stop",
        -  "status",
        -  "list"
        -]New value: +[
        +  "start",
        +  "stop",
        +  "status",
        +  "list",
        +  "export",
        +  "observe"
        +]
      • changedInput schema / properties / name / description
        Previous value: -"Required for start"New value: +"Required for start, observe and export (recording name, or a .jsonl path)"
      • addedInput schema / properties / save_to
        Added value: +{
        +  "description": "Absolute path: write the exported .spec.ts there and return the path instead of the content",
        +  "type": "string"
        +}
      • addedInput schema / properties / tab_id
        Added value: +{
        +  "description": "Target tab; omitted = last tab navigated in this session, else the active one",
        +  "type": "number"
        +}
      • addedInput schema / properties / values
        Added value: +{
        +  "default": false,
        +  "description": "observe: record values of non-sensitive fields instead of {{field}} placeholders",
        +  "type": "boolean"
        +}
    • Removedset_zoom
    • Changedtab_action2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"close cannot be undone; discard frees memory, the tab reloads on focus; reload drops injected CSS and hooks"New value: +"close cannot be undone; discard frees memory (reloads on focus); reload drops injected CSS and hooks"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "close",
        -  "activate",
        -  "reload",
        -  "back",
        -  "forward",
        -  "discard",
        -  "mute",
        -  "unmute",
        -  "duplicate"
        -]New value: +[
        +  "close",
        +  "activate",
        +  "reload",
        +  "back",
        +  "forward",
        +  "discard",
        +  "mute",
        +  "unmute",
        +  "duplicate",
        +  "close_session"
        +]
    • Addedtrack_events
    • Removedunused_css
    • Changedviewport_resize1 field changed
      • addedInput schema / properties / zoom
        Added value: +{
        +  "description": "Page zoom for this origin, 1 = 100%; applied after the resize",
        +  "type": "number"
        +}
    • Addedwatch
    • Removedweb_vitals
  4. 8 tool updatesv1.15.0
    • Changedcreate_tab5 fields changed
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "Window height px (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / left
        Added value: +{
        +  "description": "Window x on the virtual desktop (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / new_window
        Added value: +{
        +  "default": false,
        +  "description": "Open in a fresh window instead of a tab; with left/top it lands on the chosen monitor",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / top
        Added value: +{
        +  "description": "Window y (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "Window width px (new_window)",
        +  "type": "number"
        +}
    • Changedget_tabs1 field changed
      • addedInput schema / properties / include_windows
        Added value: +{
        +  "default": false,
        +  "description": "Also return the windows with bounds, state, type and tab count",
        +  "type": "boolean"
        +}
    • Changedmanage_downloads4 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"wait_for_complete blocks until the newest download finishes or times out"New value: +"download fetches with the browser cookie jar and reports the real state; wait_for_complete blocks until the newest finishes"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "wait_for_complete"
        -]New value: +[
        +  "list",
        +  "wait_for_complete",
        +  "download"
        +]
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "Relative path inside the Downloads folder (action=download)",
        +  "type": "string"
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "description": "What to download (action=download); sent with the session cookies of its origin",
        +  "type": "string"
        +}
    • Changedmove_tab7 fields changed
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "New window height px (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / left
        Added value: +{
        +  "description": "New window x (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / new_window
        Added value: +{
        +  "default": false,
        +  "description": "Extract the tab into a fresh window instead — tabs.move needs an existing window, this does not",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / top
        Added value: +{
        +  "description": "New window y (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "New window width px (new_window)",
        +  "type": "number"
        +}
      • addedInput schema / properties / window_type
        Added value: +{
        +  "default": "normal",
        +  "description": "new_window only: popup has no tab strip and no omnibox — the terminal-window look for detached chrome-untrusted://terminal tabs",
        +  "enum": [
        +    "normal",
        +    "popup"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "tab_id",
        -  "window_id"
        -]New value: +[
        +  "tab_id"
        +]
    • Changedtab_action2 fields changed
      • changedInput schema / properties / action / description
        Previous value: -"close cannot be undone; reload drops injected CSS and page hooks"New value: +"close cannot be undone; discard frees memory, the tab reloads on focus; reload drops injected CSS and hooks"
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "close",
        -  "activate",
        -  "reload",
        -  "back",
        -  "forward"
        -]New value: +[
        +  "close",
        +  "activate",
        +  "reload",
        +  "back",
        +  "forward",
        +  "discard",
        +  "mute",
        +  "unmute",
        +  "duplicate"
        +]
    • Addedtile_windows
    • Changedviewport_resize3 fields changed
      • addedInput schema / properties / left
        Added value: +{
        +  "description": "Window x on the virtual desktop; on multi-monitor this is what picks the screen",
        +  "type": "number"
        +}
      • addedInput schema / properties / state
        Added value: +{
        +  "description": "Applied before bounds: a maximized window accepts left/top/width/height and ignores them",
        +  "enum": [
        +    "normal",
        +    "maximized",
        +    "fullscreen",
        +    "minimized"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / top
        Added value: +{
        +  "description": "Window y on the virtual desktop",
        +  "type": "number"
        +}
    • Addedwindow_layout
  5. 1 tool updatev1.12.0
    • Addedmove_tab
  6. 6 tool updatesv1.11.0
    • Changedclick2 fields changed
      • addedInput schema / properties / button
        Added value: +{
        +  "default": "left",
        +  "description": "right opens the page context menu instead of activating the element",
        +  "enum": [
        +    "left",
        +    "right"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / count
        Added value: +{
        +  "default": 1,
        +  "description": "2 emits dblclick after the two clicks, which is what selects a word or opens an editor",
        +  "type": "number"
        +}
    • Changedextract1 field changed
      • addedInput schema / properties / save_to
        Added value: +{
        +  "description": "Absolute path: write the records as JSON there and return the path instead of the content",
        +  "type": "string"
        +}
    • Changedread_page3 fields changed
      • changedInput schema / properties / mode / description
        Previous value: -"text strips markup, html keeps it (costly), accessibility returns the a11y tree"New value: +"text strips markup, markdown keeps headings/links/tables far cheaper than html, accessibility returns the a11y tree"
      • changedInput schema / properties / mode / enum
        Previous value: -[
        -  "text",
        -  "html",
        -  "accessibility"
        -]New value: +[
        +  "text",
        +  "markdown",
        +  "html",
        +  "accessibility"
        +]
      • addedInput schema / properties / save_to
        Added value: +{
        +  "description": "Absolute path: write the page there and return the path instead of the content",
        +  "type": "string"
        +}
    • Changedscreenshot1 field changed
      • addedInput schema / properties / save_to
        Added value: +{
        +  "description": "Absolute path: write the PNG there and return the path instead of the content",
        +  "type": "string"
        +}
    • Changedviewport_resize1 field changed
      • addedInput schema / properties / action
        Added value: +{
        +  "default": "set",
        +  "description": "get reports the current viewport without resizing anything",
        +  "enum": [
        +    "set",
        +    "get"
        +  ],
        +  "type": "string"
        +}
    • Changedwait_for4 fields changed
      • changedInput schema / properties / condition / description
        Previous value: -"function needs expression; element needs selector"New value: +"element and text need selector or text; function needs expression"
      • changedInput schema / properties / condition / enum
        Previous value: -[
        -  "element",
        -  "function",
        -  "navigation",
        -  "network_idle"
        -]New value: +[
        +  "element",
        +  "text",
        +  "function",
        +  "navigation",
        +  "network_idle"
        +]
      • changedInput schema / properties / selector / description
        Previous value: -"condition=element"New value: +"condition=element; with condition=text it narrows the search to that subtree"
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "Literal text to wait for (condition=text), matched case-insensitively",
        +  "type": "string"
        +}
  7. 58 tool updatesv1.10.0
    • Changedaccessibility_audit2 fields changed
      • addedInput schema / properties / checks / description
        Added value: +"Subset to run; fewer checks means a shorter answer"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedassert4 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"Element the assertion is about; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / state / description
        Added value: +"attached means present in the DOM, visible also requires a rendered box"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / timeout / description
        Added value: +"Max ms to wait for the condition before failing"
    • Changedcheck_links5 fields changed
      • addedInput schema / properties / format / description
        Added value: +"lines is compact; json keeps per-link status and timing"
      • addedInput schema / properties / max_links / description
        Added value: +"Cap on links fetched: each one is a real HTTP request"
      • addedInput schema / properties / scope / description
        Added value: +"same-origin skips third-party links, which are the slow ones"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Restricts which links are collected"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedclick4 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Ignored when ref is given"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / wait_after / description
        Added value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
    • Changedclipboard2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"write takes text; read returns the current clipboard contents"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedcreate_tab1 field changed
      • addedInput schema / properties / active / description
        Added value: +"false opens the tab in the background, leaving the current one focused"
    • Changeddismiss_overlays1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changeddrag_and_drop5 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / mode / description
        Added value: +"Which event family to emit, since libraries listen to different ones"
      • addedInput schema / properties / source_selector / description
        Added value: +"Element to drag; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / target_selector / description
        Added value: +"Drop target; \">>>\" pierces shadow DOM"
    • Changedelement_screenshot2 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. The element is scrolled into view first"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedemulate_media4 fields changed
      • addedInput schema / properties / colorScheme / description
        Added value: +"Value reported to prefers-color-scheme queries"
      • addedInput schema / properties / printMode / description
        Added value: +"Make print media queries match, without opening a print dialog"
      • addedInput schema / properties / reducedMotion / description
        Added value: +"Value reported to prefers-reduced-motion queries"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedexecute_js3 fields changed
      • addedInput schema / properties / code / description
        Added value: +"JS evaluated in the page; the value of the last expression is returned"
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedextract3 fields changed
      • addedInput schema / properties / format / description
        Added value: +"lines is compact; json keeps one object per record"
      • addedInput schema / properties / max_items / description
        Added value: +"Cap on records returned, in document order"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedextract_table4 fields changed
      • addedInput schema / properties / index / description
        Added value: +"Which table to take when the selector matches several, 0-based"
      • addedInput schema / properties / selector / description
        Added value: +"The table to read; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • changedInput schema / properties / where / description
        Previous value: -"Keep only rows where each {column: substring} matches (case-insensitive contains). Use key \"any\" (or when the table has no headers) to match against any cell."New value: +"{column: substring} rows must match, case-insensitive contains. Key \"any\" matches any cell."
    • Changedfill_form3 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / wait_after / description
        Added value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
    • Changedfind_text4 fields changed
      • addedInput schema / properties / case_sensitive / description
        Added value: +"Match case exactly"
      • addedInput schema / properties / max_results / description
        Added value: +"Cap on matches returned, in document order"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / text / description
        Added value: +"Literal text to find, not a regex"
    • Changedfull_page_screenshot2 fields changed
      • addedInput schema / properties / max_scrolls / description
        Added value: +"Cap on scroll steps: a taller page is captured only up to here"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedget_frames1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedget_interactives5 fields changed
      • addedInput schema / properties / format / description
        Added value: +"lines is compact; json adds full attributes per element"
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / limit / description
        Added value: +"Max elements returned; raise it on a dense page"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / visible_only / description
        Added value: +"false also lists elements hidden or scrolled out of view"
    • Changedget_page_info2 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedget_performance1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedget_storage2 fields changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / type / description
        Added value: +"all returns the three together"
    • Changedhandle_dialogs2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"accept/dismiss auto-answer future dialogs; reset restores native behaviour"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedhighlight_elements5 fields changed
      • addedInput schema / properties / border / description
        Added value: +"CSS border shorthand, e.g. \"2px solid red\""
      • addedInput schema / properties / color / description
        Added value: +"Any CSS color for the overlay label"
      • addedInput schema / properties / remove / description
        Added value: +"Remove previously injected highlights instead of adding"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Every match is outlined"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedhover3 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Triggers CSS and JS hover handlers"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedhttp_auth3 fields changed
      • addedInput schema / properties / action / description
        Added value: +"set installs credentials for HTTP auth prompts; clear removes them"
      • addedInput schema / properties / password / description
        Added value: +"Required for action=set; kept in memory, never written to disk"
      • addedInput schema / properties / username / description
        Added value: +"Required for action=set"
    • Changedhttp_request1 field changed
      • addedInput schema / properties / method / description
        Added value: +"HEAD fetches headers only, without the body"
    • Changedinject_css2 fields changed
      • addedInput schema / properties / css / description
        Added value: +"One or more CSS rules, as they would appear in a stylesheet"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedlist_event_listeners2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Max listeners returned, from the top of the match list"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedmanage_downloads2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"wait_for_complete blocks until the newest download finishes or times out"
      • addedInput schema / properties / limit / description
        Added value: +"Max download entries returned, newest first"
    • Changedmeasure_spacing3 fields changed
      • addedInput schema / properties / selector1 / description
        Added value: +"First element; distances are measured from its box"
      • addedInput schema / properties / selector2 / description
        Added value: +"Second element; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedmodify_dom6 fields changed
      • addedInput schema / properties / action / description
        Added value: +"setStyle takes a CSS declaration in value; addClass/removeClass take className"
      • addedInput schema / properties / className / description
        Added value: +"Class to add or remove (addClass/removeClass)"
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Only the first match is changed"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / value / description
        Added value: +"Attribute value, style declaration, or text, per action"
    • Changedmonitor_network3 fields changed
      • addedInput schema / properties / format / description
        Added value: +"har exports HAR 1.2 for external tooling"
      • addedInput schema / properties / source / description
        Added value: +"page sees XHR/fetch only; browser also sees static assets"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedmonitor_websocket1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changednavigate2 fields changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / url / description
        Added value: +"Absolute URL, or a path resolved against the current page"
    • Changednetwork_rules4 fields changed
      • addedInput schema / properties / action / description
        Added value: +"list and clear inspect and drop the rules already installed"
      • addedInput schema / properties / header / description
        Added value: +"Header name for action=modify_header, e.g. \"User-Agent\""
      • addedInput schema / properties / redirect_url / description
        Added value: +"Destination for action=redirect"
      • addedInput schema / properties / resource_types / description
        Added value: +"Limit the rule to these request types; omitted = all of them"
    • Changedpress_key6 fields changed
      • addedInput schema / properties / alt / description
        Added value: +"Hold Alt"
      • addedInput schema / properties / ctrl / description
        Added value: +"Hold Control"
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / meta / description
        Added value: +"Hold Meta (Command/Windows)"
      • addedInput schema / properties / shift / description
        Added value: +"Hold Shift"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedquery_dom4 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / limit / description
        Added value: +"Max elements returned, from the top of the match list"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Matches all, not just the first"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedread_console3 fields changed
      • addedInput schema / properties / format / description
        Added value: +"lines is compact; json keeps timestamps and stack traces"
      • addedInput schema / properties / level / description
        Added value: +"all merges every level in one chronological list"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedread_page3 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / mode / description
        Added value: +"text strips markup, html keeps it (costly), accessibility returns the a11y tree"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedsave_page1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedscreenshot1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedscreenshot_diff3 fields changed
      • addedInput schema / properties / action / description
        Added value: +"baseline stores, compare measures against it, clear drops baselines"
      • addedInput schema / properties / name / description
        Added value: +"Baseline id: reuse the same one to compare across runs"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedscroll8 fields changed
      • addedInput schema / properties / action / description
        Added value: +"to jumps to a position or element; until scrolls repeatedly to load more"
      • addedInput schema / properties / behavior / description
        Added value: +"instant avoids waiting for smooth-scroll animations"
      • changedInput schema / properties / frame_id / description
        Previous value: -"action=to only"New value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / max_scrolls / description
        Added value: +"Cap on scroll steps, so an infinite feed terminates"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / until / description
        Added value: +"no_new_content stops when the page height stops growing"
      • addedInput schema / properties / x / description
        Added value: +"Absolute horizontal position in px (action=to, without selector)"
      • addedInput schema / properties / y / description
        Added value: +"Absolute vertical position in px (action=to, without selector)"
    • Changedsecurity_headers1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedseo_audit1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedsession_fixture2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"save snapshots the current origin; restore writes it back"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedsession_record1 field changed
      • addedInput schema / properties / action / description
        Added value: +"start begins recording, stop writes the file and returns its path"
    • Changedset_geolocation4 fields changed
      • addedInput schema / properties / latitude / description
        Added value: +"Decimal degrees, -90 to 90"
      • addedInput schema / properties / longitude / description
        Added value: +"Decimal degrees, -180 to 180"
      • addedInput schema / properties / reset / description
        Added value: +"Restore the real position and stop overriding"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedset_storage7 fields changed
      • addedInput schema / properties / action / description
        Added value: +"clear ignores key and wipes every entry of that type"
      • addedInput schema / properties / http_only / description
        Added value: +"Cookie hidden from page JS"
      • addedInput schema / properties / sameSite / description
        Added value: +"None requires secure=true"
      • addedInput schema / properties / secure / description
        Added value: +"Cookie sent over HTTPS only"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / type / description
        Added value: +"cookie writes a real cookie, not a storage key"
      • addedInput schema / properties / value / description
        Added value: +"Required for action=set"
    • Changedset_zoom2 fields changed
      • addedInput schema / properties / reset / description
        Added value: +"Restore the default zoom for this origin"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedtab_action2 fields changed
      • addedInput schema / properties / action / description
        Added value: +"close cannot be undone; reload drops injected CSS and page hooks"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedtype_text5 fields changed
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / selector / description
        Added value: +"CSS selector; \">>>\" pierces shadow DOM. Ignored when ref is given"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
      • addedInput schema / properties / text / description
        Added value: +"Value to type; empty string clears the field"
      • addedInput schema / properties / wait_after / description
        Added value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
    • Changedunused_css2 fields changed
      • addedInput schema / properties / max_selectors / description
        Added value: +"Cap on unused selectors reported: a large stylesheet has thousands"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedupload_file2 fields changed
      • addedInput schema / properties / selector / description
        Added value: +"The file input to fill; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedviewport_resize1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedwait_for3 fields changed
      • addedInput schema / properties / condition / description
        Added value: +"function needs expression; element needs selector"
      • addedInput schema / properties / frame_id / description
        Added value: +"Target iframe id from get_frames; omitted = main frame"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedwatch_dom6 fields changed
      • addedInput schema / properties / attributes / description
        Added value: +"Report attribute changes"
      • addedInput schema / properties / characterData / description
        Added value: +"Report text content changes"
      • addedInput schema / properties / childList / description
        Added value: +"Report added and removed children"
      • addedInput schema / properties / selector / description
        Added value: +"Subtree to observe; \">>>\" pierces shadow DOM"
      • addedInput schema / properties / subtree / description
        Added value: +"Observe descendants too, not just the matched node"
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
    • Changedweb_vitals1 field changed
      • addedInput schema / properties / tab_id / description
        Added value: +"Target tab; omitted = last tab navigated in this session, else the active one"
  8. 2 tool updatesv1.9.0
    • Changedemulate_media1 field changed
      • addedInput schema / properties / user_agent
        Added value: +{
        +  "description": "Overrides navigator.userAgent and appVersion in the page (not the HTTP header)",
        +  "type": "string"
        +}
    • Addedhttp_request
  9. 59 tool updatesv1.8.0
    • First observedaccessibility_audit
    • First observedassert
    • First observedcheck_links
    • First observedclick
    • First observedclipboard
    • First observedcreate_tab
    • First observeddismiss_overlays
    • First observeddrag_and_drop
    • First observedelement_screenshot
    • First observedemulate_media
    • First observedexecute_js
    • First observedextract
    • First observedextract_table
    • First observedfill_form
    • First observedfind_text
    • First observedfull_page_screenshot
    • First observedget_frames
    • First observedget_interactives
    • First observedget_page_info
    • First observedget_performance
    • First observedget_status
    • First observedget_storage
    • First observedget_tabs
    • First observedhandle_dialogs
    • First observedhighlight_elements
    • First observedhover
    • First observedhttp_auth
    • First observedinject_css
    • First observedlist_event_listeners
    • First observedmanage_downloads
    • First observedmeasure_spacing
    • First observedmodify_dom
    • First observedmonitor_network
    • First observedmonitor_websocket
    • First observednavigate
    • First observednetwork_rules
    • First observedpress_key
    • First observedquery_dom
    • First observedread_console
    • First observedread_page
    • First observedsave_page
    • First observedscreenshot
    • First observedscreenshot_diff
    • First observedscroll
    • First observedsecurity_headers
    • First observedseo_audit
    • First observedsession_fixture
    • First observedsession_record
    • First observedset_geolocation
    • First observedset_storage
    • First observedset_zoom
    • First observedtab_action
    • First observedtype_text
    • First observedunused_css
    • First observedupload_file
    • First observedviewport_resize
    • First observedwait_for
    • First observedwatch_dom
    • First observedweb_vitals

TDQS

A3.9/5.0

Scored across 67 tools

Disambiguation3/5

Descriptions are extremely detailed and cross-reference alternatives, which helps an agent pick correctly. However, real overlap exists across several families: screenshot/element_screenshot/full_page_screenshot, read_page/extract/extract_table/get_interactives, wait_for/assert/watch, and animations/frames/perf_trace/lighthouse. With 67 tools, more than a couple of boundaries can be confused.

Naming Consistency4/5

All names use snake_case with no camelCase or mixed conventions, which is consistent and readable. Most follow a verb_noun or descriptive noun pattern, though some are single-word nouns (screenshot, click, hover, animations, frames) while others are verb-led (get_tabs, create_tab, modify_dom), a minor deviation.

Tool Count1/5

67 tools is far beyond a well-scoped MCP surface and falls into the extreme-mismatch range. Optional capability groups mitigate this somewhat, but the exposed set is still an unusually heavy, hard-to-navigate toolkit.

Completeness5/5

The surface covers navigation, tabs, DOM querying/manipulation, CSS, forms, keyboard, dialogs, storage/cookies, network observation and interception, HTTP requests, downloads/uploads, performance traces, animations, audits, Lighthouse, heap snapshots, session recording, window management, and human handoff. Almost no obvious browser-automation lifecycle gap remains.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that lets agents drive your real Chrome browser with existing logins and sessions via an outbound-only WebSocket extension. It exposes Playwright-compatible browser tools for navigation, clicking, typing, and snapshots.
    1
    Apache 2.0
  • A
    license
    B
    quality
    B
    maintenance
    Turns Chrome into a local MCP server, giving AI agents 51 browser tools to inspect DOM, automate clicks, run JavaScript, audit security and accessibility, mock APIs, extract data, record demos, and more from any MCP client.
    92
    79 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables local Chrome control for AI clients over MCP stdio, HTTP, or CLI, exposing 20 tools to extract page text, number and click elements, type text, scroll, manage tabs, capture screenshots, and bind uploaded files to file inputs. Operations run entirely on the local machine with origin allowlists and refusal of untrusted URLs, without calling a cloud model or consuming model tokens.
    28 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to see and control the user's real Chrome/Brave/Edge profile over MCP, so they can read pages, click, type, take screenshots, audit layouts, debug CSS, and scrape paginated or infinite-scroll data. Because it drives the normal browser via the DevTools protocol with real input events, it works on modern JavaScript apps and on sites where the user is logged in.
    11 npm
    1
    MIT