Skip to main content
Glama
andresolbach

nodriver-mcp-server

nodriver-mcp-server

An undetected, anti-bot-resistant browser automation MCP server — a drop-in, stealth alternative to chrome-devtools-mcp for AI agents like Claude, Claude Code, Cursor, Windsurf, and any Model Context Protocol client. Powered by nodriver so your agent can browse, scrape, and automate real Chrome without tripping Cloudflare, hCaptcha, or WebDriver fingerprint detection.

PyPI CI License: MIT Python 3.12+ MCP compatible Tools: 70 Stars

Keywords: MCP server · browser automation · undetected chromedriver · anti-bot · Cloudflare bypass · web scraping · Claude · Cursor · nodriver · chrome-devtools-mcp alternative · Playwright/Puppeteer alternative · AI agent tools.

Is this the problem you have?

If you drive a browser from an AI agent, you have probably run into one of these:

  • The page sits on "Just a moment…" or "Checking your browser before accessing" and never loads

  • A "Verify you are human" checkbox that reappears every single time you click it

  • "Unusual Activity Detected", "Access Denied", or a plain HTTP 403 — from a site that opens perfectly in your normal browser

  • navigator.webdriver returns true, and the site quietly serves you different content because of it

  • The login works when you do it by hand, and fails the moment automation does the same steps

  • It all worked for weeks, then the site started returning an empty page or a captcha wall

None of that is your script being wrong. It is anti-bot detection — Cloudflare, DataDome, PerimeterX, Akamai, hCaptcha — recognising the automation stack itself. It shows up with chrome-devtools-mcp, playwright-mcp, Puppeteer, Selenium and browser-use alike, because they all drive Chrome in ways that leave a detectable signature: a ChromeDriver binary, WebDriver markers, CDP artifacts.

Related MCP server: CloakMCP

Why this fixes it

nodriver is the successor of undetected-chromedriver. It speaks the CDP protocol directly — no ChromeDriver binary, no Selenium/WebDriver markers — so navigator.webdriver reads false rather than true, and a session looks like a person using Chrome.

This server exposes that through the same tool surface as chrome-devtools-mcp (70 tools), so your agent keeps a familiar API and simply stops getting blocked. Swapping is a config change, not a rewrite.

What it will not do, so you can judge before installing: it does not solve image or text captchas for you, it cannot defeat every protection on every site, and it will not rescue a scraper that hammers a server. If a site blocks you for what you do rather than what you are, no driver fixes that. cf_verify handles the common Cloudflare checkbox challenge; it is not a captcha-solving service.

Does it actually pass? Here is the evidence

Claiming "undetected" is easy, so here is what the standard fingerprint suite reports when this server drives the page itself. Reproduce it in one line: point your agent at https://bot.sannysoft.com and take a snapshot.

Check

Result

bot.sannysoft.com — Intoli + fingerprint suite

58 checks, 0 failed

navigator.webdriver

false — a boolean on Navigator.prototype, not an own property, exactly as in a normal browser

window.chrome

present

navigator.plugins

5

navigator.languages

4 entries

User agent

no Headless token

What this does and does not prove. It shows the browser presents no automation artifacts to client-side fingerprinting, which is what these suites test and what most blocks key off. It does not prove any particular site will let you in: server-side signals such as IP reputation and request rate are outside what any driver controls, and captchas are not solved (see above). Measured on Chrome 151 / Windows 11, headful, with the default profile.

Features

  • 🕵️ Undetected by design — navigator.webdriver reads false, exactly as in a browser a person is using, and there are no CDP or WebDriver artifacts to find.

  • ☁️ Built-in Cloudflare challenge solver (cf_verify, needs the [cf] extra).

  • 🖼️ Frames are not a blind spot — list_frames plus a frame argument on the readers, and take_snapshot splices each iframe's tree in under the element hosting it, so a payment field or consent wall inside one gets a uid and can be clicked and filled like anything else.

  • 🔍 A network log that says what happened — status, response headers, a DevTools-style timing breakdown (DNS, connect, TLS, time to first byte, download), the script and line that started each request, transfer size, redirect hops and failures, plus WebSocket frames and server-sent events. A 500, a 404, a redirect and a DNS failure are different lines, not the same one.

  • 💾 Response bodies that cannot get lost — capture_bodies writes every matching response to disk the moment it arrives, from every tab, worker and service worker, before Chrome's buffer or the next navigation can drop it. A JSON index records URL, POST data, status and headers for each file, and search_bodies finds which response a value first arrived in and which request sent it back.

  • 🛡️ Passive security review built in — audit_security checks security headers (with a real CSP analysis: nonces, strict-dynamic, multiple policies), CORS, TLS and certificates of every origin, cookie flags, responses a CDN could serve to the wrong user, every first and third party the page talks to, and lists what Chrome's own Issues panel reports: CSP violations, mixed content, rejected cookies. inspect_storage inventories localStorage, sessionStorage, IndexedDB, Cache Storage and service workers, and decodes tokens it finds there. export_har writes everything to a HAR file for Burp, ZAP or DevTools — with the wire headers, Cookie and Set-Cookie included.

  • 👥 Several isolated browsers at once — pass browser: "agent-a" to any tool and that name gets its own Chrome, in its own process, with its own cookies, tabs and uids. Parallel agents stop stealing each other's selected tab. Omit it and nothing changes: the default browser runs in the server process, exactly as before. How it works

  • 🧩 70 tools covering navigation, input, snapshots, screenshots, content/PDF export, network + console inspection, device emulation, cookies/storage, sessions, profiles, and performance tracing.

  • 🧠 Schemas written for the agent, not just the compiler — every parameter carries a description, fixed-value options are real enums, and each tool declares read-only/destructive hints. See why this matters.

  • 📄 Compact accessibility-tree snapshots (take_snapshot) — searchable page text with a uid per element. Measured on the Hacker News front page: 27 KB against 97 KB unfiltered, 72% smaller, with every link, URL and text preserved. Same-origin URLs are printed relative to the page, which is lossless because the root node keeps the absolute one. That saving lands on every single agent step.

  • 🔗 Attach to a browser you are already signed into (use_running_browser) — drive your real Chrome profile over its debugging port instead of rebuilding logins in a fresh one.

  • 📱 Device emulation (Pixel 7, iPad) with correct UA / client hints.

  • ✅ Actions that verify themselves — fill reads the value back, set_checked reads the checked state back, and click, press_key and type_text report when no input event reached the page. A tool that cannot confirm what it did says so instead of reporting success.

  • 💾 Session save/restore — persist logins across runs.

  • 🧬 Ephemeral by default, run many at once — each session gets its own temp Chrome profile (auto-deleted), so Claude Desktop, Claude Code and VS Code can all drive nodriver simultaneously without colliding. Named persistent profiles are available on demand for reusable logins.

  • ⚡ One-command setup for 15+ MCP clients.

Installation

# Recommended: isolated install, won't touch your global Python environment
uv tool install nodriver-mcp

# or with pip
pip install nodriver-mcp

# or run it without installing anything
uvx nodriver-mcp

Requires uv for the first and third form. To track the development branch instead of a release:

uv tool install "nodriver-mcp @ git+https://github.com/andresolbach/nodriver-mcp-server.git@main"

Also listed in the official MCP Registry as io.github.andresolbach/nodriver-mcp-server, so clients and marketplaces that read the registry can find and install it directly.

Uses upstream nodriver >=0.50.3, which contains the Chrome 146+ CDP fixes (sameParty removed from Cookie, privateNetworkRequestPolicy → localNetworkAccessRequestPolicy) — verified working against Chrome 151. pip install also works, but uv tool install keeps it isolated.

You'll also need a local installation of Google Chrome (auto-detected).

Upgrade

uv tool upgrade nodriver-mcp

Requirements & tested versions

Every tool in this server was tested end-to-end against Google Chrome 151 with nodriver 0.50.3 on Python 3.12.11 / Windows 11 (macOS and Linux are supported too). Because nodriver talks to Chrome directly over CDP and tracks upstream Chrome changes, it keeps working as Chrome auto-updates.

Component

Requirement

Verified version

Python

3.12+

3.12.11

Google Chrome

any recent stable

151.0.7922.174

Operating system

Windows / macOS / Linux

Windows 11

nodriver

>= 0.50.3

0.50.3

mcp (MCP SDK)

>= 1.26.0, < 2

1.26.0

pillow

>= 12.1.1

12.1.1

tomli-w

>= 1.0.0

1.2.0

The pip packages/versions are also listed in requirements.txt (pip install -r requirements.txt), though uv tool install is recommended for a fully pinned, reproducible install.

One-command MCP client setup

# Interactive client selector (terminal TUI)
nodriver-mcp install

# Install to specific clients
nodriver-mcp install claude,cursor,kiro

# Uninstall
nodriver-mcp uninstall claude

# List all supported clients
nodriver-mcp --list-clients

# Print MCP config JSON (for manual setup)
nodriver-mcp --config

# Project-level config (writes to .cursor/mcp.json, .mcp.json, etc.)
nodriver-mcp install --scope project

Supported clients: Claude Desktop, Claude Code, Cursor, Windsurf, Codex, Gemini CLI, Copilot CLI, Kiro, VS Code, Cline, Roo Code, Amazon Q, Warp, Opencode, Trae.

The Claude Code VS Code extension shares Claude Code's config (~/.claude.json), so installing to claude-code covers both the CLI and the extension.

Manual config

If you'd rather paste it yourself, this works in any MCP client (claude_desktop_config.json, ~/.claude.json, .cursor/mcp.json, .mcp.json, …):

{
  "mcpServers": {
    "nodriver": {
      "command": "uvx",
      "args": ["nodriver-mcp"]
    }
  }
}

Environment Variables

Variable

Description

Default

NODRIVER_HEADLESS

Headless mode (true/false)

false

NODRIVER_USER_DATA_DIR

Explicit persistent Chrome profile dir (overrides the default)

Ephemeral temp profile, auto-deleted per session

NODRIVER_BROWSER_PATH

Chrome executable path

Auto-detected

NODRIVER_PROXY

Proxy server address

None

NODRIVER_BROWSER_URL

Attach to a Chrome already running at this address (e.g. http://127.0.0.1:9222) instead of launching one

Launch our own

NODRIVER_ENABLE_TRANSLATE

Set true to re-enable Chrome's Google Translate popup

Disabled

NODRIVER_ENABLE_EXTENSIONS

Set true to allow externally-installed Chrome extensions (and their prompts)

Disabled

By default the browser starts clean for automation: the Google Translate popup is suppressed and externally-installed Chrome extensions are blocked (so you don't get "an extension requires your attention" prompts). Re-enable either via the env vars above or at runtime with the set_browser_flags tool — which can also set any other Chrome launch flags (e.g. --lang=de-DE, --window-size=1280,800) via its extra_args parameter. The browser also auto-recovers if Chrome is closed or crashes between calls — tools relaunch it instead of failing.

Chrome also starts on about:blank rather than the New Tab page, so the NTP's own Google requests never show up in list_network_requests, and new_page reuses that empty startup tab instead of leaving a stray blank page behind.

Extensions

manage_extensions handles extensions at runtime:

  • manage_extensions("list") — extensions installed in the active profile (name, version, id) plus the current state

  • manage_extensions("on") / ("off") — the master switch (--disable-extensions); restarts Chrome. It covers unpacked extensions too, so "off" really means off

  • manage_extensions("load", path) / ("unload", path) — unpacked extensions from a folder

To use an extension permanently, switch to a persistent profile, install it once from the Chrome Web Store in that browser, and turn extensions on — it then loads on every launch.

Unpacked extensions need Chromium or Chrome for Testing. Official Chrome builds dropped --load-extension in v137, and as of Chrome 151 neither --enable-unsafe-extension-debugging nor disabling DisableLoadExtensionCommandLineSwitch brings it back — the flag is accepted and the extension is silently never registered. manage_extensions detects a branded build and says so instead of pretending it worked. Point NODRIVER_BROWSER_PATH at Chromium / Chrome for Testing if you need unpacked loading.

Several agents, several browsers

One agent working alone can skip this section: without the browser argument everything runs on a single shared browser, exactly as before.

Point two agents at one browser, though, and they collide. They share the selected tab, so a select_page or a navigation by one silently changes what the other sees, and every uid the other is holding goes stale. Nothing errors — the second agent simply acts on the wrong page.

So every tool takes an optional browser argument, and a name that does not exist yet creates one on the spot:

{ "url": "https://example.com", "browser": "agent-a" }

Each name is a separate Chrome in a separate process, with its own profile, cookies, tabs, snapshot uids and console/network capture. Isolation is structural rather than careful: there is no shared state left to collide over, and a Chrome that hangs or crashes takes down nothing but its own browser.

The default costs nothing. "default" runs inside the server process itself, so a session that never opens a second browser is the same single process and the same code path it always was. Only extra names spawn anything.

Tool

list_browsers

What is open: names, whether Chrome runs, profile, tabs and their URLs. Reports without starting anything.

shutdown_browser

Quits one browser's Chrome and frees its name. close_browser only quits Chrome and keeps the browser's profile and flags for next time.

Each extra browser is a Python process plus a full Chrome — roughly 200 MB and about a second to start. Up to 12 can be open at once, including the default. Two callers sharing one name still share one Chrome: the isolation is per browser, not per caller, so parallel agents each need their own.

Profiles

By default every browser launches Chrome with a fresh temporary profile that is created and deleted automatically. That also means you can run nodriver from Claude Desktop, Claude Code and the VS Code extension at the same time — each gets its own isolated Chrome, and they never fight over a shared profile. No configuration, no detection logic, nothing to clean up.

When you want to reuse a login across sessions, create a named persistent profile and switch to it:

  • list_profiles — list persistent profiles and show the active one

  • create_profile(name, activate=false) — create a reusable profile

  • use_profile(name) — switch to a persistent profile (""/"temp" returns to ephemeral)

  • use_temp_profile — switch back to a fresh ephemeral profile

  • delete_profile(name) — remove a persistent profile

Persistent profiles live under ~/.nodriver-mcp/profiles/<name>. You can still force a fixed profile globally with the NODRIVER_USER_DATA_DIR env var.

Drive a browser you are already signed into

Chrome locks its user-data-dir, so the profile holding your real logins cannot be opened a second time. The way in is to attach to the browser that already has it open — then you skip rebuilding every login through automation.

Start Chrome yourself, once:

# Windows
chrome.exe --remote-debugging-port=9222 --user-data-dir="%LOCALAPPDATA%\agent-profile"
# macOS / Linux
google-chrome --remote-debugging-port=9222 --user-data-dir=~/.config/agent-profile

Then attach, either at runtime with use_running_browser(port=9222), or up front by setting NODRIVER_BROWSER_URL=http://127.0.0.1:9222. Every tool then acts on that browser and its real tabs.

While attached, this server never closes a browser it did not start: close_browser and profile switches only detach. Go back to a self-launched browser with use_temp_profile or use_profile.

⚠️ That profile becomes part of the agent's reach. Whatever it is signed into — mail, bank, company systems — is reachable from here, because a cookie jar is all or nothing. Point this at a profile you are willing to expose, not your everyday one.

Tools (70)

Network collection is enabled automatically on each tab. Console collection is opt-in: call enable_console_collection when you want list_console_messages / get_console_message to start collecting events. This keeps Runtime.enable() disabled by default for sites that detect attached debuggers.

For mobile-only sites, pass device directly to new_page(...) or navigate_page(...) so the first real request already carries mobile signals.

click sends real CDP input events, so the page sees isTrusted=true. Because those are delivered by coordinate, it scrolls the element into view and then hit-tests several points inside it, since a sticky header or cookie banner can own the centre pixel — on docs.pypi.org that affects 43 of 54 visible links. If no point reaches the element, if_covered decides: "report" (default) refuses and names the blocker, leaving the page untouched and the session undetectable; "synthetic_click" clicks the element directly, which works through anything but makes the page see isTrusted=false. Either way the response says which path was taken, so a detectable click is never silent.

Category

Tools

Several browsers (2)

list_browsers · shutdown_browser

Input automation (12)

click · click_at · hover · fill · fill_form · set_checked · select_option · type_text · press_key · drag · upload_file · handle_dialog

Navigation (10)

navigate_page · new_page · close_page · close_browser · list_pages · select_page · wait_for · wait_for_selector · scroll_page · scroll_to_selector

Snapshots & debugging (12)

take_screenshot · take_snapshot · get_page_content · query_selector · list_frames · evaluate_script · get_computed_styles · save_pdf · enable_console_collection · disable_console_collection · list_console_messages · get_console_message

Network monitoring (6)

list_network_requests · get_network_request · capture_bodies · search_bodies · export_har · block_resources

Security audit (2)

audit_security · inspect_storage

Device emulation (4)

emulate · emulate_device · reset_emulation · resize_page

Performance (3)

performance_start_trace · performance_stop_trace · take_memory_snapshot

Cookies & storage (5)

get_cookies · set_cookie · clear_cookies · get_local_storage · set_local_storage

Session management (3)

save_session · load_session · list_sessions

Profiles & browser (9)

list_profiles · create_profile · use_profile · use_temp_profile · use_running_browser · delete_profile · set_browser_flags · set_proxy · manage_extensions

Anti-detection helpers (2)

cf_verify · bypass_insecure_warning

📖 Full tool reference → — every tool with its exact parameters, types, defaults and enum values, generated straight from the live schemas.

Built for the agent that calls it

An MCP tool is only as good as what the model can see of it. Most servers hand over a name, a sentence, and untyped parameters — leaving the agent to guess whether it's type="url" or type="goto", and burning a failed call to find out.

Here, the schema does that work:

  • Every parameter has a description in the schema itself — not buried in a prose blob the client may never show. All 70 tools, all parameters, no exceptions (there's a test for it).

  • Fixed-value parameters are real enums. navigate_page(type=…) advertises exactly url, back, forward, reload. A wrong value is rejected by validation before it ever reaches Chrome, instead of returning an error the agent has to interpret.

  • Numeric and array bounds are declared — quality is 0–100, wait_for(text=…) requires at least one entry.

  • Structured parameters are typed. fill_form publishes {uid, value} rather than an opaque list[dict].

  • Every tool declares behaviour hints (readOnlyHint, destructiveHint, idempotentHint). Clients use these to group permissions — so a client can auto-approve take_snapshot while still prompting for delete_profile.

  • Descriptions say when not to use a tool, and point at the better one. take_screenshot tells the model to prefer take_snapshot; click_at points back to click.

Comparison with chrome-devtools-mcp

Feature

chrome-devtools-mcp

nodriver-mcp-server

Browser backend

Puppeteer (ChromeDriver)

nodriver (direct CDP)

WebDriver fingerprint

❌ Exposed

✅ None

navigator.webdriver

❌ true

✅ false, as in a normal browser

Cloudflare bypass

❌

✅ Built-in cf_verify

Install method

npx

uvx / pip

Language

TypeScript / Node.js

Python

Parallel browsers

one

up to 12, isolated

Tool coverage

29 tools

70 tools

Per-parameter schema docs

partial

✅ all 70 tools

Tool behaviour hints

❌

✅ read-only / destructive

Tools not implemented: performance_analyze_insight (needs the DevTools frontend trace parser), lighthouse_audit (needs the Lighthouse Node API), screencast_start/stop (needs ffmpeg + Puppeteer), extension management (experimental).

Use cases

  • Scrape sites that reject other automation (Cloudflare, DataDome, PerimeterX, hCaptcha) without leaking a CDP/WebDriver fingerprint. Fingerprinting is only part of what those systems weigh — IP reputation and behaviour count too — so a challenge is still possible; cf_verify handles a Cloudflare checkbox.

  • Let an AI agent browse the real web — Claude, Cursor, Windsurf and other LLM agents can log in, fill forms, click, read pages, and screenshot.

  • Automate authenticated workflows and reuse the login across sessions with persistent profiles.

  • LLM-driven web research & data extraction using compact accessibility-tree snapshots instead of brittle screenshots.

  • End-to-end / QA testing with device emulation, network + console inspection, and performance traces.

  • An undetected alternative to Playwright, Puppeteer and Selenium for agentic browsing.

FAQ

Is this an undetected alternative to chrome-devtools-mcp? Yes. It exposes the same tool surface but drives Chrome through nodriver (direct CDP), so navigator.webdriver reads false — the same value a browser a person is using reports — and there are no WebDriver/CDP fingerprints for anti-bot systems to detect.

Can it bypass Cloudflare? It ships a cf_verify tool that solves the Cloudflare "verify you are human" challenge, and its undetected profile avoids most bot checks. (No tool can guarantee bypassing every protection.)

I already use chrome-devtools-mcp or playwright-mcp and keep getting blocked. How do I switch? Replace the server entry in your MCP config with the one under Manual config — that is the whole migration. The tool names and arguments match chrome-devtools-mcp, so existing prompts, scripts and agent instructions keep working unchanged. You can also run both side by side and point the agent at whichever suits the site.

The site works in my normal browser but not under automation. Why? Because anti-bot systems fingerprint the driver, not your behaviour: a ChromeDriver binary in the process tree, navigator.webdriver === true, CDP artifacts in the page. Your manual browser has none of those, so it is served the real page. nodriver drives Chrome without leaving them.

Does it help with captchas? Only the Cloudflare "verify you are human" checkbox, via cf_verify. Image grids, text captchas and hCaptcha puzzles are not solved — this is a stealth driver, not a captcha service. In practice, staying undetected means far fewer captchas are shown in the first place.

Which clients are supported? One command installs it into 15+ MCP clients: Claude Desktop, Claude Code, Cursor, Windsurf, Codex, Gemini CLI, Copilot CLI, Kiro, VS Code, Cline, Roo Code, Amazon Q, Warp, Opencode, Trae.

Can I run it in several clients at the same time? Yes. Each instance uses its own ephemeral Chrome profile by default, so Claude Desktop, Claude Code and the VS Code extension can all use nodriver simultaneously without colliding.

Headless or visible browser? A real Chrome window by default; set NODRIVER_HEADLESS=true for headless.

How do I keep a login between sessions? Create a persistent profile with create_profile and switch to it with use_profile, or use save_session / load_session.

Does it work on Windows / macOS / Linux? Yes, all three. Tested on Windows 11 with Chrome 151 and Python 3.12.

Changelog

See CHANGES.md. Highlights: ephemeral-by-default Chrome profiles so multiple instances run at once (+ named persistent profiles), migrated to upstream nodriver 0.50.3 (Chrome 151 verified), and fixed several previously-broken tools — fill/fill_form, evaluate_script with element args, select_page tab switching, press_key modifier chords (Ctrl+A/C/V), network/console lookup indexing, and Windows installer crashes.

Credits

Based on nodriver-mcp by Saber-CC (MIT). Browser backend by nodriver (ultrafunkamsterdam). Tool surface mirrors chrome-devtools-mcp.

License

MIT

Available Tools

70 tools
audit_securityAudit page securityA
Read-only

Passive security review of the selected page, from what the browser already has — a starting point for a manual test, not a verdict.

WARN marks a concrete weakness, INFO context worth a look. Headers come from the recorded page load; if it was not recorded (a tab the server did not open), the page URL is fetched once from the page and the answer says so. Chrome's issues are collected from the moment the server first touches a tab, so on a tab it had not touched, reload the page for a full list. Cookie values are never printed — use get_cookies for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
checksNoWhich parts to run: "headers" (security headers, CSP analysis, CORS on every recorded response, version disclosure), "tls" (protocol, cipher, certificate of every origin the page talked to), "cookies" (flags of every cookie sent to those origins), "cache" (responses a CDN or proxy could serve to the wrong user), "domains" (first and third parties the page talks to, and third-party code loaded without integrity checks) and "issues" (what Chrome itself flagged: CSP violations, mixed content, rejected cookies, CORS errors). Omit for all.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint annotation. It discloses where headers come from, how Chrome's issue collection timing works, that the page URL may be fetched once if not recorded, and that cookie values are intentionally not printed. This level of transparency helps the agent anticipate output quirks and avoids surprises, especially since idempotentHint is false.

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

Conciseness5/5

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

The description is efficient: it opens with the core purpose in the first sentence, then packs each subsequent sentence with unique, non-redundant context. No word is wasted; even the cookie caveat serves both behavioral and usage guidance. It is front-loaded and structured logically, so an agent can quickly grasp the baseline and then dive into nuances.

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

Completeness5/5

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

The description covers data provenance, timing caveats, expected output format, and explicitly points to a sibling tool for missing details. Since an output schema exists, the description need not explain return values. For a tool with two optional parameters and this complexity, it leaves no critical gaps an agent would need to call it correctly.

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

Parameters3/5

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

The schema already provides 100% coverage with detailed descriptions for both parameters, including the full enumeration for 'checks'. The description does not add meaning to any specific parameter; instead, it explains overall behavior and output formats. While it indirectly helps interpret the 'checks' parameter by describing WARN/INFO output, that is not the tool description's job, so it rests at the baseline for fully documented schemas.

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

Purpose5/5

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

The description clearly states the tool performs a 'passive security review of the selected page' and positions it as a starting point rather than a verdict. This gives a specific verb+resource scope and distinguishes it from a full vulnerability assessment. It also lists what the tool outputs (WARN/INFO) and what it doesn't (cookie values), making its purpose unambiguous.

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

Usage Guidelines5/5

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

The description tells the agent when to use the tool (as a starting point for manual tests) and what it is not (a verdict). It explicitly directs cookie value needs to 'get_cookies', providing a clear alternative. It also explains data-source caveats (recorded vs fetched page) that affect interpretation of results, helping the agent choose correctly in context.

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

block_resourcesBlock resource typesA
Idempotent

Block images, fonts, stylesheets or media to speed up page loads.

Removes most of the bytes on a media-heavy page, which makes scraping several times faster and far cheaper over a metered or proxied connection.

Blocking stylesheets breaks layout, so anything that depends on element geometry becomes unreliable — click_at, element screenshots, and the visible check in wait_for_selector. Text extraction is unaffected.

Requests are matched on the resource type Chrome reports for them, so an asset served from an extension-less URL is still blocked, and blocking one type never catches another.

Applies to ONE TAB — the selected page — and stays in effect there across navigations until called again with no types. A tab opened afterwards with new_page starts unblocked and needs its own call.

ParametersJSON Schema
NameRequiredDescriptionDefault
typesNoResource types to block. ["image", "font", "media"] is the usual choice for scraping — it keeps stylesheets, so layout-dependent behaviour still works. Pass an empty list or omit to unblock everything.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations provide idempotentHint=true and destructiveHint=false but the description goes far beyond them: it discloses that blocking stylesheets breaks layout-dependent operations, that matching follows Chrome-reported resource types (so extension-less URLs are still caught and types never cross-match), and that the effect is scoped to one tab and resets on new_page. No contradiction with annotations — idempotency and reversibility are consistent with 'call again with no types to unblock.'

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

Conciseness5/5

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

Four paragraphs, but every sentence earns its place and the structure is logical: purpose/benefit → side effects → matching semantics → scope/persistence. The most important claim (what it blocks, why) is front-loaded, and the longer sections address genuinely non-obvious behavior that an agent must know before calling.

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

Completeness5/5

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

For a tool with subtle side effects and scoping, the description covers everything: purpose, benefit, what breaks and what doesn't, matching semantics, persistence across navigations, how to unblock, and the new_page reset. An output schema exists, so return-value explanation isn't required. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and both parameter descriptions are excellent: `types` documents the enum values, the recommended scraping combination, and the unblock behavior; `browser` explains the per-agent isolation. Baseline is 3 given full coverage, but the description adds value by clarifying matching semantics (Chrome-reported type, no cross-type matching) that enriches how `types` should be understood. Not a 5 because the core parameter meaning lives in the schema, not the description.

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

Purpose5/5

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

The description opens with a specific verb+resource ('Block images, fonts, stylesheets or media') and a concrete purpose ('speed up page loads'). No sibling tool performs this action — the closest (bypass_insecure_warning, cf_verify, set_browser_flags) are all distinct — so the tool is clearly differentiated without needing to name a sibling.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance (speed up scraping on media-heavy pages), explicit exclusions ('Blocking stylesheets breaks layout... click_at, element screenshots, and the `visible` check in wait_for_selector become unreliable'), and what is unaffected ('Text extraction is unaffected'). The schema description reinforces this with a recommended combination. Scope (single tab, persists across navigations, new_page starts unblocked) is also spelled out. This is full usage routing with no inference required.

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

bypass_insecure_warningBypass insecure-connection warningA

Click through Chrome's "Your connection is not private" interstitial.

Use this when a navigation lands on an SSL/certificate warning page (expired or self-signed certificate, hostname mismatch) instead of the site itself — the snapshot then shows a warning page rather than the expected content. This performs the Advanced -> Proceed click for you.

Has no effect on any other kind of page.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations provide no behavioral detail beyond flags. The description explains the mechanism (performs the Advanced -> Proceed click) and its limitation (no effect on other pages). It adds value over the annotations but does not mention potential side effects like actually navigating to an insecure page or any security implications, which would strengthen transparency.

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

Conciseness5/5

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

The description is concise (~100 words) and well-structured: it opens with the action, then provides context, the mechanism, and a caveat. There is no fluff or redundancy; every sentence earns its place.

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

Completeness5/5

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

For a simple tool with one optional parameter and no required inputs, the description covers when to use it, what it does, and its non-effect. The existence of an output schema (even if not detailed here) means return values are not required to be explained. The description is complete for an agent to invoke it correctly.

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

Parameters3/5

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

The schema description covers 100% of the parameter, fully explaining the 'browser' parameter including its default and concurrency implications. The tool description itself adds no parameter information, which is acceptable given the schema's thoroughness. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the specific action ('Click through Chrome's Your connection is not private interstitial') and identifies the resource (the warning page). It distinguishes itself from sibling navigation tools by focusing exclusively on the SSL/certificate interstitial.

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

Usage Guidelines5/5

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

It explicitly tells when to use it: when a navigation lands on an SSL/certificate warning page instead of the site. It also specifies exclusions ('Has no effect on any other kind of page') and explains the symptom (snapshot shows warning page). This provides clear when-to and when-not-to guidance.

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

capture_bodiesCapture response bodies to diskA

Save every matching response body to disk the moment it arrives, in the background.

get_network_request asks Chrome for a body only when you ask — by then it is often gone: Chrome drops bodies over ~10 MB at once, and a navigation to another site drops the rest. This takes each body while the response is still paused, before the page even sees it, and writes it to a file.

Covers the whole browser until stopped: every tab, including ones the page opens itself, plus dedicated workers and service workers. Each body is its own file; capture.jsonl beside them records URL, method, POST data, status and headers per file. list_network_requests marks captured requests "saved", and get_network_request falls back to the file.

Not captured: responses from Chrome's cache (they never touch the network — reload with ignore_cache), redirects, and event streams inside workers. Event streams on a page are written as they arrive; every other matching response reaches the page only once complete, so keep the pattern off long-running downloads.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNo"start" begins capturing in the background, "status" reports progress while it runs, "stop" ends it and reports what was saved.start
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
out_dirNoFolder to write into, created if missing. Empty uses ~/.nodriver-mcp/captures/<timestamp>.
max_body_mbNoSkip a response whose Content-Length announces more than this many MB. A captured body is held in memory whole on its way to disk.
url_patternNoWhich responses to keep, matched against the full URL — required for start. "*" matches any run of characters and "?" exactly one, as in Chrome's own interception patterns: "*/api/*", "*graphql*". A pattern without "*" matches anywhere in the URL. "*" keeps everything.
resource_typesNoOnly these resource types, e.g. ["XHR", "Fetch"] for a page's own API calls. Omit for all.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes far beyond the sparse annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false). It discloses background execution, browser-wide coverage including workers, the capture.jsonl sidecar, interaction with list_network_requests and get_network_request, memory-in-whole behavior, and exact exclusions. No contradiction with annotations.

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

Conciseness5/5

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

The most important action and scope appear in the first sentence. The remaining paragraphs add necessary behavioral context, exclusions, and integration notes without filler. Every sentence earns its place, and the structure is logical: what, why, scope, exclusions.

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

Completeness5/5

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

For a complex background-capture tool with six parameters and output schema, the description covers the full behavioral contract: what is captured, what is not, how the files are organized, how it interacts with sibling tools, and a memory warning via the max_body_mb parameter. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description does not add new parameter-level meaning beyond the schema, but it does provide behavioral context that helps an agent understand the lifecycle (start/status/stop) and the inter-tool effects of captured bodies. This keeps it at a solid 3.

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

Purpose5/5

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

Opens with a specific verb-resource pair: "Save every matching response body to disk the moment it arrives, in the background." It clearly differentiates from get_network_request by explaining that the sibling asks Chrome lazily and often misses bodies, whereas this tool captures them while the response is still paused.

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

Usage Guidelines5/5

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

Explicitly contrasts with get_network_request, explains when this tool is necessary (bodies are often gone by request time), and lists concrete exclusions: cache responses, redirects, and event streams inside workers. It also gives actionable advice such as using ignore_cache and keeping patterns off long-running downloads.

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

cf_verifySolve Cloudflare challengeA

Attempt to solve a Cloudflare "Verify you are human" challenge.

Use when a page is stuck on a Cloudflare interstitial — a checkbox widget, or "Checking your browser before accessing". Drives nodriver's built-in verification bypass, which locates the checkbox visually and clicks it.

Needs opencv, which is an optional extra: install nodriver-mcp[cf], or this reports that it is missing rather than failing obscurely. Many challenges clear by themselves after a few seconds, so wait_for(["some text from the real page"]) is worth trying first — and this says so when it looks at the page and finds no challenge at all.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and idempotentHint=false, implying side effects. The description adds valuable context: it drives nodriver's built-in bypass, locates and clicks the checkbox visually, requires the optional opencv dependency (and reports missing it gracefully), and handles the no-challenge case. It does not contradict annotations and enriches the behavioral picture beyond them.

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

Conciseness5/5

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

The description is five sentences with zero fluff. The purpose is front-loaded in the first sentence, usage conditions follow, then dependency and alternative guidance are given concisely. Every sentence earns its place; it is efficient and well-organized.

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

Completeness5/5

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

For a specialized challenge-solving tool, the description covers when to use, the alternative (wait_for), the optional dependency, and the no-challenge fallback. An output schema exists (indicated) to handle return values, so nothing critical is missing. The tool is fully comprehensible and actionable for an agent.

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

Parameters3/5

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

The schema description coverage is 100% — the single optional 'browser' parameter is fully described in the schema, including its default and the semantics of naming independent Chrome instances. The tool description adds no further parameter-specific information, so it does not exceed the baseline set by the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Attempt to solve a Cloudflare Verify you are human challenge.' It precisely names the interstitial types (checkbox widget, 'Checking your browser') and is clearly distinct from all sibling tools, none of which target Cloudflare challenges. This leaves no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

It explicitly states when to use the tool ('Use when a page is stuck on a Cloudflare interstitial') and gives a concrete alternative: 'wait_for([some text from the real page]) is worth trying first' for challenges that self-resolve. It also explains that the tool reports when no challenge is present, covering the fallback condition. This is exemplary usage guidance.

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

clear_cookiesClear cookiesA
DestructiveIdempotent

Delete every cookie in the browser.

Browser-wide, not per site and not per tab — this logs you out of everything at once, with no undo. Restore a previous state with load_session if you have one saved.

Useful for testing a first-time-visitor flow or resetting a consent banner decision. localStorage is left untouched, so sites that keep state there may still recognise you.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Even though annotations already flag destructiveHint=true, the description adds meaningful behavioral detail beyond the structured data: it has no undo, it logs the user out everywhere, localStorage is left untouched, and sites may still recognize the user because of that. This gives the agent a much richer picture of the side effects than the annotations alone.

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

Conciseness5/5

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

The description is compact and well-organized: the core action comes first, followed by scope and consequences, then use cases, then a caveat. Every sentence adds value and there is no filler or redundant restating of the tool name.

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

Completeness5/5

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

For a single-parameter destructive action with an output schema, the description covers everything an agent needs: what is deleted, the scope, irreversibility, restoration path, intended use cases, and a relevant side-effect caveat. The output schema is present, so describing the return value would be redundant.

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

Parameters3/5

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

With schema description coverage at 100%, the single 'browser' parameter is fully documented in the schema, including its default and per-agent semantics. The description does not add parameter-specific information, but it does not need to. Baseline 3 is appropriate because the schema does the heavy lifting.

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

Purpose5/5

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

The description opens with a specific verb and object: 'Delete every cookie in the browser.' It goes further to clarify the exact scope ('Browser-wide, not per site and not per tab'), which clearly distinguishes this from per-site cookie tools like get_cookies and set_cookie. The phrase 'logs you out of everything' reinforces the practical effect without ambiguity.

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

Usage Guidelines4/5

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

The description gives concrete use cases: 'testing a first-time-visitor flow or resetting a consent banner decision.' It also points to an alternative restoration path with load_session. It stops short of saying when not to use this tool, but the guidance is clear enough for an agent to decide.

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

clickClick elementA

Click an element addressed by its snapshot uid.

This is the click you want in almost all cases — prefer it over click_at, because a uid survives layout shifts and raw coordinates do not. The element is scrolled into view first, so it need not be visible beforehand.

Sends real CDP input events, so the page sees isTrusted=true, which is the entire point of an undetected driver. Because those are delivered by coordinate, the click is aimed at a point that actually hits the element: several points inside it are hit-tested first, since a sticky header or a banner can cover the centre. If none of them reach it, if_covered decides what happens, and the response always says which path was taken.

Two other situations force the scripted fallback regardless: a touch-emulated target, where CDP mouse input can crash the renderer, and a CDP click that times out or errors. Every step is bounded at 10s, so a wedged page cannot hang the call.

On "unknown uid", take a fresh take_snapshot and retry with the new uid.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement uid from the most recent take_snapshot, e.g. "4_12". uids are invalidated whenever the page changes — if you get "unknown uid", take a fresh snapshot and retry with the new uid.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
dbl_clickNoSend a double-click instead of a single click.
if_coveredNoWhat to do when something else sits on top of the element, so a real mouse click at its position would hit that instead. "report" (the default) does not click at all: it returns an error naming what is in the way, leaving the page untouched and the session indistinguishable from a person's. Dismiss the cookie banner, close the modal or scroll, then click again. "synthetic_click" dispatches the click on the element directly, which works through anything — but the page sees `isTrusted=false`, which is precisely the signal anti-bot systems look for. Choose it when the overlay cannot be dismissed, or when stealth does not matter on this site; not as a default.report
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses far more than the annotations: real CDP input events, isTrusted=true, hit-testing behavior, fallback to synthetic clicks, touch-emulation crash risk, 10-second bounds, and response path reporting. This is exactly the behavioral context an agent needs.

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

Conciseness5/5

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

The description is long but every sentence earns its place: purpose, sibling differentiation, stealth behavior, fallback conditions, timeout safety, and error recovery. It is front-loaded and structured in clear paragraphs.

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

Completeness5/5

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

Given the tool's complexity, the rich schema, and the presence of an output schema, this description covers everything needed to invoke it correctly: when to use it, how it behaves, what can go wrong, and how to recover. Nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter thoroughly. The description adds some context around if_covered and uid invalidation, but it does not need to compensate for missing schema documentation.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Click an element addressed by its snapshot uid.' It also explicitly distinguishes itself from click_at, so an agent can tell which tool to use without opening the sibling schema.

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

Usage Guidelines5/5

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

It explicitly says to prefer this tool over click_at and explains why, gives recovery steps for an 'unknown uid', and describes when the scripted fallback is forced. This is concrete, actionable guidance for choosing and using the tool.

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

click_atClick at coordinatesA

Click a raw viewport coordinate instead of an element.

Use click with a uid whenever the target shows up in a snapshot — it is robust against layout shifts, this is not. Coordinates are for surfaces with no addressable element: canvases, maps, video players, image hotspots.

The point must lie inside the current viewport; scroll_page or scroll_to_selector first if it does not. Coordinates are in CSS pixels and ignore the device pixel ratio, so they match what emulate/resize_page report.

Same input path as click: real CDP events, the same reported scripted fallback, the same 10s bound per step.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate in CSS pixels, relative to the viewport's top-left corner.
yYesY coordinate in CSS pixels, relative to the viewport's top-left corner.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
dbl_clickNoSend a double-click instead of a single click.
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false. The description adds substantial behavioral context beyond those: it warns that coordinate clicks are not robust against layout shifts, clarifies that coordinates are in CSS pixels and ignore device pixel ratio, requires the point to be inside the viewport, and notes 'Same input path as `click`: real CDP events, the same reported scripted fallback, the same 10s bound per step.' This fully discloses the behavioral profile without contradicting any annotation.

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

Conciseness5/5

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

The description is five sentences, each densely informative. It front-loads the core purpose and the key differentiator from `click`, then covers usage scope, coordinate constraints, and behavioral parity. There is no filler or repetition; every sentence earns its place.

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

Completeness5/5

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

The tool has an output schema, so return value documentation is not required. The description covers the essential context for correct invocation: the target use cases, the distinction from `click`, the viewport requirement, the coordinate system, the robustness caveat, and the behavioral parity with `click`. For a 5-parameter tool with a rich sibling set, nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% (all 5 parameters have descriptions), so the baseline is 3. The description adds meaningful semantics for x and y by stating 'Coordinates are in CSS pixels and ignore the device pixel ratio, so they match what emulate/resize_page report' and by explaining the viewport requirement. It does not elaborate on browser, dbl_click, or include_snapshot beyond the schema, but those are already well-documented. The added coordinate semantics justify a slight bump to 4.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Click a raw viewport coordinate instead of an element.' It immediately distinguishes from the sibling 'click' by contrasting coordinate-based vs. element-based targeting. The subsequent sentence, 'Use `click` with a uid whenever the target shows up in a snapshot — it is robust against layout shifts, this is not,' explicitly names the sibling and the deciding condition, leaving no ambiguity about what this tool does.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use and when-not-to-use guidance. It states coordinates are for 'surfaces with no addressable element: canvases, maps, video players, image hotspots' and that `click` should be used when a snapshot shows the target. It also provides a prerequisite: 'scroll_page or scroll_to_selector first if it does not [lie inside viewport].' This is model guidance for choosing the right tool.

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

close_browserClose browserA
Destructive

Quit Chrome entirely, closing every tab.

Unlike close_page (which always keeps one tab alive), this tears down the whole browser. Chrome relaunches automatically on the next tool call with the currently selected profile, so this is also how you apply pending launch flags without switching profiles.

On an ephemeral temp profile (the default) this discards cookies, logins and localStorage — save_session first if you need them back. Persistent profiles created with create_profile keep everything.

It keeps the browser itself. The name, its selected profile and its launch flags survive for the next relaunch, so the name goes on counting against the 12-browser limit. When an agent is finished for good, call shutdown_browser instead: it also releases the name.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description goes far beyond: it details that cookies/logins/localStorage are discarded on temp profiles but preserved on persistent ones, that the browser relaunches automatically, that the name/profile/flags survive and count against the 12-browser limit. This adds critical behavioral context that annotations alone don't provide. No contradiction with annotations.

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

Conciseness4/5

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

The description is longer than a typical one, but every sentence earns its place: main purpose, contrast with close_page, behavior on relaunch, side effects on temp vs persistent profiles, persistence of name, and the alternative shutdown_browser. It is front-loaded with the core action and uses structured paragraphs. Slightly verbose but not wasteful — well organized.

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

Completeness5/5

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

Given the tool's complexity, the description is remarkably complete. It covers all relevant behaviors: what happens to cookies/data, what persists across relaunch, the browser limit, and the distinction from shutdown_browser. An output schema exists, so return values need not be explained. Nothing an agent needs to correctly invoke or decide when to use this tool is missing.

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

Parameters3/5

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

The input schema for the single 'browser' parameter is fully described (100% coverage) and includes a clear explanation of what each name represents and how to use the default. The tool description itself does not add any additional meaning about the parameter — it focuses on the tool's overall behavior. Since the schema already covers the parameter semantics thoroughly, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool 'Quit Chrome entirely, closing every tab' — a specific verb and resource. It explicitly contrasts with close_page (which keeps one tab alive) and shutdown_browser (which releases the name), making sibling differentiation unambiguous. An agent can immediately tell what this tool does and how it differs from close_page and shutdown_browser.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: it mentions it's how you apply pending launch flags without switching profiles, and when to use shutdown_browser instead ('When an agent is finished for good'). It also advises calling save_session first on temp profiles to preserve data. This is strong, actionable routing to the correct tool in different scenarios.

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

close_pageClose pageA
Destructive

Close a single browser tab.

The last remaining tab cannot be closed — use close_browser to shut Chrome down entirely. Closing the selected page clears the selection, so subsequent tools fall back to the most recently opened tab.

Returns the remaining open pages, because indices shift when a tab closes: re-read them from this response rather than reusing older ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
page_idNoIndex of the page to close, as listed by list_pages. -1 (the default) closes the currently selected page.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false. The description adds valuable context beyond these: the last-tab restriction, selection clearing side effect, and the fact that the tool returns remaining pages with shifted indices. No contradiction with annotations.

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

Conciseness5/5

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

The description is efficiently written in three short paragraphs. The core action is front-loaded, followed by a key exception and then important side effects and return info. Every sentence adds value without redundancy.

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

Completeness5/5

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

For a simple two-parameter tool with a complete input schema and an output schema, the description fully covers usage, constraints, side effects, and return behavior. Nothing essential is missing for an agent to call it correctly.

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

Parameters3/5

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

The input schema provides full descriptions for both parameters (browser and page_id), covering their defaults and meanings. The description does not add new parameter-specific semantics; it only reinforces the default behavior and return value, which are already in the schema. With 100% schema coverage, a baseline of 3 is appropriate.

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

Purpose5/5

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

The description states the specific verb 'close' with resource 'a single browser tab', making the action clear. It also distinguishes itself from close_browser by explicitly noting the last-tab limitation and the alternative for shutting down entirely.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: it states that the last remaining tab cannot be closed and instructs to use close_browser instead. It also explains the behavior after closing (selection cleared, fallback) and advises re-reading returned pages due to index shifts, which informs the agent on how to correctly use the tool's output.

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

create_profileCreate profileA
Idempotent

Create a named persistent Chrome profile — a reusable user-data dir.

A persistent profile keeps cookies, logins and Web Store extensions between runs, so a site you log into once stays logged in. It is the sturdier alternative to save_session / load_session.

Creating one is harmless by itself: nothing changes until you activate it, here or via use_profile. An existing profile of the same name is left untouched rather than overwritten. Profiles live under ~/.nodriver-mcp/profiles/.

Only one browser instance can use a given profile at a time, so give concurrent setups different names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesProfile name, e.g. "google-login". Only letters, digits, "-" and "_" are kept; any other character is stripped out.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
activateNoSwitch to the new profile straight away. That restarts the browser and closes all open pages. Default false, which only creates the directory.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already convey idempotentHint=true and destructiveHint=false, and the description reinforces and extends this by saying creation is harmless until activation, existing profiles are left untouched rather than overwritten, and profiles live under ~/.nodriver-mcp/profiles/<name>. It also discloses the single-instance constraint, which is valuable behavioral context beyond the annotations.

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

Conciseness4/5

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

The description is compact and front-loaded with the core purpose, followed by persistence semantics, safety, storage location, and concurrency warning. Each paragraph earns its place, though there is slight redundancy with the browser parameter's 'parallel agents each need their own name' note.

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

Completeness4/5

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

For a tool with three parameters, an output schema, and strong annotations, the description covers the important behavioral ground: what persistence means, when activation happens, that creation is non-destructive, where files live, and the concurrency limitation. It is complete enough for an agent to select and invoke the tool safely.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents name, browser, and activate thoroughly. The description adds a bit of extra context around profile storage location and concurrency, but it does not substantially change or deepen parameter meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Create a named persistent Chrome profile' and immediately clarifies it is a reusable user-data dir. It also differentiates itself from siblings by calling out save_session/load_session as a weaker alternative and mentioning use_profile as a later activation path.

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

Usage Guidelines4/5

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

The description gives clear usage context: use a persistent profile when you want cookies, logins, and extensions to survive between runs, and it explicitly names save_session/load_session as the alternative. It also gives practical guidance about concurrent browser instances needing different names. It stops short of an explicit 'use this instead of X when...' matrix, but the comparison is strong.

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

delete_profileDelete profileA
Destructive

Permanently delete a persistent Chrome profile directory.

Irreversible: the profile's cookies, logins, history and installed extensions are removed from disk, with no undo.

The active profile cannot be deleted — switch away with use_temp_profile first.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the persistent profile to delete, as shown by list_profiles.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint=true annotation, the description discloses irreversibility, the exact data removed (cookies, logins, history, extensions), that deletion is from disk, and that there is no undo. It also states a behavioral restriction (active profile cannot be deleted). These details meaningfully exceed the annotation's binary signal and match it without contradiction.

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

Conciseness5/5

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

Three tight sentences — action first, then irreversibility/effects, then the key usage constraint. Every sentence carries information; there is no filler or redundancy beyond the deliberate emphasis on 'no undo'.

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

Completeness5/5

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

The description covers what is deleted, permanence, the active-profile constraint, and how to work around it. An output schema exists to handle return values, annotations carry the destructive hint, and the schema documents the parameters. Nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters name and browser are already fully documented in the schema. The description adds no parameter-specific semantics beyond the general persistent-profile context; it neither enriches nor contradicts the schema.

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

Purpose5/5

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

The description opens with 'Permanently delete a persistent Chrome profile directory' — a specific verb, resource, and scope. It clearly distinguishes this from sibling tools like list_profiles, create_profile, use_profile, and use_temp_profile, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description gives an explicit constraint and alternative: 'The active profile cannot be deleted — switch away with use_temp_profile first.' This addresses when not to use the tool and names the relevant sibling. It does not explicitly state general when-to-use scenarios, but the purpose makes the primary use case obvious.

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

disable_console_collectionDisable console collectionA
Idempotent

Stop capturing console output on the current page.

Turns the CDP Runtime domain back off, which restores the quieter, harder-to-detect default — worth doing once you are finished debugging and the page still has anti-bot checks ahead of it.

Messages already collected stay readable; only new ones stop arriving.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses meaningful behavioral details: turning the CDP Runtime domain back off, restoring a quieter and harder-to-detect default, and preserving already-collected messages while stopping new ones. It also aligns with the idempotentHint annotation since calling it again is safe. No contradiction with annotations.

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

Conciseness5/5

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

The description is well structured: one concise action sentence, one contextual sentence about why this matters, and one sentence describing the side effect. Every sentence earns its place and there is no filler.

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

Completeness5/5

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

For a tool with one optional parameter, an output schema, and helpful annotations, the description covers everything an agent needs: what it does, when to call it, and what side effects to expect. There is no meaningful gap in context.

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

Parameters3/5

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

Schema description coverage is 100% for the single browser parameter, and the schema already explains the browser naming semantics and default behavior. The description adds no additional parameter-specific guidance, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Stop capturing console output on the current page.' It clearly identifies the tool as the inverse of enable_console_collection and adds technical grounding by mentioning the CDP Runtime domain. This makes the purpose unambiguous and distinguishable from sibling tools.

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

Usage Guidelines4/5

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

The description gives an explicit condition for use: 'worth doing once you are finished debugging and the page still has anti-bot checks ahead of it.' It implies the opposite of enable_console_collection but does not explicitly name that sibling or state when not to use it, so it falls just short of a full 5.

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

dragDrag and dropA

Drag one element onto another (press, move, release).

Both uids must come from the same take_snapshot. Both ends are scrolled into view and hit-tested first, and the pointer is moved in steps with the button held, which is what mouse-driven sortables and sliders listen for.

This drives the mouse. Native HTML5 drag-and-drop — the dataTransfer kind — is a separate protocol that a synthetic mouse does not trigger in Chrome; if nothing happens on a page that uses it, that is why.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_uidYesuid of the element to drop onto, from the most recent take_snapshot.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
from_uidYesuid of the element to pick up, from the most recent take_snapshot.
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, but the description goes beyond them by explaining the actual behavioral steps (scrolling into view, hit-testing, stepping pointer movement). It also discloses the significant limitation that synthetic mouse events do not trigger native HTML5 drag-and-drop in Chrome. This adds valuable context beyond the structured annotations without contradiction.

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

Conciseness5/5

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

The description is lean and well-structured. The core action is stated in the first line, followed by a concise prerequisite sentence and a crucial caveat. Every sentence earns its place—no fluff, and the most important information (action + constraint) is front-loaded.

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

Completeness5/5

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

The description covers all essential context for correct usage: the prerequisite of snapshot UIDs, the hit-testing and scrolling behavior, the stepping pointer movement, and the critical HTML5 drag-and-drop limitation. An output schema exists, so return values need no explanation. There is nothing an agent needs to know to invoke this tool correctly that is missing.

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

Parameters3/5

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

The input schema provides 100% coverage for all four parameters, each with a description. The tool description does not add additional syntactic or semantic detail beyond what the schema already encodes (e.g., the same-snapshot constraint is already in the schema descriptions for from_uid and to_uid). Baseline of 3 is appropriate when the schema carries the parameter documentation burden.

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

Purpose5/5

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

The description begins with a specific verb-resource pair ('Drag one element onto another') and immediately conveys the press-move-release mechanism. It distinguishes itself from sibling tools like click, hover, and scroll by detailing the drag-and-drop nature and the pointer movement behavior, making it clear what makes this tool unique.

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

Usage Guidelines4/5

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

The description gives a concrete prerequisite (both uids from the same take_snapshot) and explains the intended use case for mouse-driven sortables and sliders. It also warns against a common failure mode (native HTML5 drag-and-drop) and explains why it won't work. It does not explicitly name alternative tools, but the context is strong enough to guide selection.

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

emulateEmulate page conditionsA
Idempotent

Emulate network, CPU, geolocation, user agent, color scheme or viewport.

Applies to the selected page and persists across navigations until reset_emulation. Every parameter is independent — pass only what you want to change, leave the rest at their defaults. Settings already in force are carried over rather than dropped: a user_agent on its own keeps the client hints a device preset established, and a viewport on its own keeps its touch and mobile flags unless you clear them with notouch / nomobile.

To emulate a real phone or tablet, use emulate_device instead: it sets user agent, client hints, viewport, DPR and touch as one coherent set, which hand-assembled overrides here get wrong in ways anti-bot systems detect.

Turning touch on in the viewport also changes how click behaves — CDP mouse input can crash a touch-emulated renderer, so clicks fall back to the scripted path (isTrusted=false) for as long as touch is enabled.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
viewportNoViewport override as "WIDTHxHEIGHTxDPR[,mobile][,touch][,landscape]", e.g. "375x812x3,mobile,touch" or "1920x1080x1". The trailing flags are optional: `mobile` turns on mobile viewport behaviour, `touch` enables touch emulation, `landscape` sets the screen orientation. Omitting `mobile` or `touch` leaves that setting as it is, so resizing after emulate_device keeps the phone's touch support; turn them off explicitly with `nomobile` / `notouch`. Empty string leaves the viewport unchanged.
user_agentNoOverride the User-Agent header and navigator.userAgent. Omit to leave unchanged; pass an empty string to restore Chrome's real one. This does NOT touch UA client hints (Sec-CH-UA-*), which then contradict the spoofed UA and give the automation away — use emulate_device for mobile, it sets both consistently.
geolocationNoOverride geolocation, as "latitude,longitude" (e.g. "37.7749,-122.4194"). Omit to leave unchanged; pass an empty string to clear a previous override.
color_schemeNoEmulate the prefers-color-scheme media feature. "auto" clears a previous override; empty string leaves it unchanged.
network_conditionsNoThrottle the network to a preset profile. "Offline" cuts the connection entirely. Empty string leaves throttling unchanged.
cpu_throttling_rateNoSlow the CPU by this factor to emulate a low-end device (4 = 4x slower; 1-20 is the useful range). 0 or 1 means no throttling.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavioral traits: settings persist across navigations, already-applied settings are carried over rather than dropped, and enabling touch changes click behavior to a scripted path with isTrusted=false. It also warns about client-hint contradictions that can reveal automation. This is rich, non-obvious context that annotations alone do not provide.

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

Conciseness5/5

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

The description is well-structured and front-loaded with the core purpose, followed by scope, parameter behavior, sibling distinction, and a critical side-effect warning. Every paragraph earns its place, and nothing is redundant with the schema.

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

Completeness5/5

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

For a tool with 7 optional parameters, full schema coverage, an output schema, and clear annotations, the description is complete. It covers persistence, cross-parameter interactions, how to clear overrides, when to prefer emulate_device, and a dangerous interaction with click behavior. An agent has what it needs to select and invoke the tool correctly.

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

Parameters4/5

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

The input schema already covers all 7 parameters with 100% coverage, so the baseline is 3. The description adds meaningful cross-parameter semantics: every parameter is independent, pass only what you want to change, settings in force are carried over, and empty strings or notouch/nomobile clear/disable overrides. This goes beyond the individual schema descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Emulate network, CPU, geolocation, user agent, color scheme or viewport.' It clearly distinguishes the tool from siblings by naming emulate_device and reset_emulation as the related alternatives, so an agent knows exactly what this tool does and what it does not do.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool versus emulate_device: for real phone/tablet emulation, use emulate_device because it sets a coherent set of overrides. It also explains persistence until reset_emulation and emphasizes the independence of parameters, giving an agent clear conditions for invocation.

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

emulate_deviceEmulate device presetA
Idempotent

Emulate a phone or tablet with one internally consistent set of signals.

Preferred over assembling emulate parameters by hand for mobile work: user agent, UA client hints (Sec-CH-UA-*), viewport, device pixel ratio, touch support and Accept-Language are set together so they cannot contradict each other — a mismatch between them is a classic automation tell.

Presets are pixel_7, pixel_7_landscape and ipad_air (aliases are listed in the device parameter). ipad_air deliberately reports desktop-class Safari with touch and sends no client hints, which is what a real iPad does.

Applies to the selected page and survives navigation. To have mobile signals present on a page's very first request, pass device to new_page or navigate_page instead of calling this afterwards. Undo with reset_emulation.

ParametersJSON Schema
NameRequiredDescriptionDefault
deviceYesDevice to emulate — sets user agent, UA client hints, viewport, device pixel ratio and touch together. Presets: "pixel_7" (aliases: pixel7, android, android_phone), "pixel_7_landscape" (pixel7_landscape, android_landscape), "ipad_air" (ipadair, ipad, tablet). Case, spaces and -/_ are normalised. Empty string leaves emulation unchanged.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
geolocationNoOverride geolocation, as "latitude,longitude" (e.g. "37.7749,-122.4194"). Omit to leave unchanged; pass an empty string to clear a previous override.
color_schemeNoEmulate the prefers-color-scheme media feature. "auto" clears a previous override; empty string leaves it unchanged.
network_conditionsNoThrottle the network to a preset profile. "Offline" cuts the connection entirely. Empty string leaves throttling unchanged.
cpu_throttling_rateNoSlow the CPU by this factor to emulate a low-end device (4 = 4x slower; 1-20 is the useful range). 0 or 1 means no throttling.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark idempotentHint=true and destructiveHint=false, and the description adds substantial behavioral context beyond that: it sets multiple signals together to avoid contradictions, survives navigation, and the ipad_air preset deliberately reports desktop-class Safari with touch and no client hints. It also names the reset mechanism, giving the agent a complete behavioral model.

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

Conciseness5/5

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

The description is richly informative but every sentence earns its place: purpose, when-to-use, preset specifics, lifecycle behavior, and undo path. It is front-loaded with the core purpose and does not waste words on restating the schema.

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

Completeness5/5

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

With 6 parameters, full schema coverage, an output schema present, and annotations covering safety/idempotence, the description completes the picture: it covers alternatives, first-request caveat, navigation persistence, preset semantics, and undo. Nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining why presets are preferable (signals cannot contradict each other, and mismatch is a classic automation tell) and by describing the real-world behavior of the ipad_air preset. This helps the agent choose parameters more intelligently than the schema alone would.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Emulate a phone or tablet with one internally consistent set of signals.' It clearly distinguishes itself from the sibling `emulate` tool by positioning this as the preferred preset-based approach for mobile work, and from `reset_emulation` as the undo path.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool ('Preferred over assembling `emulate` parameters by hand for mobile work'), when not to use it ('To have mobile signals present on a page's very first request, pass `device` to new_page or navigate_page instead'), and how to undo it ('Undo with reset_emulation'). This is exemplary routing guidance.

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

enable_console_collectionEnable console collectionA
Idempotent

Start capturing console output on the current page.

Call this before list_console_messages or get_console_message — neither returns anything until collection is on. Network capture, by contrast, is always on and needs no equivalent call.

This is opt-in rather than automatic because it enables the CDP Runtime domain, which some anti-bot scripts probe for to detect an attached debugger. Leave it off while stealth matters, and use disable_console_collection when you are done debugging.

Applies per page: a new tab needs its own call.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations, the description discloses the CDP Runtime domain and the anti-bot detection risk, explaining the opt-in design. It also clarifies the per-page scope, which is behavioral context not covered by annotations. It does not repeat idempotency (already in annotations) and avoids contradicting them.

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

Conciseness4/5

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

Four sentences, each adding distinct value: purpose, dependency, rationale, and scope. The most important info (what it does) is front-loaded. Slightly longer than strictly necessary, but every sentence earns its place.

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

Completeness4/5

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

Together with the output schema (which removes the need to describe return values) and annotations (idempotency), the description covers prerequisites, when to use, and per-page behavior. It could mention statefulness (that it remains on until disabled) but that is implied by 'when you are done debugging.' Overall complete for this tool.

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

Parameters3/5

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

The schema description covers 100% of the single 'browser' parameter, including its meaning and default behavior. The tool description adds no extra parameter guidance, which is acceptable given full schema coverage. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('Start capturing') and resource ('console output on the current page'), making the core purpose unmistakable. It also distinguishes itself from related tools by noting that list_console_messages and get_console_message depend on this call, and by contrasting with network capture which is always on.

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

Usage Guidelines5/5

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

Explicitly instructs when to use this tool: before any console-reading tool, and when stealth is not a concern. Also provides when-not-to-use: leave it off while stealth matters, and use disable_console_collection when done. Names the alternatives (list_console_messages, get_console_message, disable_console_collection) and contrasts with network capture which needs no equivalent call.

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

evaluate_scriptEvaluate JavaScriptA

Run JavaScript inside the page and get the result back as JSON.

The escape hatch for anything the other tools do not cover: reading computed styles, calling a page's own JS API, or extracting structured data in a single round trip instead of a dozen snapshot-and-click cycles.

Without args the function runs at page level in the main world. With args, the given uids become real element references, which is how you operate on one specific element from a snapshot.

Return values must be JSON-serialisable — DOM nodes, functions and circular structures are not, so map them to plain values inside the function. A script that throws comes back as a failed call carrying the JavaScript error, not as a result you have to inspect for the word "Error".

Pass script_path to run a function kept in a .js file, and file_path to write the result to disk instead of into the conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoElement uids from the most recent take_snapshot, resolved to live DOM nodes and passed as the function's arguments. The first uid is also bound as `this`. Omit for page-level scripts.
frameNoRun inside one of the page's frames instead of the main document: an index or frame id from list_frames. Runs in an isolated world, which shares the frame's DOM but not its own JavaScript variables, so use it to read and drive the DOM rather than to call the page's own functions. Ignored when `args` is given, since a uid already carries its frame.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
functionNoA JavaScript function expression, e.g. "() => document.title" or "(el) => el.innerText". It is invoked immediately and its return value is JSON-serialised back to you. Async functions are awaited, so "async () => (await fetch('/api/x')).json()" works. Return a value — console.log output is not captured. Leave empty when using script_path.
file_pathNoWrite the JSON result to this local path instead of returning it — for extractions too large to put in the conversation.
script_pathNoRead the function from this local .js file instead of the `function` parameter. Use it for anything long or quote-heavy, where escaping the script into a JSON string is where the mistakes happen.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

It reveals behavior well beyond the annotations: main-world vs isolated-world execution, uid-to-live-element binding, JSON-serialisability constraints, thrown-error handling, and the rationale for script_path. The readOnlyHint=false and idempotentHint=false annotations are consistent with running arbitrary page JavaScript, and the description adds the operational detail an agent needs.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: core definition, usage rationale, argument modes, return/error behavior, and file-based alternatives. It is front-loaded with the one-sentence definition and uses short paragraphs that are easy to scan.

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

Completeness5/5

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

For a high-complexity, arbitrary-JavaScript tool with six parameters and rich schema descriptions, this description covers the execution environment, argument passing, result serialization, failure semantics, and file-based workflow. The existing annotations already carry the read-only/destructive hints, so nothing an agent needs to invoke the tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, and the schema already documents each parameter well. The description still adds useful meaning: the main-world page-level mode without args, the element-reference mode with args, and the practical constraint that DOM nodes, functions, and circular structures must be mapped to plain values. Some of the script_path/file_path guidance partly duplicates the schema, so the added value is real but not maximal.

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

Purpose5/5

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

The opening sentence states the exact action ('Run JavaScript inside the page') and result ('get the result back as JSON') with a specific verb and resource. The 'escape hatch' framing with concrete examples distinguishes it from the many action-oriented sibling tools such as click, fill, and take_snapshot.

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

Usage Guidelines4/5

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

The description gives explicit conditions for use: when the other tools do not cover a need, and for computed styles, calling a page's own JS API, or single-round-trip data extraction. It also routes between inline functions, script_path, and file_path. It does not name a specific sibling to prefer in a particular case, so the guidance is clear but not fully exclusionary.

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

export_harExport network log as HARA

Write the network log to a HAR 1.2 file — importable into Burp, ZAP, Chrome DevTools, Charles and anything else that reads HAR.

Headers are the ones that went over the wire, Cookie and Set-Cookie included, with POST bodies, status, timing, server IP and WebSocket frames. Response bodies come from capture_bodies' files where available — start a capture first for a HAR that has every body — and otherwise from Chrome's buffer, which only still holds recent ones on the current tab.

The file holds live session cookies and tokens; treat it like a password.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathYesWhere to write the .har file.
url_filterNoOnly requests whose URL contains this substring, e.g. "/api/". Empty exports all.
include_bodiesNoEmbed response bodies: from capture_bodies' files where there is one, otherwise whatever Chrome still holds. Off gives headers and timing only.
include_preserved_requestsNoAlso export the previous 3 navigations' requests, not just the current page's.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations carry almost no signal (all flags false), so the description bears full behavioral disclosure — and it delivers: it reveals the write-tenor (readOnlyHint=false is consistent), the full payload contents including live session cookies/tokens, the body-source fallback chain (capture_bodies files first, then Chrome buffer), and adds a security warning to treat the file like a password. This significantly exceeds what the sparse annotations provide.

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

Conciseness4/5

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

The description is longer than average (three paragraphs) but every block earns its place: purpose/format compatibility, then content and body-sourcing behavior, then the security caveat. It is front-loaded with the core purpose and leads into increasingly operational detail, with no filler or restatement of the title.

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

Completeness5/5

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

For a 5-parameter tool with an output schema, the description covers all the behavioral essentials an agent needs: what the file contains, where response bodies come from and when they are incomplete, how to get complete bodies via capture_bodies, and the session-token sensitivity. With an output schema present, return-value documentation is not required, and the capture_bodies interplay is explicitly handled.

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

Parameters3/5

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

Schema coverage is 100% with already-detailed parameter descriptions (browser explains parallel-agent semantics, include_bodies explains the fallback). The description reinforces the capture_bodies relationship that maps to include_bodies, adding some cognate context, but it does not systematically extend each parameter's meaning beyond the schema. The schema does the heavy lifting, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource — "Write the network log to a HAR 1.2 file" — and immediately distinguishes this from read-oriented siblings like list_network_requests and get_network_request by specifying file export. The format detail and the tool-importability list (Burp, ZAP, Chrome DevTools) make the function unambiguous even before 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.

Usage Guidelines4/5

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

The description gives clear when-to-use context: "start a capture first for a HAR that has every body," explicitly routing the agent to capture_bodies for the complete case and warning that Chrome's buffer otherwise only holds recent requests on the current tab. This effectively names the prerequisite/collaborating tool. It stops short of explicit when-not-to-use statements or direct naming of alternative tools, which keeps it from a 5.

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

fillFill inputA

Set the value of an input, textarea, select or contenteditable element.

Selects whatever is already in the field and types over it, character by character, so input events fire and React/Vue-style controlled components register the change. It deliberately does not blank the field first: that makes such components re-render, the focus follows the replaced node, and the keystrokes end up nowhere. For , the option is chosen by value and a change event is dispatched.

The value is read back afterwards. If it did not land you get an error, not a success you cannot trust — a field can be read-only, disabled, covered by an overlay, or rewrite what you type, and silently reporting success would send you looking for the problem several steps later.

Use type_text instead when you want to append to a focused field rather than replace its contents. For several fields at once, fill_form does it in one round trip.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement uid from the most recent take_snapshot, e.g. "4_12". uids are invalidated whenever the page changes — if you get "unknown uid", take a fresh snapshot and retry with the new uid.
valueYesThe text to enter. For a <select> element this must match the option's value attribute, not its visible label.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description reveals the type-over mechanism, input-event firing for controlled components, the deliberate avoidance of blanking the field first, select change dispatch, and a post-condition read-back that errors on failure. It also explains external complications like overlays or read-only fields. No contradiction with the annotations.

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

Conciseness5/5

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

The description is detailed but every sentence earns its place: mechanics, rationale, failure behavior, and routing to alternatives are all distinct and purposeful. It is front-loaded with the core action and structured logically.

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

Completeness5/5

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

Given the output schema and fully described parameters, the description covers use cases, failure modes, parameter caveats, and sibling routing. An agent has everything needed to invoke fill correctly and interpret unexpected outcomes.

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

Parameters4/5

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

The schema already covers all parameters at 100%, so the baseline is 3. The description adds useful behavioral meaning around how the value is entered and verified, and reinforces the select value-vs-label nuance, elevating it slightly beyond the schema alone.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Set the value of an input, textarea, select or contenteditable element.' It clearly differentiates itself from siblings by stating it replaces the field contents, and explicitly contrasts itself with type_text and fill_form.

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

Usage Guidelines5/5

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

The description explicitly says when to use type_text instead (append to a focused field) and when to use fill_form (several fields at once). It also provides context about uid freshness and failure modes, giving the agent actionable guidance on when this tool is appropriate.

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

fill_formFill formA

Fill several form fields in a single call.

Behaves like fill per field, but costs one round trip instead of one per field. Fields are processed in the order given, which matters on pages that reveal or enable later fields in response to earlier ones.

A field that fails does not abort the rest: the response reports success or the specific error per uid, so a partially filled form is always visible rather than silent.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
elementsYesThe fields to fill, in order — each entry is {"uid": "...", "value": "..."}.
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description reveals important behavioral details not captured by annotations: fields are processed in order, later fields may depend on earlier ones, a failing field does not abort the remaining fill, and the response reports per-uid success/error. This goes well beyond the annotation hints and gives the agent accurate expectations about partial failures and ordering 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.

Conciseness5/5

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

The description is tightly structured: a one-sentence summary, a comparison with the sibling `fill`, and a note about ordering and failure handling. Every sentence contributes distinctive behavioral or usage information, and there is no redundant repetition of schema or annotation content.

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

Completeness5/5

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

Combined with the fully described input schema and annotations, the description covers what the tool does, how it differs from `fill`, ordering semantics, failure behavior, and partial-fill visibility. An output schema exists, so return values do not need to be re-explained, and nothing critical for correct invocation is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents all parameters, which earns a baseline of 3. The description adds meaning beyond the schema by explaining that `elements` are processed in the given order and that the result reports per-uid success or error, deepening the agent's understanding of the key parameter.

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

Purpose5/5

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

The description opens with the specific verb-resource pair 'Fill several form fields in a single call', which clearly states the action and scope. It explicitly contrasts itself with the sibling `fill` by noting it behaves like `fill` per field but costs one round trip, distinguishing the two tools without opening schemas.

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

Usage Guidelines4/5

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

The description gives clear context by explaining that this tool batches multiple fields into one round trip and references `fill` as the per-field equivalent. It does not explicitly state 'use this for multiple fields and fill for a single field', but the efficiency motivation and the sibling comparison strongly imply the appropriate usage.

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

get_computed_stylesGet computed stylesA
Read-only

Read an element's computed styles, as the browser actually resolved them.

Computed styles are the end result of the whole cascade, so this answers what a stylesheet alone cannot: why an element is invisible (display: none, visibility: hidden, opacity: 0), what a CSS variable resolved to, or which font actually got used.

Also reports the element's box: position, size, and whether it is currently in the viewport. An element with zero width or height is present in the DOM but not rendered, which is the usual reason a click appears to do nothing.

By default only properties that differ from the browser default are returned, because the full set runs to several hundred entries and buries the interesting ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNoElement uid from the most recent take_snapshot, as an alternative to `selector`. Ignored when `selector` is given.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
selectorNoCSS selector of the element to inspect, e.g. "#header" or ".btn.primary". The first match is used. Leave empty to use `uid` instead.
propertiesNoOnly return these CSS properties, e.g. ["display", "color", "font-size"]. Omit to get the properties that differ from the browser default, which is usually what you want — the full computed set is several hundred entries.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable behavioral detail beyond that: it reports box position/size and viewport status, explains the default filtering of properties (only those differing from browser default) and why (several hundred entries), which is critical for correct use. No contradiction with annotations.

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

Conciseness5/5

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

The description is a tight set of four short paragraphs, each serving a distinct purpose: core function, explanation of value, box reporting, and default filtering rationale. It is front-loaded with the primary verb and resource. No wasted words.

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

Completeness4/5

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

The description covers purpose, usage context, and key behavioral traits. With an output schema present, the return format is handled. It does not mention error conditions or edge cases (e.g., what happens if the selector matches nothing), but those are typically outside description scope. Overall it is complete for an agent to call this tool effectively.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter is already documented. The description adds context about the default behavior of the 'properties' parameter and explains why omitting it is usually best. This adds value but does not significantly change the meaning of the parameters; the schema already carries the load.

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

Purpose5/5

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

The description clearly states the tool reads an element's computed styles as the browser resolved them, and distinguishes it from other tools by emphasizing it answers questions about the cascade (visibility, CSS variables, fonts) and reports box geometry. It is distinct from siblings like evaluate_script or take_snapshot.

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

Usage Guidelines4/5

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

The description implies when to use it: to understand why an element is invisible or not clickable, or to resolve computed values that stylesheets alone cannot. It does not explicitly name alternative tools, but the context is clear enough for an agent to decide. A minor gap is the lack of explicit 'do not use when...' exclusions.

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

get_console_messageGet console messageA
Read-only

Read one console message in full, by id.

list_console_messages truncates every entry to 200 characters; use this to get a complete stack trace or error payload.

Requires enable_console_collection to have been called for this page. The server leaves the CDP Runtime domain disabled by default because enabling it is itself something sites can detect.

ParametersJSON Schema
NameRequiredDescriptionDefault
msgidYesMessage id, as shown in square brackets by list_console_messages.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish read-only and non-destructive behavior. The description adds valuable context beyond those: the CDP Runtime domain is disabled by default, enabling it is detectable by sites, and this tool requires prior collection to be enabled. That meaningfully informs the agent of operational constraints.

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

Conciseness5/5

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

Three sentences, each earning its place: the core action, the use-case distinction, and the prerequisite. It is front-loaded and free of filler.

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

Completeness5/5

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

An output schema exists, so return values are covered. The description handles the prerequisite, relationship to sibling tools, and the id source. Nothing needed to call this tool correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining how to obtain msgid ('as shown in square brackets by list_console_messages') and by tying the purpose directly to the truncated list output, which helps the agent connect the two tools.

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

Purpose5/5

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

Opens with a specific verb, resource, and scope: 'Read one console message in full, by id.' It immediately distinguishes itself from the sibling list_console_messages by noting that tool truncates entries, so an agent knows exactly what this tool is for.

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

Usage Guidelines5/5

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

Explicitly identifies when to use this tool instead of list_console_messages (to get complete stack traces or error payloads) and states a mandatory prerequisite: enable_console_collection must be called first. This is strong routing guidance.

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

get_cookiesGet cookiesA
Read-only

List browser cookies with their domain, path and secure flag.

Reads the whole browser cookie jar, not just the current page, unless you pass url. Values are returned in full, so treat the output as sensitive — it contains live session tokens.

To carry these across a browser restart use save_session, or switch to a persistent profile with use_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOnly return cookies that would be sent to this URL (matching domain, path and secure flag). Empty string returns every cookie in the browser.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=false, so the safety profile is covered. The description adds genuine value beyond that: the whole-jar vs. url-filtered behavior, and the sensitive nature of the output ('Values are returned in full... contains live session tokens'). This is meaningful behavioral context an agent needs before calling.

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

Conciseness5/5

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

Three short paragraphs with no filler: purpose, then scope+sensitivity, then routing to alternatives. The core action is front-loaded in the first sentence, and every sentence earns its place by adding either behavioral or routing information.

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

Completeness5/5

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

For a two-optional-parameter, read-only tool with a present output schema and full schema coverage, the description covers everything an agent needs: what it returns, its scope, sensitivity, and when to use alternatives instead. The output schema handles return-value details, so nothing is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameter descriptions are already thorough (url's domain/path/secure matching semantics, browser's independent-Chrome behavior). The description reinforces the url scope ('unless you pass url') but adds no new parameter-level 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.

Purpose5/5

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

The description opens with a specific verb and resource — 'List browser cookies with their domain, path and secure flag' — and immediately clarifies scope ('Reads the whole browser cookie jar, not just the current page'). This distinguishes it from sibling write/delete tools like set_cookie and clear_cookies, and from persistence tools like save_session.

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

Usage Guidelines5/5

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

The final sentence gives explicit when-not guidance: 'To carry these across a browser restart use save_session, or switch to a persistent profile with use_profile.' This names the alternatives and the condition that selects them. The url parameter is also framed as a scoping choice (whole jar vs. filtered).

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

get_local_storageGet localStorageA
Read-only

Read all localStorage entries for the current page's origin.

Values are truncated to 200 characters each; for one entry in full use evaluate_script with () => localStorage.getItem("key").

localStorage is scoped per origin, so this returns nothing on about:blank — navigate to the site first. sessionStorage is not included.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds valuable behavioral details: 200-character truncation, per-origin scoping, about:blank behavior, and sessionStorage exclusion. This goes well beyond the structured annotations.

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

Conciseness5/5

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

The description is compact and front-loaded with the core purpose. Each sentence adds distinct useful information: truncation, the alternative for full values, origin scoping, and the about:blank edge case. No filler is present.

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

Completeness5/5

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

Given the output schema exists, annotations cover the safety profile, and the single parameter is fully documented, the description covers the key edge cases and alternatives needed for correct invocation. Nothing essential is missing.

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

Parameters3/5

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

The only parameter, browser, is fully documented in the input schema with 100% coverage, so the description does not need to add parameter details. It neither repeats nor contradicts the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: 'Read all localStorage entries for the current page's origin.' It clearly defines scope and differentiates itself from related tools by noting what is not included (sessionStorage) and by pointing to evaluate_script for full-value retrieval.

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

Usage Guidelines5/5

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

It explicitly tells the agent when to use an alternative: use evaluate_script for a single full entry because values are truncated. It also warns that about:blank returns nothing and instructs to navigate to the site first, giving clear usage context and exclusions.

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

get_network_requestGet network requestA
Read-only

Inspect one network request: URL, method, resource type and both bodies.

Often the fastest way to get structured data out of a site: find the page's own API call with list_network_requests, then read the JSON it already received here, instead of scraping the rendered DOM.

Inline bodies are truncated at 5000 characters, so pass a file path for anything larger. Response bodies are only available while Chrome still holds them in its buffer — for a long-finished request the entry may still be listed while its body is already gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
reqidNoRequest id, as shown in square brackets by list_network_requests. Omit to get the most recent request.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
request_file_pathNoWrite the request body (POST data) to this local file path instead of including it in the response.
response_file_pathNoWrite the response body to this local file path instead of including it. Use this for binary responses (images, PDFs, archives) — they are base64-decoded on the way out.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds critical behavioral details beyond annotations: inline bodies are truncated at 5000 characters, and response bodies are only available while Chrome holds them in its buffer. These are non-obvious constraints an agent must know to call the tool correctly.

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

Conciseness5/5

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

Three tightly written paragraphs: first states the purpose in one sentence, second gives the use case and comparison to DOM scraping, third covers the two key constraints. Every sentence adds information; the most critical detail (what it inspects) is front-loaded. Zero filler.

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

Completeness5/5

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

The tool has an output schema (indicated by has output schema: true), so return values are covered elsewhere. The description covers the only other operational gaps: truncation, buffer lifetime, and binary handling via file paths. For a read-only inspection tool with optional parameters, this is complete.

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

Parameters4/5

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

Schema description coverage is 100%, so all four parameters are already documented. The description adds value by explaining when to use file paths ('for anything larger' than 5000 characters) and ties the truncation constraint to request_file_path/response_file_path. This supplements the schema without redundancy.

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

Purpose5/5

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

The description opens with a specific verb ('Inspect') and resource ('one network request') and enumerates exactly what is returned (URL, method, resource type, both bodies). It explicitly contrasts with list_network_requests ('find the page's own API call with list_network_requests, then read the JSON it already received here'), which distinguishes it from its sibling without ambiguity.

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

Usage Guidelines5/5

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

The description provides a concrete workflow: use list_network_requests to locate a request, then use this tool to read its JSON rather than scraping the DOM. It also gives situational guidance for large bodies (use file paths) and warns about response buffer lifetime. This is explicit when-to-use context that routes the agent correctly.

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

get_page_contentGet page contentA
Read-only

Get the page's visible text, or its full HTML.

The cheapest way to read a page when you only need content and not the uids take_snapshot provides: no accessibility tree is built, and the text form carries no markup overhead.

Returns the DOM as it stands right now, so on pages that render asynchronously call wait_for or wait_for_selector first.

Use take_snapshot when you intend to interact with elements, and query_selector when you want specific elements rather than the whole page.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameNoRead inside one of the page's frames instead of the main document: an index or frame id from list_frames. Chrome's DOM queries never cross a frame boundary, so anything inside an iframe is unreachable without this. The frame is read through an isolated world, which shares the DOM but not the page's own JavaScript variables. Empty string reads the main document.
formatNo"text" returns document.body.innerText — visible text without markup, which is what you want for reading. "html" returns the full outerHTML including scripts and attributes, needed when you care about markup, data- attributes or hidden field values.text
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathNoWrite the content to this local path instead of returning it — the way to capture a large page without flooding the conversation.
max_charsNoTruncate the output at this many characters. 0 means no limit, which is risky on large pages — especially with format="html".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint/destructiveHint annotations, the description discloses the live-DOM semantics ('Returns the DOM as it stands right now') and the resulting async-rendering caveat, plus performance traits (no accessibility tree built, no markup overhead). These are genuine behavioral facts an agent needs that the annotations do not convey, and there is no contradiction with the readOnly hint.

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

Conciseness5/5

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

Four sentences, each earning its place: purpose, cost/performance positioning, behavioral caveat, and sibling routing. The core purpose is front-loaded in the first sentence, and there is zero filler or repetition of schema content.

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

Completeness5/5

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

For a 5-parameter tool with 100% schema coverage, an output schema, and safety annotations, the description covers everything an agent needs for correct selection and invocation: what it returns, when to prefer alternatives, and the key timing caveat. The remaining parameter details are fully handled by the input schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline 3 applies; the schema already richly documents format (innerText vs outerHTML), frame isolation, file_path for large pages, and max_chars truncation. The description adds marginal semantic color ('text form carries no markup overhead') but does not meaningfully compensate beyond the schema's existing coverage.

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

Purpose5/5

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

The first sentence states a specific verb and resource ('Get the page's visible text, or its full HTML') and the description repeatedly differentiates from siblings: take_snapshot (provides uids, builds accessibility tree) and query_selector (specific elements). An agent can distinguish this tool from its nearest alternatives without opening their schemas.

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

Usage Guidelines5/5

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

The description gives explicit when/when-not guidance with named alternatives: use this as 'the cheapest way to read a page when you only need content,' 'Use take_snapshot when you intend to interact with elements,' and 'query_selector when you want specific elements.' It also tells the agent to call wait_for or wait_for_selector first on asynchronously rendering pages. Nothing is left to inference.

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

handle_dialogHandle JavaScript dialogA

Answer an open JavaScript dialog — alert, confirm or prompt.

A dialog blocks the page and every subsequent tool call until it is handled, so call this as soon as one appears. Returns an error if no dialog is open.

beforeunload dialogs triggered by navigating away are handled automatically via navigate_page's handle_before_unload parameter; this tool is for dialogs the page opens by itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoAccept (OK) or dismiss (Cancel) the dialog. Either closes an alert(); for confirm() the choice is what the page's JavaScript receives.accept
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
prompt_textNoText to enter into a prompt() dialog before accepting it. Ignored for alert() and confirm() dialogs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds crucial runtime behavior: dialogs block the page and all subsequent tool calls, calling with no open dialog returns an error, and beforeunload dialogs are auto-handled elsewhere. This meaningfully helps an agent predict consequences before invoking the tool.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose in the first sentence, actionable urgency in the second, and the key exclusion in the third. Every sentence contributes necessary operational information without redundancy.

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

Completeness5/5

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

With a complete parameter schema, clear annotations, and an output schema present, the description provides all essential behavioral context an agent needs. It covers when to call, what happens if unused, error behavior, and the beforeunload exception, leaving no significant gap.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has a detailed description, so the baseline is 3. The tool description itself does not add further parameter-level detail beyond what the schema already provides.

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

Purpose5/5

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

The description uses a specific verb ('Answer') with a specific resource ('an open JavaScript dialog — alert, confirm or prompt'), immediately clarifying what the tool acts on. It also distinguishes itself from beforeunload handling by pointing to navigate_page, which separates it from related navigation tools.

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

Usage Guidelines5/5

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

The description explicitly says to call this tool as soon as a dialog appears, warns that it blocks subsequent calls, and states that an error is returned if no dialog is open. It also draws a clear boundary: beforeunload dialogs are handled by navigate_page's parameter, so this tool is only for page-initiated dialogs.

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

hoverHover elementA

Move the mouse over an element without clicking it.

This is how you open hover-triggered menus, tooltips and dropdowns before reading what they reveal — pass include_snapshot=true to get the revealed content back in the same call.

The element is scrolled into view and hit-tested first, the same way click does it: a point that lands on a sticky header instead opens that header's menu, not the one you asked for. If something covers the element, this says what, rather than hovering the wrong thing.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement uid from the most recent take_snapshot, e.g. "4_12". uids are invalidated whenever the page changes — if you get "unknown uid", take a fresh snapshot and retry with the new uid.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations, disclosing that the element is scrolled into view and hit-tested, that a sticky header can redirect the hover, and that obstruction reports what is covering the element instead of hovering the wrong target. This is substantial behavioral context beyond readOnlyHint/destructiveHint.

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

Conciseness5/5

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

The description is front-loaded with a one-sentence definition, followed by tightly focused supporting paragraphs on workflow and behavior. Every sentence earns its place; there is no repetition of schema content or filler.

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

Completeness5/5

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

For a tool with three well-documented parameters, an output schema, and annotations, the description is complete. It covers the core use case, the snapshot round-trip optimization, hit-testing mechanics, and failure behavior, so an agent has everything needed to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all parameters. The description adds value by explicitly tying include_snapshot=true to the hover workflow—'get the revealed content back in the same call'—which helps the agent decide when to set it.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Move the mouse over an element without clicking it.' It clearly distinguishes hover from click and gives the core use case, so an agent can tell what the tool does without ambiguity.

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

Usage Guidelines4/5

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

It gives clear context for when to use the tool: 'open hover-triggered menus, tooltips and dropdowns before reading what they reveal.' It does not explicitly name alternatives or when-not-to-use conditions, but the guidance is strong enough to route the agent correctly.

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

inspect_storageInspect page storageA
Read-only

Everything the selected page's origin keeps in the browser: localStorage, sessionStorage, IndexedDB, Cache Storage, service workers and quota usage.

Flags values that look like credentials — by key name, JWT shape or a "Bearer" prefix, also inside JSON values — because anything in web storage is readable by every script on the origin. JWTs are decoded (algorithm, expiry, claims; the signature is not checked).

Read through DevTools, not page JavaScript, except for the list of service worker registrations. IndexedDB and Cache Storage are listed with their sizes, not dumped; use evaluate_script to read records.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
reveal_valuesNoPrint values that look like credentials in full (up to 120 characters). Default false shows their first characters and length only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Even with readOnlyHint=true and destructiveHint=false in annotations, the description adds substantial behavioral context: credential-looking values are flagged, JWTs are decoded without signature verification, reading happens via DevTools rather than page JavaScript, and IndexedDB/Cache are only listed with sizes rather than dumped. This goes well beyond what annotations alone convey.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: scope, security warning, JWT behavior, read mechanism, and limitations. It is front-loaded with the core purpose and avoids unnecessary filler.

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

Completeness5/5

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

For a tool with two optional parameters, full schema coverage, an output schema, and safety annotations, the description covers all essential behavioral aspects: what is inspected, how values are handled, what is not dumped, and how to get full records. No critical gap remains for an agent deciding whether and how to call it.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by tying reveal_values to the credential-flagging behavior and by clarifying that redaction shows first characters and length by default. The browser parameter is already well documented in the schema.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Everything the selected page's origin keeps in the browser') and enumerates exactly which storage types are covered: localStorage, sessionStorage, IndexedDB, Cache Storage, service workers, and quota usage. This clearly distinguishes it from narrower siblings like get_local_storage.

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

Usage Guidelines4/5

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

It gives explicit context that reading is done through DevTools, not page JavaScript, with one named exception. It also provides a clear alternative for a specific case: 'use evaluate_script to read records' for IndexedDB and Cache Storage contents. It does not explicitly contrast with get_local_storage, but the scope statement makes the distinction clear.

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

list_browsersList browsersA
Read-only

List every browser this server currently holds: its name, whether its Chrome is running, which profile it uses, how many tabs it has and what they show. Reports without starting anything.

There is always a browser called "default", which runs in the server process. Others are created implicitly, by passing a new name as the browser argument of any tool, so this only shows names already used. A name missing here is not an error; it simply has not been opened.

chrome_running=false means the browser exists but has no Chrome, either because no tool has needed one yet or because close_browser was called. The next call relaunches it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds valuable behavior beyond that: 'Reports without starting anything,' the meaning of chrome_running=false, and the relationship with close_browser and implicit browser creation. This fully informs an agent about side-effect-free behavior and state semantics.

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

Conciseness5/5

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

The description is slightly longer than minimal but every sentence adds meaning: return fields, no side effects, implicit creation, default browser existence, and chrome_running=false semantics. The core purpose is front-loaded in the first sentence.

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

Completeness5/5

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

With no parameters and no output schema, the description carries the full burden and succeeds: it lists the returned fields, explains the default browser, clarifies missing names, and defines the chrome_running flag. An agent has everything needed to invoke and interpret the tool correctly.

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

Parameters4/5

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

There are zero parameters, so the description carries no parameter burden. The baseline of 4 applies, and the description does not waste space inventing unnecessary parameter guidance.

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

Purpose5/5

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

The first sentence states a precise verb and resource: 'List every browser this server currently holds' followed by the exact fields returned. It clearly differentiates from sibling list tools like list_pages and list_sessions by focusing on browser-level state.

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

Usage Guidelines4/5

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

The description explains when results are meaningful: only browsers already created are shown, a missing name is not an error, and 'default' always exists. It gives strong context for when to trust the output, though it does not explicitly name alternative tools or state when not to use it.

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

list_console_messagesList console messagesA
Read-only

List console output collected for the selected page.

Requires enable_console_collection first. Console capture is opt-in because it needs the CDP Runtime domain, which some sites use to detect an attached debugger; without it this returns a reminder instead of messages.

Each line is prefixed with its id and truncated to 200 characters — pass the id to get_console_message for the full text. Only the most recent 1000 messages are retained.

ParametersJSON Schema
NameRequiredDescriptionDefault
typesNoOnly return these console types, e.g. ["error", "warning"]. Note the value is "warning", not "warn". Omit for all types.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
page_idxNo0-based page number, used together with page_size.
page_sizeNoMaximum number of messages to return. Omit to return all.
include_preserved_messagesNoAlso include messages from before the last navigation — the server keeps the previous 3 navigations. Default false: current page only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the operation as read-only and non-destructive, but the description adds meaningful behavioral context: console capture is opt-in due to CDP Runtime debugger detection, messages are id-prefixed and truncated to 200 characters, and only the most recent 1000 messages are retained.

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

Conciseness5/5

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

The description is three sentences with no filler. Purpose is front-loaded, followed by the critical prerequisite/why, then the key line-format and retention constraints. Every sentence earns its place.

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

Completeness5/5

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

With detailed parameter schemas and an output schema present, the description covers the remaining essential context: prerequisite setup, degraded behavior without it, truncation, and retention limits. Nothing critical is missing for an agent to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents all five parameters precisely, including the 'warning' vs 'warn' distinction, browser naming, pagination, and preserved messages. The description adds return-format context but does not need to repeat parameter semantics.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List console output collected for the selected page.' It clearly distinguishes itself from the sibling get_console_message by explaining that lines are truncated and ids can be used to fetch the full text.

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

Usage Guidelines5/5

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

It explicitly states the prerequisite 'Requires enable_console_collection first' and warns that without it the tool returns a reminder instead of messages. It also directs the agent to get_console_message when full text is needed, providing a clear path between related tools.

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

list_framesList framesA
Read-only

List the page's frames, so their content can be reached at all.

Chrome's accessibility tree stops at a frame boundary, and document.querySelector never crosses one, so anything inside an iframe — payment fields, consent walls, embedded editors, CAPTCHA widgets — is invisible to take_snapshot and query_selector by default.

Index 0 is always the main frame. Pass an index or frame id as the frame argument of get_page_content, query_selector, evaluate_script, wait_for_selector or take_snapshot to work inside one.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds significant behavioral context: Chrome's accessibility tree stops at frame boundaries, querySelector never crosses them, and index 0 is always the main frame. It also explains how results should be consumed by other tools. This goes well beyond the annotations and meaningfully clarifies tool behavior.

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

Conciseness5/5

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

The description is front-loaded with the core action and purpose, then provides a brief but necessary explanation of the frame boundary problem, and closes with concrete usage instructions. Every sentence contributes value; there is no filler or repetition of the title or schema.

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

Completeness5/5

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

For a read-only listing tool with a single optional parameter and an output schema, the description is complete: it explains why the tool exists, when to use it, what the output means (index 0 main frame), and how to use the result with related tools. Nothing necessary for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and the only parameter, browser, is fully documented in the input schema with its own description. The tool description does not add parameter-level detail, which is fine because the schema already carries the full burden. Baseline 3 applies.

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

Purpose5/5

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

The description starts with a specific verb and resource: 'List the page's frames'. It then explains the purpose: making frame content reachable, which distinguishes this tool from take_snapshot and query_selector, which operate only on the main frame. The clear framing of iframe content as otherwise invisible gives the tool a precise identity.

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

Usage Guidelines5/5

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

The description explicitly explains when to use list_frames: whenever content lives inside an iframe and is invisible to take_snapshot and query_selector. It names the alternative tools that accept the resulting frame index or id, and states that index 0 is always the main frame. This gives the agent a complete routing decision without further inference.

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

list_network_requestsList network requestsA
Read-only

List the network requests the selected page has made.

Collection is automatic — unlike console capture, nothing needs enabling.

The main use is finding the JSON API a page calls: filter with resource_types=["XHR", "Fetch"], then pass the id from the square brackets to get_network_request to read the actual response body. That is usually far cheaper and more reliable than scraping the rendered DOM.

Only the most recent 1000 requests are retained, and each URL is truncated to 150 characters in this listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
page_idxNo0-based page number, used together with page_size.
page_sizeNoMaximum number of requests to return. Omit to return all.
url_filterNoOnly return requests whose URL contains this substring (plain text, not a regex), e.g. "/api/" or "graphql".
resource_typesNoOnly return these resource types. ["XHR", "Fetch"] is the useful filter for finding a page's own API calls. Matching is case-insensitive. Omit for all types.
include_preserved_requestsNoAlso include requests from before the last navigation — the server keeps the previous 3 navigations. Default false: current page only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context beyond annotations: collection is automatic (no enabling needed), only the most recent 1000 requests are retained, and each URL is truncated to 150 characters. This helps agents avoid misinterpreting truncated results.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence states the core purpose, followed by critical context (automatic collection, main use case, retention/truncation limits). Every sentence contributes meaningful information with no filler.

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

Completeness5/5

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

Given the output schema exists and all parameters are documented, the description covers what an agent needs: automatic collection, the main use case with a clear workflow, and important limitations (1000-request cap, URL truncation). Nothing critical is missing for correct usage.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters are documented. The description adds marginal value by recommending a specific filter value for a common use case, but it doesn't introduce semantics beyond what the schema already provides. Baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('List') and resource ('network requests the selected page has made'), which is distinct from sibling tools like get_network_request (reads a single request's body). It clearly identifies the scope (selected page) and purpose.

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

Usage Guidelines5/5

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

Provides explicit when-to-use guidance: identifies the main use case (finding a page's JSON API calls) and prescribes the exact filter resource_types=['XHR','Fetch'] and the follow-up step of passing the id to get_network_request. Also distinguishes from console capture by noting collection is automatic.

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

list_pagesList open pagesA
Read-only

List every open browser tab with its index, URL and title.

The index shown here is the page_id taken by select_page and close_page. Indices are positional and shift whenever a tab opens or closes, so re-read them here rather than reusing an index from an earlier call.

Tools act on the page chosen with select_page, or on the most recently opened tab if none was selected; the selected one is marked here.

Each entry also carries the page's CDP targetId, which is the stable identity of a tab: unlike the index it survives other tabs opening and closing, and it is what CDP-level tooling and logs refer to.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover readOnlyHint=true and destructiveHint=false. The description adds meaningful behavior beyond that: indices are positional and shift, the selected page is marked, and the CDP targetId remains stable across tab open/close events. No contradiction with annotations.

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

Conciseness4/5

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

The description is longer than strictly necessary but every paragraph adds useful information: output contents, index semantics, selected-page behavior, and targetId stability. There is no filler, though it could be tightened.

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

Completeness5/5

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

Given the output schema exists and the tool has only one optional parameter, the description is complete. It covers what the tool lists, how to interpret the index, how selection works, and the distinction between transient indices and stable CDP targetIds.

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

Parameters3/5

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

Schema description coverage is 100%, so the browser parameter is already fully documented in the schema. The description does not add anything about the browser parameter, so baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb and resource: "List every open browser tab with its index, URL and title." This clearly distinguishes list_pages from sibling tools like list_browsers (browsers) and list_sessions (sessions) by explicitly targeting tabs/pages.

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

Usage Guidelines4/5

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

The description gives clear operational guidance: the returned index is the page_id used by select_page and close_page, and indices should be re-read rather than reused because they shift. It does not explicitly name alternatives or state when not to use the tool, so it stops short of a 5.

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

list_profilesList profilesA
Read-only

List persistent Chrome profiles and show which one is active.

By default the browser runs on a fresh ephemeral temp profile that is deleted when the session ends. That default is what lets several nodriver instances — Claude Desktop, Claude Code, the VS Code extension — run at the same time without fighting over one profile directory.

Persistent profiles keep cookies, logins and installed extensions across sessions. Create one with create_profile, switch with use_profile, and return to ephemeral with use_temp_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already establish readOnly and non-destructive behavior. The description adds useful lifecycle context: the default profile is ephemeral and deleted at session end, while persistent profiles retain cookies, logins, and extensions across sessions. It does not fully clarify how the active ephemeral profile is represented in the response, but the output schema likely covers that.

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

Conciseness5/5

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

The first sentence front-loads the tool's purpose, and subsequent paragraphs provide relevant conceptual context and sibling routing without filler. Every sentence earns its place.

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

Completeness5/5

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

For a simple read-only listing tool with one optional parameter, the description is complete enough. It explains what is listed, what active means in the profile lifecycle, and how persistent profiles relate to the sibling profile-management tools, while the schema and output schema cover the remaining mechanical details.

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

Parameters3/5

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

The input schema already describes the browser parameter at 100% coverage, including its default and the parallel-agents caveat. The description adds no further parameter-specific meaning, 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.

Purpose5/5

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

The first sentence states an exact action and resource: list persistent Chrome profiles and show which one is active. It distinguishes persistent profiles from the ephemeral default profile and is clearly distinct from related tools like list_browsers and create_profile.

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

Usage Guidelines4/5

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

The description gives clear context around when persistent profiles matter and names the related operations create_profile, use_profile, and use_temp_profile. It does not explicitly state when not to use list_profiles or how to choose between it and sibling listing tools, so it stops short of full 5.

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

list_sessionsList sessionsA
Read-only

List saved session files with their name, save time and contents.

Shows the filename to hand to load_session, along with how many cookies and localStorage entries each one holds, newest first.

Sessions live in ~/.nodriver-mcp/sessions/ and are never cleaned up automatically, so old logins accumulate there over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds genuine value beyond that: sessions persist in ~/.nodriver-mcp/sessions/, are never cleaned up automatically, and accumulate over time — a meaningful behavioral disclosure about side effects of the feature (disk growth, stale logins) that annotations do not express.

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

Conciseness5/5

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

Three sentences with zero filler: the core action is front-loaded in the first sentence, the output's purpose follows in the second, and the storage/retention context in the third. Every sentence earns its place.

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

Completeness5/5

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

For a simple read-only listing tool with one documented optional parameter and an output schema, the description covers everything an agent needs: what is listed, ordering, how the result feeds a sibling workflow, and the storage location. Return-value details are already handled by the output schema, so nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%: the single optional 'browser' parameter is already fully documented in the schema, including guidance on parallel agents needing distinct names. The description adds no parameter-level detail, but per the rubric, the baseline of 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

The description opens with a specific verb+resource ('List saved session files') and further specifies exact fields (name, save time, contents), ordering (newest first), and the storage location. It also names the consumer of its output (load_session), which clearly separates it from siblings like save_session and load_session without opening any schema.

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

Usage Guidelines4/5

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

The description gives clear usage context by stating the output is 'the filename to hand to load_session', effectively describing the save/load workflow. However, it never explicitly names alternatives or states when NOT to use this tool (e.g., versus list_pages or list_browsers), so it stops short of a 5.

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

load_sessionLoad sessionA

Restore cookies and localStorage from a saved session file.

Use it at the start of a run to arrive already logged in. The page is first navigated to the saved origin so localStorage lands where it belongs, then reloaded so the restored cookies take effect.

Cookies that no longer apply are skipped rather than failing the whole restore, and the response reports how many were actually restored. Expired tokens still leave you logged out, so check the page afterwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
filenameYesSession filename as shown by list_sessions, or an absolute path to a session JSON file.
restore_pagesNoAlso re-open the tabs that were open when the session was saved. Default false, which restores only cookies and localStorage.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses several behavioral nuances beyond the annotations: it navigates to the saved origin, reloads the page, skips invalid cookies instead of failing, and reports how many were restored. It also notes that expired tokens still leave the user logged out. These details are not present in the annotations (which only set readOnlyHint=false, destructiveHint=false, etc.) and provide essential context for the agent about side effects and limitations.

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

Conciseness4/5

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

The description is slightly long (about four sentences) but each sentence adds value: purpose, usage context, process, and behavioral caveats. The most important information is front-loaded, and there is no fluff. It earns a 4 for being well-organized and efficient, though not as terse as the highest tier.

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

Completeness5/5

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

For a tool with an output schema and complex side effects (navigation, reload, selective restoration), the description covers all critical aspects an agent needs to know: what to do, how it works, what to expect (count of restored cookies), and potential failure modes (expired tokens). It also implicitly addresses prerequisites by referencing saved sessions and list_sessions. Nothing essential is missing.

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

Parameters3/5

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

The input schema already describes all three parameters with full coverage (100%), so the description doesn't need to add parameter-level detail. It does reinforce the 'filename' parameter by mentioning it as shown by list_sessions, and the browser parameter is already explained in the schema. However, the description doesn't add significant meaning beyond the schema, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Restore cookies and localStorage from a saved session file.' It also states the intended purpose ('arrive already logged in') which distinguishes it from sibling tools like save_session, get_cookies, or set_cookie. The behavior is clearly scoped to session restoration, making it easy to identify when to use.

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

Usage Guidelines4/5

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

The description explicitly recommends using this tool 'at the start of a run to arrive already logged in,' giving clear when-to-use guidance. It also warns about expired tokens and advises checking the page afterward. It does not explicitly name alternative tools for other scenarios, but the context is sufficient for an agent to infer that this is for restoring a saved session rather than setting individual cookies or storage values.

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

manage_extensionsManage Chrome extensionsA
Destructive

List, enable, disable or load Chrome extensions.

Two separate mechanisms are in play. The master switch: Chrome runs with --disable-extensions by default, so extensions installed in the profile stay dark until it is turned on. And unpacked extensions loaded from a folder on disk. The master switch governs both — with it off, unpacked extensions stay registered but do not load.

"load" only works on Chromium or Chrome for Testing. Official Google Chrome builds have ignored --load-extension since v137 (still true on Chrome 151, even with --enable-unsafe-extension-debugging), and this tool says so rather than pretending it worked. On official Chrome the working path is: install the extension once from the Web Store into a persistent profile, then switch it on with "on".

Extensions only persist in a persistent profile — on the default ephemeral one nothing can stay installed.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoFolder containing the extension's manifest.json, for "load" and "unload". Ignored by the other actions.
actionNo"list" shows the extensions installed in the active profile plus the current state, and changes nothing. "on" and "off" flip the master switch. "load" registers an unpacked extension from `path` and implies "on". "unload" stops loading `path`, or every unpacked extension when `path` is empty. Every action except "list" restarts the browser.list
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, but the description adds crucial behavioral details: the master switch governs both installed and unpacked extensions, every action except 'list' restarts the browser (from schema), and official Chrome ignores --load-extension since v137. It also discloses the persistence limitation. No contradiction with annotations.

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

Conciseness5/5

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

The description is well-organized into three paragraphs: purpose, mechanism explanation, and platform limitations. Each sentence carries weight, avoiding redundancy. The front-loaded purpose statement and the clear breakdown of behaviors make it easy for an agent to grasp the tool's capabilities quickly.

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

Completeness5/5

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

Given the tool's complexity (multiple actions, platform-specific behavior, persistence caveats), the description covers all critical aspects: the master switch, load restrictions, persistence, and browser independence. The output schema exists and parameter descriptions are thorough, so nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are already documented. The description enriches understanding by explaining the interplay between 'action' values and the master switch, and clarifies the 'browser' parameter's independence. For instance, it explains that 'load' implies 'on', which is not explicitly stated in the schema description for 'action'. This adds semantic value beyond the schema.

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

Purpose5/5

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

The description opens with 'List, enable, disable or load Chrome extensions' – a clear verb+resource that immediately states the tool's function. It also explains the two mechanisms (master switch and unpacked loading), which distinguishes the tool's behavior from a simple toggle. No sibling tool covers extensions, so differentiation is inherent.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use which action: it states that 'load' only works on Chromium or Chrome for Testing, and on official Chrome the alternative path is to install from Web Store and use 'on'. It also explains persistence requirements, telling the agent to use a persistent profile for extensions to survive. This is concrete when-to-use information.

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

new_pageOpen new pageA

Open a new browser tab and load a URL.

Chrome always starts with one tab, so the first call here reuses that empty startup tab rather than leaving a stray blank page behind for the rest of the session. A blank tab sitting among others is left alone, and an isolated context always gets a target of its own.

Unless background is set, the new page becomes the selected page for every subsequent tool call.

Passing device applies emulation before the first real request, so mobile signals are present from the very first byte — which calling emulate_device afterwards cannot achieve.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoURL to load in the new tab, including the scheme. Defaults to "about:blank" for an empty tab.about:blank
deviceNoDevice to emulate — sets user agent, UA client hints, viewport, device pixel ratio and touch together. Presets: "pixel_7" (aliases: pixel7, android, android_phone), "pixel_7_landscape" (pixel7_landscape, android_landscape), "ipad_air" (ipadair, ipad, tablet). Case, spaces and -/_ are normalised. Empty string leaves emulation unchanged.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
timeoutNoMaximum wait in milliseconds. 0 uses the built-in default.
backgroundNoOpen the tab without focusing it, leaving the current page selected. Default false, which focuses the new page and makes it the target of all following tool calls.
isolated_contextNoOpen the page in a named isolated browser context — its own cookie jar and storage, comparable to a separate incognito window. Pages given the same name share that context; different names are fully isolated from each other. Use it to hold several logins to one site at once. Empty string uses the normal shared context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark this as a mutating (readOnlyHint=false) and world-opening (openWorldHint=true) action. The description goes well beyond that by disclosing tab-reuse behavior, the fact that a blank tab is left alone, isolated contexts getting their own target, the selection side-effect unless background is set, and the timing of device emulation. These are concrete behavioral traits an agent needs to anticipate side effects correctly, with no contradiction to the annotations.

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

Conciseness5/5

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

The description is a single well-structured paragraph, with the primary purpose in the first sentence and each subsequent sentence adding distinct value (tab reuse, selection behavior, device emulation timing). No filler or redundancy; every clause contributes to understanding when and how to use the tool.

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

Completeness5/5

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

Given the tool's complexity (six parameters, side effects on selection, isolation, and emulation timing) and the presence of an output schema, the description covers all essential behavioral nuances. It explains the startup-tab handling, background behavior, isolated-context targeting, and device emulation advantage. The only parameters not mentioned (timeout, browser) are self-explanatory and fully documented in the schema, so nothing critical is missing.

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

Parameters4/5

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

Schema coverage is 100% for all six parameters, so the baseline is 3. The description adds meaningful context beyond the schema: it explains that passing device applies emulation before the first real request (a timing nuance not in the schema), that background controls selection behavior for subsequent calls, and that isolated_context always gets its own target. These enrich the parameter semantics without restating the schema, earning a 4.

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

Purpose5/5

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

The description states the core action clearly: 'Open a new browser tab and load a URL.' It distinguishes itself from sibling tools like navigate_page (which acts on an existing page) and select_page (which selects a page) by focusing on creating a new tab. It also explains the startup-tab reuse behavior, making the tool's purpose precise and unambiguous.

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

Usage Guidelines5/5

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

The description gives explicit guidance on when to use this tool: it is the way to open a new tab, with specific notes on the first call reusing the startup tab and the background parameter affecting selection. It also contrasts with emulate_device, stating that passing device here gives emulation from the first byte, which calling emulate_device afterwards cannot achieve — a clear when-not condition. This helps an agent choose between opening a page and emulating a device.

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

performance_start_traceStart performance traceA

Record a Chrome performance trace of page load or interaction.

Captures the same DevTools timeline categories the Performance panel uses: rendering, scripting, loading, screenshots and the V8 CPU profile.

With the defaults (reload + auto_stop) this is one self-contained call that reloads, records for ~5s and returns. Only one trace can run at a time.

Pass file_path to keep the data — without it you get just an event count, which confirms the trace ran but says nothing about what it measured. The output is raw trace JSON: load it via DevTools -> Performance -> Load profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
reloadNoReload the page after starting the trace so the recording covers page load. Default true, which is what you want for load performance; set false to profile the page as it currently stands.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
auto_stopNoRecord for about 5 seconds, then stop and return the result in this same call. Default true. Set false to control the window yourself and end it with performance_stop_trace.
file_pathNoWrite the raw trace JSON to this local path. Omit to get only the collected event count back.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the sparse annotations (readOnlyHint: false, destructiveHint: false) by disclosing captured timeline categories, the ~5s recording window, the single-trace-at-a-time constraint, and the output behavior (event count vs raw JSON). This is rich, useful behavioral context that the annotations do not provide, and there is no contradiction.

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

Conciseness5/5

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

The description is tightly structured: an opening purpose sentence, a short list of captured categories, a paragraph on default behavior and concurrency, and a note about file_path and output format. Every sentence earns its place; there is no fluff or repetition of schema details.

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

Completeness5/5

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

Given four optional parameters, an output schema, and the presence of a sibling performance_stop_trace, this description is complete: it covers trace content, default timing, concurrency limits, file output behavior, and how to load the result. An agent has everything needed to invoke the tool correctly and interpret its result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explicitly explaining the consequences of passing file_path ('keep the data' vs 'just an event count') and by reinforcing the meaning of the defaults (reload + auto_stop) in context. That extra guidance justifies a score above baseline.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Record a Chrome performance trace of page load or interaction.' It clearly distinguishes this from sibling tools (e.g., performance_stop_trace) by stating it starts the trace, and it lists what the trace captures. An agent can tell exactly what this tool does without opening the schema.

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

Usage Guidelines4/5

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

The description gives clear context on when to use the tool: for profiling page load or interaction, and it explains the default self-contained behavior (reload + auto_stop) plus the option to pass file_path to keep data. It doesn't explicitly name alternatives or state when not to use it, but the usage context is strong enough that an agent would not confuse it with other tools.

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

performance_stop_traceStop performance traceA

Stop the running performance trace and collect its data.

Only needed when performance_start_trace was called with auto_stop=false — otherwise the trace has already ended and this returns an error.

Waits up to 30 seconds for Chrome to flush its buffered events.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathNoWrite the raw trace JSON to this local path (e.g. "trace.json"), loadable in DevTools -> Performance. Omit to get only the event count.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Adds real behavioral context beyond the annotations: the error condition when the trace already ended and the 30-second flush wait. These are exactly the kind of runtime behaviors descriptions should disclose. No contradiction with annotations.

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

Conciseness5/5

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

Three short sentences, each earning its place: core action, usage condition/error, and timeout behavior. Front-loaded with the primary purpose and zero filler.

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

Completeness4/5

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

Complete for the tool's complexity: purpose, when-to-call, error case, and blocking behavior are all covered, and the output schema handles return-value details. Only minor extras like resource implications are absent.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents both parameters. The description contributes no param-level detail, but none is needed given the baseline-3 rule for full coverage.

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

Purpose5/5

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

States a specific verb (stop) and resource (performance trace), plus the consequence (collect its data). It clearly differs from the sibling performance_start_trace and the first line makes the action unmistakable.

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

Usage Guidelines5/5

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

Explicitly names the sibling tool, the triggering condition (auto_stop=false), and the failure mode when used incorrectly ('returns an error'). An agent knows exactly when to call this vs. when not to, with nothing left to inference.

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

press_keyPress keyA

Send a key press or keyboard shortcut to the page.

Goes to whatever currently holds focus, so click or fill the target element first — with nothing focused the key lands on the document body.

Modifiers are held around the main key with the proper modifier bitmask, so real chords such as Control+A or Control+Shift+R register as shortcuts instead of arriving as unrelated key presses.

For entering text use fill (replaces the field) or type_text (appends to it); this tool is for single keys and shortcuts.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesA key or chord, e.g. "Enter", "Tab", "Escape", "ArrowDown", "a", "Control+A" or "Control+Shift+R". Modifiers are Control, Shift, Alt and Meta, joined with +. Named keys: Enter, Tab, Backspace, Delete, Escape, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Home, End, PageUp, PageDown, Space. Any single character works as itself.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, which establish the tool is a non-destructive mutation. The description adds useful behavioral context: focus handling (falls back to document body) and modifier bitmask behavior for chords. It does not mention potential side effects like navigation triggers, but annotations already set expectations for safety.

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

Conciseness5/5

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

The description is three short paragraphs with zero fluff. It front-loads the purpose, then explains focus behavior, then gives alternatives. Every sentence earns its place, and the structure is scannable.

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

Completeness5/5

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

Given the tool's complexity (keyboard shortcuts, focus dependence, multiple parameters) and rich schema plus output schema, the description covers all critical aspects: focus prerequisite, modifier chord behavior, and clear routing to alternatives. An agent can call it correctly without further inference.

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

Parameters3/5

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

Schema description coverage is 100%, and the parameter descriptions are already detailed (key lists examples and modifiers, browser explains independent Chrome instances, include_snapshot explains its trade-off). The description adds focus and chord behavior, but that is usage guidance rather than parameter semantics. With full schema coverage, the description does not need to compensate.

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

Purpose5/5

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

The description clearly states the tool sends a key press or keyboard shortcut to the page, identifying the verb and resource. It distinguishes itself from fill and type_text by explicitly noting 'this tool is for single keys and shortcuts,' which separates it from sibling tools that handle text entry.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: it targets the currently focused element, so the agent knows to click or fill first. It also names alternatives (fill, type_text) and explains when not to use this tool, covering exclusions clearly.

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

query_selectorQuery CSS selectorA
Read-only

Find elements by CSS selector; list their tag, text, href, id and class.

The efficient way to pull a repeated structure off a page — search results, product tiles, table rows — without paying for a full snapshot.

Returns a compact listing only. It yields no uids, so it cannot drive clicks: take a snapshot when you need to interact, or operate on the elements directly via evaluate_script.

Element text is truncated to 200 characters.

ParametersJSON Schema
NameRequiredDescriptionDefault
frameNoRead inside one of the page's frames instead of the main document: an index or frame id from list_frames. Chrome's DOM queries never cross a frame boundary, so anything inside an iframe is unreachable without this. The frame is read through an isolated world, which shares the DOM but not the page's own JavaScript variables. Empty string reads the main document.
limitNoMaximum number of matching elements to return.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
selectorYesA CSS selector, e.g. "a.result", "#nav li", "input[type=file]". Standard querySelectorAll syntax — no jQuery extensions such as :contains().

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description adds significant behavioral detail: compact listing only, no uids, inability to drive clicks, 200-character text truncation, and frame-isolated-world semantics. Nothing contradicts the annotations.

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

Conciseness5/5

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

Four short, information-dense sentences, each earning its place: core function, use case, limitation with alternatives, and truncation behavior. The most decision-relevant constraints are front-loaded.

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

Completeness5/5

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

Given the output schema exists and the input schema is fully described, the prose covers all necessary decision factors: when to use, what it returns, what it cannot do, and a critical output limitation. An agent has enough to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The schema already provides strong parameter descriptions, including selector syntax limitations, frame isolation, browser naming, and limit semantics. The tool description itself does not add further parameter-level detail.

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

Purpose5/5

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

The description states a specific verb and resource: 'Find elements by CSS selector; list their tag, text, href, id and class.' It clearly distinguishes the tool from snapshot-based alternatives by emphasizing compact output, no uids, and repeated-structure extraction.

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

Usage Guidelines5/5

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

The description explicitly explains when to use this tool ('efficient way to pull a repeated structure off a page... without paying for a full snapshot') and when not to ('It yields no uids, so it cannot drive clicks'), with concrete alternatives: take_snapshot or evaluate_script. This is exemplary usage guidance.

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

reset_emulationReset emulationA
Idempotent

Clear every emulation override on the selected page.

Resets in one call: network throttling, CPU throttling, geolocation, user agent and client hints, color scheme, viewport, device pixel ratio, page scale and touch emulation — back to the real browser defaults.

Use after emulate or emulate_device to make the page behave like ordinary desktop Chrome again. Turning touch emulation off here also restores trusted CDP clicks.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description details the full scope of the reset, listing network throttling, CPU throttling, geolocation, user agent, client hints, color scheme, viewport, device pixel ratio, page scale, and touch emulation. It also discloses the CDP click restoration behavior. These specifics go well beyond the annotations (idempotentHint, destructiveHint) and give the agent a precise model of the tool's effects.

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

Conciseness5/5

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

The description is tightly structured: a one-line purpose, a list of reset items, and a usage note. Every sentence contributes new information—no fluff or repetition. The most critical detail (what it resets) is front-loaded, and the usage guidance is placed where it naturally follows.

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

Completeness5/5

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

For a tool that resets many emulation categories, the description enumerates them all, making the tool's effect fully transparent. It also provides usage context and a side effect. The presence of an output schema means return values don't need explanation, and the parameter is covered by the schema. Nothing essential is missing.

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

Parameters3/5

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

The single parameter 'browser' is fully documented in the schema with its own description covering default behavior and parallel-agent usage. The tool description adds no extra semantic detail about the parameter, but since schema coverage is 100%, a baseline of 3 is appropriate. The description's omission is not a gap because the schema already handles it.

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

Purpose5/5

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

The description uses a specific verb ('Clear') and resource ('every emulation override'), then enumerates the exact overrides it resets. It distinguishes itself from siblings like emulate and emulate_device by explicitly stating it is the counterpart that reverts them. This leaves no ambiguity about what the tool does.

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

Usage Guidelines5/5

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

It explicitly states when to use it: 'Use after emulate or emulate_device to make the page behave like ordinary desktop Chrome again.' It also adds a specific side effect ('Turning touch emulation off here also restores trusted CDP clicks'), which informs the agent of an additional reason to call it. No exclusions are needed since the tool's purpose is narrowly scoped.

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

resize_pageResize pageA
Idempotent

Resize the browser window so the page gets the given dimensions.

Moves the actual OS window, which is what you want for responsive-layout checks that should also come out right in a screenshot.

To emulate a viewport size without touching the window — including device pixel ratio, the mobile flag and touch — use emulate's viewport parameter or emulate_device. Those are what a site's media queries and fingerprinting read as a genuine device change.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthYesTarget page width in CSS pixels.
heightYesTarget page height in CSS pixels.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide idempotentHint=true and destructiveHint=false, but the description adds meaningful behavioral context: the actual OS window is moved, which affects screenshots, and this is not a genuine device-emulation change for media queries or fingerprinting. This is valuable and does not contradict the annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence states the core action, the second explains the practical use case, and the third routes to alternatives. There is no filler or repetition of schema content.

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

Completeness5/5

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

For a simple resizing tool with an output schema present, the description sufficiently covers behavior, use case, and exclusions. An agent can correctly decide when to call it and what it will do without needing further details about return values or side effects.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents width, height, and browser thoroughly. The description does not add parameter-level detail, but it does not need to; the schema carries the full burden. This matches the baseline for complete schema coverage.

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

Purpose5/5

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

The description states a specific verb and resource: 'Resize the browser window so the page gets the given dimensions.' It also clearly distinguishes this tool from emulate and emulate_device by explaining that this one moves the actual OS window while those emulate viewport-like conditions. This makes sibling differentiation immediate and unambiguous.

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

Usage Guidelines5/5

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

The description explicitly says when to use this tool: for responsive-layout checks that should also render correctly in screenshots. It also names alternatives—emulate's viewport parameter and emulate_device—for cases where the window should not be touched and device flags are needed. This gives an agent clear selection criteria among related tools.

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

save_pdfSave page as PDFA

Export the current page to a PDF using Chrome's print-to-PDF.

Renders the entire document rather than just the viewport, and applies the page's print stylesheet — so the result can differ from the screen layout.

A good way to archive a rendered page as one file. For a pixel-accurate copy of what is on screen, use take_screenshot with full_page instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathYesLocal path to write the .pdf file to.
landscapeNoUse landscape orientation instead of portrait.
print_backgroundNoInclude background colours and images. Default true, which resembles the page as seen on screen; false gives the leaner print view.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations, it discloses that the output covers the full document rather than the viewport and that the print stylesheet can make the result differ from the screen layout. This is meaningful behavioral context. It does not mention potential file overwriting, but the schema and annotations cover the core mutation profile.

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

Conciseness5/5

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

Three short sentences, each earning its place. The primary action is front-loaded, followed by key behavioral caveats and a clear alternative. There is no filler or repetition of schema content.

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

Completeness5/5

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

For a tool with four well-documented parameters and an output schema, the description supplies the essential behavioral nuances that the schema cannot: full-document rendering, print stylesheet application, and the distinction from take_screenshot. Nothing critical is missing for correct tool selection and invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented in the schema. The description does not need to add parameter-level detail, though it implies the output is a PDF file. This is the expected baseline: the schema does the heavy lifting.

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

Purpose5/5

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

The description states a specific verb and resource: 'Export the current page to a PDF using Chrome's print-to-PDF.' It further distinguishes itself from take_screenshot by clarifying that it renders the entire document and applies the print stylesheet, so an agent can tell what the tool produces beyond the name.

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

Usage Guidelines5/5

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

The description explicitly positions the tool as 'a good way to archive a rendered page as one file' and directs agents to take_screenshot with full_page instead when a pixel-accurate copy is needed. This provides clear when-to-use and when-not-to-use guidance with a named alternative.

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

save_sessionSave sessionA

Save cookies, localStorage and open page URLs to a reusable file.

This is how you keep a login obtained interactively, so a later run can skip the login flow entirely — restore it with load_session.

Stored as JSON under ~/.nodriver-mcp/sessions/. That file holds live session tokens in plain text, so treat it as a credential.

Only the current page's origin contributes localStorage. For a login meant to survive without an explicit restore step, a persistent profile (create_profile + use_profile) is the sturdier option.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesA human-readable name for this session, e.g. "github-logged-in". It forms the filename, with a timestamp appended so repeated saves never overwrite one another.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-idempotent write, and the description adds meaningful behavior beyond that: files are stored as JSON under ~/.nodriver-mcp/sessions/, contents are plain-text credentials, and only the current page's origin contributes localStorage. No contradiction with annotations.

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

Conciseness4/5

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

The main purpose is front-loaded in the first sentence, and each following paragraph earns its place by covering restoration, storage location, security sensitivity, and when a persistent profile is preferable. It is slightly longer than strictly necessary but remains focused.

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

Completeness5/5

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

Given the output schema exists, return-value documentation is unnecessary. The description covers what is saved, where it is stored, how to restore it, the localStorage origin limitation, and a more robust alternative, making the tool safe and easy to invoke correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both name and browser. The description adds useful context about the credential-sensitivity of the saved file but does not need to compensate for schema gaps.

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

Purpose5/5

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

The first sentence names a specific action and resource: save cookies, localStorage, and open page URLs to a reusable file. It also distinguishes itself from related tools by pointing to load_session for restoration and to persistent profiles as the sturdier alternative.

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

Usage Guidelines5/5

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

The description explicitly explains when to use it — preserving an interactively obtained login so a later run can skip the login flow — and names the restore counterpart, load_session. It also gives an alternative condition: for logins that must survive without an explicit restore step, use create_profile + use_profile.

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

scroll_pageScroll pageA

Scroll the page up or down by a percentage of the viewport.

The way to trigger lazy-loaded content and infinite scroll; take a fresh take_snapshot afterwards to see what was added.

The response reports how far the page actually moved and whether the end has been reached, so a scroll loop has something to stop on: "did not move" means you are at the end, and a page height that keeps growing means more content is still loading.

To bring one known element into view, scroll_to_selector is more precise. click already scrolls to its target, so no scrolling is needed before it.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoHow far to scroll, as a percentage of the viewport height — 25 is a quarter screen, 100 a full screen.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
directionNoDirection to scroll.down

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, and the description adds useful behavioral detail beyond that: scrolling can trigger lazy loading, the response reports actual movement and end-of-page status, and did not move signals the boundary while growing page height means loading is ongoing. This gives an agent concrete loop-termination criteria.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: core behavior first, then the typical use case, then response semantics for loops, then when not to use it. It is front-loaded and avoids repetition of schema content.

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

Completeness5/5

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

With no required parameters, a fully described schema, and an output schema available, the description covers the remaining gaps: when the tool is appropriate, what side effect it triggers, how to interpret the response, and which sibling to prefer instead. The agent has enough context to call it correctly and structure a scroll loop.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains amount, browser, and direction. The description reinforces the viewport-percentage semantics but does not add meaningful parameter information beyond what the input schema provides, so it stays at the baseline for high schema coverage.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Scroll the page up or down by a percentage of the viewport.' It also distinguishes itself from siblings by noting that scroll_to_selector is more precise for bringing a known element into view, so an agent can tell scroll_page apart from nearby tools.

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

Usage Guidelines5/5

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

The description states exactly when to use it: to trigger lazy-loaded content and infinite scroll. It also gives a clear exclusion by saying click already scrolls to its target so no scrolling is needed first, and names scroll_to_selector as the alternative for targeting a known element.

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

scroll_to_selectorScroll to elementA

Scroll the first element matching a CSS selector into view, centered.

More precise than scroll_page when you already know what you are looking for, and the usual preparation for click_at, which needs its target inside the viewport.

click scrolls to its own target, so this is unnecessary before it. Reports whether anything matched instead of failing silently.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
selectorYesCSS selector of the element to scroll to; the first match wins.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the sparse annotations (readOnlyHint=false, destructiveHint=false), the description discloses error-handling behavior: 'Reports whether anything matched instead of failing silently.' It also specifies that the first matching element wins and that the element is centered. This adds genuinely useful behavioral context the annotations do not cover.

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

Conciseness5/5

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

Four short sentences, each earning its place: the core action, the scroll_page comparison, the click_at preparation note, and the click exclusion plus behavior note. The most important information is front-loaded in sentence one. There is zero waste.

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

Completeness5/5

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

For a simple two-parameter tool with an output schema, the description covers everything an agent needs: what it does, how it differs from scroll_page, when it is a prerequisite (click_at), when it is unnecessary (before click), and what happens when nothing matches. The output schema covers return values, so their absence from the description is not a gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds nothing about the browser parameter that the schema doesn't already state, and the 'first match wins' detail is already present in the schema's selector description. It neither harms nor materially improves parameter understanding.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Scroll the first element matching a CSS selector into view, centered.' It adds the 'first match wins' scoping and the centered positioning detail, and the subsequent sentence explicitly distinguishes it from scroll_page. An agent can tell exactly what this tool does.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: it is 'more precise than scroll_page when you already know what you are looking for' and is 'the usual preparation for click_at.' It also names an exclusion condition: 'click scrolls to its own target, so this is unnecessary before it.' No inference is required.

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

search_bodiesSearch captured bodiesA
Read-only

Find where a value shows up in the traffic capture_bodies recorded — in which response it first arrived, and which later requests sent it back.

The usual question when following data through an app: where did this ID, token or price come from, and where does it go next. Results are in capture order, so the first hit is the first response that carried it; POST data and URLs from capture.jsonl are searched too, as the "sent" side.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesText to look for, or a regular expression with regex=true.
regexNoTreat query as a Python regular expression.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
directoryNoA capture_bodies folder to search. Empty uses the running capture, or the most recent one.
max_resultsNoStop after this many matches.
case_sensitiveNoMatch case exactly. Default false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Adds meaningful behavior beyond the readOnlyHint: results are in capture order, the first hit is the first response that carried the value, and POST data and URLs from capture.jsonl are included as the 'sent' side. This is useful context not present in annotations and does not contradict them.

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

Conciseness5/5

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

Two short paragraphs with the core semantics front-loaded in the first sentence. The 'usual question' sentence earns its place by clarifying the intended use case; there is no filler or repetition.

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

Completeness5/5

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

With a complete input schema, an output schema, and annotations already covering the read-only safety profile, the description supplies the missing behavioral context: ordering, 'sent' side coverage, and the kind of value being searched. Nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the input schema already documents all six parameters with meaningful descriptions. The tool description adds no parameter-level detail, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb ('find') and resource ('capture_bodies'), then gives precise semantics: which response first carried a value and which later requests sent it back. This clearly distinguishes it from sibling tools focused on live network requests or other browser actions.

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

Usage Guidelines4/5

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

Clearly frames the intended use case: following an ID, token, or price through an app to see where it originated and where it went next. It does not explicitly name sibling alternatives or state 'when not to use', but the context is unambiguous.

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

select_optionChoose a select optionA

Choose an option in a , by value, visible label or index.

fill also works on a , but only matches the value attribute, which is not what a snapshot shows you — so it had to be guessed. This matches what you can actually see, and when nothing matches it lists the real options instead of only saying no.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement uid from the most recent take_snapshot, e.g. "4_12". uids are invalidated whenever the page changes — if you get "unknown uid", take a fresh snapshot and retry with the new uid.
optionYesThe option to choose. Matched against the value attribute first, then the visible label, then — if it is a plain number — the position in the list. A failure names every option the <select> actually has.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already convey that this is not read-only and not idempotent, so the safety profile is covered. The description adds meaningful behavioral detail beyond the annotations: it states the tool matches what can actually be seen, and that on failure it lists the real options rather than returning a bare 'no'. This informs the agent about error behavior and matching strategy without contradicting the annotations.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence states exactly what the tool does, and the second paragraph earnestly explains when it is needed and how failures behave. Every sentence carries useful information, with no filler or repetition of the structured schema.

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

Completeness5/5

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

For a tool with a rich input schema, useful annotations, and an output schema, the description covers everything an agent needs to call it correctly: purpose, matching strategy, alternative comparison, and failure behavior. Nothing essential is missing, and the description complements rather than duplicates the structured fields.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by framing the 'option' parameter's matching order in practical terms and explaining why the value-attribute-only approach of 'fill' is insufficient for snapshot-driven workflows. This goes beyond simply restating parameter names and enriches the agent's understanding of how the parameters should be used.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Choose an option in a <select>', and names the matching keys (value, visible label, or index). It also differentiates itself from the sibling 'fill' by explaining the crucial limitation of fill on selects, making the tool's unique role immediately clear.

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

Usage Guidelines5/5

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

The description explicitly addresses the main alternative, 'fill', and gives the when-not-to-use-it reasoning: fill only matches the value attribute, which is not what snapshots show. It then explains why this tool is preferable when working from a snapshot and what happens when no option matches, providing concrete guidance for choosing it over the alternative.

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

select_pageSelect pageA
Idempotent

Choose which open tab every subsequent tool call acts on.

Without a selection, tools act on the most recently opened tab. Selecting makes that choice explicit and sticky — needed when a click opened a tab you now want to drive, or when working across several sites at once.

Indices come from list_pages and shift as tabs open and close, so the response lists them again. If the selected tab is later closed, the selection is dropped and the default applies again.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
page_idYesIndex of the page to select, as listed by list_pages.
bring_to_frontNoAlso focus the tab in the real browser window. Default true. Many pages pause animations, timers and media while backgrounded, so leave this on unless you specifically want the page to stay hidden.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

While annotations already note idempotentHint=true and destructiveHint=false, the description adds valuable behavioral context: the selection is 'sticky' and persists, indices shift as tabs open/close, and the selection is dropped if the tab closes. These details explain the lifecycle and side effects beyond what annotations convey, though it does not mention the focusing behavior of bring_to_front, which is documented in the schema.

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

Conciseness4/5

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

The description is concise and front-loaded, leading with the core action. It follows with default behavior, usage scenarios, and a caution about indices. It's a compact paragraph without redundancy, though a few sentences could be merged for even tighter structure. Overall, it's well-organized and each sentence earns its place.

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

Completeness5/5

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

Given the tool's moderate complexity and the presence of an output schema, the description covers all necessary aspects: what it does, when to use it, default behavior, index sourcing, and selection lifecycle. It does not need to explain return values because an output schema exists. The description is fully sufficient for an agent to invoke it correctly.

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

Parameters4/5

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

With 100% schema description coverage, the baseline is 3, but the description adds value by explaining that page_id comes from list_pages and is unstable because indices shift. This contextualizes the parameter's meaning and warns agents about its volatility, which is not fully captured in the schema's brief description. It also clarifies the default for bring_to_front indirectly by referencing background behavior in the schema, though the description itself does not restate it.

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

Purpose5/5

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

The description states a clear verb and resource: 'Choose which open tab every subsequent tool call acts on.' It distinguishes this from sibling tools like list_pages (listing) and new_page (creating), and explicitly contrasts with the default behavior of using the most recent tab. This makes the tool's purpose unambiguous and separable from peers.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use scenarios: 'needed when a click opened a tab you now want to drive, or when working across several sites at once.' It also clarifies the default behavior when no selection occurs, which effectively tells when selection is unnecessary. This is strong guidance for an agent deciding between this tool and alternatives.

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

set_browser_flagsSet browser launch flagsA
Destructive

Change Chrome's launch flags at runtime, and show the current ones.

Call with no arguments at all to just read the effective configuration — that form changes nothing.

These are launch-time flags, so applying them restarts Chrome and closes every open page; on an ephemeral profile that also drops its cookies. Values set here override the NODRIVER_ENABLE_* environment variables.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
restartNoRestart Chrome now so the flags take effect, closing all open pages. Default true; false defers them to the next browser start.
translateNoTrue allows Chrome's Google Translate popup, false suppresses it. Omit to leave unchanged. Suppressed by default, because the popup covers page content and swallows clicks.
extensionsNoTrue allows externally-installed Chrome extensions, false blocks them. Omit to leave unchanged. Blocked by default, so no "an extension requires your attention" prompt appears. manage_extensions offers the same switch plus listing and loading.
extra_argsNoReplace the set of extra Chrome launch flags with this list, e.g. ["--lang=de-DE", "--window-size=1280,800"]. A leading "--" is added if missing. Pass [] to clear them, omit to leave unchanged. This replaces the list rather than appending to it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Despite annotations already marking destructiveHint=true, the description adds valuable specifics: applying flags restarts Chrome, closes every open page, and drops cookies on ephemeral profiles. It also clearly states that the no-argument form changes nothing, which is important behavioral nuance beyond the annotations.

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

Conciseness5/5

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

Three short paragraphs each carry essential information: the tool's dual purpose, the safe read-only call form, and the destructive side effects plus env-var precedence. No filler or redundant restatement of the schema.

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

Completeness5/5

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

The description covers the read path, the destructive restart path, cookie loss, and environment variable override. The input schema documents all parameters in depth, an output schema exists, and annotations cover the danger profile, so nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful global semantics beyond the schema: no arguments means read-only, and values set here override environment variables. These details help agents reason about the effective configuration without duplicating per-parameter docs.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Change Chrome's launch flags at runtime, and show the current ones.' This states both the mutation and read modes, making the tool's purpose unmistakable and distinguishing it from sibling tools like manage_extensions.

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

Usage Guidelines4/5

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

The description gives clear context for when to call with no arguments to read vs. with arguments to change flags, and explains precedence over NODRIVER_ENABLE_* environment variables. It does not explicitly name alternative tools or state when not to use this tool, but the guidance is sufficient for most calls.

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

set_checkedCheck or uncheck a boxA

Tick or untick a checkbox, or select a radio button, and verify it took.

Use this instead of fill for anything with a checked state. fill types over a field's text, which a checkbox does not have — and its read-back compares value, which a checkbox never changes, so a fill could report success while nothing was selected.

Idempotent: asking for the state it is already in is reported and does not click. Otherwise it delivers a real CDP click, on the element or, when the input is visually hidden behind a styled label (the usual custom-control pattern), on the label that controls it. The state is read back afterwards, so a failure is an error rather than a success you cannot trust.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesElement uid from the most recent take_snapshot, e.g. "4_12". uids are invalidated whenever the page changes — if you get "unknown uid", take a fresh snapshot and retry with the new uid.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
checkedNoTrue to tick the box or select the radio, False to untick it. Radio buttons cannot be unticked by the browser — select a different one in the group instead.
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior1/5

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

The annotations declare idempotentHint=false, but the description explicitly says 'Idempotent: asking for the state it is already in is reported and does not click.' This is a direct contradiction, so the score is 1 per the rubric. Otherwise the description is rich, disclosing CDP clicks, hidden-label handling, read-back verification, and error behavior.

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

Conciseness5/5

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

The description is front-loaded with the core action, then gives the when-to-use guidance, then details behavior. Every sentence earns its place; there is no filler or repetition of schema fields.

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

Completeness5/5

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

For a tool with 4 parameters, an output schema, and a large sibling list, the description is complete: it states when to use it, why not to use fill, what happens on idempotent calls, how hidden labels are handled, how state is verified, and the radio-button limitation. The only flaw is the annotation contradiction, which is already captured under behavioral transparency.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema, particularly around the checked parameter: requesting the current state is a no-op that is reported, while a real change triggers an actual CDP click and read-back verification.

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

Purpose5/5

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

The description names a specific action and resource: 'Tick or untick a checkbox, or select a radio button, and verify it took.' It also differentiates itself from fill by explaining what fill does and does not do for checked controls.

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

Usage Guidelines5/5

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

It gives explicit direction: 'Use this instead of fill for anything with a checked state,' and explains why fill is unsuitable: it types over text and compares value, which checkboxes do not have. It also warns that radio buttons cannot be unticked and directs the user to select another radio instead.

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

set_local_storageSet localStorageA
Idempotent

Write entries into the current page's localStorage.

Merges into what is already there rather than clearing it. Handy for setting feature flags, consent state or auth tokens before the page's own scripts read them.

localStorage is scoped per origin, so navigate to the site first — writing on about:blank goes nowhere. Most pages read these values only at startup, so reload after setting them.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesKey-value pairs to write, e.g. {"token": "abc", "locale": "de"}. Values must be strings — JSON-encode anything structured yourself.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description reveals important behavioral traits: it merges rather than clears, localStorage is origin-scoped, writes on about:blank are lost, and most pages read these values only at startup so a reload is needed. This gives the agent actionable expectations that the annotations alone do not provide.

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

Conciseness5/5

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

Four short sentences deliver the core action, the merge behavior, the origin scoping caveat, and the reload tip with no filler. The most important information is front-loaded and every sentence earns its place.

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

Completeness5/5

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

For a two-parameter tool with a fully described schema and output schema present, the description covers everything an agent needs to invoke it correctly: what it does, how it merges, when it is useful, what page context is required, and what to do afterward. No essential operational context is missing.

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

Parameters4/5

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

The schema already describes both parameters at 100% coverage, including the string-only value constraint and browser naming semantics. The description adds value by clarifying that items are merged into existing storage rather than replacing it, which directly affects how the items parameter behaves.

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

Purpose5/5

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

The description opens with 'Write entries into the current page's localStorage,' a specific verb and resource that clearly differentiates it from sibling get_local_storage and from evaluate_script. It also immediately distinguishes the merge behavior, so an agent knows exactly what operation this tool performs.

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

Usage Guidelines4/5

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

The description gives clear contextual guidance: it is handy for feature flags, consent state, or auth tokens before page scripts read them, and it warns to navigate to the site first because about:blank storage goes nowhere. It stops short of explicitly contrasting this tool against alternatives like evaluate_script, so it earns a 4 rather than a 5.

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

set_proxyRoute traffic through a proxyA
Destructive

Send this browser's traffic through a proxy, with credentials if it wants them.

The proxy itself is a launch flag, so it needs a browser restart — which on an ephemeral profile also drops its cookies. Authentication is handled live: an authenticating proxy stops Chrome at a native dialog that no page and no other CDP command can dismiss, so the page just never loads and nothing says why.

Answering it means enabling the Fetch domain, which pauses every request for a round trip, so that only happens when a username is actually set. A proxy that does not ask for credentials costs nothing extra.

Call with no arguments to see what is configured. The password is never echoed back. Values set here override the NODRIVER_PROXY environment variable.

ParametersJSON Schema
NameRequiredDescriptionDefault
bypassNoHosts to reach directly, Chrome's own syntax, e.g. "localhost;127.0.0.1;*.internal". Empty string sends everything through the proxy.
serverNoProxy to route through, e.g. "http://198.51.100.7:8080" or "socks5://198.51.100.7:1080". A bare "host:port" is treated as http. Pass "" to remove the proxy; omit it to leave the current one alone.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
restartNoRestart Chrome now so the proxy takes effect, closing all open pages. Default true; false defers it to the next browser start.
passwordNoPassword that goes with `username`.
usernameNoUsername, for a proxy that demands authentication. Chrome ignores credentials embedded in the proxy URL, so they have to be given here.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only supply destructiveHint and idempotentHint flags; the description adds substantial behavioral detail: restart drops cookies on ephemeral profiles, authenticating proxies block at an undismissable native dialog, enabling Fetch pauses requests only when a username is set, and passwords are never echoed. No contradiction with annotations.

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

Conciseness4/5

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

The description is longer than minimal, but each paragraph carries a distinct operational consequence: purpose, restart/side effects, auth tradeoffs, and read/no-echo behavior. The core action is front-loaded, and while some phrasing could be tightened, nothing is redundant filler.

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

Completeness5/5

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

For a mutation tool with six optional parameters and no enums, the description covers invocation modes, side effects, failure modes, performance impact, and environment precedence. An output schema exists, so return-value explanation is not required; an agent has enough to call this correctly and anticipate consequences.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real parameter-level meaning: calling with no arguments reads current configuration, auth handling is tied specifically to username being set, and password behavior is documented. This goes beyond the schema's property descriptions.

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

Purpose5/5

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

The description opens with a specific action on a concrete resource: 'Send this browser's traffic through a proxy', and adds credential handling, no-argument inspection, and environment-variable precedence. This makes the tool clearly distinct from siblings like set_browser_flags or block_resources.

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

Usage Guidelines4/5

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

It gives clear operational context: call with no arguments to see configuration, values override NODRIVER_PROXY, and the restart behavior is explained. However, it doesn't explicitly name an alternative tool or state when not to use this tool, so it falls short of full routing guidance.

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

shutdown_browserShut down a browserA
DestructiveIdempotent

Quit one browser's Chrome and free its name, releasing all memory behind it. Use it when an agent is finished with its browser.

The difference to close_browser: close_browser quits Chrome but keeps the browser, so its selected profile and runtime flags survive and the next call relaunches Chrome with them. shutdown_browser discards that too, and the name starts fresh if it is ever used again.

The "default" browser cannot be retired, since it is the server itself; shutting it down quits its Chrome and resets it. A browser you attached to with use_running_browser is only detached from, never closed: it belongs to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoName of the browser to shut down.default

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate destructiveHint and idempotentHint, but the description adds significant beyond-schema context: this frees the browser name, releases memory, discards profile and runtime flags for future relaunches, resets the default browser rather than retiring it, and never closes user-attached browsers. That fully discloses the destructive and side-effect behavior.

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

Conciseness5/5

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

The description is concise and well-structured: main purpose first, followed by the key differentiator, then special cases. Every sentence carries necessary information, and no filler or repetition exists.

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

Completeness5/5

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

For a destructive tool with a single optional parameter and no output schema, the description covers all needed context: what is destroyed, persistence behavior, special handling of 'default', and the constraint on user-attached browsers. An agent has enough information to call this tool correctly and avoid misuse.

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

Parameters3/5

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

The single parameter 'browser' is fully documented in the schema with its name and default value (100% schema coverage), so the baseline is 3. The description adds useful behavioral context about the 'default' browser and attached browsers, though it does not add new parameter-format or value guidance beyond what the schema already provides.

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

Purpose5/5

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

The description opens with a specific action—'Quit one browser's Chrome and free its name'—which clearly identifies the resource and the operation. It also explicitly differentiates itself from close_browser, so an agent can distinguish the two without needing to inspect other schemas.

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

Usage Guidelines5/5

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

It states the exact trigger: 'Use it when an agent is finished with its browser.' It then compares with close_browser and explains when that alternative is appropriate, and it warns that attached browsers and the 'default' browser are handled differently. This gives clear when-to-use and when-not-to-use guidance.

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

take_memory_snapshotTake heap snapshotA

Capture a V8 heap snapshot of the page, for memory-leak debugging.

Writes the raw .heapsnapshot file for Chrome DevTools -> Memory -> Load. The usual workflow is two snapshots taken around a suspect interaction, then comparing retained objects between them.

On a heavy page a snapshot can be hundreds of megabytes and take several seconds; the response reports the resulting file size.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathYesLocal path to write the .heapsnapshot file to. Open it in DevTools -> Memory -> Load profile.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only indicate non-read-only and non-idempotent; the description adds that it writes a raw .heapsnapshot file, can be hundreds of MB, take several seconds, and reports file size. This meaningfully informs an agent of side effects and cost beyond structured annotations.

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

Conciseness5/5

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

Three compact paragraphs each add distinct value: purpose, workflow/format, and cost/response. All sentences are informative and front-loaded, with no filler.

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

Completeness5/5

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

With an output schema present, the description needn't define return values. It explains purpose, workflow, file output, scale, and latency—everything an agent needs to invoke and interpret the tool correctly is present.

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

Parameters3/5

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

Input schema covers both parameters with detailed descriptions, including the browser naming semantics. The description doesn't add parameter-specific detail, but the high schema coverage makes that acceptable; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('Capture'), resource ('V8 heap snapshot of the page'), and use case ('memory-leak debugging'). The .heapsnapshot format and DevTools destination distinguish it clearly from sibling snapshot/navigation/perf tools.

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

Usage Guidelines4/5

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

The description gives a concrete workflow: take two snapshots around a suspect interaction and compare retained objects. This implies when to use it (memory-leak debugging) and frames it as a comparative diagnostic operation, though it doesn't explicitly name alternatives or exclusions.

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

take_screenshotTake screenshotA
Read-only

Capture the page, the viewport or a single element as an image.

Do NOT use this to read a page. take_snapshot gives you the same content as searchable text, is dramatically smaller, and yields the uids every interaction tool needs. Use a screenshot only when you genuinely need pixels: layout and styling checks, visual regression, or text that exists only inside an image.

Element capture needs a uid from the current snapshot. Without file_path the image is returned inline as a base64 data URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNoCapture just this element, using a uid from the most recent take_snapshot. Cannot be combined with full_page. Empty string captures the page.
formatNoImage format. "png" is lossless and the default; "jpeg" or "webp" with a quality setting are far smaller, which matters for full-page captures.png
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
qualityNoCompression quality from 1 to 100, for jpeg and webp only. Ignored for png. 0 leaves Chrome's default.
file_pathNoWrite the image to this local path. Omit to get a base64 data URL inline in the response — that is expensive, so prefer a file for full-page or high-DPR captures.
full_pageNoCapture the whole scrollable page rather than just the visible viewport. Cannot be combined with `uid`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description does not contradict them. It adds some context by noting the inline base64 data URL behavior when file_path is omitted and the uid requirement for element capture, but these points are also present in the schema and there is no deeper behavioral disclosure such as side effects, permissions, or performance limits.

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

Conciseness5/5

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

The description is compact and well-structured: the core capability comes first, followed by an explicit anti-pattern with alternative, and a final caveat about element capture and output format. Every sentence earns its place, with no wasted words.

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

Completeness5/5

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

With all six parameters documented in the schema and an output schema provided, the description covers the remaining cross-cutting concerns: what screenshots are for versus text snapshots, the uid prerequisite, and the inline-vs-file output mode. Nothing an agent needs to invoke this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description restates the uid-from-current-snapshot requirement and the inline-vs-file_path behavior, both already documented in the parameter descriptions, without adding new parameter-specific meaning.

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

Purpose5/5

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

The description opens with a precise verb-plus-resource statement: 'Capture the page, the viewport or a single element as an image.' It then explicitly contrasts itself with take_snapshot, so an agent can immediately distinguish pixel capture from text extraction.

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

Usage Guidelines5/5

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

It says when not to use the tool ('Do NOT use this to read a page'), names the alternative (take_snapshot), and gives the exact condition for using screenshots ('only when you genuinely need pixels: layout and styling checks, visual regression, or text that exists only inside an image'). It also states the prerequisite for element capture (a uid from the current snapshot).

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

take_snapshotTake page snapshotA
Read-only

Read the page as compact text, with a uid for every element.

This is the primary way to see a page, and the source of the uids that click, fill, hover, drag and upload_file all take. Prefer it over take_screenshot for anything but a genuine visual check: it is searchable, far smaller, and it is what makes interaction possible at all.

The output is the accessibility tree — roles, names, values and states, indented by nesting — with Chrome-internal and purely presentational nodes filtered out unless verbose is set.

A URL on the same origin as the page is printed relative to it — the root node carries the absolute one, so nothing is lost and a link-dense page costs noticeably less to read.

uids stay stable across snapshots for elements that did not change, but any page change can invalidate them. Whenever a tool reports "unknown uid", take a fresh snapshot and use the new uid. Output is capped at 200 000 characters.

Frames are included and marked, so an element inside an iframe gets a uid like any other and click, fill and evaluate_script work on it unchanged.

For plain page text without uids, get_page_content is cheaper; to find elements by CSS selector, use query_selector.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
verboseNoReturn the complete accessibility tree, including nodes normally filtered out as noise and containers that are otherwise collapsed. Much larger — use it only when an element you need is missing from the default output.
file_pathNoWrite the snapshot to this local path instead of returning it — useful for very large pages you intend to search rather than read in full.
include_framesNoAlso read the page's iframes and splice each one in under the element that hosts it. On by default, because Chrome's accessibility tree stops at a frame boundary and anything inside an iframe would otherwise be invisible. Set false on a page with many frames to keep the output small.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/destructive annotations, the description discloses the output shape (accessibility tree with roles, names, values, states), filtering behavior, 200,000-character cap, relative URL printing, frame inclusion, and uid invalidation on page changes. No statement contradicts the annotations.

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

Conciseness5/5

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

The description is long but information-dense: definition, routing guidance, output format, uid lifecycle, frame behavior, and alternatives each earn their place. It front-loads the core purpose and avoids repeating schema boilerplate.

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

Completeness5/5

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

With full parameter schemas and an output schema present, the description still adds the operational context an agent needs: size cap, uid stability, frame handling, relative URLs, and recovery instructions. Nothing critical for calling the tool correctly is missing.

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

Parameters3/5

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

All four parameters already have detailed schema descriptions at 100% coverage, so the baseline is 3. The description reinforces the meaning of 'verbose' and frame inclusion, but it does not meaningfully add semantic detail about 'browser' or 'file_path' beyond what the schema already provides.

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

Purpose5/5

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

The description opens with a specific operation—'Read the page as compact text, with a uid for every element'—and clearly identifies the tool as the primary snapshot mechanism. It also distinguishes itself from take_screenshot, get_page_content, and query_selector, so an agent can select it without ambiguity.

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

Usage Guidelines5/5

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

It gives direct routing rules: prefer this over take_screenshot except for a genuine visual check, use get_page_content for plain text without uids, and use query_selector for CSS-selector lookup. It also signals when to use verbose mode and when a fresh snapshot is needed after a stale uid.

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

type_textType textA

Type text into whatever element currently has focus.

Appends at the caret instead of replacing, and needs something focused already — click the field first, or use fill, which takes a uid, clears the field and needs no separate focus step.

Prefer fill for ordinary form filling. Use type_text when you must add to existing content, or for widgets that only react to raw key events such as contenteditable, rich-text and canvas editors.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to type, one character at a time.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
submit_keyNoKey to press once typing finishes, e.g. "Enter" to submit a search box or "Tab" to move to the next field. Empty string presses nothing.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavioral detail beyond the annotations: it appends at the caret, does not replace existing content, requires focus, and works through raw key events for contenteditable/rich-text/canvas widgets. This clarifies the mutation semantics beyond the bare readOnlyHint=false and idempotentHint=false flags.

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

Conciseness5/5

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

The description is compact and well-structured: main behavior first, then the critical focus/caret nuance, then explicit routing guidance. Every sentence contributes either behavioral clarity or usage direction, with no filler or repetition of schema details.

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

Completeness5/5

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

Given the annotations, full schema coverage, and an existing output schema, the description covers everything an agent needs to decide when to use the tool and how to invoke it correctly. It explains the focus prerequisite, the difference from `fill`, and the special widgets it supports, leaving no critical gap.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents `text`, `browser`, and `submit_key`. The description provides useful operational context, such as the focus requirement and when `fill` is preferable, but it does not add new parameter-level meaning beyond what the schema already states.

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

Purpose5/5

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

The description opens with a specific verb + resource: 'Type text into whatever element currently has focus.' It further distinguishes itself from the sibling `fill` by explicitly stating it appends at the caret rather than replacing, so an agent can tell the two apart without inspecting schemas.

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

Usage Guidelines5/5

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

The description gives an explicit decision rule: 'Prefer fill for ordinary form filling. Use type_text when you must add to existing content, or for widgets that only react to raw key events.' It also warns that a focused element is required and tells the agent to click first, making the when-to-use and prerequisites unambiguous.

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

upload_fileUpload fileA

Attach a local file to a file input on the page.

Sets the input's files directly over CDP, so no OS file-picker dialog ever opens — clicking an upload button normally would open one, and that blocks every further tool call until a human dismisses it.

Chrome renders a file input with an internal shadow button, and that is what the accessibility tree exposes, so the uid you can see is usually not the input itself. This resolves to the real input: the element, one inside it, the input a label controls, or one just above in the tree.

The result is read back. If the page's own uploader consumed the file straight away, the response says so, which is a successful upload rather than an empty input.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesuid of the file input, or of the button, label or drop zone in front of it — the real <input type="file"> is resolved from there. Comes from the most recent take_snapshot.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
file_pathYesAbsolute path to a local file on the machine running this server.
include_snapshotNoAppend a fresh page snapshot to the response. Worth it when this action changes the page and take_snapshot would be your next call anyway — it saves a round trip, at the cost of a much larger response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, idempotentHint=false, openWorldHint=true, destructiveHint=false. The description adds meaningful behavioral context: file selection happens over CDP (no dialog), the shadow-DOM resolution strategy, the blocking hazard of a dialog, and how to interpret the response when the page consumes the file immediately.

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

Conciseness5/5

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

Purpose is front-loaded in the first sentence and the remaining paragraphs each explain a distinct behavior or hazard without redundancy. The length is justified by the non-obvious CDP/shadow-DOM behavior and response interpretation.

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

Completeness5/5

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

For a mutating file-upload tool with an output schema and a full input schema, the description covers prerequisites (local file path), the failure mode to avoid (dialog blocking), the resolution of uid ambiguities, and the success signal in the response. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is already 100% with detailed descriptions for uid, browser, file_path, and include_snapshot, so the baseline is 3. The description adds extra uid semantics (usually the accessibility-tree element, not the raw input, and how it is resolved) that sharpens parameter use beyond the schema.

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

Purpose5/5

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

States a specific verb (attach) and resource (a local file to a file input on the page), and immediately contrasts itself with clicking an upload button. The mechanism and target element are unambiguous, so an agent can distinguish upload_file from siblings like click or fill.

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

Usage Guidelines5/5

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

Explicitly warns that clicking an upload button would open an OS file-picker dialog that blocks further calls, making this the tool to use in that scenario. It also clarifies that the uid may point at the shadow button/label rather than the input and that the tool resolves it, so agents know what uid to pass without guessing.

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

use_profileUse persistent profileA
DestructiveIdempotent

Switch the browser to a named persistent profile.

Use it to pick up the cookies, logins and extensions stored in an earlier session, so a run starts out already authenticated.

Restarts the browser and closes every open page. The profile has to exist already — create it first with create_profile. Only one browser may use a profile at a time; a second instance pointed at the same one fails to start.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of an existing persistent profile, as shown by list_profiles. Pass "", "temp", "ephemeral" or "none" to switch back to an ephemeral profile.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark the tool as destructive, but the description adds the concrete consequences: it restarts the browser, closes every open page, and fails when another browser already uses the profile. This is exactly the behavioral context needed beyond the annotation flags.

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

Conciseness5/5

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

Four sentences, each earning its place: the action is stated first, then the purpose, then the side effects, then the constraints. No filler or redundant restating of the schema.

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

Completeness5/5

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

The description covers what the tool does, why to use it, prerequisites, destructive side effects, and a failure mode. Since an output schema exists, extra return-value documentation is unnecessary. An agent has enough to decide whether and how to call it safely.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already fully documented. The description reinforces that the profile must already exist and adds the one-browser-per-profile concurrency rule, but it does not add meaningful parameter-specific details beyond the schema.

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

Purpose5/5

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

The first sentence states a specific verb and resource: 'Switch the browser to a named persistent profile.' The word 'persistent' and the mention of picking up cookies, logins, and extensions clearly differentiate it from use_temp_profile and use_running_browser.

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

Usage Guidelines5/5

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

The description explicitly says when to use the tool: to start already authenticated from an earlier session. It also gives a prerequisite and alternative step ('create it first with create_profile') plus a hard constraint: only one browser may use a profile at a time, so a second instance fails.

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

use_running_browserAttach to a running browserA
DestructiveIdempotent

Drive a Chrome that is already running, instead of launching a new one.

This is how you use a browser you are already signed into. Chrome locks its user-data-dir, so the profile holding your real logins cannot be opened a second time — attaching to the running instance is the only way in, and it saves rebuilding every login through the automation.

The user starts Chrome themselves, once:

chrome --remote-debugging-port=9222 --user-data-dir=/path/to/profile

then this tool attaches to it. Every tool then acts on that browser and its real tabs.

--user-data-dir is not optional, and it must not be Chrome's own default directory. Since Chrome 136 the port is refused there — Chrome starts normally, says nothing, and nothing ever listens, which is a confusing way to fail. So the everyday profile cannot be reached by adding the flag to it; it has to be a directory of its own, and a copy of an existing profile is accepted (--profile-directory then picks which profile inside it).

SECURITY: that profile becomes part of the agent's reach. Whatever it is signed into — mail, bank, company systems — is reachable from here, because a cookie jar is all or nothing. Point this at a profile you are willing to expose, not your everyday one.

While attached, close_browser and every profile switch only detach; they never close a browser they did not start. Return to a self-launched browser with use_temp_profile or use_profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNoHost the browser is listening on. Leave at 127.0.0.1 unless you are attaching to a browser on another machine or in a container.127.0.0.1
portNoThe remote debugging port Chrome was started with, e.g. 9222 for --remote-debugging-port=9222.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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

Despite annotations already flagging destructiveHint=true and idempotentHint=true, the description adds critical behavioral context: close_browser and profile switches only detach and never close a browser they did not start, and the attached browser becomes part of the agent's reach with all-or-nothing cookie access. It also explains a common failure mode (port refused without --user-data-dir) and the security risk of exposing a profile.

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

Conciseness4/5

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

The description is long but well-structured, with clear sections (SECURITY) and a logical flow. It front-loads the core purpose and then expands into prerequisites, security implications, and detach behavior. Every sentence contributes essential context for correct use, though it could be tightened without losing critical information.

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

Completeness5/5

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

For a complex tool that attaches to an external browser, the description covers everything an agent needs: the setup command, the user-data-dir requirement and its caveats, security warnings, behavior of related tools (close_browser, profile switches), and how to return to self-launched browsers. With an output schema present, no return-value details are missing. This is complete.

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

Parameters3/5

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

Schema description coverage is 100% — all three parameters have detailed descriptions covering host, port, and browser. The tool description adds minimal parameter-specific information beyond what the schema already provides (e.g., it mentions the default port but the schema does too). Since the schema does the heavy lifting, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description states a specific action ('Drive a Chrome that is already running') and clearly differentiates it from alternatives like use_temp_profile or use_profile. It explains the exact scenario (signed-in browser) and why this tool is the only way in, making the purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool ('a browser you are already signed into'), explains the underlying reason (Chrome locks the user-data-dir), and gives concrete prerequisites (the user must start Chrome with --remote-debugging-port and --user-data-dir). It also names the alternatives for returning to a self-launched browser, providing clear routing.

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

use_temp_profileUse temporary profileA
DestructiveIdempotent

Switch back to a fresh ephemeral profile, created and deleted per session.

This is the default. It leaves nothing behind on disk and lets many nodriver instances run concurrently without colliding on a profile directory.

Restarts the browser and closes all open pages. The profile you are leaving is not deleted — a persistent one keeps its cookies for the next use_profile. Anything held in the outgoing temp profile is gone.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the destructiveHint and idempotentHint annotations, the description discloses concrete side effects: it restarts the browser, closes all open pages, leaves nothing on disk, and destroys anything held in the outgoing temp profile. It also clarifies that leaving a persistent profile does not delete it, which helps the agent anticipate state changes.

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

Conciseness5/5

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

The description is concise and front-loaded: the core purpose appears in the first sentence, followed by key behavioral facts. Each sentence contributes meaningful information without padding or repetition.

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

Completeness5/5

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

For a tool with one optional parameter and an output schema, the description covers everything an agent needs: what the tool does, its default status, concurrency benefits, restart/closing behavior, and the persistence of the previous profile. Nothing critical is missing.

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

Parameters3/5

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

The single browser parameter is fully documented in the schema with 100% coverage, so the description does not need to explain it. The description adds no extra parameter-level meaning, which matches the baseline expectation for a fully covered schema.

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

Purpose5/5

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

The description states a specific action ('Switch back to a fresh ephemeral profile') and clearly identifies the resource being acted on. It distinguishes itself from persistent-profile siblings like use_profile by emphasizing ephemerality and per-session deletion.

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

Usage Guidelines4/5

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

The description explains that this tool is the default and contrasts it with the persistent profile behavior of use_profile, letting an agent infer when to choose each. It stops short of an explicit 'use this when X, use use_profile when Y' rule, but the context is clear enough.

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

wait_forWait for textA
Read-only

Wait until one of several texts appears on the page, then snapshot it.

The right way to wait after an action that starts loading — far more reliable than guessing a delay, and it returns the moment the text shows up instead of always burning the whole timeout.

On success the page snapshot is included in the response, so no separate take_snapshot call is needed.

Polls the visible text twice a second. To wait for an element rather than for wording, use wait_for_selector.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesTexts to wait for — the wait ends as soon as any one of them appears. Passing both outcomes, e.g. ["Welcome back", "Login failed"], lets one call tell you which happened. Matching is a case-sensitive substring test against the page's visible text.
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
timeoutNoMaximum wait in milliseconds before giving up.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only/non-destructive behavior. The description adds genuine behavioral context beyond that: polling interval ('twice a second'), the return of a snapshot on success, and the fall-through behavior (returns as soon as text appears rather than burning the whole timeout). It does not explicitly state timeout failure behavior, a minor gap, hence not a 5.

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

Conciseness5/5

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

Four concise, front-loaded sentences. Purpose, use-case, key behavior, and alternative are each given in separate efficient statements with zero filler. Every sentence earns its place.

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

Completeness5/5

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

For a tool with a full input schema (100% coverage), an output schema, and annotations covering safety, the description provides all needed context: when to use, what happens on success, polling behavior, and the sibling alternative. Nothing an agent needs to decide or invoke correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description repeats some parameter semantics (e.g., 'one of several texts') already in the schema but adds no new meaning beyond what the schema states. It earns the baseline but no more.

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

Purpose5/5

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

The description opens with a clear verb-resource-action statement: 'Wait until one of several texts appears on the page, then snapshot it.' This distinguishes it from the sibling wait_for_selector by explicitly naming the alternative and contrasting waiting for text vs. element.

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

Usage Guidelines5/5

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

It provides explicit usage context: 'The right way to wait after an action that starts loading' and contrasts with guessing a delay. It also names the alternative (wait_for_selector) and gives the condition for choosing that tool instead, leaving no ambiguity.

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

wait_for_selectorWait for elementA
Read-only

Wait until an element matching a CSS selector appears on the page.

The structural counterpart to wait_for: use it when you know the markup but not the wording, or when the wording is localised.

Polls about three times a second and returns as soon as the element shows up. Unlike wait_for it does not return a snapshot, so follow with take_snapshot when you intend to interact.

ParametersJSON Schema
NameRequiredDescriptionDefault
browserNoWhich browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.default
timeoutNoMaximum wait in milliseconds before giving up.
visibleNoAlso require the element to have a non-zero size. Use this with frameworks that insert an element into the DOM before rendering it — presence alone would otherwise resolve too early.
selectorYesCSS selector to wait for, e.g. "#login" or ".results .item".

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses polling frequency ('about three times a second'), immediate return on element appearance, and the notable behavioral difference from wait_for: it does not return a snapshot. This adds valuable runtime behavior context that annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-sentence definition, a usage condition, and a behavioral note with follow-up advice. Every sentence earns its place, with no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a wait-for tool with an output schema and detailed parameter descriptions, the description covers the key usage distinctions, behavioral characteristics, and necessary follow-up action. Nothing essential is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters in detail. The tool description adds no additional parameter semantics, which is acceptable under the baseline of 3 when the schema carries the full burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Wait until an element matching a CSS selector appears on the page.' It also distinguishes itself from the sibling wait_for by framing this as the 'structural counterpart,' so an agent can tell them apart immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is provided: use this tool when the markup is known but wording is not, or when wording is localized. It names the alternative (wait_for) and even instructs to follow with take_snapshot for interaction, making the usage context unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 70 tool updatesv2.5.0
    • Addedaudit_security
    • Changedblock_resources1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedbypass_insecure_warning1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedcapture_bodies
    • Changedcf_verify1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedclear_cookies1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedclick2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • addedInput schema / properties / if_covered
        Added value: +{
        +  "default": "report",
        +  "description": "What to do when something else sits on top of the element, so a real mouse click at its position would hit that instead. \"report\" (the default) does not click at all: it returns an error naming what is in the way, leaving the page untouched and the session indistinguishable from a person's. Dismiss the cookie banner, close the modal or scroll, then click again. \"synthetic_click\" dispatches the click on the element directly, which works through anything — but the page sees `isTrusted=false`, which is precisely the signal anti-bot systems look for. Choose it when the overlay cannot be dismissed, or when stealth does not matter on this site; not as a default.",
        +  "enum": [
        +    "report",
        +    "synthetic_click"
        +  ],
        +  "title": "If Covered",
        +  "type": "string"
        +}
    • Changedclick_at1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedclose_browser1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedclose_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedcreate_profile1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changeddelete_profile1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changeddisable_console_collection1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changeddrag1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedemulate2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • changedInput schema / properties / viewport / description
        Previous value: -"Viewport override as \"WIDTHxHEIGHTxDPR[,mobile][,touch][,landscape]\", e.g. \"375x812x3,mobile,touch\" or \"1920x1080x1\". The trailing flags are optional: `mobile` turns on mobile viewport behaviour, `touch` enables touch emulation, `landscape` sets the screen orientation. Empty string leaves the viewport unchanged."New value: +"Viewport override as \"WIDTHxHEIGHTxDPR[,mobile][,touch][,landscape]\", e.g. \"375x812x3,mobile,touch\" or \"1920x1080x1\". The trailing flags are optional: `mobile` turns on mobile viewport behaviour, `touch` enables touch emulation, `landscape` sets the screen orientation. Omitting `mobile` or `touch` leaves that setting as it is, so resizing after emulate_device keeps the phone's touch support; turn them off explicitly with `nomobile` / `notouch`. Empty string leaves the viewport unchanged."
    • Changedemulate_device1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedenable_console_collection1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedevaluate_script7 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • addedInput schema / properties / file_path
        Added value: +{
        +  "default": "",
        +  "description": "Write the JSON result to this local path instead of returning it — for extractions too large to put in the conversation.",
        +  "title": "File Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame
        Added value: +{
        +  "default": "",
        +  "description": "Run inside one of the page's frames instead of the main document: an index or frame id from list_frames. Runs in an isolated world, which shares the frame's DOM but not its own JavaScript variables, so use it to read and drive the DOM rather than to call the page's own functions. Ignored when `args` is given, since a uid already carries its frame.",
        +  "title": "Frame",
        +  "type": "string"
        +}
      • addedInput schema / properties / function / default
        Added value: +""
      • changedInput schema / properties / function / description
        Previous value: -"A JavaScript function expression, e.g. \"() => document.title\" or \"(el) => el.innerText\". It is invoked immediately and its return value is JSON-serialised back to you. Async functions are awaited, so \"async () => (await fetch('/api/x')).json()\" works. Return a value — console.log output is not captured."New value: +"A JavaScript function expression, e.g. \"() => document.title\" or \"(el) => el.innerText\". It is invoked immediately and its return value is JSON-serialised back to you. Async functions are awaited, so \"async () => (await fetch('/api/x')).json()\" works. Return a value — console.log output is not captured. Leave empty when using script_path."
      • addedInput schema / properties / script_path
        Added value: +{
        +  "default": "",
        +  "description": "Read the function from this local .js file instead of the `function` parameter. Use it for anything long or quote-heavy, where escaping the script into a JSON string is where the mistakes happen.",
        +  "title": "Script Path",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "function"
        -]
    • Addedexport_har
    • Changedfill1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedfill_form1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedget_computed_styles
    • Changedget_console_message1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedget_cookies1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedget_local_storage1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedget_network_request1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedget_page_content2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame
        Added value: +{
        +  "default": "",
        +  "description": "Read inside one of the page's frames instead of the main document: an index or frame id from list_frames. Chrome's DOM queries never cross a frame boundary, so anything inside an iframe is unreachable without this. The frame is read through an isolated world, which shares the DOM but not the page's own JavaScript variables. Empty string reads the main document.",
        +  "title": "Frame",
        +  "type": "string"
        +}
    • Changedhandle_dialog1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedhover1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedinspect_storage
    • Addedlist_browsers
    • Changedlist_console_messages1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedlist_frames
    • Changedlist_network_requests1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedlist_pages1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedlist_profiles1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedlist_sessions1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedload_session1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedmanage_extensions1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changednavigate_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changednew_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedperformance_start_trace1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedperformance_stop_trace1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedpress_key1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedquery_selector2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • addedInput schema / properties / frame
        Added value: +{
        +  "default": "",
        +  "description": "Read inside one of the page's frames instead of the main document: an index or frame id from list_frames. Chrome's DOM queries never cross a frame boundary, so anything inside an iframe is unreachable without this. The frame is read through an isolated world, which shares the DOM but not the page's own JavaScript variables. Empty string reads the main document.",
        +  "title": "Frame",
        +  "type": "string"
        +}
    • Changedreset_emulation1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedresize_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedsave_pdf1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedsave_session1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedscroll_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedscroll_to_selector1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedsearch_bodies
    • Addedselect_option
    • Changedselect_page1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedset_browser_flags1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedset_checked
    • Changedset_cookie1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedset_local_storage1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addedset_proxy
    • Addedshutdown_browser
    • Changedtake_memory_snapshot1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedtake_screenshot1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedtake_snapshot2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_frames
        Added value: +{
        +  "default": true,
        +  "description": "Also read the page's iframes and splice each one in under the element that hosts it. On by default, because Chrome's accessibility tree stops at a frame boundary and anything inside an iframe would otherwise be invisible. Set false on a page with many frames to keep the output small.",
        +  "title": "Include Frames",
        +  "type": "boolean"
        +}
    • Changedtype_text1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedupload_file2 fields changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
      • changedInput schema / properties / uid / description
        Previous value: -"uid of the <input type=\"file\"> element, from the most recent take_snapshot. It must be the file input itself, not the styled button or drop zone layered over it."New value: +"uid of the file input, or of the button, label or drop zone in front of it — the real <input type=\"file\"> is resolved from there. Comes from the most recent take_snapshot."
    • Changeduse_profile1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Addeduse_running_browser
    • Changeduse_temp_profile1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedwait_for1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
    • Changedwait_for_selector1 field changed
      • addedInput schema / properties / browser
        Added value: +{
        +  "default": "default",
        +  "description": "Which browser to act on. Each name is an independent Chrome, created on first use. Omit for the shared default; parallel agents each need their own name.",
        +  "type": "string"
        +}
  2. 57 tool updatesv1.7.2
    • First observedblock_resources
    • First observedbypass_insecure_warning
    • First observedcf_verify
    • First observedclear_cookies
    • First observedclick
    • First observedclick_at
    • First observedclose_browser
    • First observedclose_page
    • First observedcreate_profile
    • First observeddelete_profile
    • First observeddisable_console_collection
    • First observeddrag
    • First observedemulate
    • First observedemulate_device
    • First observedenable_console_collection
    • First observedevaluate_script
    • First observedfill
    • First observedfill_form
    • First observedget_console_message
    • First observedget_cookies
    • First observedget_local_storage
    • First observedget_network_request
    • First observedget_page_content
    • First observedhandle_dialog
    • First observedhover
    • First observedlist_console_messages
    • First observedlist_network_requests
    • First observedlist_pages
    • First observedlist_profiles
    • First observedlist_sessions
    • First observedload_session
    • First observedmanage_extensions
    • First observednavigate_page
    • First observednew_page
    • First observedperformance_start_trace
    • First observedperformance_stop_trace
    • First observedpress_key
    • First observedquery_selector
    • First observedreset_emulation
    • First observedresize_page
    • First observedsave_pdf
    • First observedsave_session
    • First observedscroll_page
    • First observedscroll_to_selector
    • First observedselect_page
    • First observedset_browser_flags
    • First observedset_cookie
    • First observedset_local_storage
    • First observedtake_memory_snapshot
    • First observedtake_screenshot
    • First observedtake_snapshot
    • First observedtype_text
    • First observedupload_file
    • First observeduse_profile
    • First observeduse_temp_profile
    • First observedwait_for
    • First observedwait_for_selector

TDQS

A4.3/5.0

Scored across 70 tools

Disambiguation5/5

Every tool targets a distinct action and resource, with descriptions that explicitly cross-reference alternatives (e.g., fill vs type_text vs press_key; take_snapshot vs get_page_content). Even subtle pairs like close_browser vs shutdown_browser are carefully delineated. There is little risk of an agent misselecting a tool.

Naming Consistency4/5

The overwhelming majority follow a verb_noun snake_case pattern (list_pages, create_profile, set_cookie). Minor deviations exist: cf_verify uses an abbreviation+verb, performance_start_trace inverts the verb position, and a few bare verbs (fill, click, hover, drag) stand alone. These are readable but break the strict pattern.

Tool Count2/5

70 tools is far beyond the typical well-scoped server and makes selection expensive for an agent. Although the domain of browser automation is broad, many niche features (audit_security, capture_bodies, inspect_storage, manage_extensions) could be separate services or consolidated. The count feels heavy rather than lean.

Completeness5/5

The surface covers the full browser automation lifecycle: pages, navigation, interaction, waiting, scrolling, forms, frames, dialogs, network, performance, storage, sessions, profiles, emulation, and browser configuration. There are no dead ends; the only conceivable gaps (e.g., download handling) can be worked around with evaluate_script or other existing tools. This is one of the most complete tool sets imaginable for its domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides AI assistants with full control over a real browser session via a Chrome extension, supporting 36 tools for navigation, data extraction, and DOM manipulation. It bypasses bot detection by utilizing the user's active browser session, including cookies, authentication tokens, and installed extensions.
    16 npm
    3
    MIT
  • A
    license
    A
    quality
    F
    maintenance
    An MCP server that provides LLMs with stealth browser automation capabilities via CloakBrowser to bypass bot detection services like Cloudflare and reCAPTCHA. It supports full page interaction, content extraction, and human-like behavior through 30 specialized tools.
    20
    52 PyPI
    13
    Apache 2.0
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Undetectable browser automation server for MCP-compatible AI agents, offering 225 tools across 32 sections to navigate, extract, clone pages, and bypass antibot systems like Cloudflare.
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Stealth Chrome MCP server for AI agents providing 77 tools, perfect bot detection scores, proxy pools, encrypted sessions, and live human handoff via Cloudflare tunnel.
    MIT