real-browser-mcp-server
This server turns AI agents into controlled real-browser operators for automation, testing, and extraction via MCP/STDIO.
Initialize/manage Patchright Chromium sessions with headless/proxy/video/fingerprint spoofing/WebRTC leak protection/ad-blocking.
Navigate, manage tabs, trace redirects, replay requests, and wait for selectors/events/network idle.
Interact naturally: click, drag/slider, type, hover, press keys, scroll, and assist with embedded captcha/forms.
Capture rich
see_pagesnapshots (screenshot, text, element map, iframe inventory) and run multi-step workflows in one call.Extract content, structured data, links, media (HLS/DASH/MP4), API schemas, and SDK boilerplate.
Record/control network traffic, export HAR, block URLs, mock API routes, and inspect WebSockets/GraphQL.
Manage cookies, localStorage, IndexedDB, service workers, and save/load encrypted sessions.
Execute custom JavaScript, analyze DOM/tech/SEO/performance, and track multi-step progress.
Compatible with major AI IDEs (Cursor, VS Code/Cline, Claude Desktop, etc.) through standard STDIO MCP.
Assists with Cloudflare Turnstile challenges on pages the user is authorized to access, enabling automated handling of bot-check prompts.
Integrates Ghostery's ad and tracker blocking engine to block ads and trackers during browsing, reducing distractions and improving page load times.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@real-browser-mcp-serverOpen https://news.ycombinator.com and summarize the top 3 Hacker News stories"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π¦ Real Browser MCP
A production-ready Model Context Protocol (MCP) server that equips AI agents with a reliable, controlled web browser for automation and testing. Built on Patchright (a hardened Playwright fork) and integrated with Ghostery Adblocker, Ghost Cursor (natural mouse dynamics), and an automation assistant for Cloudflare Turnstile challenges.
This server is 100% compatible with all major AI IDEs (Cursor, VS Code, Cline, Roo Code, Windsurf, PearAI, OpenCode, Kilo Code, and Claude Desktop) using standard STDIO communication.
π See POLICY.md for acceptable use guidelines. This tool is intended for QA, testing, accessibility automation, and authorized research.
βοΈ Installation & Setup
Since this project is published on NPM, you can run it either globally via npx / npm, or locally by building from source.
β‘ Quick Start (Using npx)
Add the following to your MCP Configuration file (e.g. cline_mcp_settings.json, claude_desktop_config.json, or Cursor):
{
"mcpServers": {
"real-browser": {
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"]
}
}
}π» Local Run (Direct Source / Pre-built)
If running directly from the local repository build:
{
"mcpServers": {
"real_browser_mcp_server": {
"command": "node",
"args": [
"E:/Github-Software/Real-Browser-Mcp/dist/src/index.js"
],
"env": {
"AI_HEALING": "true",
"HEADLESS": "false"
}
}
}
}π Global Installation
Install it globally on your system. The hardened browser (Patchright Chromium) is downloaded automatically during install β no extra steps needed:
# One command: installs the server AND auto-downloads Patchright Chromium
npm install -g real-browser-mcp-server
# Run the MCP server
real-browser-mcp mcpThepostinstall step automatically runs patchright install chromium, which detects your OS and CPU architecture (Windows / Linux / macOS Γ x64 / arm64 / arm) and fetches the correct binary. If auto-download is skipped (e.g. offline), run it manually:
npx patchright install chromiumSet PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 before npm install to skip the download (e.g. in CI that only builds).
π οΈ Local Development & Build (Git Clone)
If you want to clone the repository and run it locally, follow these exact steps:
# 1. Clone the repository
git clone https://github.com/codeiva11/Real-Browser-Mcp.git
# 2. Navigate to the project directory
cd Real-Browser-Mcp
# 3. Install dependencies (Patchright Chromium is auto-downloaded via postinstall)
npm install
# 4. Build the TypeScript files
npm run build
# 5. Start the MCP server
npm run mcpWhy does npm run build not build the entire project alone?
npm run build only compiles the TypeScript code into JavaScript (dist/). However, the hardened browser engine (patchright) requires the browser binaries, which are now fetched automatically by the postinstall hook (npx patchright install chromium). If you skipped it, run that command manually. Without Chromium, the server will crash trying to find it.
π³ Run via Docker (Recommended for Servers)
We automatically build and publish a production-ready Docker image to GitHub Container Registry (GHCR).
# Pull the latest image
docker pull ghcr.io/codeiva11/real-browser-mcp:latest
# Run the MCP Server (Interactive stdio mode for AI IDEs)
docker run -i --rm ghcr.io/codeiva11/real-browser-mcp:latest(Note: When running via Docker, it automatically runs in headless mode.)
Related MCP server: Browser MCP Server
π Key Automation & Reliability Features
Reliable Browser Engine: Powered by Patchright Chromium, a hardened Playwright fork that reduces false-positives in automation environments (does not expose automation indicators or Webdriver/BiDi flags).
Integrated Ad & Tracker Blocker: Utilizes
@ghostery/adblocker-playwrightwith in-memory prebuilt filter lists (no disk cache), blocking ads and speed-bumps.Natural Interactions: Integrates ghost-cursor-patchright (BΓ©zier curves) to simulate natural mouse movements, velocity, and hover-before-click behaviors. Features Physics-based Smooth Scrolling (
page.realScroll) utilizing real mouse-wheel events and Cubic Ease-Out deceleration to mimic manual trackpad/mouse flicks for reliable interaction with dynamic UIs.Human-like Browsing:
see_pagelets the AI agent plan an entire multi-step task from one view and execute all actions in a single continuous flow via its unifiedstepsworkflow β no screenshot pause after every micro-step, just like a human. (The previously separatebrowse_tasktool is now merged intosee_pageto avoid agent confusion.)Rich Single-Shot Vision:
see_pagenow returns a screenshot plus full page text, all interactive elements with selectors, and an iframe inventory in one call β eliminating the need to re-capture the same page repeatedly.Turnstile Assist: Detects and assists with Cloudflare Turnstile challenges on pages you are authorized to access.
Anti-Race Condition Guards: Robust state-guards ensure popup blockers, shims, and adblockers attach exactly once per page, preventing context destruction.
TypeScript: Entire codebase is written in TypeScript with
strict: truefor type safety and maintainability.
π οΈ AI IDE Compatibility & Configuration Guide
Since this server adheres strictly to the official Model Context Protocol (MCP) specification over STDIO (with all informational logging directed safely to stderr to avoid JSON-RPC corruption), it is fully compatible with every modern AI editor.
1. Claude Desktop
Add the following to your claude_desktop_config.json:
{
"mcpServers": {
"real-browser-mcp-server": {
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"],
"env": {
"HEADLESS": "false",
"AI_HEALING": "true"
}
}
}
}2. Cursor IDE
Open Cursor Settings β Features β MCP.
Click + Add New MCP Server.
Configure as follows:
Name:
real-browser-mcp-serverType:
commandCommand:
npx -y real-browser-mcp-server@latest mcp
Click Save.
3. Cline / Roo Code (VS Code)
Add the server entry to your global MCP settings file (typically found at %APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json):
{
"mcpServers": {
"real-browser-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"],
"env": {
"HEADLESS": "false",
"AI_HEALING": "true"
},
"disabled": false,
"autoApprove": []
}
}
}4. Kilo Code (VS Code)
Add the server entry to your ~/.config/kilo/kilo.jsonc (global) or project kilo.jsonc:
Option A: Local Clone (Recommended for development)
{
"mcp": {
"real_browser_mcp_server": {
"type": "local",
"command": [
"node",
"E:/Github-Software/Real-Browser-Mcp/dist/src/index.js"
],
"environment": {
"HEADLESS": "false",
"AI_HEALING": "true"
},
"enabled": true
}
}
}Option B: Global via npx (Windows)
On Windows, call through cmd.exe /c npx so the batch script resolves cleanly:
{
"mcp": {
"real_browser_mcp_server": {
"type": "local",
"command": ["cmd.exe", "/c", "npx", "-y", "real-browser-mcp-server@latest", "mcp"],
"environment": {
"HEADLESS": "false",
"AI_HEALING": "true"
},
"enabled": true
}
}
}Option C: Global via npx (macOS / Linux)
{
"mcp": {
"real_browser_mcp_server": {
"type": "local",
"command": ["npx", "-y", "real-browser-mcp-server@latest", "mcp"],
"environment": {
"HEADLESS": "false",
"AI_HEALING": "true"
},
"enabled": true
}
}
}5. Windsurf IDE
Configure the server in your ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"real-browser-mcp-server": {
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"],
"env": {
"HEADLESS": "false",
"AI_HEALING": "true"
}
}
}
}6. PearAI
Add the configuration via PearAI Settings β MCP Servers using the standard command setup:
{
"mcpServers": {
"real-browser-mcp-server": {
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"],
"env": { "HEADLESS": "false" }
}
}
}7. OpenCode AI IDE
Configure the server in your opencode.jsonc or standard MCP settings configuration:
{
"mcpServers": {
"real-browser-mcp-server": {
"command": "npx",
"args": ["-y", "real-browser-mcp-server@latest", "mcp"],
"env": {
"HEADLESS": "false",
"AI_HEALING": "true"
}
}
}
}βοΈ Environment Variables
You can configure browser_init defaults directly from the MCP client env block, without passing parameters on every call. Explicit parameters passed to browser_init always override these environment variables.
Variable | Values | Default | Controls |
|
| auto (CI + no-display detection) | Run browser headless (no visible window) |
|
|
| Auto-repair broken CSS selectors in |
|
|
| Block ads and trackers |
|
|
| Assist with Cloudflare Turnstile challenges |
|
| off | Allow |
|
| auto (CI/root detection) | Force-disable or force-enable the Chromium OS sandbox |
| integer |
| Hard watchdog budget per tool call (avoids client "Request timed out") |
|
|
| Structured JSON log verbosity (stdout stays clean for MCP) |
|
| off | Emit |
| path |
| Where |
| UA string or comma-separated list | auto (built from Chromium version) | Override/rotate the browser User-Agent. A list ( |
|
| off | Opt-in for |
Values are case-insensitive. Priority for each option is: explicit browser_init param > environment variable > built-in default.
β οΈ Tool-result content safety: some AI providers (e.g. Anthropic) run safety classifiers on tool results, not just tool definitions. Tool payloads in this server are written content-neutral on purpose β do not patch instructions into tool results telling the model to "read the verification image and type the answer", or you will get
[400]: content-blocked.
π‘οΈ Input caps (hard limits):
press_key.countβ€ 100,click.clickCountβ€ 50,see_page.stepsβ€ 100,media_extractor batch_extract.urlsβ€ 50,execute_js.codeβ€ 200k chars. Values beyond these are clamped with a warning β a runaway agent can never lock the server for hours.
π Complete MCP Tool Reference (21 Tools)
The server exposes 18 tools categorized into functional units:
π Browser & Session
Tool Name | Description | Key Parameters |
| Initialize Patchright browser with ad blocker, AI healing, embedded-widget assist, WebGL/hardware spoofing, WebRTC leak protection, and fingerprint profiles. |
|
| Close browser with cleanup. |
|
π§ Navigation & Tab Management
Tool Name | Description | Key Parameters |
| Navigate to URL or manage browser tabs ( |
|
π Natural Interaction
Tool Name | Description | Key Parameters |
| Natural click or drag-and-drop ( |
|
| Type text with natural speed variation, smart clearing, and iframe support. |
|
| Form filling and embedded widget completion for pages you are testing (JS widgets, text/image input recognition). Externally hosted services are not supported. |
|
| Natural scrolling with lazy-load detection, including inside specific iframes. |
|
| Press keyboard keys with modifier key support (Ctrl/Shift/Alt). |
|
| Run custom JavaScript inside a page or iframe. Also supports |
|
π Extraction & Decoding
Tool Name | Description | Key Parameters |
| Retrieve page content in |
|
| Advanced extractor: regex, JSON, meta, structured, auto, API discovery, string conversion, links. |
|
| Extract HLS/DASH/MP4, control player APIs, convert string formats. |
|
π‘ Network & Utilities
Tool Name | Description | Key Parameters |
| Trace full redirect chains (HTTP 301/302, JS, meta refresh). |
|
| Capture requests, responses, intercepted APIs, GraphQL, WebSockets, media URLs, block unwanted resource URLs (3x faster loads), and mock API routes. Export HAR. |
|
| DOM structure, scripts, page components, tech stack, SEO, web performance metrics, console errors, and recommendations. |
|
| Smart delay for selectors, navigation events, or fixed timeout. |
|
| Inspect & manage client-side storage, cookies, and session state persistence ( |
|
| Capture a snapshot of the current page: screenshot image with optional full-page text, interactive element map, iframe inventory, and visual baseline save/compare for regression testing. |
|
ποΈ AI Vision & Human-like Workflow
Tool Name | Description | Key Parameters |
| Unified vision + human-like task runner: screenshot + page text + all interactive elements + iframe inventory in ONE call. Optionally pass a |
|
Human-like Workflow Pattern:
OLD (repetitive): see_page β click β see_page β type β see_page β click ... NEW (human-like): see_page (once, fullPage) β steps:[click, type, scroll, extract] β see_page (only on page change)
[!IMPORTANT]
The verification-widget tool is namedsolve_captcha and its
captchaSelector parameter targets the input image or widget element.
It only assists with widgets on pages you are testing; externally hosted
services (reCAPTCHA/hCaptcha) are not supported β descriptions stay neutral.
If the current model cannot consume images, see_page still returns a full text + JSON summary, and solve_captcha can return text-only fallback guidance when called with preferTextFallback: true.
π Reliability & Test Coverage
Our test suites cover several real-world pages. Results depend on environment, third-party site changes, and network conditions.
Target Test Platform | Detection Type | Status |
Sannysoft WebDriver | WebDriver/navigator properties check | β Pass |
Cloudflare WAF | Web Application Firewall challenge | β Pass |
Cloudflare Turnstile | CAPTCHA widget assist | β Pass |
FingerprintJS Bot Detector | Fingerprint-based bot detection | β Pass |
reCAPTCHA v3 Score | Google Trust Score test | β Environment-dependent |
Pixelscan Fingerprint | Canvas fingerprint check | β Pass (No Masking Detected) |
Rebrowser Bot Detector | Advanced bot signal detection | β Pass |
π§ͺ Local Test Suite
Test Suite | Test Case | Status |
CJS + ESM | Sannysoft WebDriver Detector | β Passed |
CJS + ESM | Cloudflare WAF | β Passed |
CJS + ESM | Cloudflare Turnstile | β Passed |
CJS + ESM | Fingerprint JS Bot Detector | β Passed |
CJS + ESM | Recaptcha V3 Score | β Passed |
CJS + ESM | Pixelscan Fingerprint Check | β Passed |
π» Programmatic Usage (Node.js SDK)
You can also use the core browser connector directly in your custom Node.js scripts.
CommonJS
const { connect } = require('real-browser-mcp-server');
(async () => {
const { browser, page } = await connect({
headless: false,
turnstile: true
});
await page.goto('https://example.com');
// Natural mouse movement and click
await page.realClick('#my-button');
// Natural smooth scrolling (60FPS Cubic Ease-Out physics)
await page.realScroll(400); // scrolls down 400px smoothly
await browser.close();
})();ESM (ECMAScript Modules)
import { connect } from 'real-browser-mcp-server';
const { browser, page } = await connect({
headless: false,
turnstile: true
});
await page.goto('https://example.com');
await page.realClick('#my-button');
// Natural smooth scrolling (60FPS Cubic Ease-Out physics)
await page.realScroll(400); // scrolls down 400px smoothly
await browser.close();β¨οΈ NPM Script Commands
Run these scripts from the project root directory:
Command | Description |
| Start the MCP server using standard STDIO transport. |
| Build and start the MCP server. |
| Start the MCP server. |
| Start the MCP server with verbose tool listing on |
| List all 21 registered MCP tools with categories. |
| Compile TypeScript into the |
| Build, then run the live anti-bot test suite ( |
| Run CommonJS test scripts. |
| Run ECMAScript Module test scripts. |
Every check in the live-site suite is strict: a failing check (e.g. reCAPTCHA v3 score below 0.9) fails the run. Nothing is ever skipped.
ποΈ Architecture Notes
Design
MCP-first: every tool is defined in
src/shared/tools.tsand dispatched through a singleexecuteTool()router.Handler modules:
src/mcp/handlers/contains focused files βnetwork-recorder.ts,network-extractors.ts,vision-captcha.ts,vision-see-page.ts,media-handlers.tsβ with thin wrappers (network.ts,vision.ts,index.ts) for the tool-facing API.Browser state: a single global
stateobject insrc/mcp/handlers/state.tsholds the current browser/page instance and network recorder data.requireBrowser()/getState()provide typed accessors for handlers.Human-like workflow: the unified
see_pagesteps[]workflow orchestrates the existingclick/type/scroll/press_key/wait/extracthandlers in a continuous sequence β no extra LLM or API key required. The AI agent (LLM client) plans the steps;see_pageexecutes them without pausing.No project pollution: runtime caches (User-Agent detection, saved sessions) are written to the OS temp directory (
os.tmpdir()/real-browser-mcp), never inside the project or working directory. The server does not create a.cachefolder in your project tree.execute_jscaveat: theexecute_jstool runs arbitrary JavaScript inside the controlled browser page context (a sandboxed browser tab). Only invoke it with trusted input.
Known Limitations
Single-session model: the MCP server manages one browser instance at a time. Concurrent multi-session isolation is not supported.
reCAPTCHA / hCaptcha: detected honestly but not solved automatically. Use a third-party service for these.
Vision tools require image-capable models:
see_pageandsolve_captchareturn images. Non-vision models get a full text + JSON summary fallback.TypeScript strict mode: the project compiles with
strict: trueacross all source files, andnoEmitOnError: truemakes a type error fail the build outright (tsc --noEmitpasses cleanly).
π‘οΈ License
This project is licensed under the ISC License. Created and maintained by codeiva11.
Available Tools
19 toolsasync_jobA
Poll or cancel background jobs started with async:true on media_extractor batch_extract, see_page steps, or execute_js. Read-only except cancel.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | No | Job id returned by an async:true call (required for status/result/cancel) | |
| action | No | status: job status + timing (no result payload); result: stored result/error once finished; list: recent jobs (metadata only); cancel: stop a running job | status |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses 'Read-only except cancel,' clarifying that three of four actions are non-mutating. However, it doesn't say what cancel does to stored results (destructive? reversible?), nor permissions or timing behavior for status polling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the resource and provenance front-loaded and the read-only caveat at the end. No filler; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and no output schema, the description covers origin, actions, and mutation caveat adequately. Minor gap: no mention of how 'list' behaves (scope/pagination) or how long results are retained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both jobId and the action enum are fully documented in the schema. The description adds no parameter meaning beyond the schema's own text, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (poll/cancel) and resource (background jobs) and names the exact origins of those jobs (media_extractor batch_extract, see_page steps, execute_js). An agent can distinguish this from siblings like wait or get_content without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly scopes usage to jobs created with async:true on three named tools, which is a strong selection signal. It stops short of explicitly contrasting with the sibling 'wait' (i.e., when to poll vs. block) or stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_closeA
Close the browser session and release all browser resources.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Force-kill the browser process |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry behavioral transparency on its own. It does state the core behaviorβclosing the session and releasing resourcesβwhich is meaningful. However, it does not disclose potential side effects such as losing page state, pending actions becoming invalid, or the implications of force-killing beyond what the schema parameter description already says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, grammatically complete sentence that communicates the essential action and consequence without filler. It is appropriately sized for a simple one-parameter tool and front-loads the primary action clearly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-required-parameter tool with no output schema, the description is mostly adequate, but it lacks usage context and side-effect warnings. The tool is destructive in nature, and an agent would benefit from knowing that closing the session is irreversible and that force is only needed when normal close fails. Overall completeness is acceptable but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 'force' parameter is already documented as 'Force-kill the browser process.' The description adds no extra meaning about when force should be true or what the default behavior implies. This meets the baseline for a fully schema-documented parameter but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') and identifies the resource ('browser session'), making the tool's function unmistakable. It also clearly differentiates from siblings like browser_init and navigate by stating this terminates the entire session. No ambiguity remains about what operation this tool performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to call this tool versus alternatives, such as using it only at the end of a browser session or not for closing individual tabs. Nothing distinguishes appropriate usage scenarios or warns against misuse. The only implied context is the tool's name and sibling relationships, which is not explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_initB
Initialize a browser session with configurable options: headless mode, proxy, viewport, video recording, resource filtering, biometric anti-detection hardware spoofing (WebGL, Canvas, AudioContext), and WebRTC leak protection. Automatically recovers stale sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| proxy | No | ||
| headless | No | ||
| aiHealing | No | Enable selector fallback when a selector does not match | |
| fingerprint | No | Fingerprint profile: 'random' picks a coherent realistic profile (UA + viewport + timezone + locale), or pass an object {userAgent, viewport:{width,height}, timezoneId, locale, geolocation, colorScheme}. Explicit contextOptions win on conflict. | |
| recordVideo | No | Record continuous video of the session | |
| widgetAssist | No | Automatically interact with embedded page widgets and challenge elements when present | |
| enableBlocker | No | Filter auxiliary scripts, telemetry, and background tracking requests | |
| contextOptions | No | Playwright BrowserContext options (viewport, userAgent, geolocation, permissions, httpCredentials, extraHTTPHeaders, etc.) | |
| blockWebRTCLeaks | No | Prevent local IP leaks via WebRTC when using proxies | |
| spoofFingerprint | No | Spoof WebGL vendor/renderer, Canvas noise, and AudioContext to defeat bot fingerprinting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose some behavior: automatic recovery of stale sessions, fingerprint spoofing, WebRTC leak protection, and resource filtering. However, it omits key lifecycle semantics an agent needs β whether a second call replaces or reuses an existing session, whether prior state is destroyed, and what a 'session' handle looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the core action is front-loaded before the option enumeration. The long comma-separated capability list is dense but each item maps to a real parameter, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter session-creation tool with no annotations and no output schema, the description covers the option surface but leaves lifecycle questions unanswered: what the call returns, whether sessions must be closed, and how repeated calls behave. It is adequate but not sufficient on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents nearly all ten parameters, including the non-obvious ones (fingerprint, aiHealing, widgetAssist). The description's option list largely restates those parameter names and adds no format, default, or conflict-resolution detail beyond what the schema provides, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Initialize a browser session') and enumerates the capability areas (headless, proxy, viewport, video, filtering, spoofing, WebRTC). It never names or distinguishes itself from siblings such as browser_close or navigate, so sibling differentiation is absent, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: no statement that this must be called before navigate/click/see_page, no condition for choosing it over an existing session, and no mention of pairing with browser_close. 'Automatically recovers stale sessions' is a behavioral trait, not usage routing, so an agent gets no help deciding when to invoke this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Click or drag a page element by CSS selector or annotation ID. Supports drag-and-drop / slider manipulation via dragTo, iframe context, hover before click, video player API, and automatic retry with fallback selectors.
| Name | Required | Description | Default |
|---|---|---|---|
| delay | No | ||
| aiHeal | No | Try alternative selector if primary fails | |
| dragTo | No | Drag and drop the source element to target selector or coordinates with biological friction and overshoot correction | |
| iframe | No | Target a specific iframe by index (use media_extractor list_iframes to get index) | |
| retries | No | Retry count on failure | |
| timeout | No | Max time to wait for element to appear (ms) | |
| selector | No | CSS selector for the element to click | |
| hoverOnly | No | Hover only, do not click (to reveal hidden controls) | |
| humanLike | No | Smooth cursor movement before click | |
| clickCount | No | ||
| forceClick | No | Click via JavaScript even if element is not visible | |
| hoverFirst | No | Hover over element before clicking (for dynamic controls) | |
| waitForPlay | No | Wait until the video starts playing after click | |
| annotationId | No | Annotation number from see_page(annotate:true) β use instead of selector | |
| usePlayerAPI | No | Control video player via its JavaScript API instead of DOM click | |
| hoverDuration | No | Wait time after hover before clicking (ms) | |
| playerTimeout | No | Max time to wait for video playback to start (ms) | |
| iframeSelector | No | Target a specific iframe by CSS selector | |
| scrollIntoView | No | Scroll element into view before clicking | |
| autoDetectPlayer | No | Detect and target embedded video player iframes automatically | |
| autoAcceptDialogs | No | Auto-dismiss browser dialogs (alerts, confirms) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It discloses several capabilities (drag-and-drop, iframe context, hover, video player API, automatic retry with fallback selectors), but it does not mention side effects (navigation, form submission), permissions, or failure behavior beyond retry. This is useful but incomplete for a potentially destructive action like clicking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action and then a compact list of supported behaviors. No filler or redundancy; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a rich schema (21 params, 90% coverage, nested object) and no output schema, the description covers the main capabilities adequately. It does not explain parameter interactions or the anyOf requirement, but the schema handles those details, so the description is nearly complete for its complementary role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already documents nearly all parameters in detail. The description only references dragTo, iframe, hover, and retry at a high level, adding no new semantic detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Click or drag a page element by CSS selector or annotation ID.' It is immediately clear what the tool does and how the target is specified, distinguishing it from siblings like type or press_key without needing to enumerate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives (e.g., type, press_key, execute_js) or when not to use it. The only implicit hint is 'use instead of selector' for annotationId, which is parameter-level, not tool-level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deep_analysisA
Inspect the current page in depth: DOM structure, scripts, stylesheets, accessibility, performance metrics, SEO tags, response headers, loaded technologies, and content-loading strategy recommendations.
| Name | Required | Description | Default |
|---|---|---|---|
| detailed | No | ||
| aiInsights | No | Include loading strategy recommendations | |
| detectAccessControls | No | Identify embedded widgets and page components |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does identify the tool as an inspection ('Inspect') that covers many read-oriented aspects of a page. However, it does not disclose whether the operation is truly read-only, whether it triggers network requests, how long it may take, or how results are returned. The listed coverage areas provide useful transparency, but side effects and output behavior remain unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the main purpose ('Inspect the current page in depth') before listing coverage areas. It is compact and free of filler, though the long enumerate list is slightly run-on and could be structured with separators or short phrases for easier scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a broad analysis tool with no output schema and no annotations, the description lists what is inspected but not what the agent should expect in return, whether results are aggregated, or how the optional boolean parameters alter the output. It is adequate for a first-order understanding but leaves operational detail unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 67%, and the tool description adds no parameter-level meaning. The 'detailed' boolean is left undocumented, and the 'detectAccessControls' schema description ('Identify embedded widgets and page components') appears mismatched with the parameter name. The tool description echoes 'content-loading strategy recommendations' which maps to aiInsights, but that is redundant with the schema rather than additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Inspect') and a concrete resource ('the current page'), and then enumerates a distinctive set of inspection areas (DOM, scripts, stylesheets, accessibility, performance, SEO, response headers, technologies, loading strategies). This makes it clearly distinguishable from sibling tools like see_page or get_content, which are narrower content/visual viewers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for comprehensive, multi-faceted page analysis, but it does not explicitly state when to use it over siblings such as see_page, get_content, extract_data, or api_analyzer. There are no when-not-to-use conditions or alternative routing hints, leaving the agent to infer the intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_jsA
Execute custom JavaScript in the page context with async support, return value capture, and iframe targeting. Also supports action="fetch" to replay HTTP requests with the page session (cookies/auth inherited, 30s timeout, structured status/headers/body output).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL for fetch action | |
| body | No | Body for fetch action (POST/PUT) | |
| code | No | JavaScript code to execute in the page context (required unless action="fetch") | |
| async | No | Run as a background job: returns a jobId immediately instead of blocking; poll async_job for the result. Inside the job the code is wrapped in an async function, so top-level await works. | |
| action | No | execute: run JS code; fetch: replay an HTTP request with page session | execute |
| iframe | No | Execute inside a specific iframe (0 = main frame, 1+ = iframe by index) | |
| method | No | HTTP method for fetch action | GET |
| headers | No | Headers for fetch action | |
| timeout | No | ||
| returnValue | No | Return the result of the expression | |
| waitForIframe | No | Wait for the iframe to finish loading before executing | |
| iframeSelector | No | Execute inside iframe matched by CSS selector |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add real behavioral context: cookies/auth are inherited from the page session, fetch has a 30s timeout, and output is structured as status/headers/body. It omits the elevated trust level of arbitrary page-context code execution and what happens on script errors, but the fetch-mode semantics are unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the primary capability front-loaded and the secondary mode clearly signposted by 'Also supports'. The middle clause is a compressed parameter summary that reads slightly like a teaser list, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-annotation, no-output-schema tool this covers the two modes and the fetch return shape adequately. Gaps remain around what execute mode returns, error/timeout behavior beyond fetch, and the async job hand-off, which is left entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 92%, so parameter documentation is already largely handled and the baseline is 3. The description mirrors the schema's framing (async support, return value capture, iframe targeting, fetch action) rather than adding format or behavioral detail beyond it, and says nothing about the 200k code length cap or the timeout/returnValue interactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Execute custom JavaScript in the page context') and enumerates the three capabilities (async, return value, iframe targeting) plus a second mode ('action="fetch"' for HTTP replay). Among siblings it is clearly the only arbitrary-code tool, though it doesn't explicitly name which sibling to use instead for read/extract tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use / when-not-to guidance or named alternatives; the async path's hand-off to async_job polling appears only in the schema, not the description. Usage is implied by the capability list, so an agent must infer that this is the fallback when structured tools like get_content or extract_data can't do the job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_dataB
Extract structured data from the current page in multiple modes: regex, json, meta, structured, auto, apiDiscovery, parse (string conversion), transform (data format conversion), or links (all links including nested iframes).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | auto | |
| flags | No | Regex flags | gi |
| types | No | For meta mode: which tag groups to include (all, meta, og, twitter) | |
| source | No | all | |
| pattern | No | For regex mode: the regular expression pattern | |
| jsonPath | No | For json mode: JSONPath expression | |
| selector | No | For structured/links mode: CSS selector to scope the extraction | |
| inputData | No | For transform mode: the string to convert | |
| keyOffset | No | For transform mode: offset value (optional) | |
| autoDecode | No | Automatically process Base64 or percent-encoded values in results | |
| transformKey | No | For transform mode: optional conversion parameter | |
| autoDetectKey | No | For transform mode: locate the conversion parameter from page scripts automatically | |
| includeHidden | No | For links mode: include hidden/non-visible links | |
| searchIframes | No | For links mode: search inside embedded frames |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does add useful scope information: extraction is from the current page, and links mode includes nested iframes. However, it does not disclose return behavior, auto-mode behavior, potential side effects, or whether any network/API calls are triggered by modes like apiDiscovery.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence with the core action front-loaded and the mode list following. It is efficient and contains no filler, though the long comma-separated list is somewhat heavy and could benefit from clearer grouping or line breaks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 14-parameter tool with no output schema and no annotations, so the description must compensate. It provides a useful mode inventory but does not explain mode-to-parameter mapping, default behavior, return values, or failure modes. An agent would likely need to inspect the schema carefully and still be uncertain about how modes like apiDiscovery or transform behave end-to-end.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, so the baseline is 3. The description adds value beyond the schema by defining ambiguous mode names: parse is 'string conversion,' transform is 'data format conversion,' and links mode explicitly covers nested iframes. This helps an agent understand the enumeration beyond raw parameter metadata.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Extract structured data from the current page,' and enumerates distinct extraction modes (regex, json, meta, structured, etc.). It does not explicitly differentiate from sibling tools like get_content or deep_analysis, but the mode list gives enough specificity that the purpose is not ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives like get_content, api_analyzer, or media_extractor. It does not mention prerequisites, recommended modes for common scenarios, or exclusions. The only implicit usage signal is that it operates on the current page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contentB
Get page content in multiple formats: html, text, markdown, rawHttp, or elements. Extracts text, attributes, or bounding box coordinates. Can save directly to a file.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Find elements containing this text | |
| xpath | No | XPath selector | |
| format | No | text | |
| saveAs | No | Absolute file path to save extracted content to disk | |
| timeout | No | ||
| multiple | No | Return multiple matching elements (for format=elements) | |
| selector | No | CSS selector | |
| waitForJS | No | Wait for JavaScript to finish rendering | |
| rawHttpUrl | No | URL to fetch raw HTTP without JS rendering. Defaults to current page URL. | |
| includeMeta | No | Include page title and URL at the top | |
| extractAttributes | No | Extract all element attributes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure burden. It does add meaningful context: content can be returned in multiple formats, text/attributes/bounding boxes can be extracted, and results can be saved to a file. However, it does not disclose what is returned when saveAs is used, the effect of waitForJS, or whether rawHttp bypasses the browser rendering, leaving some behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, front-loads the core purpose and format options, and avoids filler. Every sentence adds useful information about what the tool does or supports.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, no annotations, and no output schema, the description is adequate but not complete. It explains the core operation and parameter-backed capabilities, but it does not describe the return contract, especially the behavior when saveAs is used, nor does it clarify how this tool relates to extract_data and see_page.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 82%, so the baseline for this dimension is 3. The description adds a little extra meaning by mentioning bounding box coordinates and file saving, which map to format=elements and saveAs, but it does not meaningfully clarify undocumented params like timeout or format beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'page content', then names the available formats (html, text, markdown, rawHttp, elements) and types of extraction (text, attributes, bounding box coordinates). It does not explicitly differentiate this from sibling tools like extract_data or see_page, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to prefer get_content over nearby sibling tools such as extract_data, see_page, or navigate. The description implies format-based use cases, but there are no exclusions, prerequisites, or explicit alternative-selection cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
media_extractorB
Extract and control media from the current page. Supports 6 actions: extract (find video/audio/HLS/DASH/download URLs including nested iframes), list_iframes, switch_iframe, player_control (play/pause/seek/sources via player API), decode_url (inspect converted string and token formats), batch_extract.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | No | Also scan inline scripts and data attributes | |
| urls | No | List of URLs for batch_extract action | |
| async | No | For batch_extract only: run as a background job β returns a jobId immediately instead of blocking; poll async_job for the result. | |
| index | No | iframe index number | |
| types | No | Media types to find: video, audio, hls, dash, download, iframes | |
| action | No | extract | |
| quality | No | best | |
| selector | No | iframe CSS selector | |
| decoderIV | No | Optional secondary parameter (for custom conversion) | |
| aiOptimize | No | Select extraction strategy automatically | |
| decoderKey | No | Optional transformation parameter (for custom conversion) | |
| decoderType | No | Conversion type: auto-detect, url, base64, or custom | auto |
| encodedData | No | String data to convert (for decode_url action) | |
| playerAction | No | info | |
| searchIframes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, yet it says nothing about state mutation (switch_iframe changes frame context, player_control alters playback), permissions, side effects, or how batch_extract behaves without the async flag. 'Including nested iframes' and 'via player API' are the only behavioral hints for a 6-action, 15-param tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose followed by a compact action enumeration. Dense but every clause adds information; only mild density cost from packing six actions into one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six distinct action modes, 15 params and no annotations or output schema, the description covers the action menu but not per-action parameter applicability or what each action returns. It is enough to pick an action, but not enough to call the more complex modes (player_control, decode_url, batch_extract) confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 73%, so the schema documents most parameters (deep, async, types, selector, encodedData, etc.) and the baseline is 3. The description adds meaning by mapping actions to capabilities, but it does not clarify which parameters apply to which action, nor does it explain the undocumented enum values (quality, playerAction) or decoderKey/decoderIV semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Extract and control media from the current page') and enumerates all six actions with what each does, so an agent can map intent to action. It does not explicitly differentiate from plausible siblings like extract_data or network_recorder, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical glosses for each action (e.g. 'player_control (play/pause/seek/sources)', 'decode_url (inspect converted string and token formats)') imply when each sub-mode applies. However, there is no explicit when-to-use guidance versus siblings like extract_data or network_recorder, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_recorderB
Record, inspect, and control network activity. Supports 14 actions: start, stop, get, clear, get_media, get_navigations, get_api_calls, get_intercepted_apis, get_websockets, get_graphql, export_har, block_urls (block images/trackers to boost speed 3x-5x), mock_route (intercept & mock API responses), clear_routes.
| Name | Required | Description | Default |
|---|---|---|---|
| mock | No | Configuration for mock_route action | |
| limit | No | For the get action: maximum records to return (default 200, hard max 1000). The result includes totalCount so you know when more records exist. | |
| action | No | get | |
| filter | No | ||
| offset | No | For the get action: number of matching records to skip before returning (default 0). Use with limit to page through a recording. | |
| patterns | No | URL patterns or glob filters for block_urls action (e.g. ["*.png", "*.jpg", "*google-analytics*"]) | |
| captureXhrBody | No | Capture fetch/XHR response bodies (JSON or form-urlencoded) | |
| aiDetectStreams | No | Identify video and audio stream URLs in recorded requests |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It mentions some behavior, such as blocking images/trackers to boost speed and mocking API responses, but does not disclose critical traits like whether clear/clear_routes destroy data, how start/stop recording persists, what capture scope applies, or what permissions are required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then lists actions in a single compact sentence. The action list is long but useful for selecting the correct action, though the run-on enumeration is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 14-action tool with no annotations and no output schema. The description lists action names but does not explain return formats, data retention, start/stop recording semantics, or what each get_* action returns, leaving significant gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so the schema already documents several parameters such as limit, offset, patterns, and mock configuration. The description adds action-name context but does not explain key parameters like filter, captureXhrBody, or aiDetectStreams, so it neither fully compensates nor adds strong semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Record, inspect, and control network activity.' It also enumerates the 14 supported actions, making the tool's scope clear. It does not explicitly distinguish itself from siblings such as media_extractor or redirect_tracer, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The action list implies when to use the tool for recording, inspecting, and controlling network activity, and notes specific uses like blocking URLs for speed. However, it gives no explicit when-to-use versus alternatives, no prerequisites, and no 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.
press_keyC
Press keyboard keys with configurable modifier keys, repeat count, and keystroke delay.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key name (e.g. Enter, Tab, ArrowDown, a) | |
| count | No | Number of times to press the key | |
| modifiers | No | Modifier keys (Alt, Control, Meta, Shift) | |
| humanDelay | No | Add natural delay between repeated presses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden yet discloses nothing about focus requirements, which element receives the key event, error behavior for invalid key names, or side effects. It only restates the configurable parameters rather than describing how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or repetition. It is appropriately sized, though the space saved is space not used for the missing behavioral context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple four-parameter tool with fully documented schema and no output schema, the description covers the basic operation. However, with annotations absent, it should at least state that keys are sent to the currently focused element/session, which is the main thing an agent could get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema with examples and defaults. The description merely echoes 'modifier keys, repeat count, and keystroke delay' without adding format or interaction details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (press) and resource (keyboard keys) plus the configurable axes, which is clear. It does not distinguish itself from siblings like `type` or `click`, so an agent must infer that this is for discrete key presses rather than text entry.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus `type` (text entry) or `click`, nor any mention of prerequisites such as an initialized browser session or a focused element. The agent is left to infer all selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
random_scrollA
Scroll the page with configurable direction, amount, and automatic lazy-load triggering.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Pixels to scroll. 0 = auto-decide based on page content height | |
| iframe | No | Scroll inside a specific iframe by index instead of the main frame | |
| smooth | No | ||
| direction | No | smart | |
| iframeSelector | No | Scroll inside a specific iframe by CSS selector instead of the main frame | |
| aiDetectLazyLoad | No | Detect and trigger lazy-loaded content |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose the core action and the automatic lazy-load triggering side effect, but it does not describe iframe targeting, smart/random direction semantics, smoothness behavior, or other potential effects on page state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no redundant words. It efficiently conveys the core action and key configurable aspects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple utility with all-optional parameters, the description plus schema is mostly adequate. However, with no annotations and no output schema, the description leaves behavioral context like smart/random direction and iframe targeting to be inferred rather than explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description mainly restates high-level concepts like direction, amount, and lazy-loading. It does not add meaning for underspecified parameters such as smooth or the direction enum values smart/random.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('scroll the page') and names configurable behaviors: direction, amount, and lazy-load triggering. This makes the tool's function clear and distinguishes it from sibling interaction tools like click or press_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use for scrolling and triggering lazy-loaded content, and the schema exposes iframe targeting, but it does not explicitly state when to use this tool over alternatives or when not to use it. An agent must infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redirect_tracerA
Trace the complete redirect chain of a URL. Tracks HTTP 301/302, JavaScript navigation (window.location, setTimeout), and meta refresh tags. Returns the full path with status codes and headers.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| timeout | No | Navigation timeout in ms | |
| followJS | No | Track JavaScript-triggered navigations | |
| decodeURLs | No | Automatically decode percent-encoded URLs in the chain | |
| followMeta | No | Track meta refresh redirects | |
| maxRedirects | No | ||
| includeHeaders | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden and does name the redirect mechanisms it follows and the return data. However, the claim that the result includes headers is at odds with the schema's includeHeaders default false, and it does not clarify whether tracing performs a live browser navigation that could affect the current session state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action is front-loaded, and each clause adds useful information: which redirect mechanisms are tracked and what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The core behavior and return summary are present, but because there is no output schema and no annotations, important context is missing: whether the path is a list of hop objects, how headers depend on includeHeaders, and whether the trace mutates the current browser page. The schema defaults help, but they do not fully compensate for these gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 57%, yet the description adds no parameter-specific guidance for the undocumented url, maxRedirects, or includeHeaders fields. The mention of returned headers conflicts with the includeHeaders default, and the redirect-type details do not explain how the followJS and followMeta booleans affect the output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Trace the complete redirect chain'), the concrete resource (a URL), and the exact tracking scope (HTTP 301/302, JavaScript navigation, meta refresh). It also states the return value, which makes it easy to distinguish this tool from browser-navigation or network-capture siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The behavior implies the use case: analyze why a URL ends up where it does. However, the description never explicitly says when to choose this tool over alternatives such as replay_request or network_recorder, nor does it mention any exclusions or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
see_pageA
Capture a snapshot of the current page. Returns a screenshot image together with optional full-page text, an interactive element map (buttons, links, inputs with position and selector), and an iframe inventory β all in a single call.
Workflow: Call once with fullPage:true and annotate:true. From that snapshot, run all planned actions (click, type, scroll, wait, extract) as a steps array without re-capturing the page. Call see_page again only when the page genuinely changes (new navigation, modal, or dynamic content load).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | File path to also save the screenshot image | |
| async | No | When steps are present: run as a background job β returns a jobId immediately instead of blocking; poll async_job for the result. | |
| steps | No | Actions to run sequentially right after capturing the page, without re-capturing between steps. Supported: click, type, press_key, scroll, wait, extract, see, drag, hover, double_click, triple_click, idle. | |
| format | No | jpeg | |
| quality | No | JPEG quality 0-100 | |
| annotate | No | Draw numbered bounding boxes over interactive elements for precise targeting | |
| fullPage | No | Capture the full scrollable page instead of only the visible viewport | |
| autoHover | No | Hover over navigation menus before capturing to reveal dropdowns | |
| maxElements | No | Maximum number of interactive elements to map | |
| scanIframes | No | List embedded iframes with their index and URL | |
| stopOnError | No | Stop step execution on first failure | |
| captureAfter | No | Take a screenshot after the steps array completes | |
| saveBaseline | No | Save current screenshot as visual baseline for later comparison | |
| captureBefore | No | Take a screenshot before running the steps array | |
| includeDomText | No | Include the full DOM text content | |
| watchMutations | No | Report DOM mutations (popups, alerts) since the last capture | |
| compareBaseline | No | Compare current screenshot against saved baseline; returns diffPercent | |
| includeElements | No | Include the interactive element map in the response | |
| includePageText | No | Include cleaned page text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return payload shape and the important non-obvious behavior that steps execute without intermediate re-capture. It leaves unmentioned the baseline save/compare, mutation watching, and the async job behavior, all of which remain schema-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs; the first states what the tool is and returns, the second is a labeled workflow rule. Every sentence carries decision-relevant information and the recommended invocation flags are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter, zero-required browser-capture tool with no annotations and no output schema, the description covers the core loop an agent needs (capture once, batch actions, recapture only on real change). It omits any mention of the async job path, baseline comparison, or mutation watching, which are secondary but not negligible given async changes the call semantics entirely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 95%, so baseline is 3; the description earns above baseline by explaining the relationship the schema cannot β that 'steps' runs sequentially after the capture with no re-capture between steps, and that fullPage/annotate are the recommended starting flags. It does not touch the other 17 parameters, but the schema documents them fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture a snapshot of the current page') and enumerates precisely what the snapshot contains: screenshot image, optional page text, interactive element map, iframe inventory. That composite output implicitly differentiates it from single-purpose siblings like get_content or click, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes a call pattern ('Call once with fullPage:true and annotate:true'), states the alternative workflow (run all planned actions as a steps array without re-capturing), and gives the exact condition for a repeat call ('only when the page genuinely changes β new navigation, modal, or dynamic content load'). This is as close to a rulebook as a description gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_captchaB
Automate form completion and interactive widget verification on web pages. Supports JavaScript-based challenge widgets, image text transcription, and intelligent form field mapping for QA and automated browsing workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Text recognition language code: eng, hin, or eng+hin | eng |
| type | No | Widget type: js_widget (JavaScript-based embedded challenge widget), text (text transcription verification), image (image-based input), auto (detect automatically). | auto |
| iframe | No | Target a specific iframe by index | |
| submit | No | Submit the form after filling all fields | |
| aiMatch | No | Match form fields by semantic similarity even if names differ | |
| timeout | No | ||
| formData | No | Key-value pairs of form fields to fill (field names matched automatically to page inputs) | |
| humanLike | No | Type with variable keystroke delays | |
| maxRetries | No | Maximum refresh attempts before giving up | |
| allowedChars | No | Character set allowed in the answer | |
| analyzeFirst | No | Inspect page structure before filling fields | |
| formSelector | No | CSS selector for the form element (auto-detected if not provided) | |
| inputSelector | No | CSS selector for the answer input field | |
| expectedLength | No | Expected character length of the answer | |
| iframeSelector | No | Target a specific iframe by CSS selector | |
| widgetSelector | No | Alias for captchaSelector | |
| captchaSelector | No | CSS selector targeting the verification element, canvas, image, or interactive widget container | |
| refreshSelector | No | CSS selector for the reload/refresh button | |
| preferTextFallback | No | Return text-only guidance instead of an image when the model cannot process images |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, yet it never says this is a mutating operation that types into fields, may click refresh buttons, and can submit the form (the `submit` param defaults to false but can trigger navigation). It discloses nothing about required page state, failure behavior after `maxRetries`, or what is returned, all of which matter for a 19-parameter side-effecting tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the capability list front-loaded and no filler. It is arguably undersized rather than overly verbose for a tool this broad.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool with nested objects, no output schema, and no annotations, the description leaves key questions unanswered: what it returns (answer text, filled form, status), what happens when all retries fail, and whether the page must be pre-navigated. It is minimally viable but not sufficient on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 95%, so the baseline is 3; the description's mention of 'JavaScript-based challenge widgets, image text transcription, and intelligent form field mapping' loosely maps to the `type`, `lang`, and `aiMatch`/`formData` params but adds no new semantics like selector precedence or how `auto` detection resolves.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action set: automate form completion and interactive widget verification, covering JS widgets, image text transcription, and field mapping. The verb+resource is clear, though the description never uses the term 'captcha' that the tool name and `captchaSelector` imply, and it does not differentiate from siblings such as `type`, `click`, or `extract_data`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names intended contexts (QA, automated browsing workflows) which implies when to reach for it, but gives no explicit when-not-to-use and no mention of the alternative of driving forms manually via `type`/`click` or of prerequisites like an already-loaded page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storage_inspectorA
Inspect and manage client-side storage & sessions. Supports 7 actions: cookies (get all current cookies), save_session (persist cookies & storage state to file), load_session (restore state from file without re-logging), clear_cookies, autosave (auto-save session on every navigation), indexeddb, service_workers.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | cookies | |
| enabled | No | For autosave action: true to enable, false to disable | |
| passphrase | No | AES-256-GCM passphrase. When provided with save_session the file is encrypted; required to load an encrypted session. Never logged or stored. | |
| sessionPath | No | File path to save or load session state (cookies & localStorage) from disk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose real behavior beyond the schema: encryption behavior via passphrase, and that autosave fires on every navigation. However it omits what clear_cookies destroys, whether save_session overwrites an existing file, and any permission or side-effect warnings for a mutation-capable tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence of purpose followed by a compact, parallel action list. Front-loaded and no filler; every clause carries information an agent needs to pick an action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description says nothing about what cookies, indexeddb, or service_workers return, nor how errors surface when sessionPath is missing or passphrase is wrong. For a 4-parameter, unannotated tool with no return documentation, this is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the description adds genuine value on top: it maps each enum value to its semantic meaning (e.g. save_session persists cookies & storage to file, load_session restores without re-logging). It is silent on the interaction of passphrase with load_session/autosave, but the parameter descriptions in the schema cover that adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Inspect and manage client-side storage & sessions') and then enumerates all 7 supported actions with brief glosses, so an agent knows exactly what capability surface exists. No sibling tool in the list touches cookies/IndexedDB/service workers, so the boundary is inherently clear from the wording alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through the action glosses ('restore state from file without re-logging' hints at the load_session scenario). There is no explicit when-to-use/when-not guidance, no statement of prerequisites, and no comparison to any alternative approach for state persistence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeB
Type text into an input field with configurable keystroke delay, field clearing, and iframe support.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| clear | No | Clear the field before typing | |
| delay | No | Delay between keystrokes in ms | |
| aiHeal | No | Try alternative selector if primary fails | |
| iframe | No | Target a specific iframe by index | |
| selector | No | CSS selector for the input field | |
| pressEnter | No | Press Enter after typing | |
| annotationId | No | Annotation number from see_page(annotate:true) β use instead of selector | |
| iframeSelector | No | Target a specific iframe by CSS selector | |
| waitForSelector | No | Wait for the element to appear before typing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It mentions clearing and delay, but largely restates schema parameters and omits important behavioral context such as focus behavior, wait/heal behavior, and what happens if the target is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It states the core action first and then the notable configurable features.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The rich schema covers most parameter details and there is no output schema, so the description is adequate for the core action. However, for a 10-parameter browser automation tool with no annotations, it leaves target-selection and side-effect context to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 90%, so the schema already documents most parameters. The description highlights delay, clearing, and iframe support but does not add syntax or targeting guidance 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Type text into an input field." It adds configurable behaviors, but does not explicitly distinguish itself from sibling tools such as press_key or click.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives no explicit guidance on when to use this tool versus alternatives, nor when to prefer selector versus annotationId. Usage is only implied by the mention of typing into an input field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waitB
Wait for a selector, navigation event, networkidle state, or a fixed timeout before continuing.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | timeout | |
| value | No | Selector string or timeout value in ms | |
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether timeouts throw errors, what happens when a selector never appears, the default/max timeout behavior, or any side effects; it mostly restates the enum modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that lists the supported wait conditions with no wasted text. It is appropriately sized for the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a browser wait tool with no annotations, no output schema, and low parameter coverage, the description omits failure semantics, parameter coupling, and timeout behavior. An agent lacks enough information to call it correctly in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description does not explain how the 'value' parameter should be interpreted for each wait type or what role 'timeout' plays relative to the default. 'value' and 'timeout' remain underdocumented across schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wait) and four wait conditions (selector, navigation, networkidle, timeout), clearly distinguishing it from browser action siblings like click or navigate. It lacks explicit comparison to alternatives, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'before continuing' implies when to use it, but there is no explicit guidance on choosing between wait types or when to avoid waiting. The usage context is present but left largely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v3.3.14- Added
async_job - Changed
click4 fields changed- added
Input schema / properties / delay / maximumAdded value: +1000 - added
Input schema / properties / playerTimeout / maximumAdded value: +30000 - added
Input schema / properties / retries / maximumAdded value: +5 - added
Input schema / properties / timeout / maximumAdded value: +60000
- Changed
execute_js2 fields changed- changed
Input schema / properties / async / descriptionPrevious value: -"Wrap code in an async function"New value: +"Run as a background job: returns a jobId immediately instead of blocking; poll async_job for the result. Inside the job the code is wrapped in an async function, so top-level await works." - added
Input schema / properties / code / maxLengthAdded value: +200000
- Changed
media_extractor2 fields changed- added
Input schema / properties / asyncAdded value: +{ + "default": false, + "description": "For batch_extract only: run as a background job β returns a jobId immediately instead of blocking; poll async_job for the result.", + "type": "boolean" +} - added
Input schema / properties / urls / maxItemsAdded value: +50
- Changed
navigate3 fields changed- added
Input schema / properties / challengeTimeout / maximumAdded value: +90000 - added
Input schema / properties / retries / maximumAdded value: +3 - added
Input schema / properties / timeout / maximumAdded value: +60000
- Changed
network_recorder2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "For the get action: maximum records to return (default 200, hard max 1000). The result includes totalCount so you know when more records exist.", + "maximum": 1000, + "type": "number" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "For the get action: number of matching records to skip before returning (default 0). Use with limit to page through a recording.", + "type": "number" +}
- Changed
press_key1 field changed- added
Input schema / properties / count / maximumAdded value: +100
- Changed
see_page3 fields changed- added
Input schema / properties / asyncAdded value: +{ + "default": false, + "description": "When steps are present: run as a background job β returns a jobId immediately instead of blocking; poll async_job for the result.", + "type": "boolean" +} - added
Input schema / properties / maxElements / maximumAdded value: +200 - added
Input schema / properties / steps / maxItemsAdded value: +100
- Changed
solve_captcha1 field changed- added
Input schema / properties / timeout / maximumAdded value: +120000
- Changed
type2 fields changed- added
Input schema / properties / delay / maximumAdded value: +200 - added
Input schema / properties / text / maxLengthAdded value: +10000
- Changed
wait1 field changed- added
Input schema / properties / timeout / maximumAdded value: +60000
8 tool updates
v3.3.10- Removed
api_analyzer - Changed
browser_init1 field changed- added
Input schema / properties / fingerprintAdded value: +{ + "description": "Fingerprint profile: 'random' picks a coherent realistic profile (UA + viewport + timezone + locale), or pass an object {userAgent, viewport:{width,height}, timezoneId, locale, geolocation, colorScheme}. Explicit contextOptions win on conflict.", + "type": [ + "string", + "object" + ] +}
- Changed
execute_js7 fields changed- added
Input schema / properties / actionAdded value: +{ + "default": "execute", + "description": "execute: run JS code; fetch: replay an HTTP request with page session", + "enum": [ + "execute", + "fetch" + ], + "type": "string" +} - added
Input schema / properties / bodyAdded value: +{ + "description": "Body for fetch action (POST/PUT)", + "type": "string" +} - changed
Input schema / properties / code / descriptionPrevious value: -"JavaScript code to execute in the page context"New value: +"JavaScript code to execute in the page context (required unless action=\"fetch\")" - added
Input schema / properties / headersAdded value: +{ + "description": "Headers for fetch action", + "type": "object" +} - added
Input schema / properties / methodAdded value: +{ + "default": "GET", + "description": "HTTP method for fetch action", + "type": "string" +} - added
Input schema / properties / urlAdded value: +{ + "description": "URL for fetch action", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "code" -]
- Changed
navigate3 fields changed- added
Input schema / properties / challengePollIntervalAdded value: +{ + "default": 2000, + "description": "Poll interval ms while waiting for challenge", + "type": "number" +} - added
Input schema / properties / challengeTimeoutAdded value: +{ + "default": 90000, + "description": "Max ms to wait for challenge to clear (with waitForChallenge)", + "type": "number" +} - added
Input schema / properties / waitForChallengeAdded value: +{ + "default": false, + "description": "After navigation, wait for Cloudflare-style JS challenge (\"Just a moment\") to auto-solve; returns challenge status + clearance cookies", + "type": "boolean" +}
- Removed
progress_tracker - Removed
replay_request - Changed
see_page2 fields changed- added
Input schema / properties / compareBaselineAdded value: +{ + "default": false, + "description": "Compare current screenshot against saved baseline; returns diffPercent", + "type": "boolean" +} - added
Input schema / properties / saveBaselineAdded value: +{ + "default": false, + "description": "Save current screenshot as visual baseline for later comparison", + "type": "boolean" +}
- Changed
storage_inspector2 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "cookies", - "save_session", - "load_session", - "clear_cookies", - "indexeddb", - "service_workers" -]New value: +[ + "cookies", + "save_session", + "load_session", + "clear_cookies", + "autosave", + "indexeddb", + "service_workers" +] - added
Input schema / properties / enabledAdded value: +{ + "description": "For autosave action: true to enable, false to disable", + "type": "boolean" +}
2 tool updates
v3.3.1- Changed
random_scroll2 fields changed- added
Input schema / properties / iframeAdded value: +{ + "description": "Scroll inside a specific iframe by index instead of the main frame", + "type": "number" +} - added
Input schema / properties / iframeSelectorAdded value: +{ + "description": "Scroll inside a specific iframe by CSS selector instead of the main frame", + "type": "string" +}
- Changed
storage_inspector1 field changed- added
Input schema / properties / passphraseAdded value: +{ + "description": "AES-256-GCM passphrase. When provided with save_session the file is encrypted; required to load an encrypted session. Never logged or stored.", + "type": "string" +}
21 tool updates
v3.2.13- First observed
api_analyzer - First observed
browser_close - First observed
browser_init - First observed
click - First observed
deep_analysis - First observed
execute_js - First observed
extract_data - First observed
get_content - First observed
media_extractor - First observed
navigate - First observed
network_recorder - First observed
press_key - First observed
progress_tracker - First observed
random_scroll - First observed
redirect_tracer - First observed
replay_request - First observed
see_page - First observed
solve_captcha - First observed
storage_inspector - First observed
type - First observed
wait
TDQS
Scored across 19 tools
Core interaction tools (click, type, press_key, wait, navigate) are clearly distinct, but the read/extract cluster overlaps heavily: get_content, extract_data, see_page, and deep_analysis all retrieve page information, and an agent must read long descriptions to choose. Several tools (network_recorder, media_extractor, storage_inspector, extract_data) bundle many actions behind one name, adding internal selection ambiguity.
Most names are snake_case, but conventions are mixed: noun-first compounds (browser_init, browser_close), verb-first (get_content, execute_js), and bare verbs (wait, navigate, click, type). Individually readable, yet there is no single predictable pattern to infer names.
19 tools is on the heavy side for a browser automation server, and the multi-action mega-tools effectively expand the surface well beyond 19. Most tools are justified by real capabilities, but some inspection tools could be folded into see_page/extract_data.
The lifecycle is well covered: init/close, navigation and tabs, interaction, scrolling, waiting, content/media/network/storage extraction, captcha, redirect tracing, and async jobs. Minor gaps exist for dropdown selection, file upload, and dialog/alert handling, but agents can work around these with execute_js.
Maintenance
Related MCP Connectors
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
Cloud browsers for AI agents: saved logins, residential IPs, live human takeover, 57 browser tools.
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Related MCP Servers
- AlicenseAqualityDmaintenanceStealth browser automation for AI agents, using source-patched Chromium to bypass bot detection systems like Cloudflare, reCAPTCHA, and FingerprintJS.28Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control browsers with human-like behavior, stealth anti-detection, and 70 tools for navigation, interaction, and monitoring.5 npm1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to run Playwright-compatible browser automation against Chromium with persistent profiles, proxy matching, humanized interactions, and npm, Docker, stdio, or Streamable HTTP deployment.485 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to drive a Chromium-based browser for web research, testing, and automation with Playwright-compatible tools, persistent profiles, proxy matching, extension loading, and humanized input across local or containerized deployments.485 npmMIT