devtools-fleet-mcp
Manages a fleet of per-agent Chrome browsers with isolated profiles, saved logins, origin allowlists, and lifecycle management, while exposing Google's full DevTools toolset through the wrapped chrome-devtools-mcp.
Provides Lighthouse audit capabilities on web pages through the wrapped chrome-devtools-mcp toolset, enabling performance, accessibility, and SEO analysis.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@devtools-fleet-mcpStart a browser from my staging-admin login and check localhost:3000 for console errors"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Give every one of your AI agents its own Chrome, running Google's full DevTools toolset, already logged in, and fenced to the sites it should touch.
Why This Exists
Google's chrome-devtools-mcp is the best browser toolset an agent can have when the job is debugging a web app: console, network, performance traces, Lighthouse, heap snapshots. It stops working the moment you run more than one agent:
Agent two starts →
The browser is already running for …, because every server shares one Chrome profileSwitch on
--isolated→ every agent starts logged out and fights the wp-admin, staging or SSO login again, every timeThe MCP connection drops → the browser, its tabs and its login die with it
Ten agents are running → ten invisible headless Chromes. Nothing lists them, nothing cleans up after a crash
Other multi-agent browser tools solve pooling and logins, but on Playwright or through a browser extension. None of them carries Google's DevTools toolset.
Related MCP server: Chrome DevTools MCP
The Solution
devtools-fleet-mcp sits in front of chrome-devtools-mcp and manages the browsers. It doesn't reimplement a single browser tool: Google's tools are passed through unchanged, under the same names.
agent session A ─stdio─▶ devtools-fleet-mcp ─▶ chrome-devtools-mcp --browserUrl ─CDP─▶ Chrome A (own profile)
agent session B ─stdio─▶ devtools-fleet-mcp ─▶ chrome-devtools-mcp --browserUrl ─CDP─▶ Chrome B (own profile)
│
└──▶ ~/.devtools-fleet/ ◀── devtools-fleet CLI: ls, show, kill, gc, login, statesOne browser per agent, zero config. The first browser tool call launches that session's own Chrome. Up to 10 at once by default.
Browsers outlive the connection. An agent that reconnects inside the same session gets its browser back, tabs open. A small background reaper closes the browsers nobody comes back for.
Saved logins. You log in once, by hand, in a real window (2FA, SSO and captchas are fine). Any number of agents can then start from that login in parallel, each in its own browser.
Origin allowlists. A browser started from a saved login can only reach that login's origins. Typed URLs, link clicks, redirects and popups elsewhere are blocked. Strict mode locks the whole network in Chrome itself.
Recovery. If Chrome or chrome-devtools-mcp dies, the next tool call brings it back and tells the agent what happened.
Watch any agent live.
devtools-fleet show <id>opens Chrome's DevTools inspector on that agent's page without disturbing it.
Quick Start
Requires Node.js 22.12+ and Google Chrome (or point chromePath at another Chromium build).
Install as a Claude Code plugin (recommended)
The plugin installs the MCP server and a skill that teaches agents the fleet workflow: check state_list, start from a saved login, respect the allowlist, recover after a crash.
Inside Claude Code:
/plugin marketplace add pluginslab/devtools-fleet-mcp
/plugin install devtools-fleet@pluginslab-devtools-fleetOr from your terminal:
claude plugin marketplace add pluginslab/devtools-fleet-mcp
claude plugin install devtools-fleet@pluginslab-devtools-fleetRestart Claude Code and check that devtools-fleet shows up under /mcp.
Already using chrome-devtools-mcp? Remove it (claude mcp remove chrome-devtools, or disable its plugin). devtools-fleet exposes the same tools under the same names, and two servers with identical tool names confuse agents.
Updating: /plugin marketplace update pluginslab-devtools-fleet, then restart. The server runs through npx, so it picks up new npm releases on its own.
Install the CLI
The plugin gives agents the MCP tools. Saving logins, watching agents and cleaning up are done by you, from the CLI:
npm install -g devtools-fleet-mcp
devtools-fleet doctorNo global install? Every command also works as npx -p devtools-fleet-mcp devtools-fleet <command>.
Other MCP clients
Claude Code without the plugin:
claude mcp add devtools-fleet -- npx -y devtools-fleet-mcpAny other client (.mcp.json, Cursor, Claude Desktop, …):
{
"mcpServers": {
"devtools-fleet": {
"command": "npx",
"args": ["-y", "devtools-fleet-mcp"]
}
}
}First test
Open two Claude Code sessions and ask both:
"Open http://localhost:3000 and check the console for errors."
Each gets its own Chrome; neither hits the profile lock. Then, in a terminal:
devtools-fleet lsFirst saved login
devtools-fleet login staging-admin https://staging.example.com/wp-login.phpLog in in the window that opens, come back to the terminal, press Enter, confirm the allowlist. Then ask an agent:
"Using the staging-admin state, open the Plugins page and run a Lighthouse audit on it."
The agent calls state_list, then browser_start({ state: "staging-admin" }), and starts already logged in.
MCP Tools
devtools-fleet adds six tools. Everything else (navigate_page, take_snapshot, click, evaluate_script, list_network_requests, performance_start_trace, lighthouse_audit, …) is chrome-devtools-mcp's, with the same names and arguments, so its documentation and skills apply as-is.
browser_start
Starts this session's browser, or picks it up again after a reconnect. Optional: any browser tool starts one with defaults.
→ browser_start({ state: "staging-admin", url: "https://staging.example.com/wp-admin/" })
← Started: browser 3f9c2a, state "staging-admin", headless, stable
allowed origins: https://staging.example.com
tabs: https://staging.example.com/wp-admin/
uptime 2sParameter | Type | Description |
| string | Saved login to start from |
| boolean | Default from config ( |
| string | e.g. |
| string |
|
| string | Open this in the first tab |
| string[] | Without a state: restrict this browser voluntarily |
browser_status
This session's browser: id, state, allowlist, mode, open tabs, uptime, blocked requests.
→ browser_status()
← browser 3f9c2a, state "staging-admin", headless, stable
allowed origins: https://staging.example.com
tabs: https://staging.example.com/wp-admin/plugins.php
uptime 312s, 2 request(s) blocked so farbrowser_restart
Relaunches keeping cookies, storage and tabs. { headless: false } gives a visible window, for example so a person can solve a captcha.
→ browser_restart({ headless: false })
← Restarted with a visible window; reopened 2 tab(s). Page ids have changed: call list_pages.browser_stop
Closes the browser and deletes its temporary profile.
→ browser_stop()
← Closed browser 3f9c2a.state_save
Saves the current browser's login under a name. Parameters: name, allowedOrigins (defaults to the open tabs' origins), strict, overwrite. An agent can only narrow its own allowlist, never widen it, and never overwrites a state a person created.
→ state_save({ name: "local-shop" })
← Saved state "local-shop": 4 cookie(s), localStorage for 1 origin(s). Allowed: http://localhost:3000.state_list
Saved states with origins, cookie counts and expiry. Never values.
→ state_list()
← staging-admin: https://staging.example.com | 6 cookies (0 expired) | saved 2026-10-01T09:12:44.512Z by cli
local-shop: http://localhost:3000 | 4 cookies (0 expired) | saved 2026-10-01T10:03:10.087Z by agentCLI Reference
# See every fleet browser: id, status, session, state, mode, current tab
devtools-fleet ls
devtools-fleet ls --json
# Watch an agent's browser live in Chrome's DevTools inspector (doesn't disturb it)
devtools-fleet show 3f9c2a
devtools-fleet show 3f9c2a --tab 2 --print
# Close browsers
devtools-fleet kill 3f9c2a
devtools-fleet kill --all
# Close browsers whose session is gone; --detached also closes ones waiting for a reconnect
devtools-fleet gc
devtools-fleet gc --detached
# Log in by hand and save a state
devtools-fleet login staging-admin https://staging.example.com/wp-login.php
devtools-fleet login shop http://localhost:3000/login --allow https://cdn.example.com --strict
# Manage states (never prints cookie or storage values)
devtools-fleet states
devtools-fleet state show staging-admin
devtools-fleet state rm staging-admin
devtools-fleet state import shop ./storageState.json --allow http://localhost:3000
# Check Node, Chrome, permissions and config; print effective config
devtools-fleet doctor
devtools-fleet configBrowser statuses: active (an agent is connected), detached (the connection dropped; waiting for that session to reconnect), orphan (the session is gone; closed on the next cleanup), starting.
How It Works
Process Management
On the first browser tool call, devtools-fleet:
Checks the cap under a machine-wide lock (
maxBrowsers, default 10). A full fleet gets a clear error naming the running sessions anddevtools-fleet gcLaunches Chrome itself, on a port it picks, with its own temporary profile
Restores the state, if one was asked for: cookies over CDP,
localStoragethrough a throwaway tab whose request devtools-fleet answers itself, so the site is never contactedSpawns chrome-devtools-mcp from its own pinned
node_moduleswith--browserUrl, and re-exports its tool list unchangedRegisters the browser in
~/.devtools-fleet/browsers/<id>.json
When the connection drops, Chrome keeps running. When the same client session reconnects, it finds its browser in the registry and re-adopts it, tabs intact. A reaper process (one per machine, started on demand, gone when idle) closes orphans at once and detached browsers after orphanTimeoutMinutes.
How Sessions Are Recognised
MCP clients start servers through wrappers (npx, npm exec, node, shells) and restart that whole chain on reconnect, while the client session itself (the claude process, an editor's extension host) keeps running. devtools-fleet walks up the process tree past the wrappers to that session process. The same session reconnecting finds the same process and gets its browser back; a second session in the same directory finds a different one and never shares.
DEVTOOLS_FLEET_SESSION=<label> replaces the lookup with a fixed label, useful in CI or containers.
Saved Logins
devtools-fleet login opens a real Chrome window. You log in, come back to the terminal, press Enter. devtools-fleet proposes an allowlist of where you started and where you ended up. Origins you only passed through, such as an SSO provider, are listed but left out: saving their cookies would hand agents your whole SSO session. Add one with --allow if the app really needs it.
What gets saved: cookies and localStorage for the allowed origins, in Playwright's storageState format. Playwright loads these files directly, and state import takes Playwright or agent-browser files the other way.
Rules that keep states safe to hand to an agent:
States are only written outside git work trees, with mode
0600in a0700directory.No listing, CLI or MCP, ever shows cookie or storage values.
A state is always bound to an allowlist. There is no "use these cookies anywhere" mode.
The Allowlist
Allowlist entries are full origins:
Entry | Matches |
| exactly that scheme, host and port |
| ports matter: |
| any subdomain, not |
Two layers enforce it:
Argument check.
new_pageandnavigate_pageare checked before anything reaches the browser; the agent gets a plain error.Navigation interception. devtools-fleet's own CDP connection intercepts navigations in every tab, popup and frame and fails the ones outside the list. A tab that can't be put under interception is closed rather than left unguarded.
A browser with an allowlist also refuses file: URLs and extra browser contexts (new_page's isolatedContext), since pages there would sit outside the guard.
Strict mode (login --strict) is enforced by Chrome itself: the browser launches with a proxy that goes nowhere, and only the allowed origins bypass it. Every other request fails in Chrome's network stack: fetch(), XHR, beacons, workers, WebSockets, QUIC. WebRTC is pinned to the dead proxy and DNS prefetching is off. The lock holds even while no agent is connected. It's off by default because it also blocks CDNs you haven't listed. At that layer an entry means host and port, so http and https on the same port aren't told apart there; the navigation guard still tells them apart.
What the allowlist does not do:
It limits where the agent goes, not what it does there. On an allowed origin,
evaluate_scriptcan read anything the page can, including non-httpOnly cookies. Treat a saved login like handing someone your session.Without strict mode, only navigations are guarded, and only while an agent is connected. A detached browser can still be navigated away by a script already running in its pages.
Files and Paths
chrome-devtools-mcp only reads and writes files (screenshots, traces, uploads) inside the client's workspace roots and the temp directory. devtools-fleet passes your client's roots through, so take_screenshot({ filePath: "<project>/shot.png" }) works as usual. Nothing may point into ~/.devtools-fleet: not a filePath, not an upload_file, not a file: URL, symlinks included.
Data Storage
~/.devtools-fleet/
config.json # Optional configuration (see below)
browsers/
<id>.json # One registry entry per running browser
profiles/ # Temporary Chrome profiles, deleted on close
states/ # Saved logins (0700 dir, 0600 files)
<name>.json
locks/ # mkdir locks for the cap check and adoptionDEVTOOLS_FLEET_HOME moves the whole directory.
Configuration
~/.devtools-fleet/config.json, every key optional. Environment variables override the file.
Key | Env | Default | |
|
|
| |
|
|
| window size; desktop-sized so pages render their desktop layout. |
|
|
| |
|
| detected | |
|
|
| across the machine |
|
|
| how long a dropped connection's browser waits for a reconnect |
|
|
| |
|
| extra chrome-devtools-mcp flags | |
|
| extra Chrome flags, e.g. |
chrome-devtools-mcp collects usage statistics by default and may send performance trace URLs to Google's CrUX API. devtools-fleet keeps its defaults. Opt out with "upstreamArgs": ["--no-usage-statistics", "--no-performance-crux"].
Limits
Tested on macOS and Linux. Windows should work apart from reconnect re-adoption, but is untested.
Saved logins cover cookies and
localStorage. Not IndexedDB,sessionStorageor service worker caches.Sites with device-bound sessions (Device Bound Session Credentials) won't accept copied cookies.
Google accounts are not supported. Google blocks automated sign-in and binds sessions to devices.
Headless can't switch to a window in place.
browser_restartrelaunches, and the pages reload.The debugging port is local-only but not authenticated, the same as chrome-devtools-mcp and every CDP tool: other processes running as your user can drive these browsers.
Companion Tools
devtools-fleet is the look step for the PluginsLab WordPress MCPs:
MCP | Purpose |
Verified hooks/filters/APIs for writing plugin code | |
Verified block schemas for generating content | |
Ephemeral WordPress instances for testing | |
devtools-fleet-mcp (this) | One DevTools-equipped Chrome per agent for looking at the result |
Together: author → validate → test → look.
Requirements
Node.js 22.12+
Google Chrome (stable, beta, dev or canary), or any Chromium via
chromePathmacOS or Linux
Development
npm install
npm test # unit tests, no browser
npm run test:integration # launches real Chrome; ~1 minute
npm run lintLicense
MIT
Available Tools
38 toolsbrowser_restartA
Relaunch this session's browser keeping cookies, localStorage and open tabs. Pass headless: false to get a visible window (e.g. so the human can watch or solve a captcha), headless: true to hide it again. Pages reload.
| Name | Required | Description | Default |
|---|---|---|---|
| headless | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses what survives (cookies, localStorage, open tabs) and one side effect ('Pages reload'), but omits what is lost (in-memory JS state, scroll position), whether it errors when no browser is running, and how long the relaunch takes. Partial disclosure, not a rich profile.
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 short sentences, front-loaded with the core action and preservation guarantee, then the parameter semantics, then the reload side effect. Every sentence earns its place and nothing is padded.
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 one-parameter tool with no output schema, the description covers the action, preserved state, parameter semantics, and reload behavior. The remaining gap is the default value/behavior of the optional headless parameter when omitted, which an agent would want to know.
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 0% and the single parameter name ('headless') alone is ambiguous, but the description explains both boolean values with concrete intent ('visible window … headless: true to hide it again'), which is exactly the meaning the schema lacks. It does not state the default when the optional parameter is omitted.
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 ('Relaunch this session's browser') plus the scope that separates it from a fresh browser_start: cookies, localStorage and open tabs are preserved. It doesn't name the sibling it is contrasted with, but the session-scoped framing makes the distinction inferable.
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 a concrete use condition for one parameter value (headless: false so a human can watch or solve a captcha), but never says when to reach for browser_restart rather than browser_start, browser_stop, or a plain reload, nor what prerequisites exist (e.g. an active session). Usage 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.
browser_startA
Start this session's own Chrome (isolated from every other agent). Optional: the first browser tool call starts one with defaults anyway. Call it explicitly to load a saved login (state), to pick headless/viewport/channel, or to open a URL. A browser started from a state can only visit that state's allowed origins. If this session already had a browser before a reconnect, it is picked up again with its tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Open this URL in the first tab | |
| state | No | Name of a saved login state (see state_list) | |
| channel | No | ||
| headless | No | Run without a window (default from config, normally true) | |
| viewport | No | Window size, e.g. "1280x720" | |
| allowedOrigins | No | Without a state: restrict this browser to these origins, e.g. ["http://localhost:3000"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses per-agent isolation, that a state-bound browser is restricted to that state's allowed origins, and that a browser surviving a reconnect is re-adopted with its tabs. It doesn't cover failure modes or what happens if a browser is already running with conflicting settings, leaving a small gap.
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 the optionality caveat, then the explicit reasons to call it. Dense but every sentence carries information; the reconnect sentence is slightly tangential but useful.
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, all-optional tool with no output schema and no annotations, the description covers identity, isolation, origin restrictions, and reconnect behavior well enough to call it correctly. Return-shape details and behavior on a second call are the only notable omissions.
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 83%, but the description adds real meaning: it groups the tuning parameters (headless/viewport/channel), explains the state parameter's origin-restriction consequence, and cross-references state_list. It still doesn't clarify the distinction/additivity of allowedOrigins versus a state's own allowed origins.
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 ('Start this session's own Chrome') and immediately scopes it as isolated from every other agent, which cleanly separates it from siblings like browser_status, browser_restart and browser_stop. An agent can identify the tool's action and its unique session-scoped nature 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 says the call is optional because the first browser tool call starts one with defaults, then names the exact reasons to invoke it eagerly: load a saved login state, choose headless/viewport/channel, or open a URL. This is genuine when-to-use/when-not-to-use guidance with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_statusA
Show this session's browser: id, saved state, allowlist, headless, open tabs, uptime.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the concrete state dimensions returned, which signals this is a non-mutating introspection tool, but it never states that it is read-only, that it requires an active session, or what happens if no browser is running. Adequate but incomplete for an unannotated tool.
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 front-loaded sentence that leads with the verb and subject and then lists the returned fields compactly. 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?
With no output schema, the description usefully enumerates the returned state fields, which is the main thing an agent needs. For a zero-parameter, zero-risk status tool this is close to complete; only the precondition of an active browser session is unstated.
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 tool takes zero parameters, so there are no parameter semantics to document; the schema coverage is 100% and there is nothing for the description to compensate for. Baseline 4 applies for a 0-param 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 (Show) plus the resource (this session's browser) and enumerates the exact fields returned (id, saved state, allowlist, headless, open tabs, uptime). That distinguishes it from sibling read tools like list_pages and state_list. It stops short of explicitly naming a sibling it is not, so a 4 rather than 5.
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 no when-to-use guidance, no prerequisites, and no routing to alternatives. The phrase 'this session's browser' implies an inspection context, but the agent must infer that it precedes actions like browser_start or close_page. No exclusions or alternative conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_stopA
Close this session's browser and delete its temporary profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose a genuinely useful destructive side effect — the temporary profile is deleted — but says nothing about what happens to open pages, whether the profile deletion is irreversible, whether it errors if no session is running, or whether a subsequent browser_start is required.
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?
One sentence, front-loaded with the primary action and the secondary side effect. 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?
For a zero-parameter teardown tool with no output schema, the description covers the action and its cleanup effect adequately. It could be stronger by noting the fate of open pages and whether a restart is needed afterward, but nothing essential to invoking it 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?
The tool takes zero parameters, so the schema is empty and the baseline is 4. There is nothing further the description could add on 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?
States a specific verb and resource (close the browser) plus the notable side effect (delete the temporary profile). The scope word "this session's" distinguishes it from the sibling close_page, which closes a single page rather than the whole browser. It doesn't explicitly name an alternative, so it falls short of a 5.
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?
No explicit when-to-use guidance. The agent must infer that this is a teardown call for ending a browser session, and there is no statement about prerequisites (e.g. a running browser) or when browser_restart would be preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickC
Clicks on the provided element
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | The uid of an element on the page from the page content snapshot | |
| pageId | Yes | Targets a specific page by ID. | |
| dblClick | No | Set to true for double clicks. Default is false. | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, confirming it is a mutating action, but the description adds nothing about consequences: whether the click may navigate, open tabs, or trigger dialogs, or whether it waits for the page to settle. For a mutation tool in a browser-automation suite, that leaves the agent without the behavior it needs to plan around.
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?
One short sentence, front-loaded and free of padding, but it is concise to the point of under-specification rather than precision. There is nothing to trim, but the sentence earns its place only barely.
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?
A browser-click tool has complex, observable side effects, no output schema, and only one annotation. The description does not mention response contents (e.g., the optional snapshot), wait behavior, or failure modes, leaving significant gaps for correct invocation.
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 uid, pageId, dblClick, and includeSnapshot all documented in the schema. The description adds no meaning beyond that, so the schema-based 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 (clicks) on a resource (element), but "the provided element" is vague and gives no hint of how this differs from sibling interaction tools like hover, drag, fill, or type_text. An agent must open the schema to learn what an element reference is.
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 no guidance on when to use click versus hover, drag, fill, type_text, or press_key, and no prerequisites or exclusions are stated. The agent must infer applicability from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_pageB
Closes the page by its index. The last open page cannot be closed.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the page to close. Call list_pages to list pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the agent already knows this is a mutation. The description adds a meaningful behavioral constraint: the last open page cannot be closed. It does not explain what happens to page state, whether closing discards unsaved data, or what errors occur for invalid page IDs.
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 short sentences, front-loaded with the core action and followed by the key constraint. There is no unnecessary text.
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 one-parameter page-closing tool with full schema coverage and no output schema, the description provides enough context to invoke it correctly. The minor gap is that it does not clarify the 'index' versus 'ID' terminology or the effect on the active page, but those are secondary for this operation.
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 parameter is already documented as the page ID and the agent is told to call list_pages. The description adds little beyond restating the parameter, and it uses 'index' while the schema says 'ID', which is potentially ambiguous rather than clarifying.
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: 'Closes the page.' It also clarifies that the page is identified by index, which helps an agent understand the operation. However, it does not explicitly distinguish this tool from siblings such as select_page, new_page, or browser_stop, so it falls short of a 5.
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 close_page versus alternatives. 'The last open page cannot be closed' is a constraint on the action, not a usage guideline or comparison to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dragC
Drag an element onto another element
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| to_uid | Yes | The uid of the element to drop into | |
| from_uid | Yes | The uid of the element to drag | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries the burden of explaining the mutation, yet it says nothing about how the drag is performed (native HTML5 drag events vs. synthesized mouse move sequences), what side effects occur, or what happens if the drop target rejects the element. With only one annotation bit and a very terse sentence, this is a significant disclosure gap for an interaction tool prone to silent failure.
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 front-loaded sentence with zero waste. It is concise without being a tautology, though the brevity borders on under-specification for a browser interaction 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?
Four parameters, a mutation annotation only, and no output schema; the description does not cover viewport/visibility requirements, drag-mechanism caveats, or result expectations. An agent could invoke it but has little basis for predicting or diagnosing behavior.
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 every parameter (pageId, from_uid, to_uid, includeSnapshot) is documented in the schema itself. The description adds no meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb ('Drag') plus resource ('an element onto another element'), so the agent knows exactly what action is performed. It does not differentiate itself from nearby siblings such as click, hover, or fill, but the drag semantics are 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?
No guidance on when to use this over click/hover/fill, and no prerequisites such as elements needing to be visible or dragged into the viewport first. Nothing says when drag will fail or what alternative to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emulateA
Emulates various features on the target page. Each call replaces all emulation settings (except extraHttpHeaders), so pass all desired settings in a single call.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| viewport | No | Emulate device viewports '<width>x<height>x<devicePixelRatio>[,mobile][,touch][,landscape]'. 'touch' and 'mobile' to emulate mobile devices. 'landscape' to emulate landscape mode. Omit to clear the viewport override. | |
| userAgent | No | User agent to emulate. Omit or set to empty string to clear the user agent override. | |
| colorScheme | No | Emulate the dark or the light mode. Omit or set to "auto" to reset to the default. | |
| geolocation | No | Geolocation (`<latitude>,<longitude>`) to emulate. Latitude between -90 and 90. Longitude between -180 and 180. Omit to clear the geolocation override. | |
| forcedColors | No | Emulate the `forced-colors` CSS media feature. Omit or set to "auto" to reset to the default. | |
| prefersContrast | No | Emulate the `prefers-contrast` CSS media feature. Omit or set to "auto" to reset to the default. | |
| extraHttpHeaders | No | Extra HTTP headers as a JSON string object, e.g. {"X-Custom": "value", "Authorization": "Bearer token"}. Headers are included into every HTTP request originating from the page and persist across navigations until cleared. Pass an empty string to clear all extra headers. | |
| cpuThrottlingRate | No | Represents the CPU slowdown factor. Omit or set the rate to 1 to disable throttling | |
| networkConditions | No | Throttle network. Omit to disable throttling. | |
| prefersReducedMotion | No | Emulate the `prefers-reduced-motion` CSS media feature. Omit or set to "auto" to reset to the default. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries real weight, and it does add non-schema value: state is wholesale replaced per call, with extraHttpHeaders as the documented exception. It doesn't explain the effect of changing viewport mid-session or that omitted values clear overrides (that part lives in the schema).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the call-shape constraint placed up front so the agent reads it before composing arguments. Nothing redundant is restated from the 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?
For an 11-parameter, mutation-style tool with no output schema, the definition plus rich per-property schema docs cover what an agent needs. What's missing is only secondary: interaction with ongoing screencasts/snapshots and whether emulation persists across navigations (the description notes headers persist, implying other settings may behave differently).
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 a genuinely param-relevant semantic the schema doesn't state as a whole: settings are replaced, not merged, per invocation, which changes how an agent must fill all 11 parameters at once.
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 ("Emulates ... features on the target page"), so the operation type is clear. But "various features" is vague, and nothing distinguishes it from siblings that also alter page state (resize_page, navigate_page) or explains what kinds of features can be emulated without reading 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?
The second sentence is a strong usage rule: every call replaces all settings except extraHttpHeaders, so all desired settings must be passed together. It steers how to compose a call but doesn't say when to emulate versus using resize_page or a real device/browser, and gives no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_scriptB
Evaluate JavaScript inside the target page. The source can be provided inline or loaded from a local file. Returns the response as JSON, so returned values have to be JSON-serializable.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | An optional list of arguments (element uids from the page content snapshot) to pass to the function. | |
| format | No | How to interpret the source. "function" treats it as a function declaration and supports args. "script" evaluates it as classic JavaScript and does not support args. Defaults to "function". ECMAScript modules are not supported. | |
| pageId | Yes | Targets a specific page by ID. | |
| filePath | No | The absolute or relative path to a file to save the script output to. If omitted, the output is returned inline. | |
| function | No | JavaScript source to execute in the target page. Provide either this or sourcePath, but not both. The source is interpreted according to format. Example without arguments: `() => document.title` or `async () => await fetch("example.com")`. Example with arguments: `(el) => el.innerText` | |
| sourcePath | No | The absolute or relative path to a JavaScript file on the MCP server's local filesystem. Provide either this or function, but not both. | |
| dialogAction | No | Handle dialogs while execution. "accept", "dismiss", or string for response of window.prompt. Defaults to accept. | |
| waitForStableDom | No | Whether to wait for the DOM to settle. Pass false if the script only reads data. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real behavioral context beyond the single readOnlyHint=false annotation: output is returned as JSON so return values must be JSON-serializable, and the file/inline duality is explained. However, it omits the critical implication of arbitrary code execution — that scripts can mutate page state, trigger navigation, or have side effects — which is exactly what the false readOnlyHint warns about.
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: purpose first, source modes second, return-format constraint last. No filler, no repetition of the tool name, and the most consequential caveat (JSON-serializable returns) is stated plainly.
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 8 optional-heavy parameters, a single weak annotation (readOnlyHint=false), and no output schema, the description should disclose that arbitrary JS can mutate or navigate the page and that failures/console errors surface elsewhere (list_console_messages). It covers the return shape but leaves the risk profile and failure behavior to inference.
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 schema itself carefully documents format, args, function vs sourcePath, dialogAction, and waitForStableDom. The description only restates the inline-vs-file choice, adding nothing about the function/script distinction, dialog policy, or DOM-stability default. Baseline 3 is appropriate when the schema carries the load.
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: 'Evaluate JavaScript inside the target page', plus the two source modes (inline or local file). No sibling tool performs arbitrary in-page JS evaluation, so it is distinguishable by default, but the description never names an alternative or scope boundary 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?
There is no when-to-use vs when-not guidance, no mention of prerequisites (e.g., page must be selected/loaded), and no comparison to siblings like take_snapshot, get_console_message, or get_css_styles that cover narrower read needs. The only selection guidance ('inline or loaded from a local file') mirrors the schema's mutual-exclusion rule rather than adding usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillB
Type text into an input, text area or select an option from a element.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | The uid of an element on the page from the page content snapshot | |
| value | Yes | The value to fill in. "true" or "false" for checkboxes and toggles, "true" for radio buttons. | |
| pageId | Yes | Targets a specific page by ID. | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=false, so the description adds value by specifying the element types it targets. However, it does not disclose important behavioral traits like whether it clears existing values, dispatches input/change events, or handles focus.
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, well-structured sentence with no wasted words. The action and targets are 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?
For a mutation tool with four parameters and full schema coverage, the description is minimally adequate but lacks behavioral details that would help an agent use it correctly, such as event triggering or interaction with pre-existing values.
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 parameters are fully documented in the schema. The description adds no additional meaning about parameters, which is appropriate given the high 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 uses a specific verb ('Type') and names the target resources (input, text area, select) clearly. It does not explicitly differentiate from sibling tools like type_text or fill_form, but the core action is 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 gives no indication of when to use this tool instead of alternatives such as type_text or fill_form. It provides only a bare statement of function without context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_formA
Fill out multiple form elements (inputs, selects, checkboxes, radios) at once. ALWAYS prefer this tool over multiple individual 'fill' or 'click' calls when interacting with forms. It is significantly faster, more reliable, and reduces turn count. Example: Fill username, password, and check "Remember Me" in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| elements | Yes | Elements from snapshot to fill out. | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false already tells the agent this mutates page state, and the description correctly reinforces that by describing the fill action plus a concrete example. However, it never says what happens on partial failure (do earlier elements stay filled?), whether values are validated, or that element uids must come from a prior snapshot. Its remaining content is a speed/reliability pitch rather than new behavioral fact.
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 short sentences, front-loaded with the capability, then the selection rule, then a concrete example. The middle sentence's 'significantly faster, more reliable, reduces turn count' is a mild sales pitch, but it is directly actionable guidance for tool selection.
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, so the description should cover the response: includeSnapshot partially explains this, but the description is silent on what a successful fill returns and on the prerequisite of obtaining uids via take_snapshot. Those two omissions are the only meaningful gaps for a 3-parameter mutation 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 the schema already documents pageId, elements[].uid, elements[].value, and includeSnapshot. The description adds only the illustrative username/password/'Remember Me' example, which hints at the array's batch shape but doesn't explain includeSnapshot or the checkbox/radio string conventions the schema handles.
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 (fill out) and resource (multiple form elements) and enumerates the element kinds covered (inputs, selects, checkboxes, radios). It also explicitly positions itself against the sibling tools 'fill' and 'click', so an agent can distinguish it from them 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 an explicit always-use rule with named alternatives: prefer this over multiple individual 'fill' or 'click' calls when interacting with forms. The converse case (use 'fill' when only a single element is targeted) is only 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.
get_console_messageARead-only
Gets a console message by its ID. You can get all messages by calling list_console_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| msgid | Yes | The msgid of a console message on the page from the listed console messages | |
| pageId | Yes | Targets a specific page by ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read, so the description doesn't need to restate safety. It adds the useful provenance hint that ids come from list_console_messages, but says nothing about what a message contains (text, level, source URL, stack trace) or what happens if the msgid is stale or belongs to another 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?
Two short sentences, front-loaded with the purpose and followed by the one routing fact an agent needs. Nothing extraneous.
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 two-parameter read tool with full schema coverage, a readOnly annotation, and no output schema, the description covers the essential workflow. The only real gap is return-value shape, which an agent would have to discover by calling it.
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 both params are already documented, and the description adds only the cross-reference that msgid values originate from the console-message listing. No format or edge-case guidance (e.g., numeric id validity, pageId/msgid pairing) beyond what the schema supplies.
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 ('Gets') plus resource ('a console message') and the key selector ('by its ID'). It also names the sibling tool list_console_messages, so an agent can immediately tell it apart from the bulk-listing counterpart.
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 second sentence tells the agent how this tool relates to list_console_messages, implying retrieval-after-listing as the intended workflow. It stops short of explicit exclusions (e.g., when to prefer the list tool and filter client-side), but the 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_css_stylesARead-only
Retrieve matched CSS rules, inline styles (element.style), inherited styles, custom properties, and cascade wrappers (@layer, @media, @container, @scope) for an element identified by its UID. Rules are ordered from highest to lowest cascade precedence and include source line numbers (e.g. index:196). Active (winning) declarations have no prefix tag, while (losing) overridden declarations are prefixed with [overloaded]. Treat the output as authoritative and complete. Results are paginated (10 rules per page by default); use pageIdx to page through the remaining rules. Requires a UID from take_snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | The uid of the element on the page from the page content snapshot to inspect CSS styles for | |
| pageId | Yes | Targets a specific page by ID. | |
| pageIdx | No | Page number to return (0-based). Defaults to 0 (the first page). | |
| pageSize | No | Maximum number of CSS rules to return per page. Defaults to 10. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important output behavior: rules are ordered by cascade precedence, source line numbers are included, winning declarations have no prefix, overridden declarations are marked with [overloaded], and results are paginated. This gives the agent substantial context for interpreting and trusting the result.
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 core purpose, followed by output semantics and pagination. Sentences are dense with useful information and there is no significant 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?
Because there is no output schema, the description must explain what is returned. It does so thoroughly, covering rule sources, ordering, active/overridden notation, and pagination, while also stating the UID prerequisite.
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 parameters already have documented meanings. The description adds little parameter-specific semantics beyond restating that pageIdx pages through remaining results and that UID comes from take_snapshot, both of which are already reflected in 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 uses a specific verb, 'Retrieve', and a precise resource set: matched CSS rules, inline styles, inherited styles, custom properties, and cascade wrappers for an element identified by UID. It clearly distinguishes this as the CSS-inspection tool among the browser siblings.
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 states the prerequisite that the UID must come from take_snapshot and explains how to page through results with pageIdx. It does not name explicit alternatives or when-not-to-use conditions, but the operational 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_network_requestA
Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel. Useful for inspecting request headers (including 'Cookie') and response headers (including 'Set-Cookie' and directives).
| Name | Required | Description | Default |
|---|---|---|---|
| reqid | No | The reqid of the network request. If omitted returns the currently selected request in the DevTools Network panel. | |
| pageId | Yes | Targets a specific page by ID. | |
| requestFilePath | No | The absolute or relative path to a .network-request file to save the request body to. If omitted, the body is returned inline. | |
| responseFilePath | No | The absolute or relative path to a .network-response file to save the response body to. If omitted, the body is returned inline. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds real value by pointing at Cookie/Set-Cookie header inspection, which tells an agent why to call it. However, it never explains why a 'get' tool carries readOnlyHint=false — namely that requestFilePath/responseFilePath cause writes to disk and can clobber files. That side effect is consequential and is only visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the primary action and default behavior, then the value proposition. 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?
With no output schema, the description usefully signals what comes back (request and response headers and directives), and the schema covers the file-output variants. Minor gap: it does not clarify that bodies are returned inline by default, which matters for response size expectations.
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 four parameters are already documented in the schema, including the file-path options. The description only restates the reqid/default-selection semantics and adds nothing about the two file-output parameters, so 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 ('Gets a network request') plus the lookup key (reqid) and the fallback behavior. It is distinguishable from the sibling list_network_requests by being single-request scoped, though it never names that sibling 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?
Gives clear context: pass a reqid, or omit it to get whatever is currently selected in the DevTools Network panel, and it explains the concrete use case (inspecting request/response headers including cookies). It stops short of stating when to prefer list_network_requests or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
handle_dialogC
If a browser dialog was opened, use this command to handle it
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Whether to dismiss or accept the dialog | |
| pageId | Yes | Targets a specific page by ID. | |
| promptText | No | Optional prompt text to enter into the dialog. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false, so the description still carries most of the burden. It does not disclose the key behavioral trait of dialogs — that they block further page interaction until handled — nor the difference in effect between accept and dismiss beyond what the enum labels imply.
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?
One short sentence with the condition front-loaded and no waste. It is efficient, though the brevity comes at the cost of substance rather than being a model of dense 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 simple three-parameter tool with a fully documented schema and no output schema, the description covers the minimum: what it is for. It omits the blocking nature of dialogs and when to choose each action, which would matter for correct invocation sequencing.
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 every parameter has an inline description, including the accept/dismiss enum and optional promptText. The description adds no meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'handle' is vague, but paired with 'browser dialog' it identifies a concrete resource, and the tool is distinguishable from siblings like click or navigate_page. It never states what 'handle' actually entails (accept/dismiss), which the schema alone reveals.
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 conditional 'If a browser dialog was opened' gives an implicit trigger condition, which is better than nothing. However, it offers no guidance on when to accept vs dismiss, no mention of ordering relative to other actions, and no sibling alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hoverC
Hover over the provided element
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | The uid of an element on the page from the page content snapshot | |
| pageId | Yes | Targets a specific page by ID. | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false signals this is not a pure read operation, yet the description does not explain what hovering changes (tooltip, hover menu, CSS state) or whether the call waits for a hover duration. It adds essentially no behavioral context beyond the 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?
A single sentence with no wasted words, but it is under-specified rather than appropriately concise for a three-parameter interaction tool. It does front-load the verb and target, which is the one structural strength.
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 schema covers all parameters and no output schema exists, so parameter-level needs are met, but the description omits what an agent should expect from a hover action and how includeSnapshot affects the response. For an interaction tool with only a readOnlyHint=false annotation, this leaves significant behavioral gaps.
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 uid, pageId, and includeSnapshot are already documented in the schema. The description's phrase "provided element" only loosely gestures at uid and adds no format or identification guidance beyond what the schema provides, making the baseline 3 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 ("Hover") and the resource it acts on ("the provided element"), so an agent can tell it performs a mouse-hover interaction rather than a click or drag. However, it includes no differentiation from siblings like click or drag, which also target elements.
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 no guidance on when to use hover versus click, drag, or evaluate_script. The implied use case (revealing hover-dependent UI) is left entirely to inference, with no exclusions or conditions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lighthouse_auditA
Get Lighthouse scores, failing audits, and the DOM nodes they flag for accessibility, SEO, best practices, and agentic browsing. Full reports are saved to disk. This excludes performance. For performance audits, run performance_start_trace
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "navigation" reloads & audits. "snapshot" analyzes current state. | navigation |
| device | No | Device to emulate. | desktop |
| pageId | Yes | Targets a specific page by ID. | |
| outputDirPath | No | Directory for reports. If omitted, uses temporary files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description must explain why a read-style audit is flagged as non-read-only. It does so by disclosing that full reports are written to disk, which accounts for the write side effect, and it hints that 'navigation' reloads the page. It doesn't state permissions or report size/retention, leaving a small gap.
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 short sentences: capability, output location, and exclusion/redirection. The scope constraint and alternative are front-loaded 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?
With no output schema, the description still tells the agent what comes back (scores, failing audits, flagged DOM nodes) and where full reports go, plus how to get the excluded category elsewhere. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are documented, so the schema already carries parameter meaning. The description's mention of reports saved to disk loosely ties to outputDirPath but adds no syntax or format detail 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?
Names a specific verb and resource and enumerates the categories covered (accessibility, SEO, best practices, agentic browsing), plus explicitly what it excludes (performance). An agent can distinguish it from performance_start_trace and the snapshot/screencast siblings 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?
States the exclusion ('This excludes performance') and names the exact alternative tool and action to take instead ('run performance_start_trace'). Both the use case and the routing decision are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_console_messagesBRead-only
List all console messages for the target page since the last navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | Filter messages to only return messages of the specified resource types. When omitted or empty, returns all messages. | |
| pageId | Yes | Targets a specific page by ID. | |
| pageIdx | No | Page number to return (0-based). When omitted, returns the first page. Ignored unless pageSize is set. | |
| pageSize | No | Maximum number of messages to return. When omitted, returns all messages. | |
| serviceWorkerId | No | Filter messages by the service worker ID shown by list_pages (sw-N). | |
| includeStackTraces | No | Set to true to include the stack trace for each message when available. Increases the response size. | |
| includePreservedMessages | No | Set to true to return the preserved messages over the last 3 navigations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds the meaningful constraint that only messages since the last navigation are returned (with includePreservedMessages extending to three navigations left to the schema), but says nothing about ordering, volume, or output shape.
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?
One sentence, front-loaded with the action and resource, with zero filler. Nothing is padded or repeated from the 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?
For a read-only listing tool with a fully documented schema, the description is adequate but leaves out the two things an agent most needs: how this differs from get_console_message, and the fact that preserved messages require an opt-in flag to be visible.
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 seven parameters are self-documenting, including the filter, pagination, and preserved-message flags. The description adds no parameter insight beyond the schema, which is the baseline case.
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 all console messages') plus a scope ('for the target page since the last navigation'). It does not distinguish itself from the sibling get_console_message, which fetches a single message, so an agent must infer the list-vs-single split.
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 no explicit when-to-use guidance and no mention of the obvious alternative, get_console_message, or of when a bulk listing is preferable. The scope phrase hints at coverage but gives no selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_network_requestsARead-only
Lists the most recent requests for the target page since the last navigation.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| pageIdx | No | Page number to return (0-based). When omitted, returns the first page. Ignored unless pageSize is set. | |
| pageSize | No | Maximum number of requests to return. When omitted, returns all requests. | |
| resourceTypes | No | Filter requests to only return requests of the specified resource types. When omitted or empty, returns all requests. | |
| includePreservedRequests | No | Set to true to return the preserved requests over the last 3 navigations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already signals a safe read, and the description adds genuinely useful behavioral scoping: results are limited to the window since the last navigation. That window is the key non-obvious trait (the schema's includePreservedRequests only indirectly reveals the 3-navigation alternative), though ordering guarantees and response shape remain unstated.
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 front-loaded sentence with no filler; the scope qualifier arrives immediately after the verb. It is efficient, though slightly thin given five parameters and no 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 full schema coverage and a readOnly annotation, a short description can suffice, but for a 5-parameter list tool with no output schema the description says nothing about result shape, ordering, or whether the list is a point-in-time snapshot. It is adequate but leaves real questions for the agent to discover at call time.
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 pagination, filtering by resourceTypes, and preserved-request behavior are already fully documented. The description only echoes the page targeting and implies recency ordering ('most recent'), adding little beyond the structured 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?
Specific verb (Lists) plus resource (network requests) scoped to a target page, which cleanly separates it from the single-item sibling get_network_request. It doesn't name that sibling explicitly, so differentiation is inferred from the singular/plural naming rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'target page since the last navigation' – there is no statement of when to prefer this over get_network_request, nor any prerequisite such as the page needing to be loaded or selected first. An agent can guess the intent but gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pagesBRead-only
Get a list of pages open in the browser.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already declares readOnlyHint=true, and the description adds no behavioral context such as ordering, scope across windows, pagination, or what a page entry contains. It is minimally transparent but does not meaningfully go beyond the 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 a single front-loaded sentence with no wasted words. It is appropriately concise, though it could be slightly more informative without becoming bloated.
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 zero-parameter, read-only listing tool with no output schema, the description gives enough information to invoke the tool correctly. It could optionally mention return shape or scope, but the core invocation context is 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 tool takes zero parameters, so the baseline is 4. There are no parameter semantics to clarify, and the empty schema is consistent with the 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 states a specific verb and resource: "Get a list of pages open in the browser." This clearly identifies a read-oriented listing tool, though it does not explicitly distinguish it from siblings such as state_list or select_page.
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 that the tool is used to see open pages, but it provides no explicit guidance on when to use it versus alternatives like state_list, select_page, or new_page. There are no exclusions or usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_pageC
Open a new tab and load a URL. Use project URL if not specified otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to load in a new page. | |
| timeout | No | Maximum wait time in milliseconds. If set to 0, the default timeout will be used. | |
| background | No | Whether to open the page in the background without bringing it to the front. Default is false (foreground). | |
| isolatedContext | No | If specified, the page is created in an isolated browser context with the given name. Pages in the same browser context share cookies and storage. Pages in different browser contexts are fully isolated (useful for clean-slate testing of cookies and authentication). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only set readOnlyHint=false, so the description carries most of the burden. It says a tab is opened, which is consistent with the mutation annotation, but doesn't disclose whether the new page becomes the active target (relevant given sibling select_page), whether the tab persists, or whether it operates in the same browser context by default. Only the schema fills that in.
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 short sentences with the action front-loaded and no filler. The second sentence is vague ('otherwise') and could have been replaced with actual guidance.
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 four parameters, one required, and no output schema, the description should indicate what the agent gets back (e.g., a page handle usable with select_page) and how the new tab relates to existing ones. The schema covers the parameters well, but the interaction model is left implicit.
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 four parameters are already documented, which sets the baseline at 3. The description adds only the default-URL notion, and it muddles rather than clarifies semantics by implying url is optional when the schema requires 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?
States a specific verb and resource: 'Open a new tab and load a URL.' This is clearly distinct from navigate_page (which navigates an existing page) and from select_page, though the description never names those siblings. Clear but not differentiated 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?
'Use project URL if not specified otherwise' is a hint about the url argument, not a when-to-use rule; it also conflicts with the schema marking url required. Nothing tells the agent when to use this over navigate_page or select_page, or what happens to the previously active page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
performance_analyze_insightBRead-only
Provides more detailed information on a specific Performance Insight of an insight set that was highlighted in the results of a trace recording.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| insightName | Yes | The name of the Insight you want more information on. For example: "DocumentLatency" or "LCPBreakdown" | |
| insightSetId | Yes | The id for the specific insight set. Only use the ids given in the "Available insight sets" list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read, so the bar is lower. The description adds useful context that it drills into insights previously surfaced by a trace recording, but says nothing about what the returned detail looks like or any limits on valid insight names beyond the schema example.
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 front-loaded sentence with no filler; the drill-down intent is stated immediately. It is compact but arguably under-specified rather than wasteful.
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 read-only, three-parameter lookup tool with full schema coverage and an annotations-declared safety profile, most needs are met. The gap is explaining the shape of the 'more detailed information' returned, since no output schema exists to carry that.
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 three parameters (pageId, insightName, insightSetId) are already documented in the schema, including the example insight names and the 'use only ids from Available insight sets' constraint. The description adds no parameter meaning beyond that, making baseline 3 correct.
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 (provides detailed information) and a specific resource (a Performance Insight within an insight set from a trace recording). This distinguishes it from siblings like performance_start_trace and performance_stop_trace as a drill-down tool, though it doesn't explicitly name those alternatives.
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 'of an insight set that was highlighted in the results of a trace recording' implies the workflow context (call after a trace surfaces insights). However, it never states explicitly when to use this versus performance_start_trace/stop_trace, nor any preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
performance_start_traceA
Start a performance trace on the target webpage. Use to find frontend performance issues, Core Web Vitals (LCP, INP, CLS), and improve page load speed.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| reload | No | Determines if, once tracing has started, the target page should be automatically reloaded. Navigate the page to the right URL using the navigate_page tool BEFORE starting the trace if reload or autoStop is set to true. | |
| autoStop | No | Determines if the trace recording should be automatically stopped. | |
| filePath | No | The absolute file path, or a file path relative to the current working directory, to save the raw trace data. For example, trace.json.gz (compressed) or trace.json (uncompressed). | |
| ignoreCache | No | Whether to bypass the HTTP cache when reloading the page, to measure a cold page load. Only applies if reload is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false is the only annotation, so the agent knows this is not a pure read, but the description never says the trace keeps recording until performance_stop_trace is called or that a file artifact may be written. The schema descriptions carry the reload/autoStop/cache nuances, which partially compensates.
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 tightly packed sentences with the action front-loaded and the diagnostic value second; 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 stateful tracing tool with no output schema and only a single loose annotation, the description omits the essential lifecycle (trace runs until stopped, analyze with performance_analyze_insight). An agent could call it but might not know what to do next.
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 is documented at the schema level, so baseline 3 applies. The description adds no parameter-level meaning beyond that.
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 clear verb+resource ('Start a performance trace on the target webpage') and adds the diagnostic intent (frontend performance, Core Web Vitals). It doesn't distinguish itself from the sibling lighthouse_audit, which plausibly serves a similar diagnostic role, so 4 rather than 5.
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?
'Use to find frontend performance issues, Core Web Vitals (LCP, INP, CLS)' gives implied usage context, but there is no explicit when-not guidance and no mention of the sibling alternatives (lighthouse_audit, performance_analyze_insight) or of the required stop step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
performance_stop_traceB
Stop the active performance trace recording on the target webpage.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| filePath | No | The absolute file path, or a file path relative to the current working directory, to save the raw trace data. For example, trace.json.gz (compressed) or trace.json (uncompressed). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only readOnlyHint=false is given, so the description carries the burden of explaining the mutation, yet it says nothing about what happens to captured data when filePath is omitted (discarded? returned?), how existing trace data is affected, or the error behavior with no active trace. These are exactly the details an agent needs before invoking a stop operation.
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 front-loaded sentence with zero filler, but its brevity is also what leaves the behavioral gaps unaddressed; efficiency is good, completeness is the tradeoff.
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 two-parameter tool with full schema coverage and no output schema, the definition is minimally sufficient, but an agent still cannot tell whether the trace result is saved, returned, or lost unless filePath is supplied.
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 the filePath schema entry already explains absolute/relative paths and compressed vs uncompressed formats. The description adds no parameter meaning of its own, 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 ('Stop') and resource ('active performance trace recording') with a clear scope ('target webpage'). It implicitly contrasts with the sibling performance_start_trace, though it never names it or another 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?
The word 'active' implies a trace must already be running, but the description never says to call performance_start_trace first, nor what happens if no trace is active. Usage 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.
press_keyA
Press a key or key combination. Use this when other input methods like fill() cannot be used (e.g., keyboard shortcuts, navigation keys, or special key combinations).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | A key or a combination (e.g., "Enter", "Control+A", "Control++", "Control+Shift+R"). Modifiers: Control, Shift, Alt, Meta | |
| pageId | Yes | Targets a specific page by ID. | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the agent knows this is a mutating action. The description adds some context by explaining use cases (shortcuts, navigation), but it does not disclose behavioral details such as whether the key press requires prior page focus, what happens on invalid keys, or any side effects. With annotations present, this is adequate but not rich.
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 action and immediately followed by a usage condition. No wasted words; every sentence adds value (purpose and when-to-use).
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 full schema coverage and a single annotation (readOnlyHint=false), the description covers purpose and primary usage well. It could mention prerequisites (e.g., a page must be active) or expected outcomes, but it is sufficient for correct invocation given the structured fields.
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 parameters are fully documented in the input schema. The description repeats the concept of 'key or key combination' without adding syntax or usage details beyond what the schema already provides. Baseline 3 is appropriate when the schema carries the full parameter 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 states a specific verb (press) and resource (key or key combination), and explicitly distinguishes the tool from sibling fill() by naming a condition when fill() cannot be used. An agent can immediately understand the tool's unique role among input methods.
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 for when to use this tool: 'when other input methods like fill() cannot be used' and lists examples (keyboard shortcuts, navigation keys, special combinations). It does not explicitly compare to other siblings like type_text, but the guidance is sufficient without being misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resize_pageC
Resizes the page's window so that the page has specified dimension
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Page width | |
| height | Yes | Page height | |
| pageId | Yes | Targets a specific page by ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, confirming a mutation, but the description adds nothing about what changes: whether this affects the real browser window or an emulated viewport, whether it persists across navigation, or how it interacts with screenshots and screencasts. For a state-changing tool with no output schema, that leaves the agent guessing 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?
A single, front-loaded sentence with no filler. Minor grammar awkwardness ('specified dimension' should be plural) but nothing extraneous.
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 three-required-parameter mutation tool with minimal annotations and no output schema, the description should cover units, whether it is the real window or an emulated viewport, and persistence. None of that is present, so an agent cannot fully predict the call's effect.
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 pageId, width and height are already documented, and the baseline of 3 applies. The description adds no meaning beyond the schema — notably it does not state the unit (pixels) or any practical bounds for width/height.
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 ('Resizes') and resource ('the page's window') with the resulting effect ('page has specified dimension'), so the operation is unambiguous. It does not distinguish itself from the sibling 'emulate', which can also change viewport dimensions, leaving overlap unaddressed.
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 no guidance on when to use this versus alternatives such as 'emulate', nor any prerequisites (e.g., page must be open, effect on active tabs). The agent must infer the usage context entirely from the one-line purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencast_startC
Starts recording a screencast (video) of the target page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| filePath | No | Output file path (.mp4). Uses mkdtemp to generate a unique path if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, so the description carries most of the burden. It establishes recording of the target page but says nothing about the recording continuing until screencast_stop, where output is written (beyond the schema's filePath note), or any disk/resource implications of an in-progress capture.
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 front-loaded sentence with zero filler. It is efficient, but the terseness borders on under-specification for a stateful operation that requires a paired stop call.
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?
Two simple parameters, no output schema, and a thin annotation set — the description is adequate to identify the action but leaves out lifecycle context (stop requirement, output location, page prerequisite) that an agent needs to drive 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 description coverage is 100%, with both pageId and filePath documented including the mkdtemp fallback behavior. The description adds nothing 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?
Specific verb + resource + scope: 'Starts recording a screencast (video) of the target page.' It is clearly distinguishable from the sibling screencast_stop by the verb 'starts', though it never names that counterpart 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?
No when-to-use guidance, no prerequisites (e.g., that a page must be selected), and no mention of the screencast_stop sibling that must eventually be called. Usage is only inferable from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screencast_stopB
Stops the active screencast recording on the target page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, so the agent already knows this is a write/mutating operation. The description adds that the recording must be "active" and scoped to a target page, but says nothing about what happens to the captured data, what is returned, or behavior when no recording is running.
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?
One short sentence with no filler, front-loading the verb and resource. It is appropriately sized for a trivial single-parameter tool, though it could have used a second clause for the no-active-recording case.
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 one-required-param mutation with annotations and no output schema, the definition is minimally adequate. It omits edge-case behavior (no active recording) and whether the recording result is delivered anywhere, which an agent would want to know before calling.
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 the single pageId parameter is already documented in the schema as targeting a specific page by ID. The description restates the page scoping but adds no format, default, or validation detail 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?
States a specific verb ("Stops") and resource ("the active screencast recording on the target page"), which pairs naturally with the sibling screencast_start. It doesn't explicitly name the sibling as the counterpart, so it stops short of full 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?
Usage is only implied: one infers this is called after screencast_start to end capture. There is no explicit statement of when to use it versus alternatives, prerequisites, or what to do if no recording is active.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_pageARead-only
Select a page as a context for future tool calls.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the page to select. Call list_pages to get available pages. | |
| bringToFront | No | Whether to focus the page and bring it to the top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context by saying the selection affects future tool calls, but it does not disclose persistence details or the side effect of focusing the page when bringToFront is used.
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 front-loaded sentence with no filler. Every part of it contributes to understanding the tool's core effect.
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 two-parameter context-selection tool with full schema coverage and an annotation marking it read-only, the description is largely complete. It explains the tool's effect on future calls, though it could say more about page-context persistence and the optional bringToFront behavior.
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 are documented in the schema, including guidance to call list_pages for pageId. The description adds no parameter-level meaning beyond the schema, so the baseline score 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 states a specific verb and resource: selecting a page. It also explains the effect—establishing context for future tool calls—which distinguishes it from page-listing or navigation tools, though it does not explicitly name alternatives.
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 'as a context for future tool calls' implies when the tool should be used, but the description gives no explicit when-not guidance or alternative routing. The schema mentions list_pages for obtaining page IDs, but the description itself does not cover prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
state_listA
List saved login states: name, allowed origins, cookie counts, when saved and when the first cookie expires. Never shows cookie values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden, and it does disclose a meaningful behavioral trait: cookie values are never exposed, only metadata such as cookie counts and first-expiry time. It stops short of covering anything else behavioral, but for a parameterless read tool the disclosure is substantive.
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 compact sentence that front-loads the action and then lists returned fields, closing with the most important caveat. No filler and nothing misordered.
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 enumeration of returned fields (name, origins, cookie counts, saved time, first expiry) and the no-cookie-values caveat do the work the schema would otherwise do. The only minor gap is that questions of ordering, volume, or scoping of the listing are unaddressed.
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 tool takes zero parameters, so the schema sets the baseline at 4. The description adds no parameter detail because there is none to add, and correctly focuses on the returned shape instead.
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 (saved login states), and enumerates the fields it returns. It is distinguishable from the sibling state_save by the list-vs-save framing, though the sibling is not named 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?
The nature of the operation (read-only enumeration with no parameters) makes the intended use implied rather than stated. There is no explicit when-to-use guidance, no mention of state_save as the counterpart action, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
state_saveA
Save the current browser's login (cookies + localStorage) as a named state, so other sessions can start already logged in. Only cookies for the allowed origins are kept. allowedOrigins defaults to the http(s) origins open in tabs; it can never be wider than this browser's own allowlist. States a person created with devtools-fleet login cannot be overwritten.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | State name: letters, digits, . _ - | |
| strict | No | Block every request (not just navigations) outside the allowlist when the state is used | |
| overwrite | No | ||
| allowedOrigins | No | Origins this state may be used on, e.g. ["https://staging.example.com"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers meaningful behavior: allowedOrigins defaults to open http(s) tab origins, can never exceed the browser's own allowlist, and states created via `devtools-fleet login` are protected from overwrite. It doesn't spell out what cookies outside the allowlist undergo (dropped silently) or auth prerequisites, but the disclosure is strong.
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, then behavioral caveats in descending importance. Four tight sentences with no filler, though the allowlist constraint is restated in two adjacent 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?
For a stateful save operation with no annotations and no output schema, the description covers the critical behaviors an agent needs (origin scoping, overwrite protection, default derivation). Only minor gaps remain around failure modes and return behavior.
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 75% and the schema already documents name, strict, and allowedOrigins. The description adds genuine meaning beyond the schema by explaining allowedOrigins' default derivation and its hard upper bound, plus the overwrite protection behavior that bears on the overwrite flag.
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+payload: 'Save the current browser's login (cookies + localStorage) as a named state.' The purpose is unambiguous and distinguishable from the sibling state_list, which the agent can infer handles the read side.
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 rationale 'so other sessions can start already logged in' implies when this is useful, and constraints on allowedOrigins scope are given, but there is no explicit when-to-use vs when-not guidance and no mention of the sibling state_list as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_heapsnapshotA
Capture a heap snapshot of the target page. Use to analyze the memory distribution of JavaScript objects and debug memory leaks.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| filePath | Yes | A path to a .heapsnapshot file to save the heapsnapshot to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare only readOnlyHint=false, leaving the description to explain why this counts as a write. It never states that a file is written to disk at filePath, that the snapshot can be large or slow, or whether the page is paused. It does add purpose context (memory-leak debugging) that the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool does followed by when to use it. Every phrase carries information and nothing is padded.
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 two-parameter, no-output-schema tool, the description covers the action and purpose adequately; the output destination is clear from the required filePath. Minor gaps remain around side effects (disk write, snapshot size) that an agent would benefit from knowing before invoking.
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 both pageId and filePath are already fully documented in the schema. The description adds no format, path convention, or overwrite behavior beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Capture a heap snapshot of the target page'), which is clearly distinct from takeover siblings like take_screenshot or take_snapshot. It does not explicitly say how it differs from take_snapshot, but the memory/heap framing does the differentiating work.
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?
'Use to analyze the memory distribution of JavaScript objects and debug memory leaks' gives a use case, so the intent is implied rather than absent. There is no guidance on when to prefer this over alternatives such as performance_start_trace or performance_analyze_insight, and no exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_screenshotC
Take a screenshot of the page or element.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | No | The uid of an element on the page from the page content snapshot. If omitted, takes a page screenshot. | |
| format | No | Type of format to save the screenshot as. Default is "png" | png |
| pageId | Yes | Targets a specific page by ID. | |
| quality | No | Compression quality for JPEG and WebP formats (0-100). Higher values mean better quality but larger file sizes. Ignored for PNG format. | |
| filePath | No | The absolute path, or a path relative to the current working directory, to save the screenshot to instead of attaching it to the response. | |
| fullPage | No | If set to true takes a screenshot of the full page instead of the currently visible viewport. Incompatible with uid. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description carries the burden of behavioral disclosure and adds none. It doesn't say where the image lands (attached to the response vs. written to disk via filePath), whether the target page must be active, or how large captures are handled. Only the schema hints at these behaviors.
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 front-loaded sentence with zero waste, but it is undersized for a six-parameter tool with a file-writing side effect. Concision here shades into under-specification.
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 required pageId and the main option set are covered by the schema, and there is no output schema to explain. What's missing is guidance on the response/attachment behavior and on which capture target to choose for which intent, which matters for a tool with six interacting options.
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 are already documented, including the uid/fullPage incompatibility and quality's irrelevance to PNG. The description's only added semantic is the page-vs-element choice, so baseline 3 is right.
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 screenshot') and distinguishes the two capture targets (page vs. element). It does not differentiate itself from nearby siblings like take_snapshot or screencast_start, which capture similar visual state in different 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?
No guidance on when to prefer this over take_snapshot, screencast_start, or evaluate_script, and no mention of prerequisites such as an active page selection. The page-vs-element distinction is only implicitly conveyed by the phrase 'or element'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_snapshotA
Take a text snapshot of the target page based on the a11y tree. The snapshot lists page elements along with a unique identifier (uid). Always use the latest snapshot. Prefer taking a snapshot over taking a screenshot. The snapshot indicates the element selected in the DevTools Elements panel (if any).
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Targets a specific page by ID. | |
| verbose | No | Whether to include all possible information available in the full a11y tree. Default is false. | |
| filePath | No | The absolute path, or a path relative to the current working directory, to save the snapshot to instead of attaching it to the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=false, leaving most behavior to the description, which does add useful context: uid-based element identity, the staleness rule, and the DevTools Elements-panel selection marker. It does not explain what the non-read-only hint means in practice (snapshot written to disk via filePath vs attached to response), nor snapshot size/verbosity implications.
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 in the first sentence, and each following sentence carries a distinct rule (uid identity, staleness, screenshot preference). Slightly encumbered by the parenthetical DevTools-panel remark, but no real 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?
No output schema exists, so the description must convey the return shape, and it does describe a list of elements with uids. The remaining gap is that the effect of `verbose` on what comes back and the exact entry format are left implicit.
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 three parameters are already documented in the schema; the description only reinforces the general notion of element entries and uids. It adds no extra meaning about `verbose` or `filePath` beyond the schema text, 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?
Specific verb and resource: 'Take a text snapshot of the target page based on the a11y tree', plus it explains what a snapshot contains (page elements with unique uids). It also distinguishes itself from take_screenshot by stating the snapshot should be preferred, so an agent can separate it from that sibling.
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 operative guidance: 'Always use the latest snapshot' and 'Prefer taking a snapshot over taking a screenshot', which explicitly routes behavior against the nearest alternative. It stops short of stating when a snapshot is NOT appropriate (e.g., visual/CSS verification where a screenshot is required) or what to do if the page changes mid-flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textA
Type text using keyboard into a previously focused input
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to type | |
| pageId | Yes | Targets a specific page by ID. | |
| submitKey | No | Optional key to press after typing. E.g., "Enter", "Tab", "Escape" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false; the description adds real behavioral context by clarifying that keystrokes go to whatever is already focused rather than a targeted element. It does not cover what happens if nothing is focused, whether existing text is cleared, or error behavior for a mutation tool.
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 front-loaded sentence with zero filler; the most decision-relevant constraint (prior focus) appears immediately.
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 3-param interaction tool with no output schema, the description covers the core action and focus precondition, but leaves out sibling disambiguation and failure semantics, which matter for an agent choosing between typing, filling, and key-pressing.
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 text, pageId, and submitKey are already documented in the schema. The description adds no parameter-level meaning (e.g., it never mentions submitKey's role), 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 (type) and mechanism (keyboard input) plus a key precondition ('previously focused input'). It does not distinguish itself from siblings like fill, fill_form, or press_key, which is the main clarity gap.
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?
'Previously focused input' implies a prerequisite (focus first) but never says when to use this versus fill/fill_form or press_key. Usage is inferable rather than explicit, and no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileC
Upload a file through a provided element.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | The uid of the file input element or an element that will open file chooser on the page from the page content snapshot | |
| pageId | Yes | Targets a specific page by ID. | |
| filePaths | Yes | One or more files paths to upload. File paths have to be local to the browser instance (not the MCP). | |
| includeSnapshot | No | Whether to include a snapshot in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=false, so the description must carry the rest of the behavioral burden. It does not mention that this mutates page state, that files must be local to the browser instance (a critical, non-obvious constraint that lives only in the schema), or what happens on failure or with multiple file paths.
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 short sentence with no filler and the action front-loaded. It is efficient, though its brevity reflects omission rather than disciplined editing.
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 mutating browser-automation tool with no output schema and no meaningful annotations, the description is far too thin. An agent gets no guidance on the snapshot/uid workflow, file path semantics, or whether the page changes after upload.
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 explains every parameter including the important browser-local path constraint. The description adds no parameter meaning beyond what the schema provides, which lands at the 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 states a specific verb and resource ("Upload a file") but qualifies it with the vague phrase "through a provided element," which is only explained by the schema. It does nothing to distinguish this from siblings like fill, type_text, or evaluate_script, which an agent might otherwise consider for interacting with file inputs.
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 no indication of when to use this tool versus alternatives, nor any prerequisite context such as needing the uid from a snapshot or requiring the target element to be a file input. The agent must infer the workflow entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forARead-only
Wait for the specified text to appear on the selected page. By default, hidden text is also matched. Set visible to true to wait until the matched text is visible.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Non-empty list of texts. Resolves when any value appears on the page. | |
| pageId | Yes | Targets a specific page by ID. | |
| timeout | No | Maximum wait time in milliseconds. If set to 0, the default timeout will be used. | |
| visible | No | If true, wait until the matching text is visible. By default, hidden text also counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides crucial behavioral context that goes beyond the basic annotation (readOnlyHint). It specifically highlights the default matching behavior (hidden text is matched) and explains how to override this using the 'visible' parameter, which is key to correct tool invocation.
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, uses a logical two-sentence structure, and places the most important behavioral detail (default matching) immediately in the first sentence.
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 high complexity (4 parameters, timeout handling, visibility logic), the description is sufficient to use the tool, but it lacks high-level contextual guidance on expected latency or failure modes typical of browser polling tools.
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?
Although the schema is 100% covered, the description adds semantic value by summarizing the behavior of the 'visible' flag and explaining the logic of the 'text' array (resolves when any value appears), thus helping the agent understand the parameters' effects.
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: waiting for specific text to appear on a page. While clear, it is a standard polling/wait action, lacking specific context of *why* this is distinct from other actions like 'type_text' or 'click'.
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 are no explicit usage guidelines or context provided regarding when an agent should choose this wait action over other sibling tools. It describes what the tool does, not why the agent should use it.
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.
32 tool updates
v0.1.1- Changed
click1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
close_page1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
drag1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
emulate7 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - changed
Input schema / properties / colorScheme / descriptionPrevious value: -"Emulate the dark or the light mode. Set to \"auto\" to reset to the default."New value: +"Emulate the dark or the light mode. Omit or set to \"auto\" to reset to the default." - added
Input schema / properties / forcedColorsAdded value: +{ + "description": "Emulate the `forced-colors` CSS media feature. Omit or set to \"auto\" to reset to the default.", + "enum": [ + "active", + "none", + "auto" + ], + "type": "string" +} - added
Input schema / properties / prefersContrastAdded value: +{ + "description": "Emulate the `prefers-contrast` CSS media feature. Omit or set to \"auto\" to reset to the default.", + "enum": [ + "more", + "less", + "custom", + "no-preference", + "auto" + ], + "type": "string" +} - added
Input schema / properties / prefersReducedMotionAdded value: +{ + "description": "Emulate the `prefers-reduced-motion` CSS media feature. Omit or set to \"auto\" to reset to the default.", + "enum": [ + "reduce", + "no-preference", + "auto" + ], + "type": "string" +} - changed
Input schema / properties / userAgent / descriptionPrevious value: -"User agent to emulate. Set to empty string to clear the user agent override."New value: +"User agent to emulate. Omit or set to empty string to clear the user agent override." - changed
Input schema / properties / viewport / descriptionPrevious value: -"Emulate device viewports '<width>x<height>x<devicePixelRatio>[,mobile][,touch][,landscape]'. 'touch' and 'mobile' to emulate mobile devices. 'landscape' to emulate landscape mode."New value: +"Emulate device viewports '<width>x<height>x<devicePixelRatio>[,mobile][,touch][,landscape]'. 'touch' and 'mobile' to emulate mobile devices. 'landscape' to emulate landscape mode. Omit to clear the viewport override."
- Changed
evaluate_script6 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - changed
Input schema / properties / args / descriptionPrevious value: -"An optional list of arguments to pass to the function."New value: +"An optional list of arguments (element uids from the page content snapshot) to pass to the function." - added
Input schema / properties / formatAdded value: +{ + "description": "How to interpret the source. \"function\" treats it as a function declaration and supports args. \"script\" evaluates it as classic JavaScript and does not support args. Defaults to \"function\". ECMAScript modules are not supported.", + "enum": [ + "function", + "script" + ], + "type": "string" +} - changed
Input schema / properties / function / descriptionPrevious value: -"A JavaScript function declaration to be executed by the tool in the target page.\nExample without arguments: `() => document.title` or `async () => await fetch(\"example.com\")`.\nExample with arguments: `(el) => el.innerText`\n"New value: +"JavaScript source to execute in the target page. Provide either this or sourcePath, but not both. The source is interpreted according to format.\nExample without arguments: `() => document.title` or `async () => await fetch(\"example.com\")`.\nExample with arguments: `(el) => el.innerText`\n" - added
Input schema / properties / sourcePathAdded value: +{ + "description": "The absolute or relative path to a JavaScript file on the MCP server's local filesystem. Provide either this or function, but not both.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "pageId", - "function" -]New value: +[ + "pageId" +]
- Changed
fill1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
fill_form1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
get_console_message1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
get_css_styles1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
get_network_request1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
handle_dialog1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
hover1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
lighthouse_audit1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
list_console_messages3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - changed
Input schema / properties / pageIdx / descriptionPrevious value: -"Page number to return (0-based). When omitted, returns the first page."New value: +"Page number to return (0-based). When omitted, returns the first page. Ignored unless pageSize is set." - changed
Input schema / properties / serviceWorkerId / descriptionPrevious value: -"Filter messages to only return messages of the specified service worker."New value: +"Filter messages by the service worker ID shown by list_pages (sw-N)."
- Changed
list_network_requests3 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - changed
Input schema / properties / pageIdx / descriptionPrevious value: -"Page number to return (0-based). When omitted, returns the first page."New value: +"Page number to return (0-based). When omitted, returns the first page. Ignored unless pageSize is set." - changed
Input schema / properties / resourceTypes / items / enumPrevious value: -[ - "document", - "stylesheet", - "image", - "media", - "font", - "script", - "texttrack", - "xhr", - "fetch", - "prefetch", - "eventsource", - "websocket", - "manifest", - "signedexchange", - "ping", - "cspviolationreport", - "preflight", - "fedcm", - "other" -]New value: +[ + "document", + "stylesheet", + "image", + "media", + "font", + "script", + "texttrack", + "xhr", + "fetch", + "prefetch", + "eventsource", + "manifest", + "signedexchange", + "ping", + "cspviolationreport", + "preflight", + "fedcm", + "other" +]
- Changed
list_pages1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
navigate_page1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
new_page1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
performance_analyze_insight1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
performance_start_trace2 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / ignoreCacheAdded value: +{ + "description": "Whether to bypass the HTTP cache when reloading the page, to measure a cold page load. Only applies if reload is true.", + "type": "boolean" +}
- Changed
performance_stop_trace1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
press_key1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
resize_page7 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / height / exclusiveMinimumAdded value: +0 - added
Input schema / properties / height / maximumAdded value: +9007199254740991 - changed
Input schema / properties / height / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / width / exclusiveMinimumAdded value: +0 - added
Input schema / properties / width / maximumAdded value: +9007199254740991 - changed
Input schema / properties / width / typePrevious value: -"number"New value: +"integer"
- Added
screencast_start - Added
screencast_stop - Changed
select_page1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
take_heapsnapshot1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
take_screenshot1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
take_snapshot1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
type_text1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
upload_file1 field changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false
- Changed
wait_for2 fields changed- changed
Input schema / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / visibleAdded value: +{ + "default": false, + "description": "If true, wait until the matching text is visible. By default, hidden text also counts.", + "type": "boolean" +}
36 tool updates
v0.1.0- First observed
browser_restart - First observed
browser_start - First observed
browser_status - First observed
browser_stop - First observed
click - First observed
close_page - First observed
drag - First observed
emulate - First observed
evaluate_script - First observed
fill - First observed
fill_form - First observed
get_console_message - First observed
get_css_styles - First observed
get_network_request - First observed
handle_dialog - First observed
hover - First observed
lighthouse_audit - First observed
list_console_messages - First observed
list_network_requests - First observed
list_pages - First observed
navigate_page - First observed
new_page - First observed
performance_analyze_insight - First observed
performance_start_trace - First observed
performance_stop_trace - First observed
press_key - First observed
resize_page - First observed
select_page - First observed
state_list - First observed
state_save - First observed
take_heapsnapshot - First observed
take_screenshot - First observed
take_snapshot - First observed
type_text - First observed
upload_file - First observed
wait_for
TDQS
Scored across 38 tools
Most tools target clearly distinct browser/devtools actions, and paired tools like list_console_messages vs. get_console_message are distinguishable by their descriptions. There is some overlap among input tools (fill, fill_form, type_text, press_key) and between screenshot/snapshot tools, but the descriptions give enough guidance to choose correctly.
The set uses snake_case throughout, but the ordering and verb style are mixed: some tools are verb_noun (list_pages, take_screenshot), others are noun_verb or domain-prefixed (state_list, browser_start, screencast_start). The pattern is readable but not predictable across the whole surface.
With 38 tools, this is a large surface for a browser automation/devtools server, well above the typical well-scoped range. Many tools earn their place given the breadth of debugging features, but the count is heavy enough to increase selection burden.
The tool surface covers browser lifecycle, page interaction, snapshots, console, network, CSS, performance tracing, Lighthouse, dialogs, file upload, and saved login states. Minor gaps exist around broader cookie/storage management beyond named states, but core workflows are well covered.
Maintenance
Related MCP Connectors
- TabfleetOAuthcom.tabfleet
Launch, inspect, control, and share isolated cloud browsers for your agents.
Cloud browsers for AI agents: get past bot detection, sign in with MFA, run web tasks at scale.
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser through DevTools for automated testing, performance analysis, debugging, and web scraping. Provides reliable browser automation using Puppeteer with comprehensive DevTools access.2,262,793 npm3Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI coding assistants to control and inspect a live Chrome browser for automation, debugging, performance analysis, network monitoring, and DOM interaction through Chrome DevTools Protocol.2,262,793 npmApache 2.0
- AlicenseBqualityAmaintenanceEnables AI agents and developers to automate real Chrome/Chromium browsers through the Chrome DevTools Protocol, with token-efficient snapshots, multi-action batching, shadow DOM traversal, system-page control, extension management, and network/WebSocket inspection.691MIT
- AlicenseNot gradedqualityAmaintenanceEnables multiple agents to share a single Chrome browser with isolated tabs and shared sessions, allowing coordinated browsing and automation.18 npmMIT