Chrome Bridge
Drives your real, logged-in Chrome from Claude Code over a local WebSocket bridge — 66 browser-automation tools (43 core, rest in opt-in caps) covering navigation, interaction, inspection, debugging, audits and CI.
Tabs & windows —
get_tabs,create_tab,navigate,tab_action(close/reload/back/discard/duplicate),move_tab,tile_windows,window_layout; session-owned tabs are tracked and closed.Page interaction —
click,type_text,fill_form,press_key,hover,scroll,drag_and_drop,upload_file,clipboard,handle_dialogs,dismiss_overlays.Reading & inspection —
read_page(text/markdown/HTML/a11y tree),get_interactives,find_text,query_dom,get_css_styles,get_page_info,get_frames,read_form,extract,extract_table(server-side filtering of huge tables).Screenshots & visual regression —
screenshot,element_screenshot,full_page_screenshot,screenshot_diff(baseline vs. changed pixels, or prod vs. staging URL diff).JS & debugging —
execute_js,read_console,watch_dom,modify_dom,inject_css,network_rules(block/redirect/header/stub/record-replay),monitor_network(incl. HAR),track_events(GA4, Meta Pixel…).Performance & motion —
perf_trace(LCP/CLS/INP),frames(long frames, layout shifts),animations,screencast,lighthouseandheap_snapshot(launch mode only).Audits —
audit(a11y, keyboard, SEO, security, links, vitals, CSS, resources, cache in one call) andcookie_audit(trackers before consent).State, storage & files —
get_storage/set_storage,session_fixture,save_page(MHTML),manage_downloads,session_record+replay/Playwright export,assert.Environment emulation —
viewport_resize,emulate_media(dark mode, reduced motion, print, device/DPR, touch, CPU/network throttling),set_geolocation,http_auth,measure_spacing.Authenticated requests —
http_requestsends the browser's session cookies (invoices, authenticated JSON, PDFs).Human handoff —
handoffshows a banner for 2FA/CAPTCHA/login/choices, waits, and can return a typed answer or a user-picked element.Background & discovery —
watcha page for changes,find_settingwalks an admin menu for a keyword,get_statusenables optional caps mid-session.Runtime control — caps (
core…all),--no-js,--read-root/--write-rootfencing, token auth, loopback-only by default; plus a zero-token CLI lane and headless launch mode for CI.
Chrome Bridge
By frsorrentino · npm
chrome-bridge-mcp· not affiliated with other projects named "chrome-bridge".
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.

Quickstart
Requires Node.js 18+ and Chrome 135+.
git clone https://github.com/frsorrentino/chrome-bridge.git
cd chrome-bridge && ./install.shOpen
chrome://extensions, enable Developer mode, click Load unpacked, select theextension/folder.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.shdoes not run from PowerShell or cmd. Use the plugin path below (claude plugin marketplace add frsorrentino/chrome-bridge, thenclaude plugin install chrome-bridge@chrome-bridge) with the extension from the Web Store, or runinstall.shfrom Git Bash. The plugin's error log hooks run in Git Bash, as Claude Code runs every hook, and need Python 3.8+ aspython3,pythonorpy(the Microsoft Storepython3alias is skipped); without Python they stay silent and the tools work the same. For launch mode seeCHROME_BRIDGE_BROWSERbelow: 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 ( | 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.

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.

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.jsonlLaunch mode — a dedicated Chromium instance with an ephemeral profile, for isolated sessions or CI:
node server/index.js --launch --headlessIt 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
66 in total. core (43 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).

Group | N | What's in it |
Core & Navigation | 13 | tabs, windows, |
Interaction | 11 |
|
DOM & Inspection | 12 |
|
Debugging & Network | 8 |
|
Visual & Responsive | 5 |
|
Audits | 2 |
|
State, Storage & Files | 9 | storage, fixtures, MHTML, recording, |
Motion & Performance | 6 |
|
Every tool, with the notes that matter: docs/TOOLS.md.
How it works

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 |
|
| |
|
|
|
| unset | Required on both |
|
|
|
| 22 most used tools | Tools kept in context when the client loads the server whole; the others carry |
| unset | No arbitrary JavaScript in the page: |
| unset | Where |
| unset | Launch mode only: the browser binary, e.g. |
| unset |
|
| unset | Every path the model chooses ( |
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_TOKENon both handshakes.Launch mode also opens a DevTools port on 127.0.0.1 (chosen by the system), for
lighthouseandheap_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_keywithtrusted,emulate_media via: "debugger",perf_traceandscreencastattachchrome.debuggerto 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-jsremoves arbitrary JavaScript;--write-rootfences every path the model writes;upload_filerefuses keys and credentials, and--read-rootfences it to one directory. For sessions that matter, automate in a separate Chrome profile.--no-jsis not a sandbox:inject_cssstays, and CSS attribute selectors withurl()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 senddoes the same on demand;list,markandaddread 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 --securityprepares 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), orCHROME_BRIDGE_OBSERVE=offfor the server. Keep the log but stop the offers:{"propose": false}.
Troubleshooting
Symptom | Cause / fix |
| 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 |
| Something else owns the port. Free it or change |
| Enable Allow user scripts in |
| The page was opened before the extension, "Capture console & metrics" is off, or the page isn't injectable ( |
Screenshot times out, or | A minimized or fully covered window stops producing frames; captures fail after 10 s. Bring the window forward. |
| Same cause: Chrome does not render a hidden page and slows its timers (after a few minutes, to one wake-up per minute). |
| 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 |
| The field rejected the value. Events from an extension have |
| Written by the MCP client, not by the bridge: too many images in one request. Use |
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 |
| Expected with the plugin: since Claude Code 2.1.285 it hides them for stdio servers that plugins provide (variable names stay). |
Popup says «In attesa: un altro browser è collegato», | 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. |
Documentation
docs/TOOLS.md — all 66 tools, by group
docs/CAPABILITIES.md — what the bridge gets past and what it does not, one dated state per wall
docs/EFFICIENCY.md — the benchmark and the design behind it
docs/PERFORMANCE.md — latency per tool on the real path,
npm run bench:latencybench/RESULTS.md — raw runs and inclusion rule
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).
Related projects
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
66 toolsanimationsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max animations listed; the summary counts all | |
| scope | No | CSS selector: only animations on this element or inside it | |
| action | No | Action run right after recording starts | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| duration_ms | No | Record for this many ms (max 30000) instead of a snapshot |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior well beyond the annotations: it refuses on a hidden page, warns that composited_estimate is a guess rather than the compositor's answer, defines fade_only, and explains the 150 ms-transition timing rationale for recording. Annotations declare readOnlyHint=false and idempotentHint=false, which is consistent with the fact that it can trigger click/hover/scroll/press_key actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core capability and output shape, then the two operating modes, then caveats. Dense semicolon-clause sentences pack substantial information with little waste, though the length pushes toward run-on territory.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 burden of explaining return values and does so (selector/ref, animated properties, duration, delay, easing, iterations, play state, timeline, composited_estimate, fade_only). It also covers the hidden-page refusal and the reduced-motion workflow. Minor gap: it does not describe the limit/summary interaction that the schema implies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 explaining the semantic split between snapshot mode and duration_ms recording mode, and by clarifying that optionally an action runs after recording starts. This adds meaning about how parameters interact rather than restating field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the page animations") and enumerates the four animation technologies it covers (CSS animations, transitions, Web Animations, View Transitions), plus the per-item fields it returns. An agent can distinguish this from get_css_styles or watch_dom 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly partitions two modes: without duration_ms it is a snapshot of what runs now; with duration_ms it records every animation that starts in the window, optionally after an action. It also routes for a related task ("Pair with emulate_media reducedMotion"). It does not explicitly contrast with sibling listing tools like get_css_styles, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assertARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Tab url pattern | |
| text | No | In the element (with selector) or anywhere on the page | |
| count | No | Exact match count for selector | |
| state | No | attached means present in the DOM, visible also requires a rendered box | attached |
| title | No | Tab title pattern | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| timeout | No | Max ms to wait for the condition before failing | |
| selector | No | Element the assertion is about; ">>>" pierces shadow DOM |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds behavioral context about polling timeout and pattern syntax, which is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core functionality and pattern syntax are conveyed efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, the description covers main conditions, patterns, and replay context. It lacks explicit return behavior but is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well-described. The description adds minimal extra meaning, only summarizing condition types and pattern styles. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to assert page conditions (element existence/visibility, text, URL/title) with polling until timeout. It distinguishes from siblings by focusing on assertion rather than observation or waiting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for assertions but does not provide explicit guidance on when to use this tool versus alternatives like wait_for or query_dom. No exclusions or comparison with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auditARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | Default skips keyboard, css (slow, approximate), resources and cache | |
| scope | No | a11y only: limit to this subtree | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the full Markdown report there and return the path instead of the content | |
| max_links | No | links only: cap on URLs fetched |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive, and the description repeats 'Read-only'. It adds useful behavioral details beyond annotations: the output format ('summary line per kind', 'full Markdown report') and the save_to behavior. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, compact and well-structured. It front-loads the core purpose ('One-call page audit'), lists all options efficiently, and includes output details without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 optional parameters) and the annotations covering safety, the description provides sufficient context: it explains each parameter via schema descriptions and details output behavior. It does not mention edge cases or prerequisites, but the tab_id and scope parameters are self-explanatory from schema descriptions, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter has a helpful description. The main description further enriches parameter semantics by explaining what each kind refers to (e.g., 'resources' means which plugin/theme/module/host slows the page) and clarifying default behavior for kinds like keyboard and css. This goes beyond the schema's enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'One-call page audit' and enumerates the exact audit kinds (accessibility, keyboard, SEO, security headers, broken links, Core Web Vitals, unused CSS, resources, cache). This clearly identifies the verb (audit), the resource (page), and distinguishes it from specialized siblings like cookie_audit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says to 'pick the kinds' and lists them, so it's clear when to use this tool for any of those audit categories. It does not explicitly name alternatives or state when not to use it, but the coverage is evident from the kind list, making usage largely implied.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | From get_interactives, e.g. "n3" | |
| count | No | 2 emits dblclick after the two clicks, which is what selects a word or opens an editor | |
| force | No | Click even if occluded | |
| button | No | right opens the page context menu instead of activating the element | left |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| trusted | No | Real browser input (isTrusted) via chrome.debugger, main frame only: for widgets that ignore synthetic clicks | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | No | CSS selector; ">>>" pierces shadow DOM. Ignored when ref is given | |
| wait_after | No | Settle before returning: navigation waits for a page load, networkidle for quiet traffic | none |
TDQS
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.
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.
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.
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.
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.
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.
clipboardAIdempotent
Read or write the system clipboard (text). Activates the tab first. write overwrites whatever the user had copied, which is not recoverable.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | For write | |
| action | Yes | write takes text; read returns the current clipboard contents | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that write overwrites the clipboard and that this is not recoverable, which is critical behavioral information beyond the annotations. It also notes that the tab is activated first, adding transparency about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise, consisting of two short sentences that pack essential information without anyone. The structure is logical, starting with the core function and then adding the warning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary function and the critical warning, but lacks guidance on alternative tools or edge cases (e.g., what happens when reading an empty clipboard). Given the absence of an output schema, a bit more context about expected behavior would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions already fully explain all parameters (action, text, tab_id) with 100% coverage. The tool description does not add extra semantic meaning beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads or writes the system clipboard (text), which is a specific verb and resource. It also clarifies the scope to text, leaving no ambiguity about the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not mention when to use this tool versus alternatives like type_text or read_page. It only mentions 'Activates the tab first' as an operational note, but provides no guidance on appropriate use cases or conditions where another tool would be more suitable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cookie_auditAIdempotent
Cookie and consent-banner audit: clears this site's cookies, reloads, records cookies and third-party requests BEFORE consent, accepts the banner, records again; the findings name the trackers contacted before consent. Logs you out of the audited site.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| settle_ms | No | Wait after load and after consent, for late beacons | |
| accept_selector | No | Accept button of the banner; omitted = dismiss_overlays; "none" skips consent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotent, non-destructive), the description explicitly discloses the side effects: clearing cookies, accepting the banner, and logging out. This transparency about state changes exceeds what the annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single run-on sentence but is rich with relevant detail. It front-loads the purpose and follows a logical sequence. Slightly dense, but not verbose—allocating a 4 for clarity and efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full workflow, expected output (findings naming trackers), and side effects (logout). With no output schema, this textual explanation sufficiently equips an agent to understand the tool's behavior and results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides full descriptions for all three parameters (coverage 100%). The tool description adds no additional parameter meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's specific function: a cookie and consent-banner audit. It lists the sequence of actions (clear cookies, reload, record before consent, accept banner, record again) and explicitly notes the logout side effect, making the intended purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when auditing tracker behavior before and after consent, and it warns about the logout effect. It does not explicitly compare against alternatives like the generic 'audit' tool, but the specific scenario is clear enough for an agent to select it appropriately.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Window y (new_window) | |
| url | No | URL to open (default: new tab page) | |
| left | No | Window x on the virtual desktop (new_window) | |
| width | No | Window width px (new_window) | |
| active | No | false opens the tab in the background, leaving the current one focused | |
| height | No | Window height px (new_window) | |
| new_window | No | Open in a fresh window instead of a tab; with left/top it lands on the chosen monitor |
TDQS
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.
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.
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.
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.
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.
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_overlaysAIdempotent
Dismiss cookie banners/modal overlays: OneTrust, Cookiebot, Usercentrics, then generic heuristic. Idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Which event family to emit, since libraries listen to different ones | html5 |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| source_selector | Yes | Element to drag; ">>>" pierces shadow DOM | |
| target_selector | Yes | Drop target; ">>>" pierces shadow DOM |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-destructive behavior. The description adds the event family implementation detail but does not disclose other behavioral traits like timing, side effects (e.g., element reordering), or error scenarios.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with no filler. Every word adds meaning, and the semicolon effectively separates the general action from mode specifics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of drag-and-drop (source, target, modes, frames, tabs) and no output schema, the description is adequate but thin. It does not explain return values, waiting behavior, or what constitutes a successful drop.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 5 parameters have schema descriptions (100% coverage), so the tool description's role is diminished. However, it adds valuable context for the 'mode' parameter by explaining the difference between html5 and pointer events, which goes beyond the schema's 'which event family to emit'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Drag an element onto another') and distinguishes by specifying two event families (html5 vs pointer). This verb+resource structure is specific and distinct from sibling tools like click or hover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description explains when to use each mode ('html5 = DragEvent+DataTransfer; pointer = pointer/mouse events'), it lacks explicit guidance on when not to use this tool or alternative approaches. No prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
element_screenshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| scale | No | Enlargement of the crop, 1-4; output still capped at 1568px | |
| region | No | Box in viewport CSS px (the rect frame of get_interactives/query_dom), instead of selector | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector | No | CSS selector; ">>>" pierces shadow DOM. The element is scrolled into view first |
TDQS
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.
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.
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.
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.
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.
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_mediaAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| via | No | page: script shim, no browser bar; debugger: real emulation (default when a debugger-only option is set) | |
| reset | No | Remove all emulations and detach the debugger | |
| touch | No | Emulate a touch screen (debugger) | |
| device | No | Device metrics override (debugger) | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| network | No | DevTools network profile; none turns it off (debugger) | |
| contrast | No | Value reported to prefers-contrast queries (debugger) | |
| printMode | No | Make print media queries match, without opening a print dialog | |
| user_agent | No | Overrides navigator.userAgent and appVersion in the page (not the HTTP header) | |
| colorScheme | No | Value reported to prefers-color-scheme queries | |
| cpu_throttle | No | CPU slowdown factor, e.g. 4 for a mid-range phone; 1 turns it off (debugger) | |
| reducedMotion | No | Value reported to prefers-reduced-motion queries |
TDQS
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.
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.
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.
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.
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.
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_jsADestructive
Run JavaScript in the page (MAIN world). Requires the extension's "Allow user scripts" toggle; errors explain setup if disabled. A promise is awaited up to timeout. A cut result stays valid JSON and says truncated; save_to writes the whole result to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JS evaluated in the page; the value of the last expression is returned | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the result (a string as is, anything else as JSON) there and return the path instead of the content | |
| timeout | No | Max ms to wait for the result (default 30000); raise it for long async work | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| max_length | No | Max output chars |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring destructiveHint=true and openWorldHint=true, the safety profile is already covered, and the description adds real operational context: the required toggle with a self-explaining error path, promise awaiting up to timeout, and truncation that preserves valid JSON. It does not discuss what page state the arbitrary JS can mutate, but the value added beyond annotations is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then prerequisites, then async and truncation behavior. No sentence is filler; every clause carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no output schema, the description covers the setup gate, the timeout contract, and the truncation/save_to relationship. It omits how returns are shaped for non-serializable values and says nothing about targeting tabs/frames, but is otherwise sufficient to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: it explains the truncation contract and that save_to writes the untruncated result to disk, clarifying how max_length and save_to interact. tab_id and frame_id defaults are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run JavaScript in the page') and pins the execution context as MAIN world, which distinguishes it from DOM-querying siblings like query_dom and inject_css. It stops short of naming an explicit alternative, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives prerequisites ('Requires the extension's Allow user scripts toggle') and async behavior, but never says when to reach for this over extract, query_dom, or inject_css, nor when it is inappropriate. The agent must infer the use case from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extractARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | field name → {selector, attr} | |
| format | No | lines is compact; json keeps one object per record | lines |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the records as JSON there and return the path instead of the content | |
| max_items | No | Cap on records returned, in document order | |
| max_length | No | Max output chars | |
| item_selector | Yes | CSS selector matching each item |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds useful context: deterministic, parsed server-side from main-document HTML. This adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the purpose. Every part adds value with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, nested object, no output schema), the description covers the core usage and behavioral context. It lacks explicit mention of defaults or output format, but schema descriptions fill that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 7 parameters. The description adds a general pattern explanation but does not provide details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads repeated non-tabular structures as records per item, with specific examples (product cards, list items, search results). It distinguishes from siblings like extract_table by specifying 'non-tabular'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (non-tabular structures) and hints at alternatives (extract_table for tables), but does not explicitly state when not to use or list alternatives. The context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_tableARead-onlyIdempotent
Read a real as JSON: thead cells become keys, each row an object. Read-only. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Which table to take when the selector matches several, 0-based | |
| where | No | {column: substring} rows must match, case-insensitive (names too). Key "any" matches any cell. | |
| offset | No | Skip N rows of the (filtered) set before applying max_rows. | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| columns | No | Return only these columns per row. | |
| max_rows | No | Max rows returned to you (output cap). | |
| selector | No | The table to read; ">>>" pierces shadow DOM | table |
| scan_rows | No | Max rows materialized in-page to scan/filter; raise for very large tables. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive=false, so the bar is lower, and the description still adds real context: server-side filtering and its byte-cost behavior, plus how row_count relates to match_count (post-filter). It omits error/empty-match behavior, but the added behavioral detail is well above annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then the eligibility constraint, then the filter/count semantics. 'Read-only' is mild redundancy against the readOnlyHint annotation but the rest earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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-shape burden (thead→keys, rows→objects) and distinguishes total vs filtered row counts. Given 8 optional params and nested `where` objects, it is largely complete, though it says nothing about empty matches or error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 params including `where`, `index`, `offset` and `max_rows`. The description's mention of `where` filtering is useful framing but largely restates what the schema says, and its `row_count`/`match_count` detail describes output fields rather than parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read a real <table> as JSON') plus the exact output shape (thead cells become keys, each row an object). The clause 'Only for tabular markup' separates it from broader siblings like read_page, query_dom and extract, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit scope restriction ('only for tabular markup') and explains the payoff of the server-side `where` filter (one row out of 1500 costs a few hundred bytes). It never names a concrete alternative tool to use instead for non-tabular content, so the 'when not / use instead' side is implied rather than stated.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | {selector or ref, value or checked} per field | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| submit_ref | No | Submit button as a ref, instead of submit_selector | |
| wait_after | No | Settle before returning: navigation waits for a page load, networkidle for quiet traffic | none |
| submit_selector | No | Submit button to click after filling |
TDQS
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.
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.
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.
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.
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.
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_settingAIdempotent
Where is a setting in an unknown admin panel: follows the panel's menu links (same origin) until a page contains the keyword and reports the menu path. Navigates the tab, leaves it on the page found, stops at max_pages.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| keyword | Yes | What you are looking for, e.g. "webp", "cron", "maintenance mode" | |
| max_pages | No | Pages visited at most | |
| menu_selector | No | Where the menu links are | nav, aside, [role="navigation"], #adminmenu, .menu, .sidebar, .navbar, .tabs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool navigates the tab and leaves it on the found page, which is a side effect not captured by the annotations. It also explains the iterative behavior of following menu links and stopping at max_pages. This goes beyond the annotation hints and provides useful behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, with no redundant content. It front-loads the purpose and then explains the behavior and constraints. Every phrase adds value, and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the core mechanism but lacks explicit details about the return format ('reports the menu path' is vague), what happens if the keyword is not found, or how it handles pages that fail to load. Since there is no output schema, these details would be useful for an agent to fully anticipate results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters have schema descriptions with 100% coverage, so the baseline is 3. The tool description does not add significant extra semantic detail about the parameters beyond what the schema already provides (e.g., keyword is described as 'What you are looking for' in both places).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to locate a setting in an unknown admin panel by clicking through menu links until the keyword is found, then reporting the menu path. This distinguishes it from other search-related tools like find_text or query_dom, which operate on the current page only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in an unknown admin panel' and the mechanism of following menu links give clear context for when this tool is appropriate. It also mentions the max_pages limit and the fact that it navigates the tab, which helps agents decide if this tool fits their need. However, it does not explicitly contrast it with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_textARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Literal text to find, not a regex | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| max_results | No | Cap on matches returned, in document order | |
| case_sensitive | No | Match case exactly |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral details about attaching nearby interactive elements with refs for interaction. This is valuable context beyond annotations, though it does not cover edge cases like no match found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core purpose, followed by an important behavioral detail. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explains the return values (parent selector, context, visibility, position, interactive elements). It covers the main aspects but could be more explicit about the list of matches and behavior when no match is found.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are well-described in the schema. The description does not add additional meaning or usage hints for parameters beyond what the schema provides. The mention of 'parent selector, context, visibility, position' refers to output, not parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds text on a page and specifies what it returns: parent selector, context, visibility, position per match, and attached interactive elements for the first visible match. This is specific and distinguishes it from sibling tools like query_dom or get_interactives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for finding text and obtaining interactive elements, but it lacks explicit guidance on when to use this versus alternatives like query_dom. No when-not-to-use conditions or prerequisites are mentioned.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max long frames listed; counts include all | |
| action | No | Action run right after recording starts | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| duration_ms | No | Recording window in ms (max 30000) | |
| threshold_ms | No | Long frames shorter than this are not listed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the generic safety profile, and the description adds substantial behavioral context: it refuses on hidden pages because rAF/observers stop, synthetic events yield no interaction id, compositor-only animations can stay smooth while the main thread drops frames, and an action can run right after recording starts. These are genuine operational traits not visible in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and tightly information-dense, with no filler sentences. It is long and parenthetical-heavy (render/style layout start, CLS/INP window caveats), which slightly taxes readability, but nearly every clause carries real meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 action object and no output schema, the description fully explains the returned metrics (frame rate, dropped frames, LoAF details, shifts with moved elements, INP split into input delay/processing/presentation) plus the hidden-page and trusted-input constraints. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (limit, action, tab_id, frame_id, duration_ms, threshold_ms) are already documented. The description adds the action types (click, hover, scroll, key) and the trusted-input requirement, but this only marginally extends what the schema already provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (record) and resource (the page/frame performance window) and enumerates exactly what it reports: frame rate, dropped frames, LoAF, layout shifts, INP. An agent can distinguish this from perf_trace, lighthouse, and animations 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear from the metric set (use it to measure smoothness/interaction responsiveness over a window), and it notes constraints like needing trusted input for INP. But it never names an alternative (perf_trace, lighthouse, animations) or states when this is preferred over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
full_page_screenshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| delay | No | ms between captures (min 500, Chrome quota) | |
| stitch | No | false = one image per viewport | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| max_scrolls | No | Cap on scroll steps: a taller page is captured only up to here | |
| max_segments | No | Images returned from the top (≈2.7k image tokens each); segment_offset for the rest | |
| segment_offset | No | Skip the first N segments |
TDQS
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.
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.
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.
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.
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.
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_stylesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | Yes | CSS selector; ">>>" pierces shadow DOM. Only the first match is inspected | |
| properties | No | Only these, e.g. ["margin-top","--brand"]; margin covers its longhands. Omitted = every property a matching rule sets | |
| include_inherited | No | Also inherited properties (color, font-*, custom properties) with the ancestor that sets them |
TDQS
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.
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.
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.
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.
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.
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_framesARead-onlyIdempotent
List frames (main + iframes) with frameId, parent, URL — for the frame_id parameter of DOM tools.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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_interactivesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max elements returned; raise it on a dense page | |
| scope | No | Limit search (CSS selector) | |
| since | No | cursor from the previous list: only added (+), changed (~) and removed elements; same scope, frame and tab | |
| format | No | lines is compact; json adds full attributes per element | lines |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| visible_only | No | false also lists elements hidden or scrolled out of view |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds useful context about what each result contains and implies incremental delta listing via the since cursor, but says nothing about ordering, truncation behavior against limit, or performance on dense pages. It adds some value but is not rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the capability and output fields come first, the routing preference second. No filler, nothing that could be dropped without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema tool whose schema is fully documented, the description covers purpose, output shape, and a usage preference. It omits result ordering/pagination semantics, but the completeness bar is largely met given how much the schema and annotations carry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 limit, scope, since, format, tab_id, frame_id, and visible_only with concrete defaults. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (actionable elements: buttons, links, inputs, role/onclick matches), and enumerates the payload (CSS selector, label, position, flags). It is clearly distinguishable from siblings like query_dom, read_page, or extract, which cover raw HTML or other extraction goals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Prefer this over dumping HTML to discover selectors" gives clear guidance on when to reach for this tool rather than reading the page source. It stops short of naming the closest alternative siblings (query_dom, find_text, read_page) by name or stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_infoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), but the description adds substantial cross-tool behavior: visibility=hidden means the page does not render and screenshots fail, timers slow down, and dev.overlay carries compiler messages when an error overlay is open. These are non-obvious operating conditions an agent must know before calling other tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the returned metadata list, then explains the two most consequential semantics (visibility, dev server/overlay). Dense and mostly waste-free, though the second half is a single run-on sentence mixing three distinct concepts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations on return values, the description correctly takes on the burden of explaining the payload fields and their interpretation. It is nearly complete; the only gap is how this metadata tool relates to DOM-reading siblings like query_dom or read_page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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) are fully documented in the schema, including omission semantics. The description adds nothing about the parameters, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ("Page metadata") and enumerates exactly what it returns: title, url, visibility, doctype, charset, meta tags, scripts, stylesheets, links and forms. That is concrete, but it draws no boundary against siblings such as get_status, query_dom or read_page, so the agent gets no differentiation signal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is actionable usage guidance embedded in the details: read dev.overlay "before treating the page as valid", and treat visibility=hidden as a red flag because rendering and timers are affected. However there is no explicit when-to-use/when-not or named alternative (e.g., query_dom for DOM inspection), so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusBRead-onlyIdempotent
Bridge status: extension connection, server mode (primary/relay), host, port, server and extension versions, js_evaluation (false under --no-js), write_root and read_root, caps_active and caps_available (a tool missing from the list lives in an inactive cap), session_tab_id (the implicit tab), owned_tabs (created by this session), uptime_sec. enable switches caps on for this session, no restart. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| enable | No | Caps to switch on now, all in one call; "all" = every cap |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is unusually transparent about behavior, disclosing that the optional 'enable' parameter mutates session state ('switches caps on for this session, no restart'), which is a real side effect. However, this conflicts with the annotations declaring readOnlyHint=true and idempotentHint=true, which advertise a pure read with no state change. The description is honest, but the definition as a whole misleads a client that trusts the hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the body is a dense run-on enumeration that mixes the returned-field list with the optional-cap catalog in one long sentence with no paragraph breaks. Nearly all content is useful, yet the undifferentiated field dump makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 itself, and it does exhaustively: connection state, mode, host/port, versions, js_evaluation semantics, roots, caps_active vs caps_available with an interpretation rule, session_tab_id, owned_tabs, and uptime. Nothing an agent needs to interpret the response or the enable parameter is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes beyond the schema by explaining the effect of enabling (caps active for this session, no restart) and by mapping each cap to the concrete tools it unlocks (audits/cookie_audit, visual/inject_css, perf/lighthouse, etc.). That cap-to-tool mapping is genuinely actionable information an agent cannot get from the enum alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Bridge status') and enumerates exactly what is reported (connection, server mode, host/port, versions, roots, caps, tabs, uptime). It implicitly distinguishes itself from page-oriented siblings like get_page_info or get_tabs by scoping everything to the bridge/session itself. It stops short of naming a sibling it is not, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer it should call this to verify the extension is connected, check server mode, or diagnose why an optional tool is not in the tool list ('a tool missing from the list lives in an inactive cap'). The 'enable ... no restart' sentence hints at activation, but there is no explicit when-to-use vs alternatives statement or precondition guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_storageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | all returns the three together | all |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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_tabsARead-onlyIdempotent
List every open tab with id, url, title, active flag and mine (created by this session). Read-only. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| include_windows | No | Also return the windows with bounds, state, type and tab count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so "Read-only" is redundant. However the description adds genuine non-obvious behavior: tabs closed since the last call are surfaced once in closed_session_tabs with enumerated reasons (closed, window_closed, replaced, closed_by_bridge), which is stateful/edge-case detail the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then read-only, then when to use it, then the option, then the closed-tab edge case — no filler sentences. It is dense and packed into one paragraph, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately enumerates returned fields and documents the exceptional return channel (closed_session_tabs) and its reason vocabulary. Nothing critical is missing for correct invocation; only minor gaps remain around pagination/scale of large tab sets.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's own description already covers bounds/state/type/tab count. The description adds a usage-level nuance ("needed before moving or tiling") rather than new syntax, which is a modest increment over the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List every open tab") and enumerates the returned fields (id, url, title, active flag, mine), which lets an agent distinguish it from get_page_info, get_interactives or create_tab. The clarifying gloss "mine (created by this session)" removes ambiguity about the field name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete triggering condition — "Find a tab_id when the implicit target is not the one you mean" — and a prerequisite for the option that must be set before other operations ("needed before moving or tiling"). It does not name alternative siblings (e.g. get_page_info, move_tab) or say when not to call it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
handle_dialogsAIdempotent
Auto-accept/dismiss future JS dialogs (alert/confirm/prompt), logging them. reset restores native dialogs and returns the log.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | accept/dismiss auto-answer future dialogs; reset restores native behaviour | accept |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| prompt_text | No | Returned by window.prompt on accept |
TDQS
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.
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.
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.
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.
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.
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.
handoffAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ask | No | Show a text box in the banner; the reply comes back as answer | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| message | Yes | What the user should do, one line | |
| timeout | No | ms to wait for the click, default 5 min | |
| pick_max | No | With pick_element: up to N elements, the user presses Done when finished | |
| in_terminal | No | Also ask in the Claude Code terminal (MCP elicitation) when the client supports it; the first answer wins. Not for pick_element | |
| pick_element | No | Ask the user to click an element; returns its selector, text and box |
TDQS
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.
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.
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.
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.
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.
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_snapshotADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Classes listed | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the .heapsnapshot there and return the path instead of the content | |
| compare_to | No | Absolute path of an earlier .heapsnapshot to diff against |
TDQS
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.
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.
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.
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.
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.
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.
hoverAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | From get_interactives | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| trusted | No | Real browser pointer via chrome.debugger, main frame only: needed for CSS :hover | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | No | CSS selector; ">>>" pierces shadow DOM |
TDQS
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.
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.
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.
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.
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.
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_authAIdempotent
Set/clear credentials for HTTP Basic/Digest auth dialogs (browser-wide, in-memory only).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | set installs credentials for HTTP auth prompts; clear removes them | |
| password | No | Required for action=set; kept in memory, never written to disk | |
| username | No | Required for action=set |
TDQS
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.
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.
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.
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.
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.
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_requestADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute URL. Cookies are sent for its origin | |
| body | No | Request body (POST/PUT/PATCH) | |
| method | No | HEAD fetches headers only, without the body | GET |
| headers | No | Extra request headers | |
| save_to | No | Absolute path: write the response bytes here instead of returning them (PDF, images, archives) | |
| max_length | No | Max chars of body returned inline |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=true, so the description does not need to fully disclose side effects. The description does mention sending cookies and writing bytes to a file, which are important behaviors. However, it does not warn that POST/PUT/DELETE methods can modify or destroy remote resources, which is relevant given the destructiveHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact at two sentences and conveys the core purpose, key parameters, and a specific fallback use case. The phrasing 'fetches what a server-side request gets a login page for' is slightly awkward, but it does not add unnecessary length or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the return behavior (inline text up to max_length, or bytes written via save_to) but lacks details about response status codes, headers, or error conditions. Since there is no output schema, a bit more information about the response format would improve completeness, though the description is sufficient for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter having a description. The description adds useful context for save_to and max_length (e.g., writing bytes for PDFs and capping inline text). It does not go beyond the schema to clarify headers or method semantics, but the schema already covers these adequately, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as an HTTP request from the browser with the user's cookies, meant to fetch authenticated content such as invoices, JSON, or exports. It also distinguishes the PDF-reading use case from read_page, giving a specific purpose. It could be more direct in naming the action 'perform an HTTP request', but the intent is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool: when a server-side request would get a login page, for authenticated data, and for PDFs where read_page fails. It also hints at not using read_page for PDFs. It does not explicitly enumerate all alternative tools, but the 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.
inject_cssAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| css | Yes | One or more CSS rules, as they would appear in a stylesheet | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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.
lighthouseADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Page to audit; omitted = the URL of the target tab | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path without extension: the report is written to <path>.report.json and <path>.report.html | |
| categories | No | Subset of categories; omitted = all four | |
| form_factor | No | mobile emulates a mid-range phone with slow 4G, as PageSpeed Insights does | mobile |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | What to download (action=download); sent with the session cookies of its origin | |
| limit | No | Max download entries returned, newest first | |
| action | Yes | download fetches with the browser cookies and reports the real state; wait_for_complete blocks until the newest finishes | |
| timeout | No | Max ms (wait_for_complete) | |
| filename | No | Relative path inside the Downloads folder (action=download) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important side effects and real-world behavior: downloads are saved to the browser's Downloads folder, the tool reports the actual state, and a download may return waiting_for_user if Chrome asks for a destination. This goes beyond the minimal annotations and gives the agent useful runtime expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, leading with the three primary operations. It avoids unnecessary detail and each sentence contributes meaningful information about behavior or side effects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's core actions, storage location, and state-reporting behavior, which is enough for basic use. It does not explicitly describe the return values for list or wait_for_complete, but given the simple schema and annotations, this is a minor gap rather than a critical omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The JSON schema already provides 100% coverage of all parameters with descriptions. The tool description mostly restates the action enum behavior and adds little new meaning about the parameters themselves, so it provides only marginal additional value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: list downloads, start one, or wait for completion. It distinguishes this from server-side file operations by explicitly stating files land in the browser Downloads folder, and it conveys the download-state reporting behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the practical context of use, including where files are stored and what happens when the browser is configured to ask for a save location. It does not explicitly name alternative sibling tools, but the 'not on the server' note helps an agent choose this over server-side file operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_spacingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector1 | Yes | First element; distances are measured from its box | |
| selector2 | Yes | Second element; ">>>" pierces shadow DOM |
TDQS
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.
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.
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.
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.
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.
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_domAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Attribute name | |
| value | No | Attribute value, style declaration, or text, per action | |
| action | Yes | setStyle takes a CSS declaration in value; addClass/removeClass take className | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | Yes | CSS selector; ">>>" pierces shadow DOM. Only the first match is changed | |
| className | No | Class to add or remove (addClass/removeClass) |
TDQS
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.
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.
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.
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.
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.
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_networkARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear buffer after read | |
| limit | No | Most recent; buffer 1000 | |
| since | No | cursor from the previous read: only newer entries, nothing deleted | |
| format | No | har exports HAR 1.2 for external tooling | lines |
| source | No | page: XHR/fetch only; browser: static assets too; websocket: connections and messages | page |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld. The description adds a genuinely behavioral detail beyond them: that the page hook is 'installed on first call,' disclosing a first-invocation side effect. It doesn't cover buffer exhaustion or pagination semantics, but it earns credit for the hook disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the purpose and then the scope/format semantics. No filler, though the 'format=har' clause is nearly redundant with the schema's own enum description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param, all-optional read tool with full schema coverage and rich annotations, the description covers the essential scoping dimensions. It stops short of routing guidance against siblings, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 source and format explanations restate what the enum descriptions already say ('page: XHR/fetch only; format har exports HAR 1.2'), so the description adds little beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 enumerates the three source scopes, which clarifies the tool's domain. However, it offers no differentiation from closely related siblings like network_rules, http_request, or session_record, so an agent cannot tell from the description alone which network tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The source values imply when each mode applies (page vs browser vs websocket), which is useful usage context. But there is no explicit when-to-use-vs-alternative guidance and the sibling network_rules/http_request are never mentioned, leaving the agent to infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_tabAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | New window y (new_window) | |
| left | No | New window x (new_window) | |
| index | No | Position in the destination window; -1 appends at the end | |
| width | No | New window width px (new_window) | |
| height | No | New window height px (new_window) | |
| tab_id | Yes | Tab to move; get it from get_tabs | |
| window_id | No | Destination window; get_tabs reports windowId for every tab | |
| new_window | No | Extract the tab into a fresh window instead of an existing one | |
| window_type | No | new_window only: popup has no tab strip nor omnibox, the terminal-window look | normal |
TDQS
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.
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.
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.
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.
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.
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_rulesAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Response body (action=stub) | |
| name | No | Fixture name for record/replay | |
| action | Yes | record saves the page's API responses (url_filter) as a fixture, replay serves them with overrides; list/clear | |
| header | No | Header name for action=modify_header, e.g. "User-Agent" | |
| status | No | action=stub | |
| overrides | No | replay: force a status, body or delay on matching URLs — error states a real backend will not produce | |
| url_filter | No | declarativeNetRequest urlFilter, e.g. "||example.com/api/*" | |
| content_type | No | action=stub | application/json |
| header_value | No | Omit to remove header | |
| redirect_url | No | Destination for action=redirect | |
| header_target | No | response = strip content-security-policy / x-frame-options, inject CORS | request |
| resource_types | No | Limit the rule to these request types; omitted = all of them |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that rules persist across reloads until cleared and that it is a local helper, with an HTTPS-specific limitation. Combined with annotations indicating non-read-only, idempotent behavior, this gives a solid picture of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and dense, packing many capabilities into a single readable paragraph. It avoids fluff, though the long colon-separated list requires careful parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers core behavior and constraints, but does not explain return values, rule precedence, how to clear a single rule versus all rules, or how overlapping rules are resolved. For a tool with this many actions and optional parameters, that is a notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The JSON schema already documents all parameters with descriptions, and the narrative description adds useful semantics such as header_target behavior for stripping CSP and injecting CORS, and overrides being useful for error states a real backend will not produce.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as browser-wide network interception that can block, redirect, set/remove headers, stub, record, and replay. It is distinct from monitoring tools like monitor_network, though it does not use an explicit verb phrase like 'Manage network rules'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool can do but gives no guidance on when to use it versus alternatives such as monitor_network or http_request. The HTTPS host trust caveat is useful but does not provide selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
perf_traceADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | record does start → wait → stop in one call | record |
| reload | No | Reload the page right after tracing starts (default true for record, false for start) | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the trace JSON there and return the path instead of the content | |
| duration_ms | No | record: how long to trace, max 60000 | |
| interaction | No | Action run right after recording starts |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantive behavior beyond the annotations: the raw trace is written to a JSON file whose path/size come back in the result, tracing uses chrome.debugger so 'Chrome shows its debugging bar while tracing' (invisible in launch mode), and the tool refuses on a hidden page. This side-effect disclosure is genuinely useful and consistent with destructiveHint=true (the reload). It could go further on the reload's page-state impact, but the annotation bar is already met.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the payoff ('return its conclusions, never the trace') before the details. It is dense and the metric enumeration is a long run-on sentence, but every clause carries needed information given there is no output schema, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a nested interaction object, the description does the heavy lifting: it lists what is returned, explains the recording lifecycle modes, the raw-trace file artifact, the debugger side effect, and the hidden-page refusal. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the nested interaction object, reload defaults, duration cap, and save_to already carry descriptions. The prose restates the action/reload/duration behavior but adds no syntax or format detail the schema lacks, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 and return its conclusions') and immediately clarifies the crucial scope point: it returns conclusions, never the raw trace. It enumerates the exact metrics produced (LCP with phases, FCP, CLS, INP, long tasks, long animation frames), so an agent can distinguish this from generic siblings like lighthouse, audit, or track_events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the action semantics well: 'record' is the default one-shot (start, reload, wait, stop) while 'start'/'stop' 'bracket anything else done meanwhile', and notes it 'Refuses on a hidden page'. It gives clear conditions for each mode but never names or contrasts against sibling tools such as lighthouse or audit, so the when-to-prefer-this-tool question is left to inference.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | Hold Alt | |
| key | Yes | e.g. "Enter", "Escape", "Tab", "ArrowDown" | |
| ctrl | No | Hold Control | |
| meta | No | Hold Meta (Command/Windows) | |
| shift | No | Hold Shift | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| trusted | No | Real browser key (isTrusted) via chrome.debugger, main frame only | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | No | Target (default: activeElement) |
TDQS
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.
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.
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.
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.
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.
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_domARead-onlyIdempotent
Query DOM elements by CSS selector, returning structure, attributes, bounding rect, and computed styles.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max elements returned, from the top of the match list | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | Yes | CSS selector; ">>>" pierces shadow DOM. Matches all, not just the first | |
| properties | No | Computed styles to include, e.g. ["color"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and idempotentHint=true. The description adds value by stating what is returned (structure, attributes, bounding rect, computed styles), and the schema covers the limit and selector details. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the action and key details. No unnecessary words; highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 hints at the return format (structure, attributes, bounding rect, computed styles). It could mention that results are an array or ordered by DOM order, but it is sufficient for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not add extra meaning beyond the schema; it only mentions the selector in the tool description but not the other parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Query DOM elements by CSS selector) and the return data (structure, attributes, bounding rect, computed styles). It is specific and distinguishes from siblings like get_interactives or modify_dom.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus others. It implies usage for general DOM querying but does not mention alternatives or exclusions. Given many sibling tools, more context would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_consoleADestructive
Read console messages captured since page load, incl. uncaught errors and unhandled rejections.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear buffer after read | |
| level | No | all merges every level in one chronological list | all |
| limit | No | Most recent; buffer 1000 | |
| since | No | cursor from the previous read: only newer entries, nothing deleted | |
| format | No | lines is compact; json keeps timestamps and stack traces | lines |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| sourcemap | No | Resolve bundle.js:line:col frames to source files through their source maps |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety bar is lower. The description usefully discloses the buffer scope and that uncaught errors/rejections are included, but it never warns that the destructive behavior comes from the buffer-clearing read (the 'clear' flag), which is the one behavioral trait an agent most needs surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the verb and resource, then appends the scoping detail. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With seven well-described params, no output schema requested, and annotations covering the safety profile, the description is nearly complete for a diagnostic read tool. The one gap is the destructive buffer-clearing consequence, which is left entirely to the annotations and the 'clear' param description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each of the seven parameters carries a description (clear, level, limit, since, format, tab_id, sourcemap). The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read console messages) plus a scope qualifier (captured since page load) and what content is guaranteed (uncaught errors, unhandled rejections). An agent can distinguish it from siblings like monitor_network or get_page_info, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and the 'since page load' scope, which tells the agent this is a post-load diagnostic read. There is no explicit when-to-use, when-not-to-use, or guidance on pairing it with tools like evaluate_js or monitor_network.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_formARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector | No | The form or container; omitted = every visible control on the page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explicitly states 'Read-only' and discloses that password and card values are redacted, which is valuable behavioral information 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct and well-structured, conveying all necessary information in two sentences without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers what the tool does, when to use it, and important constraints. Given the tool's simplicity and lack of output schema, it provides complete context for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides clear descriptions for both parameters (tab_id, selector). The tool description does not add extra meaning to these parameters, so it meets but does not exceed the baseline for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reading a form as filled by the user, listing specific attributes (label, type, value, etc.) and its intended use case (checking against project documents before submit). It distinguishes itself from generic read tools by focusing on forms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides usage context ('before an irreversible Submit') and essential caveats (sensitive values redacted, read-only). While it doesn't explicitly name alternative tools, the guidance is sufficient for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | text strips markup; markdown keeps headings/links/tables far cheaper than html; accessibility = a11y tree | text |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| save_to | No | Absolute path: write the page there and return the path instead of the content | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| max_length | No | Max output chars |
TDQS
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.
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.
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.
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.
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.
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_pageADestructiveIdempotent
Save the full page (DOM, styles, images) as an MHTML archive file on the server filesystem.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| output_path | Yes | Absolute file path to write (e.g. /tmp/page.mhtml) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds that the tool writes an MHTML archive to the server filesystem, which elaborates on the destructive nature but does not detail side effects or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys all essential information without redundancy or unnecessary details. It is efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description adequately covers the operation. However, it omits potential edge cases, such as errors from invalid paths or overwrite behavior, which could be important for proper use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already describes both parameters. The description adds no extra semantics beyond the schema, such as the meaning of 'last tab navigated' for tab_id. Therefore, it provides minimal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (save), the resource (full page), and the output format (MHTML archive file). It distinguishes from sibling tools like screenshot (image capture) and read_page (content extraction) by specifying the archive format and filesystem destination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as when to prefer save_page over screenshot or get_page_info. No context about prerequisites or exclusions is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencastADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frame rate of the output video | |
| action | No | record does start → wait → stop in one call | record |
| format | No | Video container | mp4 |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| quality | No | JPEG quality of the captured frames, 0-100 | |
| save_to | No | Absolute path: write the video there and return the path instead of the content | |
| max_width | No | Scale frames down to this width in px | |
| duration_ms | No | record: how long to record, max 120000 | |
| interaction | No | Action run right after recording starts |
TDQS
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.
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.
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.
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.
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.
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.
screenshotARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| presets | No | Resizes the window per preset, then restores it; not phone emulation. A refused width is reported, not shot. save_to = directory | |
| save_to | No | Absolute path: write the PNG there and return the path instead of the content | |
| if_changed | No | Same pixels as the last screenshot of this tab: a note instead of the image. false = always send it |
TDQS
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.
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.
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.
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.
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.
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_diffAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | compare_urls: selectors hidden on both pages (dates, carousels, ads) | |
| name | No | Baseline id: reuse the same one to compare across runs | default |
| url_a | No | compare_urls: reference page, e.g. production | |
| url_b | No | compare_urls: page under test, e.g. staging or a PR preview | |
| action | Yes | baseline stores, compare measures against it, compare_urls diffs url_a vs url_b here, clear drops baselines | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector | No | Capture one element (default viewport) | |
| from_file | No | action=baseline: take it from this PNG (design mockup) instead of capturing | |
| threshold | No | Per-channel tolerance 0-255 |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Absolute horizontal position in px (action=to, without selector) | |
| y | No | Absolute vertical position in px (action=to, without selector) | |
| until | No | no_new_content stops when the page height stops growing | no_new_content |
| action | No | to jumps to a position or element; until scrolls repeatedly to load more | to |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| step_px | No | px per step, default viewport height | |
| behavior | No | instant avoids waiting for smooth-scroll animations | auto |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| offset_y | No | px offset for fixed headers (to) | |
| selector | No | Target (to) or stop element (until=element) | |
| container | No | until: selector that scrolls; default the document, or the largest scrollable element if the document does not scroll | |
| settle_ms | No | Pause ms after each step | |
| max_scrolls | No | Cap on scroll steps, so an infinite feed terminates |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is already partially structured. The description adds real behavioral value by disclosing the 'until' loop semantics (element visible, network idle, no new content / infinite scroll). It does not mention that scroll position is mutated as a side effect, nor the step/settle pacing that governs behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses with the primary action model front-loaded and zero filler. It is arguably too terse for a 13-parameter tool, but nothing in it is wasted or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 fully described parameters, a rich enum set, and no output schema, the description covers the one thing the schema cannot express well: the intent distinction between a single jump and a repeat-until loop. An agent has enough to call the tool correctly without further prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 13 parameters, and the enum values (action, until, behavior) are already documented in the schema with defaults. The description restates the action=to/until split but adds no syntax, units, or edge-case meaning beyond what the schema already 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scroll) and splits it into two clearly named modes ('once to element/coordinates' vs 'repeatedly until ...'), which tells an agent what the tool does at a glance. It does not name or distinguish against any sibling, but no sibling in the list performs scrolling, so differentiation is less critical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description effectively explains which of the two actions to choose and what each achieves, which is usable routing guidance. However it gives no context on when scrolling is preferred over alternatives (e.g. wait_for, get_page_info, full_page_screenshot) and no prerequisites such as requiring a loaded page or existing tab.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_fixtureADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Required for save/restore | |
| action | Yes | save snapshots the current origin; restore writes it back | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Required for start, observe and export (recording name, or a .jsonl path) | |
| action | Yes | start records this session; observe records what the USER does; stop writes the file; export makes a Playwright test | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| values | No | observe: record values of non-sensitive fields instead of {{field}} placeholders | |
| save_to | No | Absolute path: write the exported .spec.ts there and return the path instead of the content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: it records to a jsonl format, never records sensitive values, and replays target the tab navigated. These are valuable behavioral details beyond the annotations, which are all false. However, it doesn't mention side effects like file creation (beyond the replay command), whether stop is required, or how the export writes files. Given the false annotations, the description carries the burden and does a solid job, though not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single run-on sentence with semicolons, but it's dense with information and front-loads the core purpose. It avoids redundant wording and each clause adds distinct value. While not perfectly structured, it is efficient and does not waste words, earning a 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters and six actions, the description covers the high-level workflow well: recording, observing, exporting, and the replay target. The schema details the actions, so the description doesn't need to repeat them. It misses some nuance like what 'list' or 'status' do, but those are covered by the schema. The lack of an output schema is partially mitigated by the description's mention of 'return the path' in the save_to parameter, so overall it's fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes all parameters with 100% coverage, including the action enum and their purposes. The description adds minimal parameter-specific meaning—it mentions the replay file path and observe mode, but these are already implied in the schema. Since the schema is comprehensive, a baseline of 3 is appropriate; the description doesn't significantly enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a session recorder with three distinct capabilities: recording commands, observing user actions, and exporting to Playwright tests. It uses specific verbs and resources, and the three modes are explicitly differentiated, which distinguishes it from generic tools. Though it doesn't name a sibling, the description makes the tool's unique purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides contextual hints like 'for CI' and the replay command, but it doesn't explicitly state when to use this tool over alternatives or when to avoid it. There's no mention of prerequisites (e.g., needing an active session) or exclusions. The guidance is implicit rather than explicit, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_geolocationAIdempotent
Override navigator.geolocation with fixed coordinates (page-level patch). reset restores native.
| Name | Required | Description | Default |
|---|---|---|---|
| reset | No | Restore the real position and stop overriding | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| accuracy | No | Meters | |
| latitude | No | Decimal degrees, -90 to 90 | |
| longitude | No | Decimal degrees, -180 to 180 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotentHint=true and readOnlyHint=false, which the description does not contradict. The description adds that it is a page-level patch and that reset restores native behavior, but does not elaborate on persistence or scope beyond the page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (two sentences) and front-loaded with the main action. It is efficient but could be slightly more structured with separation of setting and resetting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 5 parameters and no output schema, the description is adequate but does not explain the interaction between reset and coordinates, or the temporary/durable nature of the override. It lacks guidance for typical testing scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds minimal extra meaning beyond the schema (e.g., 'reset restores native' is implicit in the reset parameter description).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: override navigator.geolocation with fixed coordinates. It also mentions the reset capability. This distinguishes it from sibling tools, as no other tool handles geolocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (setting coordinates for testing), but does not explicitly state when to use this tool versus alternatives, nor does it provide exclusion criteria or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_storageADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Required for set/delete | |
| path | No | Cookie path (default /) | |
| type | Yes | cookie writes a real cookie, not a storage key | |
| value | No | Required for action=set | |
| action | Yes | clear ignores key and wipes every entry of that type | |
| domain | No | Cookie domain | |
| secure | No | Cookie sent over HTTPS only | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| expires | No | UTC date string (cookie) | |
| sameSite | No | None requires secure=true | |
| http_only | No | Cookie hidden from page JS |
TDQS
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.
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.
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.
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.
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.
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_actionADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | close cannot be undone; discard frees memory (reloads on focus); reload drops injected CSS and hooks | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| bypass_cache | No | reload only |
TDQS
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.
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.
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.
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.
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.
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_windowsAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Monitor area to fill, when no target window has a scriptable tab to read it from | |
| layout | No | columns splits left to right, rows top to bottom, grid keeps tiles as square as it can | grid |
| padding | No | Px of empty margin kept inside the work area | |
| window_ids | No | Windows to tile; omitted = every normal window on the reference monitor | |
| include_types | No | Window types to include; omitted = normal only | |
| reference_window_id | No | Window whose monitor is used; omitted = the focused one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral nuances beyond the annotations, such as 'Maximized windows are restored first, since maximized ignores bounds' and the prerequisite that at least one target must have a scriptable tab. These details inform the agent about side effects and conditions, complementing the annotations (readOnlyHint false, idempotentHint true) without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using two sentences to convey purpose, scope, and behavioral details. It is front-loaded with the core action ('Tile Chrome windows over one monitor in equal parts with no gap') and then efficiently covers constraints and edge cases. Every sentence adds value without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (6 parameters, nested object, enums) and the rich schema descriptions, the description is largely complete. It covers the main purpose, scope, prerequisites, and a key behavioral quirk. It does not mention return values or error handling, but those are not expected from the schema's lack of an output schema. The description fills the context gap well for an agent to decide and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for all six parameters, and these descriptions are specific and informative (e.g., layout 'columns splits left to right', padding 'Px of empty margin kept inside the work area'). The tool description adds little beyond what the schema says; it reinforces the overall behavior but does not materially enhance parameter understanding. With 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Tile Chrome windows over one monitor in equal parts with no gap.' It specifies the resource (Chrome windows), the action (tile), and the scope (one monitor, equal parts, no gap). The additional clarification 'Only Chrome windows' further narrows the scope, leaving 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit constraints (e.g., 'at least one target needs a scriptable tab') but does not explicitly state when to use this tool over alternatives. There is no comparison with sibling tools like 'window_layout' or 'move_tab', and no conditions like 'use this when...'. It lacks direct usage guidance for an agent choosing among similar window management tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
track_eventsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Clear the browser log first — call it right before the action you want to observe | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| wait_ms | No | Time to wait before reading, for beacons sent after the action |
TDQS
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.
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.
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.
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.
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.
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_textAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | From get_interactives, e.g. "n3" | |
| mode | No | set = assign value; keys = per-char events (autocomplete/masked); trusted = real input via chrome.debugger, main frame | set |
| text | Yes | Value to type; empty string clears the field | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| selector | No | CSS selector; ">>>" pierces shadow DOM. Ignored when ref is given | |
| wait_after | No | Settle before returning: navigation waits for a page load, networkidle for quiet traffic | none |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path on the server machine; keys and credentials (~/.ssh, .env, *.pem) refused | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector | Yes | The file input to fill; ">>>" pierces shadow DOM | |
| mime_type | No | Default: inferred from extension |
TDQS
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.
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.
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.
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.
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.
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_resizeAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Window y on the virtual desktop | |
| left | No | Window x on the virtual desktop; on multi-monitor this is what picks the screen | |
| zoom | No | Page zoom for this origin, 1 = 100%; applied after the resize | |
| state | No | Applied before bounds: a maximized window accepts left/top/width/height and ignores them | |
| width | No | Overrides preset | |
| action | No | get reports the current viewport without resizing anything | set |
| height | No | Overrides preset | |
| preset | No | 375x812, 768x1024, 1440x900 | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one |
TDQS
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.
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.
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.
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.
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.
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_forARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | spa = pushState/popstate/hashchange | load |
| text | No | Literal text to wait for (condition=text), matched case-insensitively | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| idle_ms | No | Quiet period ms (network_idle) | |
| timeout | No | Max ms (default 10000; 15000 navigation/network_idle) | |
| visible | No | Element must also be visible | |
| frame_id | No | Target iframe id from get_frames; omitted = main frame | |
| interval | No | Poll ms, min 50 | |
| selector | No | condition=element; with condition=text it narrows the search to that subtree | |
| condition | Yes | element and text need selector or text; function needs expression | |
| expression | No | JS expression (condition=function) |
TDQS
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.
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.
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.
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.
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.
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.
watchAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Watch id | |
| text | No | Text that appears / disappears | |
| since | No | poll: events after this ms timestamp | |
| until | No | Default: change with value_of, else match | |
| action | No | poll = events since a timestamp | add |
| reload | No | Reload before each check, for pages that do not update live | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| selector | No | Element that appears (until=match) or disappears (until=gone) | |
| value_of | No | Element whose text changing fires (until=change) | |
| interval_s | No | Between checks, min 30 | |
| expires_min | No | Give up after |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and non-destructive, so the description doesn't repeat those. It adds valuable context beyond annotations: 'Survives extension idling, not a browser restart' clarifies persistence scope, and 'Events are collected, not pushed' explains the event delivery model. These details help an agent understand lifecycle and consumption without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and includes illustrative examples. It packs multiple behavioral notes (polling, event collection, persistence) into three sentences without redundancy. Slightly dense but efficient; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explains the watch mechanism and lifecycle but does not describe what the tool returns (e.g., event structure or format). Since parameters are fully documented in the schema, the main gap is the output contract. An agent might need additional clues to interpret the result, especially for the poll action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is individually documented. The tool description does not add additional meaning to the parameters beyond what the schema provides; it only references interval_s in context. This meets the baseline for fully covered schemas, but does not elevate it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to keep watching a page in the background for conditions like text appearing, disappearing, or changing. It provides concrete examples (pipeline green, Approve button appears) and explicitly distinguishes the polling mechanism ('events are collected, not pushed'). This differentiates it from siblings like watch_dom or wait_for by emphasizing the background, interval-based monitoring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives usage context (polling with action=poll, blocking script with --wait) but does not explicitly state when to choose this tool over alternatives like watch_dom or wait_for. It implies usage for long-running background checks but lacks exclusions or alternative routing, leaving the decision partially to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_domARead-onlyIdempotent
Watch DOM mutations (MutationObserver). First call installs the watcher; later calls read accumulated mutations.
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Disconnect observer | |
| clear | No | Clear buffer after read | |
| limit | No | Most recent mutations; buffer 1000 | |
| tab_id | No | Target tab; omitted = last tab navigated in this session, else the active one | |
| subtree | No | Observe descendants too, not just the matched node | |
| selector | No | Subtree to observe; ">>>" pierces shadow DOM | body |
| childList | No | Report added and removed children | |
| attributes | No | Report attribute changes | |
| characterData | No | Report text content changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds stateful behavior (install watcher on first call) which contradicts the 'idempotentHint: true' annotation. While it discloses more about usage pattern than annotations alone, the contradiction reduces reliability. Missing details on side effects like buffer limits or callback behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences covering the core functionality and phase behavior. No redundant words; essential information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While parameter details are fully covered by the schema, the description lacks information about return format, how mutations are structured, and the lifecycle of the watcher. For a tool with 9 parameters, more behavioral context (e.g., how to stop/clear) would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds no additional meaning beyond the schema. Each parameter's purpose is already clear from the schema, so no extra value from the tool description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool watches DOM mutations via MutationObserver and explains the two-phase behavior (install then read). It distinguishes itself from siblings like 'query_dom' or 'modify_dom' by specifying the observation pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for tracking DOM changes over time but does not explicitly state when to use it versus alternatives like 'get_interactives' or 'execute_js'. No exclusions or prerequisite conditions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
window_layoutADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Layout name, required except for list | |
| action | Yes | save snapshots every window; restore repositions the recognised ones |
TDQS
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.
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.
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.
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.
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.
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.
23 tool updates
v1.28.0- Added
animations - Changed
click1 field changed- added
Input schema / properties / trustedAdded value: +{ + "default": false, + "description": "Real browser input (isTrusted) via chrome.debugger, main frame only: for widgets that ignore synthetic clicks", + "type": "boolean" +}
- Changed
emulate_media7 fields changed- added
Input schema / properties / contrastAdded value: +{ + "description": "Value reported to prefers-contrast queries (debugger)", + "enum": [ + "more", + "less", + "no-preference" + ], + "type": "string" +} - added
Input schema / properties / cpu_throttleAdded value: +{ + "description": "CPU slowdown factor, e.g. 4 for a mid-range phone; 1 turns it off (debugger)", + "type": "number" +} - added
Input schema / properties / deviceAdded 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" +} - added
Input schema / properties / networkAdded value: +{ + "description": "DevTools network profile; none turns it off (debugger)", + "enum": [ + "offline", + "3g", + "slow-4g", + "fast-4g", + "none" + ], + "type": "string" +} - changed
Input schema / properties / reset / descriptionPrevious value: -"Remove all emulations"New value: +"Remove all emulations and detach the debugger" - added
Input schema / properties / touchAdded value: +{ + "description": "Emulate a touch screen (debugger)", + "type": "boolean" +} - added
Input schema / properties / viaAdded value: +{ + "description": "page: script shim, no browser bar; debugger: real emulation (default when a debugger-only option is set)", + "enum": [ + "page", + "debugger" + ], + "type": "string" +}
- Changed
execute_js2 fields changed- added
Input schema / properties / save_toAdded 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" +} - added
Input schema / properties / timeoutAdded value: +{ + "description": "Max ms to wait for the result (default 30000); raise it for long async work", + "type": "number" +}
- Changed
extract_table1 field changed- changed
Input schema / properties / where / descriptionPrevious 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."
- Changed
fill_form7 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"{selector, value} pairs"New value: +"{selector or ref, value or checked} per field" - added
Input schema / properties / fields / items / properties / checkedAdded value: +{ + "description": "Checkbox/radio instead of value: true checks, false unchecks", + "type": "boolean" +} - added
Input schema / properties / fields / items / properties / refAdded value: +{ + "description": "From navigate or get_interactives, e.g. \"n3\"", + "type": "string" +} - added
Input schema / properties / fields / items / properties / selector / descriptionAdded value: +"CSS selector; ignored when ref is given" - added
Input schema / properties / fields / items / properties / value / descriptionAdded value: +"Text, option value or label; for checkbox/radio \"true\"/\"false\"" - removed
Input schema / properties / fields / items / requiredRemoved value: -[ - "selector", - "value" -] - added
Input schema / properties / submit_refAdded value: +{ + "description": "Submit button as a ref, instead of submit_selector", + "type": "string" +}
- Added
frames - Added
get_css_styles - Changed
get_interactives1 field changed- added
Input schema / properties / sinceAdded value: +{ + "description": "cursor from the previous list: only added (+), changed (~) and removed elements; same scope, frame and tab", + "type": "string" +}
- Changed
get_status1 field changed- added
Input schema / properties / enableAdded 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" +}
- Changed
handoff3 fields changed- added
Input schema / properties / askAdded value: +{ + "default": false, + "description": "Show a text box in the banner; the reply comes back as answer", + "type": "boolean" +} - added
Input schema / properties / in_terminalAdded 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" +} - added
Input schema / properties / pick_maxAdded value: +{ + "default": 1, + "description": "With pick_element: up to N elements, the user presses Done when finished", + "type": "number" +}
- Added
heap_snapshot - Changed
hover2 fields changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector; \">>>\" pierces shadow DOM. Triggers CSS and JS hover handlers"New value: +"CSS selector; \">>>\" pierces shadow DOM" - added
Input schema / properties / trustedAdded value: +{ + "default": false, + "description": "Real browser pointer via chrome.debugger, main frame only: needed for CSS :hover", + "type": "boolean" +}
- Added
lighthouse - Changed
monitor_network1 field changed- added
Input schema / properties / sinceAdded value: +{ + "description": "cursor from the previous read: only newer entries, nothing deleted", + "type": "string" +}
- Added
perf_trace - Changed
press_key1 field changed- added
Input schema / properties / trustedAdded value: +{ + "default": false, + "description": "Real browser key (isTrusted) via chrome.debugger, main frame only", + "type": "boolean" +}
- Changed
read_console1 field changed- added
Input schema / properties / sinceAdded value: +{ + "description": "cursor from the previous read: only newer entries, nothing deleted", + "type": "string" +}
- Added
screencast - Changed
screenshot2 fields changed- added
Input schema / properties / if_changedAdded 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" +} - changed
Input schema / properties / presets / descriptionPrevious 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"
- Changed
scroll1 field changed- added
Input schema / properties / containerAdded value: +{ + "description": "until: selector that scrolls; default the document, or the largest scrollable element if the document does not scroll", + "type": "string" +}
- Changed
type_text2 fields changed- changed
Input schema / properties / mode / descriptionPrevious 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" - changed
Input schema / properties / mode / enumPrevious value: -[ - "set", - "keys" -]New value: +[ + "set", + "keys", + "trusted" +]
- Changed
upload_file1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"Absolute path on the server machine"New value: +"Absolute path on the server machine; keys and credentials (~/.ssh, .env, *.pem) refused"
31 tool updates
v1.16.1- Removed
accessibility_audit - Added
audit - Removed
check_links - Added
cookie_audit - Changed
element_screenshot3 fields changed- added
Input schema / properties / regionAdded 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" +} - added
Input schema / properties / scaleAdded value: +{ + "default": 1, + "description": "Enlargement of the crop, 1-4; output still capped at 1568px", + "maximum": 4, + "minimum": 1, + "type": "number" +} - removed
Input schema / requiredRemoved value: -[ - "selector" -]
- Added
find_setting - Changed
full_page_screenshot1 field changed- changed
Input schema / properties / max_segments / descriptionPrevious 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"
- Removed
get_performance - Added
handoff - Removed
highlight_elements - Removed
list_event_listeners - Changed
manage_downloads1 field changed- changed
Input schema / properties / action / descriptionPrevious 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"
- Changed
monitor_network2 fields changed- changed
Input schema / properties / source / descriptionPrevious 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" - changed
Input schema / properties / source / enumPrevious value: -[ - "page", - "browser" -]New value: +[ + "page", + "browser", + "websocket" +]
- Removed
monitor_websocket - Changed
move_tab2 fields changed- changed
Input schema / properties / new_window / descriptionPrevious 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" - changed
Input schema / properties / window_type / descriptionPrevious 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"
- Changed
network_rules4 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "block", - "redirect", - "modify_header", - "stub", - "list", - "clear" -]New value: +[ + "block", + "redirect", + "modify_header", + "stub", + "record", + "replay", + "list", + "clear" +] - added
Input schema / properties / nameAdded value: +{ + "description": "Fixture name for record/replay", + "type": "string" +} - added
Input schema / properties / overridesAdded 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" +}
- Changed
read_console1 field changed- added
Input schema / properties / sourcemapAdded value: +{ + "default": false, + "description": "Resolve bundle.js:line:col frames to source files through their source maps", + "type": "boolean" +}
- Added
read_form - Changed
read_page1 field changed- changed
Input schema / properties / mode / descriptionPrevious 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"
- Changed
screenshot1 field changed- added
Input schema / properties / presetsAdded value: +{ + "description": "One capture per preset, window restored; save_to = directory, one file each", + "items": { + "enum": [ + "mobile", + "tablet", + "desktop" + ], + "type": "string" + }, + "type": "array" +}
- Changed
screenshot_diff6 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "baseline", - "compare", - "list", - "clear" -]New value: +[ + "baseline", + "compare", + "compare_urls", + "list", + "clear" +] - added
Input schema / properties / from_fileAdded value: +{ + "description": "action=baseline: take it from this PNG (design mockup) instead of capturing", + "type": "string" +} - added
Input schema / properties / maskAdded value: +{ + "description": "compare_urls: selectors hidden on both pages (dates, carousels, ads)", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / url_aAdded value: +{ + "description": "compare_urls: reference page, e.g. production", + "type": "string" +} - added
Input schema / properties / url_bAdded value: +{ + "description": "compare_urls: page under test, e.g. staging or a PR preview", + "type": "string" +}
- Removed
security_headers - Removed
seo_audit - Changed
session_record6 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "start", - "stop", - "status", - "list" -]New value: +[ + "start", + "stop", + "status", + "list", + "export", + "observe" +] - changed
Input schema / properties / name / descriptionPrevious value: -"Required for start"New value: +"Required for start, observe and export (recording name, or a .jsonl path)" - added
Input schema / properties / save_toAdded value: +{ + "description": "Absolute path: write the exported .spec.ts there and return the path instead of the content", + "type": "string" +} - added
Input schema / properties / tab_idAdded value: +{ + "description": "Target tab; omitted = last tab navigated in this session, else the active one", + "type": "number" +} - added
Input schema / properties / valuesAdded value: +{ + "default": false, + "description": "observe: record values of non-sensitive fields instead of {{field}} placeholders", + "type": "boolean" +}
- Removed
set_zoom - Changed
tab_action2 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "close", - "activate", - "reload", - "back", - "forward", - "discard", - "mute", - "unmute", - "duplicate" -]New value: +[ + "close", + "activate", + "reload", + "back", + "forward", + "discard", + "mute", + "unmute", + "duplicate", + "close_session" +]
- Added
track_events - Removed
unused_css - Changed
viewport_resize1 field changed- added
Input schema / properties / zoomAdded value: +{ + "description": "Page zoom for this origin, 1 = 100%; applied after the resize", + "type": "number" +}
- Added
watch - Removed
web_vitals
8 tool updates
v1.15.0- Changed
create_tab5 fields changed- added
Input schema / properties / heightAdded value: +{ + "description": "Window height px (new_window)", + "type": "number" +} - added
Input schema / properties / leftAdded value: +{ + "description": "Window x on the virtual desktop (new_window)", + "type": "number" +} - added
Input schema / properties / new_windowAdded value: +{ + "default": false, + "description": "Open in a fresh window instead of a tab; with left/top it lands on the chosen monitor", + "type": "boolean" +} - added
Input schema / properties / topAdded value: +{ + "description": "Window y (new_window)", + "type": "number" +} - added
Input schema / properties / widthAdded value: +{ + "description": "Window width px (new_window)", + "type": "number" +}
- Changed
get_tabs1 field changed- added
Input schema / properties / include_windowsAdded value: +{ + "default": false, + "description": "Also return the windows with bounds, state, type and tab count", + "type": "boolean" +}
- Changed
manage_downloads4 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "wait_for_complete" -]New value: +[ + "list", + "wait_for_complete", + "download" +] - added
Input schema / properties / filenameAdded value: +{ + "description": "Relative path inside the Downloads folder (action=download)", + "type": "string" +} - added
Input schema / properties / urlAdded value: +{ + "description": "What to download (action=download); sent with the session cookies of its origin", + "type": "string" +}
- Changed
move_tab7 fields changed- added
Input schema / properties / heightAdded value: +{ + "description": "New window height px (new_window)", + "type": "number" +} - added
Input schema / properties / leftAdded value: +{ + "description": "New window x (new_window)", + "type": "number" +} - added
Input schema / properties / new_windowAdded value: +{ + "default": false, + "description": "Extract the tab into a fresh window instead — tabs.move needs an existing window, this does not", + "type": "boolean" +} - added
Input schema / properties / topAdded value: +{ + "description": "New window y (new_window)", + "type": "number" +} - added
Input schema / properties / widthAdded value: +{ + "description": "New window width px (new_window)", + "type": "number" +} - added
Input schema / properties / window_typeAdded 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" +} - changed
Input schema / requiredPrevious value: -[ - "tab_id", - "window_id" -]New value: +[ + "tab_id" +]
- Changed
tab_action2 fields changed- changed
Input schema / properties / action / descriptionPrevious 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" - changed
Input schema / properties / action / enumPrevious value: -[ - "close", - "activate", - "reload", - "back", - "forward" -]New value: +[ + "close", + "activate", + "reload", + "back", + "forward", + "discard", + "mute", + "unmute", + "duplicate" +]
- Added
tile_windows - Changed
viewport_resize3 fields changed- added
Input schema / properties / leftAdded value: +{ + "description": "Window x on the virtual desktop; on multi-monitor this is what picks the screen", + "type": "number" +} - added
Input schema / properties / stateAdded value: +{ + "description": "Applied before bounds: a maximized window accepts left/top/width/height and ignores them", + "enum": [ + "normal", + "maximized", + "fullscreen", + "minimized" + ], + "type": "string" +} - added
Input schema / properties / topAdded value: +{ + "description": "Window y on the virtual desktop", + "type": "number" +}
- Added
window_layout
1 tool update
v1.12.0- Added
move_tab
6 tool updates
v1.11.0- Changed
click2 fields changed- added
Input schema / properties / buttonAdded value: +{ + "default": "left", + "description": "right opens the page context menu instead of activating the element", + "enum": [ + "left", + "right" + ], + "type": "string" +} - added
Input schema / properties / countAdded value: +{ + "default": 1, + "description": "2 emits dblclick after the two clicks, which is what selects a word or opens an editor", + "type": "number" +}
- Changed
extract1 field changed- added
Input schema / properties / save_toAdded value: +{ + "description": "Absolute path: write the records as JSON there and return the path instead of the content", + "type": "string" +}
- Changed
read_page3 fields changed- changed
Input schema / properties / mode / descriptionPrevious 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" - changed
Input schema / properties / mode / enumPrevious value: -[ - "text", - "html", - "accessibility" -]New value: +[ + "text", + "markdown", + "html", + "accessibility" +] - added
Input schema / properties / save_toAdded value: +{ + "description": "Absolute path: write the page there and return the path instead of the content", + "type": "string" +}
- Changed
screenshot1 field changed- added
Input schema / properties / save_toAdded value: +{ + "description": "Absolute path: write the PNG there and return the path instead of the content", + "type": "string" +}
- Changed
viewport_resize1 field changed- added
Input schema / properties / actionAdded value: +{ + "default": "set", + "description": "get reports the current viewport without resizing anything", + "enum": [ + "set", + "get" + ], + "type": "string" +}
- Changed
wait_for4 fields changed- changed
Input schema / properties / condition / descriptionPrevious value: -"function needs expression; element needs selector"New value: +"element and text need selector or text; function needs expression" - changed
Input schema / properties / condition / enumPrevious value: -[ - "element", - "function", - "navigation", - "network_idle" -]New value: +[ + "element", + "text", + "function", + "navigation", + "network_idle" +] - changed
Input schema / properties / selector / descriptionPrevious value: -"condition=element"New value: +"condition=element; with condition=text it narrows the search to that subtree" - added
Input schema / properties / textAdded value: +{ + "description": "Literal text to wait for (condition=text), matched case-insensitively", + "type": "string" +}
58 tool updates
v1.10.0- Changed
accessibility_audit2 fields changed- added
Input schema / properties / checks / descriptionAdded value: +"Subset to run; fewer checks means a shorter answer" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
assert4 fields changed- added
Input schema / properties / selector / descriptionAdded value: +"Element the assertion is about; \">>>\" pierces shadow DOM" - added
Input schema / properties / state / descriptionAdded value: +"attached means present in the DOM, visible also requires a rendered box" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / timeout / descriptionAdded value: +"Max ms to wait for the condition before failing"
- Changed
check_links5 fields changed- added
Input schema / properties / format / descriptionAdded value: +"lines is compact; json keeps per-link status and timing" - added
Input schema / properties / max_links / descriptionAdded value: +"Cap on links fetched: each one is a real HTTP request" - added
Input schema / properties / scope / descriptionAdded value: +"same-origin skips third-party links, which are the slow ones" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Restricts which links are collected" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
click4 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Ignored when ref is given" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / wait_after / descriptionAdded value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
- Changed
clipboard2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"write takes text; read returns the current clipboard contents" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
create_tab1 field changed- added
Input schema / properties / active / descriptionAdded value: +"false opens the tab in the background, leaving the current one focused"
- Changed
dismiss_overlays1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
drag_and_drop5 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / mode / descriptionAdded value: +"Which event family to emit, since libraries listen to different ones" - added
Input schema / properties / source_selector / descriptionAdded value: +"Element to drag; \">>>\" pierces shadow DOM" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / target_selector / descriptionAdded value: +"Drop target; \">>>\" pierces shadow DOM"
- Changed
element_screenshot2 fields changed- added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. The element is scrolled into view first" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
emulate_media4 fields changed- added
Input schema / properties / colorScheme / descriptionAdded value: +"Value reported to prefers-color-scheme queries" - added
Input schema / properties / printMode / descriptionAdded value: +"Make print media queries match, without opening a print dialog" - added
Input schema / properties / reducedMotion / descriptionAdded value: +"Value reported to prefers-reduced-motion queries" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
execute_js3 fields changed- added
Input schema / properties / code / descriptionAdded value: +"JS evaluated in the page; the value of the last expression is returned" - added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
extract3 fields changed- added
Input schema / properties / format / descriptionAdded value: +"lines is compact; json keeps one object per record" - added
Input schema / properties / max_items / descriptionAdded value: +"Cap on records returned, in document order" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
extract_table4 fields changed- added
Input schema / properties / index / descriptionAdded value: +"Which table to take when the selector matches several, 0-based" - added
Input schema / properties / selector / descriptionAdded value: +"The table to read; \">>>\" pierces shadow DOM" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - changed
Input schema / properties / where / descriptionPrevious 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."
- Changed
fill_form3 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / wait_after / descriptionAdded value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
- Changed
find_text4 fields changed- added
Input schema / properties / case_sensitive / descriptionAdded value: +"Match case exactly" - added
Input schema / properties / max_results / descriptionAdded value: +"Cap on matches returned, in document order" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / text / descriptionAdded value: +"Literal text to find, not a regex"
- Changed
full_page_screenshot2 fields changed- added
Input schema / properties / max_scrolls / descriptionAdded value: +"Cap on scroll steps: a taller page is captured only up to here" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
get_frames1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
get_interactives5 fields changed- added
Input schema / properties / format / descriptionAdded value: +"lines is compact; json adds full attributes per element" - added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / limit / descriptionAdded value: +"Max elements returned; raise it on a dense page" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / visible_only / descriptionAdded value: +"false also lists elements hidden or scrolled out of view"
- Changed
get_page_info2 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
get_performance1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
get_storage2 fields changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / type / descriptionAdded value: +"all returns the three together"
- Changed
handle_dialogs2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"accept/dismiss auto-answer future dialogs; reset restores native behaviour" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
highlight_elements5 fields changed- added
Input schema / properties / border / descriptionAdded value: +"CSS border shorthand, e.g. \"2px solid red\"" - added
Input schema / properties / color / descriptionAdded value: +"Any CSS color for the overlay label" - added
Input schema / properties / remove / descriptionAdded value: +"Remove previously injected highlights instead of adding" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Every match is outlined" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
hover3 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Triggers CSS and JS hover handlers" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
http_auth3 fields changed- added
Input schema / properties / action / descriptionAdded value: +"set installs credentials for HTTP auth prompts; clear removes them" - added
Input schema / properties / password / descriptionAdded value: +"Required for action=set; kept in memory, never written to disk" - added
Input schema / properties / username / descriptionAdded value: +"Required for action=set"
- Changed
http_request1 field changed- added
Input schema / properties / method / descriptionAdded value: +"HEAD fetches headers only, without the body"
- Changed
inject_css2 fields changed- added
Input schema / properties / css / descriptionAdded value: +"One or more CSS rules, as they would appear in a stylesheet" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
list_event_listeners2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Max listeners returned, from the top of the match list" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
manage_downloads2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"wait_for_complete blocks until the newest download finishes or times out" - added
Input schema / properties / limit / descriptionAdded value: +"Max download entries returned, newest first"
- Changed
measure_spacing3 fields changed- added
Input schema / properties / selector1 / descriptionAdded value: +"First element; distances are measured from its box" - added
Input schema / properties / selector2 / descriptionAdded value: +"Second element; \">>>\" pierces shadow DOM" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
modify_dom6 fields changed- added
Input schema / properties / action / descriptionAdded value: +"setStyle takes a CSS declaration in value; addClass/removeClass take className" - added
Input schema / properties / className / descriptionAdded value: +"Class to add or remove (addClass/removeClass)" - added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Only the first match is changed" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / value / descriptionAdded value: +"Attribute value, style declaration, or text, per action"
- Changed
monitor_network3 fields changed- added
Input schema / properties / format / descriptionAdded value: +"har exports HAR 1.2 for external tooling" - added
Input schema / properties / source / descriptionAdded value: +"page sees XHR/fetch only; browser also sees static assets" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
monitor_websocket1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
navigate2 fields changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / url / descriptionAdded value: +"Absolute URL, or a path resolved against the current page"
- Changed
network_rules4 fields changed- added
Input schema / properties / action / descriptionAdded value: +"list and clear inspect and drop the rules already installed" - added
Input schema / properties / header / descriptionAdded value: +"Header name for action=modify_header, e.g. \"User-Agent\"" - added
Input schema / properties / redirect_url / descriptionAdded value: +"Destination for action=redirect" - added
Input schema / properties / resource_types / descriptionAdded value: +"Limit the rule to these request types; omitted = all of them"
- Changed
press_key6 fields changed- added
Input schema / properties / alt / descriptionAdded value: +"Hold Alt" - added
Input schema / properties / ctrl / descriptionAdded value: +"Hold Control" - added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / meta / descriptionAdded value: +"Hold Meta (Command/Windows)" - added
Input schema / properties / shift / descriptionAdded value: +"Hold Shift" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
query_dom4 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / limit / descriptionAdded value: +"Max elements returned, from the top of the match list" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Matches all, not just the first" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
read_console3 fields changed- added
Input schema / properties / format / descriptionAdded value: +"lines is compact; json keeps timestamps and stack traces" - added
Input schema / properties / level / descriptionAdded value: +"all merges every level in one chronological list" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
read_page3 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / mode / descriptionAdded value: +"text strips markup, html keeps it (costly), accessibility returns the a11y tree" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
save_page1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
screenshot1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
screenshot_diff3 fields changed- added
Input schema / properties / action / descriptionAdded value: +"baseline stores, compare measures against it, clear drops baselines" - added
Input schema / properties / name / descriptionAdded value: +"Baseline id: reuse the same one to compare across runs" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
scroll8 fields changed- added
Input schema / properties / action / descriptionAdded value: +"to jumps to a position or element; until scrolls repeatedly to load more" - added
Input schema / properties / behavior / descriptionAdded value: +"instant avoids waiting for smooth-scroll animations" - changed
Input schema / properties / frame_id / descriptionPrevious value: -"action=to only"New value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / max_scrolls / descriptionAdded value: +"Cap on scroll steps, so an infinite feed terminates" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / until / descriptionAdded value: +"no_new_content stops when the page height stops growing" - added
Input schema / properties / x / descriptionAdded value: +"Absolute horizontal position in px (action=to, without selector)" - added
Input schema / properties / y / descriptionAdded value: +"Absolute vertical position in px (action=to, without selector)"
- Changed
security_headers1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
seo_audit1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
session_fixture2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"save snapshots the current origin; restore writes it back" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
session_record1 field changed- added
Input schema / properties / action / descriptionAdded value: +"start begins recording, stop writes the file and returns its path"
- Changed
set_geolocation4 fields changed- added
Input schema / properties / latitude / descriptionAdded value: +"Decimal degrees, -90 to 90" - added
Input schema / properties / longitude / descriptionAdded value: +"Decimal degrees, -180 to 180" - added
Input schema / properties / reset / descriptionAdded value: +"Restore the real position and stop overriding" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
set_storage7 fields changed- added
Input schema / properties / action / descriptionAdded value: +"clear ignores key and wipes every entry of that type" - added
Input schema / properties / http_only / descriptionAdded value: +"Cookie hidden from page JS" - added
Input schema / properties / sameSite / descriptionAdded value: +"None requires secure=true" - added
Input schema / properties / secure / descriptionAdded value: +"Cookie sent over HTTPS only" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / type / descriptionAdded value: +"cookie writes a real cookie, not a storage key" - added
Input schema / properties / value / descriptionAdded value: +"Required for action=set"
- Changed
set_zoom2 fields changed- added
Input schema / properties / reset / descriptionAdded value: +"Restore the default zoom for this origin" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
tab_action2 fields changed- added
Input schema / properties / action / descriptionAdded value: +"close cannot be undone; reload drops injected CSS and page hooks" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
type_text5 fields changed- added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / selector / descriptionAdded value: +"CSS selector; \">>>\" pierces shadow DOM. Ignored when ref is given" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one" - added
Input schema / properties / text / descriptionAdded value: +"Value to type; empty string clears the field" - added
Input schema / properties / wait_after / descriptionAdded value: +"Settle before returning: navigation waits for a page load, networkidle for quiet traffic"
- Changed
unused_css2 fields changed- added
Input schema / properties / max_selectors / descriptionAdded value: +"Cap on unused selectors reported: a large stylesheet has thousands" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
upload_file2 fields changed- added
Input schema / properties / selector / descriptionAdded value: +"The file input to fill; \">>>\" pierces shadow DOM" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
viewport_resize1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
wait_for3 fields changed- added
Input schema / properties / condition / descriptionAdded value: +"function needs expression; element needs selector" - added
Input schema / properties / frame_id / descriptionAdded value: +"Target iframe id from get_frames; omitted = main frame" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
watch_dom6 fields changed- added
Input schema / properties / attributes / descriptionAdded value: +"Report attribute changes" - added
Input schema / properties / characterData / descriptionAdded value: +"Report text content changes" - added
Input schema / properties / childList / descriptionAdded value: +"Report added and removed children" - added
Input schema / properties / selector / descriptionAdded value: +"Subtree to observe; \">>>\" pierces shadow DOM" - added
Input schema / properties / subtree / descriptionAdded value: +"Observe descendants too, not just the matched node" - added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
- Changed
web_vitals1 field changed- added
Input schema / properties / tab_id / descriptionAdded value: +"Target tab; omitted = last tab navigated in this session, else the active one"
2 tool updates
v1.9.0- Changed
emulate_media1 field changed- added
Input schema / properties / user_agentAdded value: +{ + "description": "Overrides navigator.userAgent and appVersion in the page (not the HTTP header)", + "type": "string" +}
- Added
http_request
59 tool updates
v1.8.0- First observed
accessibility_audit - First observed
assert - First observed
check_links - First observed
click - First observed
clipboard - First observed
create_tab - First observed
dismiss_overlays - First observed
drag_and_drop - First observed
element_screenshot - First observed
emulate_media - First observed
execute_js - First observed
extract - First observed
extract_table - First observed
fill_form - First observed
find_text - First observed
full_page_screenshot - First observed
get_frames - First observed
get_interactives - First observed
get_page_info - First observed
get_performance - First observed
get_status - First observed
get_storage - First observed
get_tabs - First observed
handle_dialogs - First observed
highlight_elements - First observed
hover - First observed
http_auth - First observed
inject_css - First observed
list_event_listeners - First observed
manage_downloads - First observed
measure_spacing - First observed
modify_dom - First observed
monitor_network - First observed
monitor_websocket - First observed
navigate - First observed
network_rules - First observed
press_key - First observed
query_dom - First observed
read_console - First observed
read_page - First observed
save_page - First observed
screenshot - First observed
screenshot_diff - First observed
scroll - First observed
security_headers - First observed
seo_audit - First observed
session_fixture - First observed
session_record - First observed
set_geolocation - First observed
set_storage - First observed
set_zoom - First observed
tab_action - First observed
type_text - First observed
unused_css - First observed
upload_file - First observed
viewport_resize - First observed
wait_for - First observed
watch_dom - First observed
web_vitals
TDQS
Scored across 66 tools
Despite the large number, most tools have clearly distinct purposes (e.g., screenshot variants differ by scope; storage, network, and DOM tools are separate). A few areas overlap—audit vs lighthouse, wait_for vs assert, and extraction tools—but the detailed descriptions usually resolve the choice.
Nearly all names use snake_case, with common verb_noun patterns like get_status, set_storage, and create_tab. Some names are noun_noun or single words (screenshot, tab_action, lighthouse), which is a minor deviation but still readable and consistent enough.
66 tools is an extreme surface for an agent, far exceeding the typical 3-15 well-scoped set. Even with optional capability groups, the total count creates overwhelming cognitive load and high misselection risk.
The surface covers browser automation comprehensively: tabs, windows, DOM, CSS, network interception, storage, performance, audits, file upload/download, dialogs, handoff, and session recording. No obvious core CRUD or lifecycle gaps remain.
Maintenance
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Live browser debugging for AI assistants — DOM, console, network via MCP.
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP 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.1Apache 2.0
- AlicenseBqualityBmaintenanceTurns 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.92372 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables 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.379 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables 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.16 npm1MIT