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: 65 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 (65 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 designnavigator.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 spotlist_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, timing, transfer size, redirect hops and failures, plus WebSocket frames in both directions. A 500, a 404, a redirect and a DNS failure are different lines, not the same one.

  • 👥 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

  • 🧩 65 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 themselvesfill 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, privateNetworkRequestPolicylocalNetworkAccessRequestPolicy) — 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 (65)

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 (3)

list_network_requests · get_network_request · block_resources

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 65 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 declaredquality 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

65 tools

Per-parameter schema docs

partial

✅ all 65 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

57 tools
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.

Applies to the current page session and stays in effect across navigations until called again with no types.

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.

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 annotations, the description discloses session-scoped persistence across navigations, the reset mechanism, and specific side effects on stylesheet-blocking for geometry-dependent operations. This enriches the idempotentHint with concrete behavioral expectations and potential failure modes.

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, each serving a distinct purpose: primary function, use-case benefit, and side-effect/scope warning. Every sentence earns its place with no repetition or filler, and the most important information 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?

With a single parameter fully described in the schema and an output schema present, the description covers behavior, side effects, scope, and reset, making it fully actionable for an agent. No additional return-value documentation is needed given the output schema.

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

Parameters4/5

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

The schema already provides 100% coverage, including recommended enum combinations and unblock semantics. The description adds value by explaining why stylesheet blocking breaks layout and reinforcing the trade-off, going slightly beyond the schema without duplicating 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 clearly states the tool's function: blocking images, fonts, stylesheets, or media to speed up page loads. It distinguishes itself from sibling tools by specifying the resource types and the performance motivation, 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 provides explicit when-to-use guidance (media-heavy pages, metered/proxied connections) and when-not-to-use (when layout-dependent behavior is needed, listing affected tools like click_at and wait_for_selector). It also explains how to reset via calling with no types, giving clear operational boundaries.

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

No parameters

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?

The description goes beyond the annotations by explaining the exact action performed ('Advanced -> Proceed click') and the behavior that it has no effect on other pages. This discloses the tool's scope and side effects, complementing the annotations without contradicting them.

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

Conciseness5/5

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

The description is concise and front-loaded, with the core action in the first sentence. Subsequent sentences provide necessary context and exclusions without any fluff. 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 zero-parameter tool with a simple action, the description is complete: it states what it does, when to use it, the implementation detail, and the non-effect on other page types. No gaps remain for an agent to correctly select and invoke the tool.

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

Parameters4/5

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

The tool has zero parameters, so the description carries no parameter burden. The baseline for 0 parameters is 4, and the description adds no unnecessary detail about parameters, which 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 names the specific action ('Click through Chrome's "Your connection is not private" interstitial') and clearly distinguishes it from generic click tools by scoping it to SSL/certificate warning pages. This is a specific verb+resource pairing that 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?

Explicitly states when to use the tool ('when a navigation lands on an SSL/certificate warning page') and when not to ('Has no effect on any other kind of page'). It explains the problem (snapshot shows warning page instead of expected content) and what the tool accomplishes, providing clear context and an exclusion.

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.

Requires opencv-python to be installed; without it this returns an error. Many challenges also clear by themselves after a few seconds, so wait_for(["some text from the real page"]) is worth trying first.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

Goes beyond annotations by disclosing the opencv-python dependency (returns error without it), the visual click mechanism, and the fact that many challenges clear on their own. This adds valuable behavioral context 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?

Three sentences, front-loaded with purpose, then usage context, then dependencies/alternatives. Every sentence provides essential information with no 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 zero-param tool with an output schema, the description covers prerequisites (opencv), usage scenarios, and behavior. It also suggests a fallback strategy (wait_for), making it comprehensive for the tool's complexity.

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 has zero parameters, so the baseline is 4. The description does not need to explain parameters because there are none, and it doesn't add extraneous parameter info.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Attempt to solve a Cloudflare Verify you are human challenge.' It uses a specific verb and resource, and distinguishes itself from sibling tools by targeting Cloudflare interstitials specifically.

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 states when to use: 'Use when a page is stuck on a Cloudflare interstitial — a checkbox widget, or Checking your browser before accessing.' It also recommends wait_for as an alternative first try, providing clear usage context.

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

No parameters

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?

The description goes beyond the destructiveHint and idempotentHint annotations by explaining the scope (browser-wide, not per site/tab), the lack of undo, and the fact that localStorage is untouched. This gives the agent critical context 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.

Conciseness5/5

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

Three short, focused paragraphs. The first sentence states the action, the second clarifies scope and consequences, and the third provides use cases and a caveat. Every sentence earns its place; no 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 no-parameter tool, the description covers all essential aspects: what it does, scope, irreversibility, recovery path, and edge case (localStorage). With an output schema present and no parameters, this is fully 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?

The tool has zero parameters, so the schema fully covers parameter semantics. The description adds behavioral context rather than parameter details, which is appropriate. The baseline of 4 applies here.

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 'Delete every cookie in the browser' with a specific verb and resource. It distinguishes itself from per-site or per-tab tools and from related siblings like get_cookies or set_cookie by emphasizing the browser-wide scope.

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 use cases: testing first-time-visitor flow or resetting consent banner decisions. Also provides an alternative for recovery via load_session, guiding the agent when to use this tool versus when to use a session restoration tool.

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 automatically, 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. Two situations force a scripted fallback (element.click() plus synthetic events, isTrusted=false): a touch-emulated target, where CDP mouse input can crash the renderer, and a CDP click that times out or errors. The response says so explicitly whenever that happens, so a detectable click is never silent. 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.
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

A5/5.0
Behavior5/5

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

The description discloses rich behavioral traits beyond the annotations: it sends real CDP input events with isTrusted=true, explains the two fallback scenarios and their consequences, notes that every step is bounded at 10s, and states that fallbacks are never silent. This is exactly the kind of context annotations do not provide. No contradiction exists.

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 delivers usage guidance and behavioral detail in an organized manner. Every sentence earns its place—there is no filler or repetition. The length is justified by the technical nuance it conveys.

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 3 parameters and an output schema, the description covers all essential aspects: purpose, alternative tool, fallback behavior, timing constraints, and error recovery. The presence of an output schema means return values need not be described, so nothing critical is missing. The description is fully self-sufficient for an agent to invoke the tool correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds significant meaning beyond the raw parameter definitions. It explains why uids are reliable, how to handle 'unknown uid' with a fresh snapshot, and the trade-off of include_snapshot (saves a round trip at cost of larger response). This meaningfully enhances an agent's ability to use the parameters correctly.

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 clearly distinguishes this tool from the sibling click_at by stating it is preferred and explaining why (uid survives layout shifts). The purpose is immediately 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 to prefer this over click_at, provides the rationale, and details the specific situations (touch-emulated target, timeout/error) that force a scripted fallback. This gives clear when-to-use and when-not-to-use guidance, going beyond vague hints.

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.
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?

The description reveals that coordinate clicks are not robust against layout shifts, use real CDP events with the same scripted fallback and 10s bound as `click`, and that coordinates are in CSS pixels ignoring device pixel ratio. These details extend well beyond the sparse annotations and provide critical execution context.

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 in four tight paragraphs, each addressing a specific aspect: core function, alternative usage, coordinate constraints, and behavioral equivalence. No redundant or filler sentences, and the most important information 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?

For a simple click action, the description covers when to use it, how it differs from `click`, coordinate system details, viewport requirements, and event behavior. With an output schema present, this is fully complete for an agent to invoke correctly without additional assumptions.

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 all 4 parameters (100% coverage), so baseline is 3. The description adds meaningful semantics for x/y by stating they are in CSS pixels, viewport-relative, and matching emulate/resize_page, plus the viewport constraint. These additions clarify the coordinate system beyond the schema, though other parameters are not additionally addressed.

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 'Click a raw viewport coordinate instead of an element,' clearly stating the verb, resource, and distinguishing from `click` which targets elements. It further clarifies use cases for surfaces without addressable elements, such as canvases, maps, and video players.

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 instructs to use `click` with a uid when the target appears in a snapshot, and reserves coordinates for non-element surfaces. It also provides a prerequisite: scroll into view if the point is outside the viewport, naming `scroll_page` and `scroll_to_selector` as alternatives.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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?

The description discloses critical behavioral traits beyond the destructiveHint annotation: it closes every tab, sacrifices all browser state on ephemeral profiles, preserves data on persistent profiles, and automatically relaunches on the next tool call. This is rich, honest behavioral context that fully aligns with and expands upon 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 concise and well-structured. Every sentence serves a purpose: the first gives the core action, the second differentiates from close_page and explains the relaunch behavior, and the third covers data persistence and the save_session recommendation. No word is wasted, and the structure facilitates quick scanning.

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

Completeness5/5

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

Given the tool's simplicity (no parameters), the description is complete. It explains the tool's effect, its side effects on different profiles, when to use it, and the relaunch behavior. The presence of an output schema reduces the need to describe return values, and the description covers all necessary contextual aspects.

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

Parameters4/5

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

The tool has zero parameters, so parameter semantics are inherently satisfied. The description does not need to explain any parameter details, and the schema coverage is 100% by vacuity. A baseline of 4 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, unambiguous action: 'Quit Chrome entirely, closing every tab.' It clearly identifies the resource (Chrome browser) and the scope (all tabs), and explicitly contrasts itself with the sibling tool close_page, making its unique purpose obvious.

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 over close_page, states that it's the mechanism to apply pending launch flags, and advises saving session data before use on ephemeral profiles. These are clear, actionable usage guidelines with direct alternatives and prerequisites.

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
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.9/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description reveals critical behavioral traits: the last-tab restriction, selection clearing with fallback to the most recently opened tab, and index shifting. It also instructs the user to re-read remaining page indices from the response, preventing stale references. This is rich, actionable 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 concise and well-structured: a one-sentence purpose, then a caveat with an alternative, then an important behavioral note about selection, and finally a critical instruction about return values. Every sentence contributes value with no redundancy or fluff.

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

Completeness5/5

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

For a simple tool with a single optional parameter, the description covers all essential aspects: the action, edge cases (last tab), side effects on selection, and return semantics. The availability of an output schema reduces the need to detail the exact return format, but the description still mentions the key behavior of returning remaining pages. This is complete for the tool's complexity.

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 provides 100% coverage for page_id, including the -1 default and its meaning. The description goes further by noting that indices shift after a close, implying that page_id values become stale and must be refreshed from the response. This adds semantic value beyond the schema, earning a 4 rather than a baseline 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?

The description opens with 'Close a single browser tab,' which is a specific verb-resource pair that immediately distinguishes this from close_browser. It also clarifies the constraint that the last tab cannot be closed, reinforcing the tool's exact scope. This clearly differentiates it from related 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 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 an alternative: 'The last remaining tab cannot be closed — use close_browser to shut Chrome down entirely.' This provides an explicit exclusion and directs users to the correct sibling tool. Additionally, it explains the selection-fallback behavior, giving clear context for 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.

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.
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.9/5.0
Behavior5/5

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

Beyond annotations, the description discloses key behavioral traits: 'nothing changes until you activate it', 'An existing profile of the same name is left untouched rather than overwritten', storage path under ~/.nodriver-mcp/profiles/<name>, and the one-instance-per-profile constraint. These add meaningful context 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 four sentences, front-loaded with a crisp definition, followed by high-value context (persistence, alternatives, side effects, path, concurrency). Every sentence contributes new information, with no fluff 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?

Given the tool's moderate complexity, annotated metadata, and fully described schema, the description covers all necessary aspects: purpose, alternative tools, side effects, safety, storage location, and usage constraints. No major gaps remain.

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 parameters have detailed descriptions already. The description adds extra context beyond the schema by explaining that profiles live at a specific filesystem path and that activation can happen later via use_profile, which enriches understanding of the `activate` parameter. However, the schema already covers the immediate meaning of both parameters, so not a 5.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Create a named persistent Chrome profile — a reusable user-data dir.' It clearly distinguishes this from siblings by calling it 'the sturdier alternative to save_session / load_session' and by explaining persistent profiles keep cookies/logins between runs. This makes the tool's 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?

Explicitly positions the tool against alternatives: 'It is the sturdier alternative to save_session / load_session.' It also explains that creation alone is harmless and that activation can happen later via use_profile, giving clear context for when to use this tool versus siblings. The concurrency warning ('Only one browser instance can use a given profile at a time') provides a practical when-not/limitation.

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.

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?

The description goes well beyond the destructiveHint annotation by detailing exactly what is removed (cookies, logins, history, extensions) and confirming there is no undo. It also discloses the active profile constraint, which is critical for safe invocation.

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, purposeful sentences. It front-loads the main action and then adds necessary warnings without any fluff 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?

Given the destructive nature, the annotations, the output schema, and the single well-documented parameter, the description fully covers the essential behavior, the irreversible consequences, and a key edge case. Nothing important 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 schema already provides 100% coverage for the single 'name' parameter, including a description referencing list_profiles. The tool description adds no additional parameter semantics, 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 description clearly states the action ('Permanently delete'), the resource ('persistent Chrome profile directory'), and emphasizes irreversibility. It distinguishes from siblings like create_profile/use_profile by highlighting permanence.

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 explicit note that the active profile cannot be deleted and the instruction to switch away with use_temp_profile first provides practical usage context and names an alternative tool. While it doesn't exhaustively cover all edge cases, it gives clear actionable guidance.

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

No parameters

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 idempotentHint annotation, the description explains the underlying mechanism (turns off CDP Runtime domain), the anti-bot detection benefit (quieter, harder-to-detect default), and the key side effect that 'Messages already collected stay readable; only new ones stop arriving.' This is exactly the kind of behavioral context that helps an agent predict outcomes.

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

Conciseness5/5

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

The description is three tight sentences, front-loaded with the main action, then providing rationale and a side effect. Every sentence earns its place—no fluff, no redundant restating of the title. It is a model of concise yet informative writing.

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

Completeness5/5

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

For a zero-parameter tool with an output schema, the description provides all necessary context: what it does, when to use it, why it matters, and what happens to collected data. It is fully complete for the tool's complexity and leaves no major behavioral questions unanswered.

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 baseline is 4. The description adds no parameter-level details because none are needed. It doesn't need to compensate for any schema gaps since the schema is empty and coverage is 100%.

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: 'Stop capturing console output on the current page.' This clearly distinguishes it from sibling tools like enable_console_collection and list_console_messages. The purpose is unambiguous and action-oriented.

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 provides clear context for when to use: 'once you are finished debugging and the page still has anti-bot checks ahead of it.' This implies when it's appropriate, but it doesn't explicitly mention alternatives or exclusionary cases (e.g., when you still need new messages). Still, the context is strong enough to guide the agent.

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. Works for native HTML5 drag-and-drop and for mouse-driven sortable lists.

Some JS drag libraries require a stream of intermediate mousemove events that this does not emit; if a drag silently does nothing, drive it manually with click_at and press_key instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_uidYesuid of the element to drop onto, from the most recent take_snapshot.
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.9/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses a key limitation: some JS libraries need intermediate mousemove events that this tool does not emit. It also warns about silent failures and suggests a workaround. This is valuable behavioral context not inferable from 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 concise yet rich: three short paragraphs cover the action, a prerequisite, and a behavioral caveat with a workaround. Every sentence serves a distinct purpose; no filler or redundancy.

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

Completeness5/5

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

For a complicated interaction tool like drag-and-drop, the description is complete: it covers prerequisites, supported scenarios, limitations, and alternatives. The input schema and output schema handle parameter details and return values, leaving the description to add critical operational context.

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 slight semantic value by clarifying that 'both uids must come from the same take_snapshot,' emphasizing a constraint not made explicit in the schema (which only says 'from the most recent take_snapshot' for each). This helps disambiguate the relationship between from_uid and to_uid.

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 drag-and-drop action: 'Drag one element onto another (press, move, release).' This verb+resource phrasing distinguishes it from sibling tools like click, hover, and click_at.

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 explains when to use the tool (for native HTML5 drag-and-drop and mouse-driven sortable lists) and provides an alternative when it fails: 'drive it manually with click_at and press_key instead.' It also notes the prerequisite that both uids come from the same take_snapshot.

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.

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
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. 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 (idempotentHint=true, destructiveHint=false), the description discloses important behavioral traits: persistence across navigations, the independent-parameter behavior, and the concrete side effect that enabling `touch` changes `click` behavior (falls back to scripted path with isTrusted=false). It also warns about UA client hints not being touched by the user_agent parameter. This adds meaningful context beyond what 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.

Conciseness5/5

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

The description is appropriately sized: four sentences, each serving a distinct purpose—listing capabilities, stating scope and parameter usage, mentioning the alternative tool, and warning about a behavioral interaction. No redundant or vague phrasing; the most important information 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?

With 6 fully schema-described parameters, an output schema present, and annotations covering mutability and idempotence, the description still adds crucial context: persistence, how to reset via reset_emulation, the explicit alternative emulate_device, and the touch-click caveat. This is sufficient for an agent to select and safely invoke the tool without additional external knowledge.

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 that 'Every parameter is independent — pass only what you want to change, leave the rest at their defaults,' which clarifies the default-value semantics beyond the schema. It also highlights the interaction between the viewport's `touch` flag and click behavior, which is not evident from the schema alone. These additions justify a 4, though the schema already provides thorough descriptions for each 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 a specific verb and the list of emulatable resources: 'Emulate network, CPU, geolocation, user agent, color scheme or viewport.' It clearly distinguishes from the sibling tool emulate_device by explicitly naming it as the alternative for real phone/tablet emulation, and also mentions reset_emulation for clearing the state.

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: 'To emulate a real phone or tablet, use emulate_device instead' and explains why (coherent set of user agent, client hints, viewport, DPR, touch). It also states the scope ('Applies to the selected page and persists across navigations until reset_emulation') and how to use parameters independently with defaults.

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.
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?

The description discloses rich behavioral details beyond annotations: all signals are set together to avoid contradictions, ipad_air deliberately reports desktop-class Safari with touch and no client hints, emulation survives navigation, and passing `device` to new_page/navigate_page is required for first-request signals. This complements the idempotentHint and non-destructive 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 well-structured and front-loaded: a one-sentence purpose, then usage justification, preset details, and scope/undo notes. Each sentence earns its place; no filler or redundancy.

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

Completeness5/5

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

For a tool with 5 params, an output schema, and good annotations, the description covers the key contextual aspects: what the preset includes, when to use an alternative, page-scope behavior, and how to undo. The remaining parameter semantics are fully handled by 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% with detailed parameter descriptions, so the baseline is 3. The description adds value by explaining what 'internally consistent' means (why presets matter) and elaborating on the ipad_air preset's specific behavior, which aids parameter selection beyond the raw 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: 'Emulate a phone or tablet with one internally consistent set of signals.' It clearly distinguishes itself from the sibling 'emulate' tool by emphasizing preset-based consistency and positioning itself as the preferred approach for mobile work.

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 states when to use this tool ('Preferred over assembling `emulate` parameters by hand for mobile work') and gives concrete alternatives: use `new_page` or `navigate_page` for first-request signals, and `reset_emulation` to undo. This offers clear decision guidance versus siblings.

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

No parameters

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 (idempotentHint=true, readOnlyHint=false), the description discloses significant behavioral context: it enables the CDP Runtime domain, explains why it is opt-in (anti-bot scripts probe for it), and notes that it applies per page. This adds value beyond what annotations provide and helps the agent understand side effects and stealth implications.

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 first sentence gives the core purpose, followed by short, informative sentences about prerequisites, rationale for opt-in, and per-page behavior. Every sentence earns its place; no filler or redundancy.

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

Completeness5/5

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

For a tool with no parameters and an output schema, the description covers all necessary context: when to call it, its relationship to related tools, why it is opt-in, and per-page behavior. The output schema handles return values, so no additional return explanation is needed.

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 has zero parameters, so the description cannot add parameter-specific meaning. Per the baseline rule for 0 params, a score of 4 is appropriate. The description focuses on behavior and prerequisites, which is all that is needed here.

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

Purpose5/5

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

The description clearly states the tool's action and resource: 'Start capturing console output on the current page.' This is a specific verb+resource construction that immediately distinguishes it from sibling tools like list_console_messages, get_console_message, and disable_console_collection.

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 usage guidance: 'Call this before list_console_messages or get_console_message' and explains the alternative (network capture is always on). It also specifies when not to use it (when stealth matters) and mentions the companion disable_console_collection for cleanup. Additionally, it clarifies the per-page scope.

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. Errors are returned as a string beginning with "Error:" rather than raised.

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.
functionYesA 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.

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 substantial behavioral detail beyond annotations: runs in the main world, args become live DOM element references, return values must be JSON-serialisable, async functions are awaited, errors are returned as strings, and console.log output is not captured. These are non-obvious runtime behaviors that an agent needs to know, and they do not contradict the provided 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 four sentences, front-loaded with the core purpose, followed by usage context and critical behaviors. Each sentence carries distinct, necessary information with no filler or redundancy, making it efficient and 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 tool with only 2 parameters and full schema coverage, the description covers all essential aspects: invocation mode, argument semantics, return serialization constraints, async handling, error behavior, and a limitation (console.log not captured). With an output schema also present, nothing important is left unexplained.

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 operational context: args resolve to DOM nodes rather than strings, page-level vs. element-scoped execution, and the requirement to map DOM nodes to plain values in the return. This supplements the schema's already-solid parameter descriptions with practical usage nuance.

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

Purpose5/5

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

The description clearly identifies the tool as executing JavaScript in the page and returning JSON, and goes further by positioning it as the 'escape hatch' for scenarios other tools don't cover, with concrete examples like reading computed styles and calling page APIs. This strongly distinguishes it from sibling tools such as click, take_snapshot, and navigate_page.

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 provides an explicit when-to-use heuristic: 'the escape hatch for anything the other tools do not cover', with illustrative use cases. It also explains the two invocation modes (page-level vs. element-targeted via args). It doesn't name specific alternative tools or say when not to use it, leaving a small gap in guidance.

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 or select element.

Clears the field first, then types the value character by character so that input events fire and React/Vue-style controlled components actually register the change (assigning .value directly does not). For , the option is selected by value and a change event is dispatched.

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.
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 thoroughly discloses behavior beyond annotations: it clears the field first, types character by character to trigger input events for React/Vue controlled components, and for <select> it selects by value and dispatches a change event. This adds significant value over the annotations (readOnlyHint=false, destructiveHint=false) and the schema, explaining the 'how' and 'why' of the tool's actions.

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 concise: a clear opening sentence, a mid-section explaining the low-level behavior, and a final sentence covering alternatives. Every sentence contributes new information without redundancy or fluff, making it highly efficient and easy to parse.

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 (interaction with controlled components) and the presence of a rich schema and output schema, the description covers all necessary context: what it does, how it does it, when to choose alternatives, and important side effects (clearing, event firing). No critical gaps remain, making it fully complete for an AI agent 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.

Parameters3/5

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

Schema coverage is 100%, and the parameter descriptions in the schema are already detailed (e.g., uid invalidation, select value attribute, include_snapshot behavior). The tool description does not add significant extra semantics beyond what the schema provides, so the baseline score of 3 is appropriate. There is no contradiction or missing parameter information.

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 sets the value of input, textarea, or select elements, which is specific and distinct from sibling tools like type_text and fill_form. It also explains the mechanism (clears and types) and the target element types, 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 provides usage guidance: 'Use type_text instead when you want to append to a focused field rather than replace its contents' and 'For several fields at once, fill_form does it in one round trip.' This clearly delineates when to use this tool versus alternatives, which is exactly what high-quality usage guidelines should do.

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
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.5/5.0
Behavior5/5

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

The description discloses key behavioral traits beyond the annotations: fields are processed in order, a single field failure does not abort the rest, and the response reports per-uid success/error so partial fills are visible. This adds meaningful context about failure semantics and side effects that annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true) do not capture.

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 three tightly scoped sentences covering behavior, error handling, and an efficiency note. Every sentence earns its place with no redundancy or fluff.

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

Completeness5/5

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

For a tool with 2 parameters, an output schema, and clear sibling relationships, the description is thorough. It covers batch behavior, ordering considerations, partial-failure robustness, and the snapshot option's trade-off, providing enough context for an agent to select and invoke the tool correctly without needing the output 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 parameters ('elements' and 'include_snapshot') are already fully documented. The description adds no additional parameter semantics beyond reaffirming the order property of 'elements' in the prose ('Fields are processed in the order given'), which is a marginal enhancement. 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 'Fill several form fields in a single call,' a specific verb+resource that clearly identifies the tool's function. It also explicitly distinguishes itself from the sibling 'fill' by noting the batch behavior and round-trip savings, preventing 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 names 'fill' as the per-field alternative and explains the benefit of using this tool ('costs one round trip instead of one per field'). It provides context for when ordering matters (pages that reveal/enable later fields), giving clear usage context, though it does not explicitly mention 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.

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.

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, so the description adds valuable context beyond that: it requires enable_console_collection to have been called, and explains that the CDP Runtime domain is disabled by default because enabling it is detectable by sites. This is meaningful operational context that goes beyond structured fields.

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

Conciseness5/5

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

The description is three concise sentences, each serving a distinct purpose: primary function, comparison to sibling, and prerequisite/rationale. No fluff or redundancy; it is well-structured and 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?

For a simple read-by-id tool with an output schema, the description covers the purpose, usage guidance, sibling differentiation, and prerequisite. Annotations cover safety, and the output schema covers return format. Nothing important 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 provides 100% coverage with a clear description: 'Message id, as shown in square brackets by list_console_messages.' The description simply refers to 'by id' without adding further detail, but the schema description is sufficient. Baseline 3 applies because parameter information is well-covered 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 uses a specific verb+resource pair: 'Read one console message in full, by id.' This clearly distinguishes it from the sibling list_console_messages, which truncates messages. The first sentence alone fully defines the tool's primary function.

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 this tool: when a complete stack trace or error payload is needed because list_console_messages truncates to 200 characters. It also names the prerequisite call (enable_console_collection) and explains why, giving the agent clear context for when this tool is available.

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.

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?

Even though annotations already declare readOnlyHint=true and destructiveHint=false, the description adds valuable behavioral context: it reads the entire cookie jar, returns full values (including live session tokens), and can be filtered by URL. This goes well beyond the annotations and gives the agent important safety-relevant information.

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, well-structured, and front-loaded with the primary purpose. Each sentence serves a purpose: the first states what it does, the second explains scope and sensitivity, and the third gives alternatives. 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?

The tool is simple (one optional parameter, read-only, output schema present), and the description covers all essential aspects: scope, filtering, sensitivity, and persistence alternatives. It is fully complete for an agent to select and invoke 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 schema already covers the url parameter's meaning at 100% (including the empty-string default). The description reinforces this by explaining the 'whole jar vs filtered by url' behavior, adding a practical nuance not fully captured in the schema. It doesn't duplicate everything, but it adds useful behavioral context around the 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 clearly states a specific action ('List browser cookies') with a defined resource and the fields returned (domain, path, secure flag). It also distinguishes itself from related tools like set_cookie, clear_cookies, and get_local_storage by specifying that it reads the whole cookie jar, not just the current page.

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 usage context: it reads all cookies unless a url is passed, and notes that outputs are sensitive. It also names specific alternatives for persistence ('save_session' and 'use_profile'), providing clear when-to-use and when-to-avoid guidance.

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

No parameters

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, but the description adds valuable behavioral details: values truncated to 200 characters, per-origin scoping, empty results on about:blank, and exclusion of sessionStorage. These go beyond the annotation signals and set clear expectations.

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: three short paragraphs each serving a distinct purpose (purpose, truncation/alternative, scoping caveat). Every sentence contributes meaningful information with no 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?

Given the zero-parameter, read-only nature and the presence of an output schema, the description covers the essential non-obvious aspects: truncation, origin scoping, about:blank behavior, and the evaluate_script alternative for full values. It is thorough and leaves no critical gaps.

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 has zero parameters, so the baseline is 4. The description adds context about the implicit scope (current page's origin) and the truncation behavior, which is useful even though there are no formal parameters.

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

Purpose5/5

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

The description clearly states the tool's function: 'Read all localStorage entries for the current page's origin.' This uses a specific verb (Read), resource (localStorage entries), and scope (current page's origin). It also distinguishes from siblings by explicitly excluding sessionStorage and pointing to evaluate_script for reading a single full value.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: 'for one entry in full use evaluate_script with ...' and warns about about:blank, implying a prerequisite of navigation. The note that sessionStorage is not included further clarifies when to use this tool versus alternatives.

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.
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.7/5.0
Behavior5/5

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

The description discloses critical operational behavior beyond the annotations: inline bodies truncated at 5000 characters, file-path fallback for larger payloads, and the Chrome buffer limitation causing response bodies to disappear for long-finished requests. These details are essential for the agent to interpret results 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 tight paragraphs with the purpose in the first sentence. Every sentence earns its place, covering workflow, limits, and caveats without 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?

With an output schema present and annotations covering the read-only safety profile, the description still explains the key operational constraints (truncation, buffer, file paths) and positions the tool within a practical workflow. It is complete for an inspection tool.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful parameter context by explaining why file paths may be needed (truncation, binary responses) and how reqid relates to list_network_requests output, enhancing the schema's dry parameter 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 "Inspect one network request: URL, method, resource type and both bodies," giving a specific verb and resource. It clearly distinguishes from the sibling list_network_requests by focusing on a single request and referencing it as the discovery step.

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

Usage Guidelines4/5

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

Provides an actionable workflow: use list_network_requests to find the page's API call, then read the JSON here instead of scraping the DOM. This gives clear context for when the tool is valuable, though it does not enumerate explicit exclusions or when-not-to-use cases.

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
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
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?

Annotations already mark readOnlyHint true and destructiveHint false, and the description adds valuable behavioral context beyond that: it states that no accessibility tree is built, that text form carries no markup overhead, and that the DOM is returned as it currently stands, which explains potential async staleness. This aligns with idempotentHint false and enriches the agent's understanding of side-effect-free read 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 compact and front-loaded with the core purpose, followed by efficiency context, an async warning, and explicit sibling guidance. Every sentence earns its place; no filler or redundant repetition of schema/annotations.

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 tool with three optional, well-documented parameters and an output schema, the description covers all necessary operational context: when to use it, the performance trade-offs, the async rendering caveat, and how it differs from siblings. There are no significant gaps.

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

Parameters3/5

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

The input schema covers 100% of parameters with detailed descriptions (format enum, file_path, max_chars). The tool description adds only marginal parameter-related context, like 'text form carries no markup overhead,' but this is more behavioral than a semantic explanation of each argument. Since schema coverage is high, 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: 'Get the page's visible text, or its full HTML.' It clearly distinguishes the tool from siblings by naming take_snapshot and query_selector as alternatives for interactive or element-specific needs, 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 provides explicit when-to-use guidance: it is the cheapest way to read content when not needing uids, and it advises calling wait_for or wait_for_selector first on async pages. It also names alternatives, saying to use take_snapshot for interaction and query_selector for specific elements, which is a clear yes/no usage framework.

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
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?

The description discloses important behavior beyond annotations: the blocking nature of dialogs, the error when no dialog is open, and the distinction from automatically handled beforeunload dialogs. 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?

Four concise sentences, each adding unique value: purpose, blocking behavior, error condition, and distinction from navigation dialogs. Front-loaded with the core purpose.

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

Completeness5/5

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

Given the simple 2-parameter schema and provided annotations, the description covers all necessary context: when to use, behavior, error handling, and how it relates to other tools. Output schema exists, so return values need no explanation.

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 parameter descriptions already explaining accept/dismiss and prompt_text. The description does not add further meaning to the parameters themselves, meeting 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 uses a specific verb 'Answer' and resource 'open JavaScript dialog', explicitly listing the dialog types: alert, confirm or prompt. It clearly distinguishes from sibling tools, none of which are dialog-related.

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: 'A dialog blocks the page and every subsequent tool call until it is handled, so call this as soon as one appears.' It also gives an exclusion: beforeunload dialogs are handled by navigate_page, so this tool is for dialogs the page opens by itself.

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.

Only moves the pointer; it does not scroll. If the element sits outside the viewport, call scroll_to_selector first.

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.
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.4/5.0
Behavior4/5

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

Discloses behavioral boundaries: only moves the pointer, does not scroll, and can reveal content via include_snapshot. The annotations already indicate non-read-only and non-destructive, so the description adds useful clarifications without contradicting them.

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

Conciseness5/5

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

Three short paragraphs, front-loaded with the core action, then targeted guidance. No redundant filler, 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?

Covers action, use cases, viewport caveat, and snapshot retrieval. The output schema handles return values, so the description is complete for an interaction tool of this scope, though it doesn't mention potential page-state changes beyond the hover-reveal behavior.

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

Parameters3/5

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

The schema covers 100% of parameters with detailed descriptions, so the tool description does not need to repeat them. The description only references include_snapshot contextually, adding no new parameter syntax; 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+resource ('Move the mouse over an element') and explicitly distinguishes from clicking and scrolling, making its purpose unmistakable. It also identifies the use case of opening hover-triggered menus, tooltips, and dropdowns.

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 the use case (hover-triggered menus/tooltips/dropdowns) and names an alternative (scroll_to_selector) for out-of-viewport elements. It also recommends include_snapshot=true when the hover changes the page, providing clear when-to-use guidance.

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.
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 declare readOnlyHint=true, so safety is covered. The description adds valuable behavioral details beyond that: each line is prefixed with id and truncated to 200 characters, only the most recent 1000 messages are retained, and the opt-in rationale. These details help the agent set expectations without contradicting 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 four sentences, front-loaded with the main action, and each subsequent sentence earns its place by explaining prerequisites and behavioral details. There is no fluff or redundancy, making it highly concise and well-structured.

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 values need not be spelled out. The description covers prerequisites, opt-in rationale, behavior (truncation, retention, id prefix), and points to get_console_message for full text. With only 4 optional params and an output schema, this is complete for the tool's complexity.

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 syntax or format details beyond what the schema provides, but it does add context about truncation and id use that relates to output quality. No extra param semantics are needed, so a 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 uses a specific verb+resource construction: 'List console output collected for the selected page.' It clearly identifies what the tool does and its scope. It also differentiates from siblings by referencing get_console_message for full text and implying enable_console_collection as a prerequisite, making the purpose and boundary explicit.

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 states the prerequisite: 'Requires enable_console_collection first.' It also explains the consequence of not doing so ('without it this returns a reminder instead of messages') and provides reasoning (CDP Runtime domain, site detection). This gives clear when-to-use instructions and distinguishes from get_console_message by id.

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
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.9/5.0
Behavior5/5

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

Annotations already declare read-only and non-destructive. The description adds critical behavioral constraints: automatic collection, retention limited to 1000 requests, URL truncation to 150 characters, and the presence of ids in square brackets. This goes beyond the annotations and helps the agent understand the tool's 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 a compact paragraph of four sentences. Each sentence serves a purpose: purpose, automatic collection, main use case, and retention/truncation limits. No redundant noise.

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 rich schema (5 params, all described) plus an output schema, the description covers the core purpose, usage patterns, and key behavioral limits. It also links to the companion tool get_network_request for the full workflow. Nothing essential is missing.

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

Parameters4/5

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

The input schema already has 100% coverage with descriptions. The description adds usage patterns, such as the recommended resource_types filter and how to use the output id to call get_network_request. This gives the agent practical parameter guidance beyond the schema, though it doesn't elaborate on pagination (which the schema already covers).

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 ('List') and resource ('network requests the selected page has made'). It distinguishes from sibling 'get_network_request' by explaining that this tool lists requests while the other reads response bodies. The phrase 'main use is finding the JSON API a page calls' further clarifies its specific role.

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 tells the primary use case (finding JSON API calls) and how to execute it (filter with resource_types=['XHR','Fetch'], then pass id to get_network_request). It also contrasts with DOM scraping and mentions that collection is automatic, unlike console capture, guiding 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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 mark this as read-only and non-destructive, so the safety profile is covered. The description adds valuable behavioral context: indices shift dynamically and the default page target behavior (selected page or most recent tab). This goes beyond the structured annotations and helps the agent reason about 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 three sentences, each serving a distinct purpose: what it returns, the dynamic index warning, and the page-selection behavior. No wasted words; information density is high 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?

With no parameters, presence of an output schema, and strong annotations, the description fully covers the tool's behavior. It explains the output fields, index semantics, and interaction with other tools, making it complete for an agent 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 tool has zero parameters, so there is no parameter burden on the description. The baseline for no parameters is 4, and the description appropriately omits param details since none exist. No unnecessary parameter information is needed.

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 'List' with a clear output scope: 'every open browser tab with its index, URL and title.' It distinguishes itself from sibling tools by focusing solely on tab enumeration, and even connects the index to select_page/close_page, making the purpose unmistakable.

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

Usage Guidelines4/5

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

Provides clear usage context by explaining that indices are positional and shift, so the agent should re-read rather than reuse stale indices. It also clarifies how tools act on the selected page or the most recent tab. However, it does not explicitly compare against alternatives like get_page_content or take_snapshot, though the purpose makes the use case fairly obvious.

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

No parameters

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, so the description's job is to add context. It does so by explaining the default ephemeral temp profile and that persistent profiles preserve cookies, logins, and extensions across sessions. This adds meaningful 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.

Conciseness5/5

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

The description is three short paragraphs; the first sentence states the core function, and the subsequent sentences provide essential context about ephemeral vs persistent profiles and related commands. Every sentence adds value without unnecessary fluff.

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

Completeness5/5

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

With no parameters and an output schema, the description still explains the behavioral context thoroughly—what persistent profiles are, how they differ from the ephemeral default, and how they fit into the profile management workflow (create/switch/return). This gives the agent all it needs to decide when to invoke list_profiles.

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

Parameters4/5

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

The tool has zero parameters, so the input schema fully covers parameters (vacuously). The description adds value by explaining the concept of profiles and the active profile, which gives meaning to the tool's output. No parameter documentation is needed, so a baseline 4 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 'List persistent Chrome profiles and show which one is active,' which is a specific verb+resource+outcome and clearly distinguishes it from siblings like create_profile, use_profile, and delete_profile. It goes beyond the title by specifying the scope (persistent profiles) and the active status.

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 the ephemeral vs persistent profile context and explicitly references create_profile, use_profile, and use_temp_profile as related actions. This gives clear context for when listing profiles would be useful, though it could more explicitly state 'use this before switching profiles' as a direct recommendation.

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

No parameters

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?

While annotations already declare readOnlyHint=true and destructiveHint=false, the description adds meaningful behavioral context: sessions are stored in ~/.nodriver-mcp/sessions/, are not cleaned up automatically, and accumulate over time. This informs the agent about persistence and potential storage growth beyond what annotations 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 three sentences, each providing distinct useful information: the command's output, how to use it with load_session, and the storage location/cleanup behavior. It is front-loaded with the main action and contains 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?

The tool is simple with no parameters, and an output schema exists, so the description need not explain return values. It sufficiently covers what the agent needs to know: what is listed, how to use it, and the persistence context. The sibling-tool context further helps, but the description stands on its own.

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

Parameters4/5

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

The tool has no parameters, so the input schema is trivially 100% covered. Baseline for 0 params is 4, and the description does not need to explain parameters. It correctly omits param details and focuses on what the tool returns.

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 the specific verb 'List' with the resource 'saved session files' and details what is shown (name, save time, contents). It clearly distinguishes from sibling tools like save_session and load_session by describing its unique role.

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

Usage Guidelines4/5

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

The description provides clear usage context: it shows the filename to hand to load_session, and notes that sessions accumulate because they are never cleaned up automatically. It does not explicitly mention when not to use it or alternatives, but the purpose is evident from the context.

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
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.5/5.0
Behavior5/5

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

Describes non-obvious behaviors: navigation to the saved origin before restoring localStorage, reloading to apply cookies, skipping invalid cookies rather than failing, reporting restore count, and warning that expired tokens may leave the user logged out. This goes well beyond the annotations, which only state flags (readOnly=false, etc.). 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?

Every sentence is informative and earns its place. It opens with the core purpose, then explains the internal procedure, edge-case handling, and a necessary caveat. No fluff 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?

Covers what it does, when to use it, side effects (navigation/reload), failure handling, and what the response reports. With an output schema available, this description is complete for the tool's complexity.

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 100% of parameters with detailed descriptions (filename and restore_pages). The description adds no additional parameter-specific meaning beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

States the exact action: 'Restore cookies and localStorage from a saved session file.' It clearly differentiates from sibling tools like set_cookie and save_session by focusing on restoring a previously saved session, and adds the use-case 'at the start of a run to arrive already logged in.'

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

Usage Guidelines4/5

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

Explicitly says when to use ('Use it at the start of a run to arrive already logged in'), and implies a difference from per-cookie/per-localStorage tools. However, it does not explicitly name alternatives or state when not to use it, so it falls 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.

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

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 important behavioral traits beyond annotations: the master switch semantics, that every action except "list" restarts the browser, and that extensions only persist in a persistent profile. It also honestly states that the tool reports failure on official Chrome rather than pretending to succeed. This adds depth beyond the readOnlyHint/destructiveHint 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 front-loaded with the core actions, then uses short paragraphs to explain the two mechanisms and platform caveats. Every sentence provides essential context, and no space is wasted. The structure is clear and appropriately sized for the tool's complexity.

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 differences, persistence concerns), the description covers all necessary aspects: what it does, when it applies, how actions behave, and limitations. An output schema exists, so return values need not be described. The description is complete enough for an agent to invoke the tool correctly.

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

Parameters3/5

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

The input schema covers 100% of the parameters with detailed descriptions for both 'action' and 'path'. The description adds some context about the two mechanisms and platform support, but does not materially change the parameter semantics because the schema already explains that 'path' is ignored by most actions. Baseline 3 is appropriate for high schema coverage with some additional context.

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, enable, disable or load Chrome extensions." This clearly distinguishes it from sibling tools, which are mostly browser navigation or interaction tools. The description also explains the two underlying mechanisms, 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?

Provides explicit when-to-use and when-not-to-use guidance, e.g., "load" only works on Chromium or Chrome for Testing, and on official Chrome the working path is to install from the Web Store first. This helps the agent select the correct action and understand limitations, which is more than just implying usage.

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.
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.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, openWorldHint=true), the description discloses significant behavioral traits: reuse of the startup tab, selection for subsequent tool calls, device emulation before the first request, and isolated context behavior. This adds substantial 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 compact and front-loaded with the core action. Each sentence contributes valuable behavioral or contextual information without redundancy or filler. It is long enough to cover key nuances but still 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?

Given the tool's complexity, the annotations, and the presence of an output schema, the description covers essential behaviors: tab reuse, selection semantics, emulation timing, and isolated contexts. No critical operational details are missing, and the description is fully sufficient to guide 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?

The schema already covers all 100% of parameters with descriptions, so the baseline is 3. The description adds extra meaning by explaining the timing implications of device emulation, the effect of background on page selection, and how isolated_context names create shared or isolated environments—information not just repeating 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 action: "Open a new browser tab and load a URL," which clearly identifies the tool's purpose and resource. It distinguishes itself from sibling tools like navigate_page by specifying that it creates a new tab rather than navigating the current one.

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

Usage Guidelines4/5

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

The description provides clear context: it explains the first-call behavior in Chrome, the default selection behavior unless background is set, and explicitly references emulation timing compared to emulate_device. It does not explicitly list exclusions or alternatives beyond emulate_device, but the context is sufficient for most use cases.

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

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.
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.9/5.0
Behavior5/5

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

It discloses that only one trace can run at a time, the default recording duration (~5s), the output format (raw trace JSON), and the distinction between returning just an event count vs. saving the full trace. This adds significant 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.

Conciseness5/5

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

The description is concise, well-structured, and front-loaded with the core purpose. Each sentence provides essential information—categories, defaults, constraints, and output handling—without any redundant or filler 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?

The description fully covers the tool's behavior given its optional parameters and existing output schema. It addresses the main use cases (self-contained trace vs. manual stop), a key constraint (one trace at a time), and how to handle results, making it complete for a tool of this complexity.

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 value by explaining the practical impact of file_path (keeping data vs. just an event count) and clarifying the default behavior of reload and auto_stop, going beyond the schema's field descriptions.

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

Purpose5/5

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

The description clearly states the tool records a Chrome performance trace of page load or interaction, and it explicitly lists the captured categories. This differentiates it from sibling tools like performance_stop_trace and other page-related actions.

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 explains the default behavior (reload + auto_stop), when to set auto_stop=false and use performance_stop_trace, and the consequence of omitting file_path. This gives clear when-to-use guidance and references an alternative tool.

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
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.5/5.0
Behavior4/5

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

Annotations are minimal (all false hints), so the description carries the burden. It discloses the waiting period, the error case, and the stopping action. This goes beyond what annotations provide, though it doesn't detail output content.

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, front-loaded with the main purpose, then usage condition, then behavioral note. No redundancy, every sentence contributes.

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 is simple with one optional param and an output schema. The description covers when to use, what it does, and edge cases. The output schema handles return value details, so the description 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?

The single optional parameter file_path has full schema description coverage, explaining how to use it and what happens if omitted. The description adds no extra param info, but baseline 3 is appropriate since the schema is self-sufficient.

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 stops a running performance trace and collects data, referencing the paired start tool. It distinguishes itself from performance_start_trace and clearly communicates the action and resource.

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 specifies when the tool is needed (only with auto_stop=false), when it errors, and the 30-second wait behavior. This gives the agent concrete conditions for use and avoids misuse.

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.
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 indicate readOnlyHint=false and openWorldHint=true, but the description adds critical behavioral context: keys go to the currently focused element, with nothing focused they land on the document body; modifiers are combined with the proper bitmask so chords work. This goes beyond the annotation flags, though it doesn't cover every possible side effect (e.g., navigation or page 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?

Three tightly packed paragraphs: purpose, focus behavior, and alternatives. Every sentence earns its place, no fluff, and the most important facts are front-loaded. Structure is clear and 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?

For a keyboard tool with focus and modifier complexity, the description fully covers usage context, preconditions, and alternative tools. The output schema exists and the parameter schema is rich, so the description need not repeat return formats. No significant gaps remain.

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 with detailed descriptions for both parameters (key examples and include_snapshot's purpose). The description adds a useful detail about modifier bitmasks, which relates to the key parameter, but the schema already carries the full semantic load. Meets 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 'Send a key press or keyboard shortcut to the page,' which is a specific verb+resource statement. It clearly distinguishes from sibling text-entry tools (fill, type_text) by stating 'this tool is for single keys and shortcuts.' Purpose is unambiguous and differentiated.

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 ('click or fill the target element first') and provides clear exclusions: 'For entering text use fill (replaces the field) or type_text (appends to it).' This gives actionable guidance on focus requirements and alternative tool selection for text entry.

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
limitNoMaximum number of matching elements to return.
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?

The description discloses key behavioral traits beyond the annotations: returns a compact listing only, yields no uids and therefore cannot drive clicks, and truncates element text to 200 characters. These details are not captured by readOnlyHint/destructiveHint and add significant value.

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

Conciseness5/5

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

The description is compact and well-structured: one sentence on purpose, one on use case, one on limitations, and one on truncation. Every sentence earns its place with no redundancy or fluff.

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

Completeness5/5

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

For a read-only query tool with a present output schema, the description covers purpose, use cases, limitations, and return format succinctly. It fully equips the agent to decide when to invoke it and what to expect.

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 selector and limit. The description adds no additional parameter-specific semantics, though it does clarify output characteristics. Baseline 3 is appropriate given full 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+resource: 'Find elements by CSS selector; list their tag, text, href, id and class.' It clearly identifies what the tool returns and is distinct from sibling tools like take_snapshot by emphasizing its efficient, focused scope.

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 when-to-use guidance: 'The efficient way to pull a repeated structure off a page — search results, product tiles, table rows — without paying for a full snapshot.' It also states when not to use it: 'take a snapshot when you need to interact, or operate on the elements directly via evaluate_script,' naming concrete alternatives.

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

No parameters

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?

The description discloses detailed behavioral traits beyond annotations, enumerating all the emulation overrides that are reset (network throttling, CPU throttling, geolocation, etc.). It also notes the side effect of restoring trusted CDP clicks when touch emulation is turned off, adding valuable context. 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 concise and well-structured. It opens with a clear summary, lists the resets in a compact manner, and closes with usage guidance. Every sentence provides useful 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?

Given the tool's simplicity (no parameters) and the presence of an output schema, the description is fully complete. It covers what the tool does, when to use it, and the precise behavioral scope, including the CDP click note. No gaps remain.

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 doesn't need to explain parameter meaning. The schema coverage is 100% vacuously. The description adds no parameter-specific detail, but the baseline of 4 is appropriate for a no-parameter tool.

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

Purpose5/5

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

The description clearly states the tool's purpose with a specific verb and resource: 'Clear every emulation override on the selected page.' It lists the exact types of overrides reset, differentiating it from sibling tools like emulate and emulate_device.

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 tells when to use the tool: 'Use after emulate or emulate_device to make the page behave like ordinary desktop Chrome again.' It also provides a specific nuance about touch emulation and trusted CDP clicks, giving clear context for usage.

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.

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 that it moves the actual OS window and clarifies that it does not affect device pixel ratio, mobile flag, or touch—those belong to emulation. This adds meaningful context beyond the readOnlyHint, idempotentHint, and destructiveHint annotations, with 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 three sentences, each adding distinct value: the action, the use case, and the alternative for viewport emulation. There is no redundancy or unnecessary detail.

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 full schema coverage and an output schema, the description fully covers the functionality, its purpose, and its limitations. It is self-contained and complete for an agent to invoke correctly.

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

Parameters3/5

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

Schema coverage is 100% with both width and height clearly described in CSS pixels. The description adds no extra parameter-specific meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action ('Resize the browser window') and the target resource, distinguishing it from viewport emulation tools like emulate and emulate_device. The verb is specific and the scope is unambiguous.

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

Usage Guidelines5/5

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

Explicitly explains when to use this tool (responsive-layout checks requiring accurate screenshots) and provides direct alternatives for viewport-only emulation (emulate's viewport parameter or emulate_device). 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.

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
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?

The description adds valuable behavioral context beyond the annotations: it renders the entire document, applies the page's print stylesheet, and may differ from the screen layout. This is useful and not contradicted by any annotation. It could have noted potential file overwriting, but given the annotations provided, this is strong.

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

Conciseness5/5

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

The description is concise and well-structured: the first sentence states the core action, the second explains key behavioral differences, and the third offers use-case guidance and an alternative. Every sentence earns its place with no 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 moderate-complexity tool with a detailed schema and output schema present, the description covers the key functional aspects (full-document rendering, print stylesheet, archiving use case) and distinguishes the tool from its closest sibling. It is sufficiently complete without unnecessary detail.

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 provides 100% coverage with descriptions for all three parameters, including defaults and effects. The description adds marginal value by relating print_background to the 'print view' behavior, but the schema does the heavy lifting. 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 specifies the tool's function: exporting the current page to a PDF via Chrome's print-to-PDF. It distinguishes itself from the sibling tool take_screenshot by noting that saving as PDF is for archiving, while a pixel-accurate copy would use a screenshot.

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 ('A good way to archive a rendered page as one file') and provides a concrete alternative ('use take_screenshot with full_page instead') for a different use case. This is clear, actionable guidance.

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.

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 crucial behavioral traits beyond annotations: storage location ('~/.nodriver-mcp/sessions/'), plain-text credential risk ('treat it as a credential'), origin scoping ('Only the current page's origin contributes localStorage'), and the timestamped filename avoiding overwrites. Annotations only declare readOnlyHint false, destructiveHint false, etc., leaving the description to provide the meaningful safety and data-flow context.

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, use case, storage/security, limitation, and alternative. Front-loaded with the main action and objects, no filler or redundant 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 single-parameter tool with an output schema and comprehensive annotations, the description fully covers behavior, security implications, scoping limitations, and the relationship to sibling tools. 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 fully describes the 'name' parameter, including the example 'github-logged-in' and the timestamp append behavior. The description adds no new parameter-specific information, so the baseline of 3 for full schema coverage 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: 'Save cookies, localStorage and open page URLs to a reusable file.' It clearly distinguishes the tool from siblings like load_session (restore) and create_profile (persistent profile) by framing it as the way to keep an interactively obtained login.

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 states when to use: 'This is how you keep a login obtained interactively, so a later run can skip the login flow entirely — restore it with load_session.' It also provides an alternative for a more durable need: 'a persistent profile (create_profile + use_profile) is the sturdier option.' 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.

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.

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.
directionNoDirection to scroll.down

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=false and openWorldHint=true, so the agent knows this is a state-changing operation. The description adds behavioral context: it triggers lazy-loaded content, may require a follow-up snapshot, and notes that click auto-scrolls. This enriches the understanding of side effects without contradicting 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 concise paragraphs, each earning its place: the first states the core function, the second gives the primary use case and post-action step, the third clarifies when to use alternatives. 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?

For a simple two-parameter tool with full schema coverage, an output schema, and clear annotations, the description covers the essential context: what it does, when to use it, what to do after, and how it relates to sibling tools. This is complete for an agent to correctly invoke it.

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 descriptions for both 'amount' and 'direction' that fully explain their format and defaults (e.g., '25 is a quarter screen'). The tool description adds no new parameter semantics beyond what the schema already provides, 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 starts with a specific verb and resource: 'Scroll the page up or down by a percentage of the viewport.' It clearly distinguishes itself from siblings like scroll_to_selector and click by stating its scope (percentage-based scrolling) and its role as the tool for infinite scroll.

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 given: it is 'The way to trigger lazy-loaded content and infinite scroll,' and the description advises taking a take_snapshot afterwards. It also explicitly excludes alternatives: 'scroll_to_selector is more precise' for known elements, and 'click already scrolls to its target,' so no pre-scroll is needed. This gives clear when-to-use and when-not-to-use context.

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
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?

Adds value beyond annotations by explaining the tool 'Reports whether anything matched instead of failing silently' and that it centers the element. Annotations already note non-read-only behavior, and no contradiction exists; the description enriches understanding of the tool's outcome.

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, front-loaded with the primary action, followed by targeted usage guidance and behavioral note. No wasted words; each sentence serves a distinct purpose.

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 tool with an output schema present, the description covers purpose, usage, alternatives, and behavior. It is fully sufficient for an agent 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.

Parameters3/5

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

Schema covers 100% of the single parameter with a clear description ('the first match wins'). The tool description restates the first-match behavior but adds little beyond schema; 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?

Description starts with specific verb+resource: 'Scroll the first element matching a CSS selector into view, centered.' It clearly distinguishes from sibling scroll_page by emphasizing precise element-based scrolling, making the tool's 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?

Provides explicit usage context: more precise than scroll_page when target is known, usual preparation for click_at, and unnecessary before click because click scrolls itself. 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.

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
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
Behavior5/5

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

Beyond annotations (idempotentHint, etc.), the description discloses that selection is sticky, indices shift as tabs open/close, and if the selected tab is closed the selection is dropped and default applies. Also explains the bring_to_front parameter's effect on backgrounded page animations. 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?

Three paragraphs, 76 words. The first sentence is direct and purposeful. The remaining sentences each add context on behavior and usage. Slightly verbose but 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 stateful selection tool, the description covers purpose, default behavior, when to use, index semantics, side effects, and failure mode (tab closed). Output schema exists so return format needn't be described. Well-rounded and 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 covers 100% of parameters with descriptions. The description adds context about indices shifting, but page_id semantics are already in the schema. Bring_to_front is fully described in the schema, so the description adds little beyond what structured data 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 clear verb+resource: 'Choose which open tab every subsequent tool call acts on.' It distinguishes from sibling tools like list_pages (which lists) and navigate_page (which navigates), and explains the default selection behavior.

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 guidance: 'needed when a click opened a tab you now want to drive, or when working across several sites at once.' Also clarifies that without selection, tools act on the most recently opened tab, and that indices come from list_pages — giving a direct reference to the related tool.

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
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.5/5.0
Behavior5/5

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

Goes well beyond the destructiveHint annotation by disclosing that applying flags restarts Chrome, closes all pages, and drops cookies on ephemeral profiles. Also clarifies the no-argument read-only form and interaction with NODRIVER_ENABLE_* variables, giving a full behavioral picture.

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 sentence earns its place. The opening states the primary action, the middle explains the read-only form, and the final covers consequences and overrides. No redundancy 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?

Given the output schema exists, parameter descriptions are extensive, and annotations are present, the description covers all necessary context: runtime effect, read-only usage, restart behavior, cookie implications, and environment variable override. Nothing important 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 has 100% coverage with rich per-parameter descriptions (defaults, effects, examples). The tool description itself adds no parameter-specific detail, so a baseline score of 3 is appropriate given the schema handles the semantics.

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

Purpose5/5

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

The description clearly states the tool changes Chrome's launch flags at runtime and can also show current ones. It specifies the resource (Chrome launch flags) and the verb (change/show), 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?

Provides clear context on how to use the tool: call with no arguments to read, with arguments to change; explains restart side effects and override of environment variables. Does not explicitly name alternatives or exclusion cases, but the guidance is sufficiently actionable.

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.

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 (idempotentHint=true, destructiveHint=false), the description clarifies that it merges rather than clears, and warns about origin scoping and page startup reads. This adds useful behavioral context. It does not contradict the annotations, though it could be slightly more explicit about overwriting existing keys.

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 carrying weight: purpose, merge semantics/use case, and critical scoping/reload caveats. No fluff, front-loaded with the main action, and structured for quick skimming.

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 one-parameter tool, the description covers the necessary operational context: origin scoping, prerequisite navigation, and the reload step. The existence of an output schema reduces the need to describe return values. The guidance is complete enough for reliable use.

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 for the single 'items' parameter, including an example and the string-value constraint. The description does not add further parameter-level detail, so the baseline score of 3 is appropriate.

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

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 and resource: 'Write entries into the current page's localStorage.' This immediately distinguishes the tool from its sibling 'get_local_storage' (read vs. write) and from cookie-related tools. It is specific about the action and target.

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

Usage Guidelines4/5

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

Provides practical guidance: 'Handy for setting feature flags, consent state or auth tokens,' and explains the need to navigate to the site first and reload after setting. It implies when to use the tool but does not explicitly compare it against alternatives like set_cookie or get_local_storage, so it misses the full 'when-not' context.

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
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?

The description discloses important behavioral traits beyond the annotations: writes a raw .heapsnapshot file for DevTools, can be hundreds of megabytes and take several seconds on heavy pages, and the response reports the file size. This adds value not present in the minimal annotation hints.

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

Conciseness5/5

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

The description is four sentences, each earning its place: purpose, output format, workflow, and performance/response detail. It is front-loaded with the main purpose and contains no redundant or extraneous text.

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 is simple with one parameter and an output schema. The description covers the workflow, file format, performance, and response. No critical contextual information is missing for an agent to invoke 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?

The schema description for 'file_path' already covers the parameter fully (local path, open in DevTools). The tool description adds no additional parameter-specific semantics beyond what the schema provides, 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?

Description uses a specific verb ('Capture') and clearly identifies the resource ('V8 heap snapshot of the page') with an explicit purpose ('for memory-leak debugging'). It distinguishes from sibling tools like take_snapshot (which likely captures a DOM or screen 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 provides clear context by specifying the use case (memory-leak debugging) and the typical workflow (two snapshots around a suspect interaction). It does not explicitly mention alternatives or when-not-to-use, but the context is sufficient for an agent to decide 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.

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
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.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. The description adds meaningful context: the expensive inline base64 data URL behavior, the dependency on a snapshot uid for element capture, and performance trade-offs (file vs inline). This enriches the annotation baseline significantly.

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 paragraphs but every sentence earns its place. It front-loads the core purpose, then provides critical usage warnings, alternatives, and dependencies. No filler or redundant content beyond reinforcing valuable guidance.

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 and 5 parameters fully documented, the description covers selection criteria, alternatives, output behavior, and performance considerations. It is complete for an agent to correctly decide when and how to invoke this tool.

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

Parameters4/5

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

Schema coverage is 100% with detailed parameter descriptions. The description adds extra clarity about the uid requirement for element capture, reiterates cost implications of omitting file_path, and clarifies the distinction among page/viewport/full_page. While schema already covers most, this supplements with usage context.

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 specifies the exact action: capture the page, viewport, or element as an image. It explicitly differentiates from take_snapshot by stating when screenshots are needed (pixels, layout, styling) versus when text extraction is appropriate.

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 strong when-to-use and when-not-to-use guidance, naming take_snapshot as the alternative for reading text and explaining that screenshots should only be used for visual needs. It also notes the requirement of a uid for element capture and the inline base64 behavior without file_path.

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.

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.

For plain page text without uids, get_page_content is cheaper; to find elements by CSS selector, use query_selector.

ParametersJSON Schema
NameRequiredDescriptionDefault
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.

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 and destructiveHint annotations, the description discloses the output format (accessibility tree with roles/names/values/states), filtering behavior with verbose, uid stability and invalidation rules, the 200,000 character cap, and the role of uids in interaction. This is rich behavioral context beyond what 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.

Conciseness5/5

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

Well-structured with a clear opening sentence, followed by usage rationale, output details, uid behavior, and alternative suggestions. Every sentence contributes useful information and none is wasted. The moderate length is justified by the tool's complexity.

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 and the presence of an output schema and annotations, the description is thorough. It covers purpose, use cases, output format, limitations, and alternatives. No significant gaps remain.

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 detailed descriptions for both parameters. The main description references verbose only briefly ("unless verbose is set") and file_path is not mentioned in the main text. The schema already explains the semantics, so the description adds little parameter-specific meaning beyond the 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+resource: "Read the page as compact text, with a uid for every element." It clearly distinguishes itself from siblings by explaining it is the primary way to see a page and the source of uids for interaction tools, while also differentiating from take_screenshot and get_page_content.

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 given: "Prefer it over take_screenshot for anything but a genuine visual check" and "For plain page text without uids, get_page_content is cheaper; to find elements by CSS selector, use query_selector." This clearly states when to use this tool and names alternatives, meeting the highest bar.

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.
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.5/5.0
Behavior4/5

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

Description goes beyond readOnly/destructive hints by describing append-at-caret behavior, the focus requirement, and support for contenteditable/rich-text/canvas widgets. It doesn't contradict annotations; readOnlyHint=false and destructiveHint=false are consistent with focused text-typing mutation.

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 purposeful sentences: definition, behavioral constraint, and usage guidance. No filler; every sentence adds operational value without being verbose.

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 simple two-parameter schema, existing output schema, and annotations, the description covers focus prerequisite, append semantics, widget compatibility, and alternative tool selection. This is complete for an agent to select and 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?

The input schema already fully describes both parameters, including the default for submit_key and the one-character-at-a-time behavior. The description adds no new parameter-level detail, so schema coverage earns the baseline 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?

The description opens with a specific verb and resource ('Type text into whatever element currently has focus') and immediately clarifies scope (appends at caret, needs pre-existing focus). It distinguishes itself from sibling fill by naming it as an alternative and setting different use cases.

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 states when to prefer fill ('ordinary form filling') and when to use type_text ('add to existing content, or widgets that only react to raw key events'). It also tells the agent that a prior click/focus step is required, or to use fill which needs no separate focus step.

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.

Many sites hide the real behind a styled button or drop zone. It is still in the snapshot; if you cannot spot it, locate it with query_selector("input[type=file]").

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYesuid 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.
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.4/5.0
Behavior5/5

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

The description discloses that files are set directly over CDP, preventing dialog opening, and warns that clicking an upload button normally opens a dialog that blocks agent execution. It also explains that hidden inputs are still in the snapshot and how to find them. This goes well beyond the annotations (readOnlyHint=false, openWorldHint=true) and adds valuable operational context.

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 earning its place: purpose, key CDP behavior, and a practical tip for hidden inputs. No redundant text, front-loaded with the main point.

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 moderately complex tool with an output schema, the description covers core usage, the main pitfall (dialog blocking), and the hidden-input case. It also mentions include_snapshot for efficiency. 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?

The schema already covers all parameters with detailed descriptions (e.g., uid must be the file input itself, file_path is absolute). The description reinforces the uid guidance but doesn't add significant new semantic value. 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 opens with a clear, specific action: 'Attach a local file to a file input on the page.' It precisely identifies the resource (file input) and the verb (attach), distinguishing it from sibling tools like fill or type_text, which are for text fields. The title and description align perfectly.

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 explains when to use this tool (for file uploads) and why it is preferable: it avoids the OS file-picker dialog that can block all further tool calls. It also provides a concrete fallback for tricky pages: locate the hidden input with query_selector("input[type=file]"). It doesn't explicitly name alternatives, 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.

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.

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 significant behavioral traits beyond annotations: 'Restarts the browser and closes every open page' and 'a second instance pointed at the same one fails to start.' These are critical side effects and failure modes not captured by the annotations' readOnly/destructive/idempotent hints. 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?

Four sentences, front-loaded with the core purpose, followed by usage motivation, side effects, prerequisites, and concurrency caveat. Every sentence carries essential information with no fluff.

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

Completeness5/5

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

The description is complete for this tool: purpose, when to use, prerequisites, side effects, concurrency failure mode, and how to revert to ephemeral. Output schema exists so return values need no explanation. Sibling tools provide additional 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 coverage is 100%, so the baseline is 3. The tool description repeats that the profile must already exist, but the schema already provides the full parameter meaning, including the ephemeral escape values. Thus the description adds no new semantic value beyond the structured 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 'Switch the browser to a named persistent profile,' a specific verb and resource. It clearly distinguishes from siblings like create_profile, delete_profile, and use_temp_profile by focusing on using an existing profile.

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 explains when to use the tool ('pick up the cookies, logins and extensions stored in an earlier session'), gives a prerequisite ('create it first with create_profile'), and mentions the ephemeral alternative via special parameter values. It also warns about the single-instance constraint, which is practical usage guidance.

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

No parameters

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 destructiveHint annotation, the description discloses concrete side effects: 'Restarts the browser and closes all open pages' and 'Anything held in the outgoing temp profile is gone.' It also clarifies that the profile being left is not deleted, adding nuance to the destructive behavior and explaining the concurrency benefit.

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, front-loaded with the core purpose and followed by lifecycle and side-effect details. Every sentence adds valuable context without repetition 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?

Given the zero-parameter schema and existing output schema, the description covers the tool's lifecycle, concurrency benefit, side effect of restarting, and the critical contrast with persistent profiles. No essential behavioral aspect appears 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 tool has zero parameters (schema coverage 100% with empty properties), so the description does not need to compensate for undocumented arguments. The baseline of 4 applies because no parameter semantics are required.

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 'Switch back' and names the resource 'fresh ephemeral profile' with lifecycle details ('created and deleted per session'). It clearly distinguishes from sibling use_profile by explaining that a persistent one keeps its cookies for the next use_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?

It states 'This is the default' and explains that it leaves nothing behind, enabling concurrent nodriver instances without profile collisions. It implicitly contrasts with use_profile by describing the persistent profile's cookie retention, giving the agent enough context to choose between them, though it does not explicitly enumerate when-not-to-use scenarios.

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.
timeoutNoMaximum wait in milliseconds before giving up.

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 readOnly and non-destructive, but the description adds valuable behavioral context: it polls visible text twice a second, returns as soon as text appears rather than burning full timeout, and includes a page snapshot on success. 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?

Four tight sentences front-load the core purpose, then add reliability context, snapshot benefit, polling cadence, and alternative tool. Every sentence earns its place with no fluff.

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

Completeness5/5

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

The description covers what the tool does, when to use it, how it behaves (polling, early return, snapshot), and points to the alternative. With an output schema present, nothing about return values is missing. This is complete for a moderate-complexity wait tool.

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

Parameters3/5

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

Schema coverage is 100% and the schema's text description already explains the 'any one' matching and case-sensitive substring behavior. The tool description reinforces the 'several texts' semantic but adds no new parameter detail beyond what the schema provides, 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 states a specific action (wait until text appears) on a specific resource (visible page text) and clearly distinguishes from sibling wait_for_selector by contrasting text vs element. It also mentions snapshotting as part of the 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?

Explicitly says this is the right way to wait after an action that starts loading, recommends it over guessing delays, and names the alternative wait_for_selector for element-based waits. 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.

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
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 the annotations (readOnlyHint, openWorldHint), the description adds meaningful behavioral context: polling frequency ('about three times a second'), early return semantics, and the absence of a snapshot in the return value. This provides value over the structured data and gives a clear picture of runtime 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?

Three sentences, each earning its place: first states the core action, second contextualizes against wait_for, third explains behavioral nuance and follow-up. Front-loaded with the primary purpose and 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?

The description, combined with a comprehensive schema and annotations, fully covers what it does, when to use it, how it behaves (polling, early return), and what to do next. No important aspect is left unexplained for this simple 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 input schema already provides 100% coverage with detailed descriptions for all three parameters. The description adds no further parameter-specific details, so it neither helps nor hurts. Baseline 3 is appropriate given the schema handles 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 resource: 'Wait until an element matching a CSS selector appears on the page.' It clearly distinguishes itself from the sibling wait_for by calling itself the 'structural counterpart' and explaining the difference in use cases (knowing markup vs wording).

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: 'use it when you know the markup but not the wording, or when the wording is localised.' It also tells the user what not to expect ('does not return a snapshot') and what to do instead ('follow with take_snapshot when you intend to interact'), effectively naming the alternative wait_for in the process.

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

TDQS

A4.2/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, and detailed descriptions resolve potential confusion. A few adjacent pairs (emulate vs emulate_device, fill vs type_text, take_snapshot vs get_page_content vs query_selector) require careful reading, but the descriptions explicitly delineate when each is appropriate.

Naming Consistency5/5

Tool names follow a consistent verb-first snake_case pattern (e.g., click, navigate_page, list_network_requests, save_session). Minor deviations like 'cf_verify' still read as verb-object, and the pattern holds across all 57 tools.

Tool Count1/5

At 57 tools, this is an extreme count per the calibration rubric. Even for a comprehensive browser automation server, the sheer number overwhelms an agent and suggests over-decomposition; many operations could be consolidated or grouped.

Completeness4/5

The surface covers core browser workflows: navigation, interaction, reading, emulation, session/profile management, network/console inspection, and performance tracing. Gaps exist (e.g., request interception, iframe handling, download management), but they are edge cases rather than primary blockers.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    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.
    15
    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
    12
    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

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/andresolbach/nodriver-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server