Skip to main content
Glama

Airbrowser

CI PyPI npm License Discord

Open-source browser automation API with anti-detection — Undetectable Chrome for AI agents, web scraping, and automation. REST API + MCP server + VNC debugging. Selenium/Playwright alternative that bypasses Cloudflare.

Quick Start

Docker (one-liner)

docker run -d -p 18080:18080 --name airbrowser ghcr.io/ifokeev/airbrowser-mcp:latest

# With NVIDIA GPU (recommended for anti-detection)
docker run -d -p 18080:18080 --gpus all --device /dev/dri:/dev/dri --name airbrowser ghcr.io/ifokeev/airbrowser-mcp:latest

Portable Downloads

Download and run - no Docker knowledge required:

Platform

Download

Requirements

Linux

airbrowser-linux.tar.gz

uidmap package or Docker

macOS

airbrowser-mac.tar.gz

Colima, Docker Desktop, or Podman

Windows

airbrowser-windows.zip

Docker Desktop or Podman

# Linux/macOS
tar -xzf airbrowser-*.tar.gz && cd airbrowser-* && ./airbrowser

# Windows: Extract zip and double-click airbrowser.bat

From Source

git clone https://github.com/ifokeev/airbrowser-mcp.git
cd airbrowser-mcp
docker compose up --build

# With NVIDIA GPU
docker compose -f compose.gpu.yml up --build

Local Mode (no Docker) — Linux only

Run natively without a container — zero container fingerprint for maximum anti-detection stealth. Tested on Ubuntu/Debian.

git clone https://github.com/ifokeev/airbrowser-mcp.git
cd airbrowser-mcp
uv run python run_local.py         # auto-installs deps + system packages
uv run python run_local.py --vnc   # with VNC viewer at http://localhost:6080/vnc.html

Requires Chrome installed on the host. See python run_local.py --help for options.

Service

URL

Description

Dashboard

http://localhost:8000/dashboard

Browser pool management UI

Swagger Docs

http://localhost:8000/docs/

Interactive API documentation

REST API

http://localhost:8000/api/v1/

Browser automation endpoints

MCP Server

http://localhost:3099/mcp

Model Context Protocol for AI agents

VNC

vnc://localhost:5900

Remote desktop (with --vnc flag)

noVNC

http://localhost:6080/vnc.html

Web-based VNC viewer (with --vnc flag)


Open http://localhost:18080 - all services available:

Service

Path

Dashboard

/

API Docs

/docs/

REST API

/api/v1/

MCP Server

/mcp

VNC Viewer

/vnc/

Related MCP server: cloakbrowser-mcp

Features

  • Undetected Chrome (SeleniumBase UC)

  • 100+ concurrent browsers

  • Persistent profiles & cookies

  • Tab management

  • Proxy per browser (DataImpulse recommended)

  • MCP for AI agents

  • AI vision tools (optional)

GPU passthrough enables hardware-accelerated WebGL rendering via Vulkan, making the browser fingerprint match a real desktop machine. Without it, Chrome falls back to software rendering (SwiftShader) which is easily detected by anti-bot systems.

Requirements: NVIDIA GPU + NVIDIA Container Toolkit

# Docker Compose (recommended)
docker compose -f compose.gpu.yml up

# Docker run
docker run -d -p 18080:18080 \
  --gpus all \
  --device /dev/dri:/dev/dri \
  -e NVIDIA_VISIBLE_DEVICES=all \
  -e NVIDIA_DRIVER_CAPABILITIES=all \
  ghcr.io/ifokeev/airbrowser-mcp:latest

# Portable launcher
./airbrowser --gpu

Without a GPU, Chrome uses --use-gl=swiftshader automatically. With GPU passthrough, it uses --use-gl=angle --use-angle=vulkan for real GPU rendering.

AI Vision (Optional)

Enable AI-powered vision tools (what_is_visible, detect_coordinates) with any OpenAI-compatible vision backend. Vision turns on only when VISION_API_BASE_URL, VISION_API_KEY, and VISION_MODEL are all set.

When smart targeting is enabled per request, detect_coordinates can validate a raw vision point, optionally snap to a nearby clickable target, and return both the original click_point and a resolved_click_point with an outcome_status that tells you whether the result was confirmed, corrected, or needs inspection before clicking. Pair that with gui_click or MCP-compatible gui_click_xy to re-check coordinate clicks and request post-click feedback.

# Docker run
docker run -d -p 18080:18080 \
  -e VISION_API_BASE_URL=https://your-openai-compatible-endpoint/v1 \
  -e VISION_API_KEY=your-api-key \
  -e VISION_MODEL=your-vision-model \
  ghcr.io/ifokeev/airbrowser-mcp:latest

# Docker compose
VISION_API_BASE_URL=https://your-openai-compatible-endpoint/v1 \
VISION_API_KEY=your-api-key \
VISION_MODEL=your-vision-model \
docker compose up

MCP Client Configuration

Add airbrowser to your AI coding assistant:

claude mcp add airbrowser --transport http http://localhost:18080/mcp

Go to Cursor SettingsMCPAdd new MCP Server:

{
  "mcpServers": {
    "airbrowser": {
      "url": "http://localhost:18080/mcp",
      "transport": "http"
    }
  }
}

Add to your MCP settings:

{
  "mcpServers": {
    "airbrowser": {
      "url": "http://localhost:18080/mcp",
      "transport": "http"
    }
  }
}

Follow Cline MCP guide with:

{
  "mcpServers": {
    "airbrowser": {
      "url": "http://localhost:18080/mcp",
      "transport": "http"
    }
  }
}

Follow the Windsurf MCP guide with the config above.

Test your setup

Navigate to https://example.com and take a screenshot

Your AI assistant should create a browser, navigate to the URL, and return a screenshot.

Generated Clients

Auto-generated from OpenAPI spec:

# Python
pip install airbrowser-client

# TypeScript
npm install airbrowser-client

Community

Join our Discord server for support, feature requests, and discussion.

Docs

License

MIT

Available Tools

24 tools
assert_conditionA

Verify a browser condition and report failure as an error.

Use this tool when an expected page state must be explicitly verified. It is a read-only verification operation: it does not click, type, navigate, scroll, or otherwise intentionally modify the page.

Element and text assertions may block while SeleniumBase waits for the condition, up to timeout seconds. Title and URL assertions are checked immediately and ignore timeout. A failed assertion or timeout is handled by handle_sb_errors and returned as a descriptive tool error; it is not reported as a successful result.

Unlike check_if_condition, this tool does not merely return whether a condition is true: a failed expectation is an error. Unlike wait_for_condition, its purpose is to verify an expectation, not merely synchronize with a changing page.

Args: check: - "element_present": Verify that the selector identifies a present element. - "element_visible": Verify that the selector identifies a visible element. - "text_visible": Verify that expected text is visible within selector, or within the whole HTML document if selector is omitted. - "title": Verify the exact current page title immediately. - "url": Verify the exact current URL immediately. - "url_contains": Verify that the current URL contains expected immediately.

selector: CSS or SeleniumBase selector for element and text checks.
    Required for element checks; optional for text_visible.

expected: Expected text, title, or URL value. Required for
    text_visible, title, url, and url_contains.

exact: For text_visible only, require an exact text match instead
    of a substring match.

timeout: Maximum seconds to wait for element/text assertions.
    Must be >= 0. Ignored for title and URL assertions.

Returns: A confirmation message when the assertion passes. If the assertion fails or times out, the error handler returns the resulting error instead of a success message.

Tool selection: - Inspect a condition without failing -> check_if_condition. - Wait for a condition to become true -> wait_for_condition. - Verify that an expected condition is true -> assert_condition.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkNoelement_visible
exactNo
timeoutNo
expectedNo
selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so thoroughly: it declares read-only verification, lists what it does not do (click, type, navigate, scroll, modify), explains blocking behavior for element/text checks vs immediate title/url checks, and states that failures become descriptive tool errors via handle_sb_errors.

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

Conciseness4/5

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

The description is well front-loaded and structured into purpose, behavior, args, returns, and tool selection. It is slightly redundant because the sibling comparisons appear both in prose ('Unlike check_if_condition...') and again in the tool-selection bullets, but the length is largely justified by the tool's complexity and zero schema coverage.

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

Completeness5/5

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

Given no annotations, zero schema description coverage, and an output schema, the description provides everything an agent needs: purpose, usage alternatives, parameter semantics, blocking behavior, and failure handling. Return value details are present as helpful context even though the output schema already defines them.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does. It enumerates every check value, explains selector requirements for element vs text checks, expected requirements per check type, exact matching only for text_visible, and timeout behavior including the >=0 constraint and that it is ignored for title/url assertions.

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

Purpose5/5

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

The description states a specific verb and resource: verify a browser condition and report failure as an error. It clearly distinguishes the tool from check_if_condition and wait_for_condition, so an agent can identify its role without opening schemas.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool ('when an expected page state must be explicitly verified') and provides a dedicated tool-selection section contrasting it with check_if_condition and wait_for_condition. The conditions for choosing each alternative are fully specified.

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

check_if_conditionA

Check the current state of an element or text without waiting for the condition to become true.

Use this tool when you need an immediate boolean observation of the current page state. Use wait_for_condition when the condition may become true later and the workflow should wait for it. Use assert_condition when the condition is an expected requirement and failure should be treated as an assertion error.

Args: check: The element state to inspect when text is not provided: - "present": Return True when at least one matching element exists. - "visible": Return True when the matching element is visible. check is ignored when text is provided.

selector:
    CSS selector or SeleniumBase selector identifying the element.

text:
    Optional text to check for visibility within `selector`. When
    provided, this takes precedence over `check`; the tool checks text
    visibility instead of element presence or visibility. Use this when
    the question is "Is this text currently visible?" rather than
    whether the element itself is present or visible.

Returns: True or False indicating whether the requested condition is currently satisfied. Missing elements return False rather than raising an exception. If there's an error, returns a string with error details.

Tool selection: - Immediate boolean observation -> use check_if_condition. - Wait for a state/content transition -> use wait_for_condition. - Verify an expected condition -> use assert_condition. - Need element details of matching elements -> use find_elements. - Need to read page or element content -> use get_content.

Notes: This tool does not intentionally wait for elements or text to appear. It is intended for checking the current state only. If page timing or asynchronous loading matters, use wait_for_condition instead.

When `text` is provided, `check` is ignored.
ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
checkNovisible
selectorNobody

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that the tool does not wait for elements, that missing elements return False rather than raising, and that errors return a string. It omits any note on permissions or rate/timing guarantees beyond the non-waiting statement, so it is strong but not exhaustive.

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

Conciseness4/5

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

Well front-loaded with the purpose first and structured sections afterward, but the precedence rule ('check' is ignored when 'text' is provided) is stated twice, once in Args and again in Notes, which is redundant for the value delivered.

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

Completeness5/5

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

An output schema exists, so the 'Returns' text is a bonus rather than a necessity, and the description still covers the non-waiting semantics, error behavior, and precedence rules an agent needs. Nothing required to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it largely does: it defines the 'present'/'visible' enum meanings precisely and explains that 'text' takes precedence and causes 'check' to be ignored. It leaves the two schema defaults (check='visible', selector='body') unstated, which is the only gap.

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

Purpose5/5

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

States a specific verb and resource ('Check the current state of an element or text') with the distinguishing constraint 'without waiting for the condition to become true' front-loaded. An agent can separate it from wait_for_condition and assert_condition without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit tool-selection block naming each alternative (wait_for_condition, assert_condition, find_elements, get_content) alongside the condition that selects it. When-to-use and when-not-to-use are both spelled out, including the timing caveat.

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

click_elementA

Click element(s) matching a CSS, XPath, or supported text selector.

Use this tool for normal clicks, clicking a specific matching occurrence, clicking all visible matches, conditional clicks, or clicks scoped to a parent element.

Selection behavior: - nth is 1-based and takes precedence over every other click mode. - Otherwise, all_matches=True clicks every currently visible match. - Otherwise, only_if_visible=True clicks only if a match is visible. - Otherwise, parent_selector scopes the click to a nested element. - With none of the above, performs a normal SeleniumBase click.

Args: selector: CSS selector, XPath selector, or supported SeleniumBase text-matching selector. Text-matching selectors such as a:contains("Sign in") are supported only for single-element clicks; do not use them with all_matches=True.

nth: 1-based occurrence to click when multiple elements match.
    Must be >= 1 if provided. Takes precedence over `all_matches`,
    `only_if_visible`, and `parent_selector`.

all_matches: If True, click every currently visible matching element
    in order of appearance. Ignored when `nth` is provided. Use only
    when multiple clicks are intentionally desired, such as for
    clicking all the checkboxes in a section of a webpage.
    If any of the click actions induces page navigation, then
    subsequent clicks are cancelled without any exceptions raised.

only_if_visible: If True, click only when the target is already
    visible; do not wait for it to become visible.

parent_selector: CSS/XPath selector for the parent/container in which
    to find `selector`. Used only for the nested-click mode.
    Can be used to click an element inside a parent iframe.

timeout: Maximum seconds to wait for a normal click operation.
    Default: 5. Not used by conditional or bulk click modes.

scroll: If True, scroll the target into view before a normal or
    indexed click. Default: True.

Examples: - Click the first button: click_element("button") - Click the 2nd button: click_element("button", nth=2) - Click all checkboxes: click_element('input[type="checkbox"]', all_matches=True) - Click the first visible link: click_element("a", only_if_visible=True) - Click the first button that's inside the first iframe: click_element("button", parent_selector="iframe")

Error behavior: With the exception of using 'only_if_visible=True', if there's no matching element found within the timeout, then @handle_sb_errors returns details from the exception raised.

When not to use: - Do not use this tool if you need to hover an element first before clicking; use hover_action with action="hover_and_click" instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
nthNo
scrollNo
timeoutNo
selectorYes
all_matchesNo
only_if_visibleNo
parent_selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden, and it does well: it discloses that all_matches clicks are cancelled without exceptions if navigation occurs, that only_if_visible does not wait, that timeout is ignored by conditional/bulk modes, and that errors are routed through @handle_sb_errors. It doesn't explicitly state that clicks are destructive/irreversible, but for a click tool the mutation is self-evident and the navigation-cancellation caveat is valuable. A 4 is warranted; a 5 would require even more operational detail like exact exception types or side 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.

Conciseness4/5

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

The description is long but every section earns its place: selection behavior, per-parameter semantics, examples, error behavior, and when-not-to-use. It is well-structured with headers and bullet-like formatting, and the most important scoping rule (nth precedence) is front-loaded. It loses one point only because the length is substantial and some parameter explanations could be tightened without losing clarity.

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

Completeness5/5

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

For a 7-parameter tool with no annotations and 0% schema coverage, the description is remarkably complete. It covers all parameters, precedence, error behavior, and exclusions, and provides five examples covering each mode. The output schema exists, so return-value documentation is not required. Nothing an agent needs to invoke this tool correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate, and it does. Every parameter (selector, nth, all_matches, only_if_visible, parent_selector, timeout, scroll) is explained with semantics, precedence, defaults, and constraints. It even warns that text-matching selectors are unsupported with all_matches=True. This is far beyond what the bare schema provides.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Click element(s) matching a CSS, XPath, or supported text selector.' It then enumerates the distinct click modes (normal, nth, all_matches, only_if_visible, parent-scoped), which clearly differentiates it from sibling tools like hover_action, focus_element, and select_option. The examples further cement what the tool does.

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

Usage Guidelines5/5

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

The description includes an explicit 'When not to use' section that names hover_action as the alternative for hover-then-click flows. It also gives clear selection-behavior precedence rules (nth > all_matches > only_if_visible > parent_selector > normal), so an agent knows exactly when to set which parameter. This is exemplary usage guidance.

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

close_browserA

Close the active browser session and release browser resources.

Call this when the browser automation workflow is finished. Closing the session ends the persistent browser state, including its open tabs, cookies, navigation history, and page state. If browser automation is needed afterward, start a new session with start_browser.

This operation is safe to call when no browser session is active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations available, the description carries full behavioral disclosure. It states that the session's persistent state is ended, enumerating open tabs, cookies, navigation history, and page state, and confirms that calling it with no active session is safe.

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

Conciseness5/5

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

The description is compact and front-loaded with the core action. Each sentence provides distinct, useful context: what it does, when to use it, the alternative, and no-session safety.

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

Completeness5/5

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

For a no-parameter lifecycle tool, the description fully covers purpose, timing, state effects, fallback, and edge-case safety. Since an output schema exists, not detailing the return format is acceptable.

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

Parameters4/5

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

The tool has zero parameters and 100% schema description coverage, so parameter explanation is unnecessary. A baseline of 4 is appropriate because the description does not need to add parameter semantics.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Close the active browser session and release browser resources.' It also differentiates from sibling start_browser by describing the closure as ending the session and pointing to starting a new session if needed.

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

Usage Guidelines5/5

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

It explicitly says to call this when the browser automation workflow is finished and names start_browser as the alternative for subsequent automation. It also clarifies behavior with no active session, removing ambiguity.

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

find_elementsA

Find matching elements and return structured element information.

Use this tool when you need to discover how many elements match a selector, inspect their text/tag names, or inspect the HTML of multiple matches.

This tool converts matching elements into ordinary serializable dictionaries. It does not return live SeleniumBase element objects.

Args: selector: A CSS selector, or an XPath selector that SeleniumBase can convert to CSS. In sb.find_elements, SeleniumBase automatically attempts to convert XPath to CSS. Some XPath expressions, such as those using contains(...), cannot be converted to CSS and therefore aren't supported by this tool.

timeout: Maximum number of seconds to wait for at least one matching
    element to appear. If the selector is an XPath selector that
    cannot be converted into a valid CSS selector, then the wait
    might be less than the timeout.

include_html: If True, include each matching element's outer HTML.
    If False, return only tag name and text.

Returns: A dictionary containing: - count: Number of matching elements found. - matches: A list of element dictionaries containing tag_name and text, plus html when include_html=True. If there's an error during search, then "error" is added into the returned dictionary with error details.

Tool selection: - Need structured information about matching elements -> use find_elements. - Need the visible text/HTML of a page or a single element -> use get_content. - Need to click one of several matches -> use click_element with nth. - Need to know whether an element is present/visible -> use check_if_condition.

Notes: Element handles cannot be persisted across MCP calls. If you find elements and then need to act on one, resolve it again with the appropriate interaction tool.

For uncaught errors, @handle_sb_errors returns strings.
ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorYes
include_htmlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries full burden and delivers: it warns that results are serializable dictionaries rather than live element objects, that handles cannot persist across MCP calls, that XPath 'contains(...)' selectors are unsupported and that timeout may be shortened for unconvertible XPath, and that errors are surfaced in the returned dict. These are non-obvious operational constraints an agent would otherwise learn only by failing.

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

Conciseness4/5

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

The structure is well front-loaded—purpose, then usage, then Args/Returns/Tool selection/Notes—so an agent can skim. It runs slightly long, with some overlap between the opening paragraph and the Args section, and the closing '@handle_sb_errors returns strings' note is internal-sounding boilerplate, but almost every line earns its place.

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

Completeness5/5

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

For a 3-parameter tool with 0% schema coverage and no annotations, the description covers input semantics, return shape, error behavior, and the cross-call persistence limitation, so it is complete even though an output schema exists. Nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and it does: selector (CSS or convertible XPath, with the conversion limitation called out), timeout (max wait for first match, plus the shortening caveat), and include_html (outer HTML vs. tag/text only) are each explained beyond their names and defaults. No parameter is left to guesswork.

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

Purpose5/5

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

The description opens with a specific verb+resource ('Find matching elements and return structured element information') and the Tool selection block explicitly differentiates it from get_content, click_element, and check_if_condition. An agent can identify the tool's niche without opening a schema.

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

Usage Guidelines5/5

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

It states concrete triggers ('discover how many elements match a selector, inspect their text/tag names, or inspect the HTML of multiple matches') and routes to named alternatives with their own conditions. When-to-use vs. when-to-use-something-else is fully covered.

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

focus_elementA

Scroll to, focus, or highlight an element.

This tool does not click, type, select, hover, or otherwise activate the element. Use click_element, type_text, or hover_action for those operations.

Args: selector: CSS selector or SeleniumBase selector identifying the target.

action:
    - "scroll_to_element": Scroll the element into the viewport.
    - "focus": Move keyboard focus to the element.
    - "highlight": Temporarily highlight the element for debugging or
      demonstration by changing the border color. May affect timing
      and/or reduce stealth.

timeout: Maximum seconds to wait for the target element. Default: 5.

If there's no matching element found within the timeout, then @handle_sb_errors returns details from the exception raised.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoscroll_to_element
timeoutNo
selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full load and does well: it discloses that 'highlight' mutates the border color, that this may affect timing, and may reduce stealth — a meaningful side-effect warning. It also describes error behavior via @handle_sb_errors on timeout. It stops short of describing permission prerequisites or reversibility, but for a DOM attention operation this is strong disclosure.

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

Conciseness4/5

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

Front-loaded purpose statement, followed by a tight exclusion sentence and a structured Args block. Slightly verbose with the dedicated non-activation paragraph, but every sentence conveys routing or parameter meaning.

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

Completeness5/5

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

Despite an output schema existing, the description still covers all three parameters, the side effect of highlight, and the timeout failure mode. For a 3-param tool with zero schema coverage, nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and it does: it explains each action enum value individually, defines selector as CSS/SeleniumBase, and specifies timeout units and default. This is materially richer than the bare schema titles.

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

Purpose5/5

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

States specific verbs (scroll to, focus, highlight) on a specific resource (an element), and explicitly distinguishes from siblings by naming click_element, type_text, and hover_action as the tools for activation. An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicitly states when NOT to use it (does not click, type, select, hover, or activate) and names the alternatives for those operations. The action enum values are also mapped to intent, giving the agent a clear decision path.

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

get_attributesA

Read HTML attributes from the first matching element.

Use this tool when you need the value of a specific HTML attribute, or all HTML attributes of an element. Attributes could be something such as href, src, value, class, id, name, type, aria-label, etc.

Args: selector: CSS selector or SeleniumBase-supported XPath selector.

attribute: Specific HTML attribute to retrieve. When omitted, return
    all HTML attributes of the first matching element as a dictionary.

timeout: Maximum seconds to wait for the target element. Default: 5.

Tool selection: - Need one or more HTML attribute values from a specific element -> use this tool. - Need to discover multiple matching elements or inspect their text -> use 'find_elements'. - Need visible text or HTML content -> use 'get_content'. - Need to check element presence/visibility -> use 'check_if_condition'.

This is a read-only operation.

If there's no matching element found within the timeout, then @handle_sb_errors returns details from the exception raised.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorYes
attributeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does most of it: it declares the operation read-only, documents the default 5s timeout wait, and explains the no-match path (exception surfaced via @handle_sb_errors). It does not say whether the element is scrolled into view or how attribute-name casing/normalization is handled, so it is strong but not exhaustive.

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

Conciseness4/5

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

Front-loads the core behavior in the first sentence, then organizes parameters and tool-selection routing into clearly labeled blocks. Slight redundancy between the opening line and the Args section, but every block carries usable information rather than padding.

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

Completeness5/5

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

An output schema exists, so return values need not be enumerated, and the description still notes the dictionary shape when attribute is omitted. Combined with the timeout semantics and the documented error path, an agent has everything needed to call this correctly for a simple 3-parameter read tool.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate and largely does: selector is defined as a CSS selector or SeleniumBase-supported XPath, attribute is explained with its omitted-behavior (return all attributes as a dictionary), and timeout is given a meaning plus its default. It stops short of edge cases like invalid selectors or case sensitivity.

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

Purpose5/5

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

States a precise verb and resource ('Read HTML attributes from the first matching element'), including the scoping detail that only the first match is used. That scoping is exactly what separates it from find_elements, so an agent can distinguish it without opening schemas.

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

Usage Guidelines5/5

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

Contains an explicit 'Tool selection' block that names the alternative tools (find_elements, get_content, check_if_condition) and the condition that routes to each. It also states the positive trigger ('need the value of a specific HTML attribute'). Both when-to-use and when-not are covered.

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

get_contentA

Read visible text, HTML, or discovered URLs from the selected element.

Use this tool when you need to get actual page content or URL information rather than page metadata.

Args: selector: CSS selector or SeleniumBase-supported XPath selector. Default: "body".

output_format:
    - "text": Return visible text from the selected element.
    - "html": Return HTML from the selected element.
    - "urls": Return URLs discovered by SeleniumBase within the
      selected element. Returned URLs are normalized to full URLs
      with their protocol prefixes.

timeout: Maximum seconds to wait for the target element. Default: 5.

Tool selection: - Need URL, title, origin, or User-Agent -> use get_page_info. - Need visible text, html, or URLs on a page -> use get_content. - Need structured information about matching elements -> use find_elements. - Need to check element presence/visibility -> use check_if_condition. - Need to wait for content to appear -> use wait_for_condition.

If there's no matching element found within the timeout, then @handle_sb_errors returns details from the exception raised.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorNobody
output_formatNotext

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and adds meaningful behavior: it defines output_format semantics, notes URL normalization to full protocol-prefixed URLs, states the timeout default and its failure behavior, and mentions @handle_sb_errors exception handling. It does not cover authentication or rate limits, but for a read-oriented content tool this is strong disclosure.

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

Conciseness5/5

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

The description is front-loaded with purpose, then structured into Args and Tool selection sections. Each sentence adds routing or parameter semantics, and the length is justified by the need to compensate for absent schema descriptions and annotations.

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

Completeness5/5

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

Given an output schema exists, the description need not explain return values, and it appropriately focuses on selection, parameters, and failure behavior. It fully covers what an agent needs to invoke the tool correctly despite no annotations and 0% schema description coverage.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate fully. It documents all three parameters: selector syntax and default, timeout meaning and default, and each output_format enum value with its exact return behavior. It adds substantial meaning beyond the bare schema.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Read visible text, HTML, or discovered URLs from the selected element.' It explicitly distinguishes itself from metadata retrieval by naming get_page_info and other alternatives, so an agent can select it without opening the schema.

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

Usage Guidelines5/5

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

It provides an explicit 'Tool selection' routing list that maps five distinct needs to five sibling tools, including get_page_info, find_elements, check_if_condition, and wait_for_condition. This is unambiguous when-to-use guidance with named alternatives.

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

get_page_infoA

Get current browser session and page metadata.

Use this as the primary tool for determining where the browser currently is after navigation, clicks, form submissions, redirects, reloads, or tab switches.

This is a READ-ONLY metadata operation. It does not inspect arbitrary page content, find elements, check visibility, wait for conditions, or assert expected values.

Returns: A dictionary containing: - running: True when browser metadata was successfully retrieved. False when no session is available or metadata retrieval failed. - url: The complete current page URL, including path and query string. - title: The current document title. - origin: The current page origin (scheme, host, and port). - user_agent: The browser's current User-Agent string.

Tool selection: - Need URL, title, origin, or User-Agent -> use get_page_info. - Need visible page text or HTML -> use get_content. - Need information about matching elements -> use find_elements. - Need an immediate state check -> use check_if_condition. - Need to wait for a condition -> use wait_for_condition. - Need to verify an expected condition -> use assert_condition.

Unlike a dedicated browser-status tool, get_page_info is the single source of browser/page metadata. If no browser session is active, it returns {"running": False} instead of attempting to access a page.

This operation does not navigate, reload, click, type, or otherwise modify the current page.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly: it declares the operation READ-ONLY, enumerates what it does not do (inspect, find, check visibility, wait, assert, navigate, modify), and specifies fallback behavior (returns {'running': False} when no session is available). This goes well beyond the structured fields.

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

Conciseness4/5

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

The description is front-loaded and organized with clear sections (purpose, usage, read-only disclaimer, returns, tool selection), but it is longer than necessary for a zero-parameter read. The 'Returns' list duplicates the output schema, and the final sentence repeats the read-only guarantee already stated earlier.

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

Completeness5/5

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

Given the simple read operation, zero parameters, absence of annotations, and the presence of an output schema, the description is complete: it covers purpose, when to use, alternatives, safety profile, return value semantics, and fallback behavior. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters and schema description coverage is 100%, so there are no parameter semantics to clarify. The baseline for zero parameters is 4, which is appropriate here.

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

Purpose5/5

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

The description states a specific verb and resource ('Get current browser session and page metadata') and explicitly differentiates itself from siblings like get_content, find_elements, check_if_condition, wait_for_condition, and assert_condition in the Tool selection section. An agent can immediately tell what this tool is for and why it exists.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool ('after navigation, clicks, form submissions, redirects, reloads, or tab switches') and provides a clear routing table mapping other needs to their correct sibling tools. No ambiguity remains about alternatives.

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

hover_actionA

Hover over an element, optionally click another, or drag-and-drop.

Use this tool for hover interactions, hover-triggered menus, and drag-and-drop operations.

Args: selector: The primary element selector. For action="hover", this is the element to hover over. For action="hover_and_click", this is the element to hover over before clicking 'secondary_selector'. For action="drag_and_drop", this is the draggable source element.

secondary_selector:
    The secondary element selector.
    Required for action="hover_and_click", where it identifies
    the element to click after hovering 'selector'.
    Required for action="drag_and_drop", where it identifies the
    destination/drop target.
    Not used for action="hover".

action:
    - "hover": Hover over 'selector' only.
    - "hover_and_click": Hover over 'selector', then click
      'secondary_selector' after a short moment has passed.
    - "drag_and_drop": Drag 'selector' and drop it onto
      'secondary_selector'.

timeout: Maximum seconds to wait for 'selector'.
    For drag_and_drop, the same timeout applies to secondary_selector.
    For hover_and_click, SeleniumBase uses its own short wait for
    secondary_selector; this parameter does not extend that secondary
    wait.

Returns: A confirmation message describing the performed operation's result.

Error behavior: If a required element cannot be found or interacted with within the applicable wait period, or if an error occurs during the action, the resulting exception message is returned through @handle_sb_errors. Failing actions such as failed hover_and_click will raise exceptions.

When not to use: - Do not use this tool to click if you don't need to hover an element before clicking another; use 'click' instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNohover
timeoutNo
selectorYes
secondary_selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It precisely explains the timing semantics for hover_and_click (including the separate short wait for secondary_selector), how timeout applies differently across actions, the two-step nature of drag_and_drop, and error behavior (exceptions propagated via @handle_sb_errors). This is thorough and preempts common failure modes.

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

Conciseness5/5

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

The description is structured with clear sections (Args, Returns, Error behavior, When not to use) and front-loads the core purpose. Each sentence adds value—no filler or repetition. Despite its length, every part is essential to correct usage, making it appropriately concise for the tool's complexity.

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

Completeness5/5

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

Given the tool's complexity (three actions with distinct selector roles), the description covers everything an agent needs: parameter meanings, action-specific behaviors, timeout semantics, error handling, and return format. It also explicitly calls out when not to use the tool. There is no missing information that would cause mis-invocation.

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

Parameters5/5

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

Schema coverage is 0%, so the description must fully compensate. It does so by explaining each parameter's role per action: selector's three context-dependent meanings, secondary_selector's conditions and exclusions, the action enum with descriptions, and timeout's per-action nuances. This exceeds what the schema provides and leaves no ambiguity.

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

Purpose5/5

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

The description opens with a clear statement of the tool's function: 'Hover over an element, optionally click another, or drag-and-drop.' It explicitly lists the three action variants and distinguishes itself from siblings like click_element and focus_element by focusing on hover interactions. The purpose is unambiguous and differentiates from alternatives.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance for each action, including when to use hover_and_click and drag_and_drop. It also contains a 'When not to use' section that directs agents to use 'click' when no hover is needed, naming the alternative tool directly. This leaves no ambiguity about when to select this tool.

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

manage_cookiesA

Manage cookies for the current browser session.

Use this tool to inspect, clear, save, or restore browser cookies. Cookie management is useful for inspecting session state, preserving login sessions between browser runs, restoring previously saved sessions, or resetting website state during testing.

Args: action: - "get_all": Return all cookies currently available to the browser, including attributes such as name, value, domain, path, expiry, and security flags. - "clear": Delete all cookies from the current browser session. - "save": Save current cookies to filename. The file may be created or overwritten. - "load": Load cookies from filename into the current browser session.

filename: Filesystem path used by save/load.
    Ignored for get_all and clear.

Returns: "get_all": Current browser cookies. "clear": Confirmation that cookies were cleared. "save": Confirmation containing the destination filename. "load": Confirmation containing the source filename.

Security: Cookie data can contain authentication credentials, session identifiers, and other private information. Only inspect, save, load, or share cookies when explicitly authorized.

`filename` is passed to SeleniumBase's cookie persistence methods and
can access the filesystem available to the MCP server. Use only
trusted, authorized paths. The save action may overwrite an existing
file.

Notes: Loading saved cookies does not guarantee restoration of a login. Cookies may be expired, invalidated, domain/path restricted, or dependent on other browser state. Navigate to the relevant site when necessary so the browser has the appropriate origin for the cookies.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoget_all
filenameNocookies.txt

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries full responsibility for behavioral disclosure. It warns about filesystem access, potential file overwriting, privacy of cookie data, and the unreliability of restoring logins. It also clearly notes that cookies may be expired or domain-restricted, giving a transparent view of limitations.

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

Conciseness5/5

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

The description is well-organized into sections (Description, Args, Returns, Security, Notes) and every sentence contributes essential information. It is detailed but not redundant, balancing thoroughness with clarity.

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

Completeness5/5

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

Despite lacking an output schema, the description textually describes the return expectations for each action (e.g., confirmation containing filename). It also covers security considerations, file overwriting behavior, and functional limitations, making it complete for an agent to decide when and how to use the tool.

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

Parameters5/5

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

The schema provides no descriptions, but the tool description explains both parameters thoroughly: action with its four enum values and their effects, and filename with its purpose for save/load and that it is ignored for get_all/clear. Defaults are also mentioned implicitly. This adds significant meaning beyond the raw schema.

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

Purpose5/5

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

The description clearly states 'Manage cookies for the current browser session' and then enumerates four specific actions (get_all, clear, save, load). This is distinct from sibling tools like manage_storage or manage_window, making its purpose unambiguous.

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

Usage Guidelines4/5

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

The description provides concrete usage scenarios (preserving login sessions, restoring saved sessions, resetting website state during testing) and notes about navigating to a site before loading cookies. However, it does not explicitly state when to prefer this over a sibling tool like manage_storage, so it falls short of fully explicit when/when-not guidance.

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

manage_historyA

Manage or inspect the current browser tab's navigation history.

Use 'back' or 'forward' for history navigation, 'reload' to refresh while bypassing the cache, or 'list' to inspect history. Use 'open_url' for navigation to an arbitrary URL.

Args: action: - "back": Go to the previous history entry, if available. - "forward": Go to the next history entry, if available. - "reload": Reload the current page while ignoring the cache. - "list": Return the current history position and entries.

Navigation actions can trigger page loads or redirects. Use get_page_info afterward to verify the resulting URL or title.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolist

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and largely meets it: it warns that navigation actions can trigger page loads or redirects, that 'reload' bypasses the cache, that 'back'/'forward' only apply 'if available', and what 'list' returns. It does not mention whether history is per-tab vs session scoped or any failure mode when no history entry exists, so it falls short of a 5.

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

Conciseness4/5

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

Front-loaded with the core purpose and a use-for routing sentence before the Args block, which is the right ordering. There is mild redundancy – 'reload' semantics are stated twice (summary line and Args entry) – but the extra lines are informative rather than filler.

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

Completeness5/5

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

For a single-enum-parameter tool with an output schema already covering return values, the description covers everything an agent needs: action semantics, side effects, and the sibling to use for arbitrary URLs. Nothing material is left for the agent to infer.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must supply parameter meaning, and it does: each enum value is documented with its effect ('reload' ignoring the cache, 'list' returning position and entries, back/forward conditional on availability). Only the default ('list') is not restated, which is minor given it is captured in the schema's default field.

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

Purpose5/5

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

States a specific verb (manage/inspect) and resource (current browser tab's navigation history), then enumerates the four actions it performs. It also names the sibling it is not (open_url) so the agent can disambiguate navigation-vs-history behavior without inspecting either schema.

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

Usage Guidelines5/5

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

Explicitly routes each action: 'back'/'forward' for history navigation, 'reload' for cache-bypassing refresh, 'list' to inspect history, and directs the agent to open_url for arbitrary URL navigation. It also tells the agent to call get_page_info afterward to verify the result, which is a concrete follow-up guideline.

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

manage_storageA

Get or set a key in localStorage or sessionStorage.

Use this tool when the browser workflow needs to inspect or modify JavaScript Web Storage belonging to the current page origin.

Tool selection: - Need localStorage/sessionStorage -> use this tool. - Need cookies or authentication cookies -> use manage_cookies. - Need arbitrary JavaScript or storage operations not covered here -> use run_javascript. - Need visible page content or HTML -> use get_content. - Need an element's HTML attributes -> use get_attributes.

When not to use: - Do not use this tool for HTTP cookies; use manage_cookies instead. - Do not use this tool for arbitrary page JavaScript; use run_javascript when a higher-level tool is insufficient. - Do not use this tool to inspect values from another origin; storage is scoped to the current page origin.

Args: key: Storage key to read or modify.

value: Value to store when action="set". Required for set.

storage: "local" for localStorage or "session" for sessionStorage.

action: "get" to read the key or "set" to write the key.

Returns: The stored value for get, or a confirmation message for set.

Security: Web storage can contain authentication tokens, session identifiers, and other sensitive application state. Only use this tool with trusted sites and authorized MCP clients.

Notes: Storage belongs to the current page origin. Values from one website are not generally available to another origin.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
valueNo
actionNoget
storageNolocal

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and includes return behavior, security warnings about sensitive tokens, and origin scoping. It could more explicitly mention that setting a value overwrites an existing key, but the overall behavior is 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.

Conciseness5/5

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

The description is well-organized into purpose, selection guidance, parameter explanations, returns, security, and notes. Every section adds useful information, and the structure makes it easy to scan.

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

Completeness5/5

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

Despite having no output schema, the description covers what the tool returns, security considerations, and the important scope-of-origin constraint. This gives an agent enough context to use the tool correctly and safely.

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

Parameters5/5

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

The description explains all four parameters in plain language, including that value is required when action is 'set' and that storage selects local or session storage. This adds meaningful guidance beyond the bare schema titles and enum lists.

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

Purpose5/5

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

The description clearly states the tool's function: 'Get or set a key in localStorage or sessionStorage.' It specifies the resource (web storage), the actions (get/set), and distinguishes this tool from siblings like manage_cookies and run_javascript.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool for localStorage/sessionStorage and when not to, naming alternatives such as manage_cookies, run_javascript, get_content, and get_attributes. This gives clear guidance for an agent to select the correct tool.

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

manage_tabsA

Manage browser tabs, including opening new ones.

Use this for listing, opening, switching, or closing tabs. Use open_url and manage_history for navigation within the active tab.

Args: action: - "list_tabs": Return each tab's index, URL, and title. Use this to find the tab_index for "switch_to_tab". - "open_new_tab": Open a new tab, optionally navigating to url. - "switch_to_tab": Switch to the tab at tab_index from "list_tabs". - "switch_to_newest_tab": Switch to the newest tab. - "close_active_tab": Close the active tab. This action must be followed by a 'manage_tabs' action that switches to a new tab, such as "switch_to_tab" or "switch_to_newest_tab".

url: URL for "open_new_tab". If not provided, "about:blank" is used.

tab_index: Tab index from "list_tabs" that is only used for the
    "switch_to_tab" action.)

switch_to: If using "open_new_tab", switch to the new tab when True.

Notes: Tab indexes are session-relative and may change after tabs are opened or closed. Use "list_tabs" to get current indexes before switching by index.

Error behavior: If there's an error during any of the tab actions, then @handle_sb_errors will propagate the exception as an error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
actionNolist_tabs
switch_toNo
tab_indexNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the destructive close_active_tab action and the requirement to follow it with a switch action, notes that tab indexes are session-relative and unstable, and documents the error-handling behavior through @handle_sb_errors. This goes well beyond the bare action list.

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

Conciseness5/5

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

The description is clearly organized with Args, Notes, and Error behavior sections. Every block adds practical information: action semantics, parameter constraints, session-relative index warnings, and exception propagation. The length is justified by the multi-action surface.

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

Completeness5/5

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

For a multi-action browser-tab tool with no annotations and an output schema present, the description alone covers all the essential semantics: what to use it for, what each action does, how parameters interact with actions, session-relative index caveats, and error behavior. An agent has enough to call it correctly.

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

Parameters5/5

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

The input schema has no per-parameter descriptions, but the tool description explains every parameter, including defaults, action-specific applicability, and the meaning of switch_to. For example, it says tab_index is only used by switch_to_tab and that url defaults to about:blank on open_new_tab. This fully compensates for the schema's 0% coverage.

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

Purpose5/5

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

The first sentence identifies a specific capability (managing browser tabs: list, open, switch, close) and explicitly contrasts with open_url and manage_history for navigation within the active tab. This lets an agent distinguish manage_tabs from siblings without inspecting schemas.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool ('listing, opening, switching, or closing tabs') and when to use alternatives ('open_url' and 'manage_history' for navigation within the active tab). It also gives procedural guidance, such as using list_tabs to obtain a current tab_index before switch_to_tab because indexes change.

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

manage_windowA

Get or change browser window geometry or state.

Args: action: - "get_rect": Return the current window position and size. - "set_rect": Set x, y, width, and height. All four are required. - "maximize": Maximize the browser window. - "minimize": Minimize the browser window.

x: Horizontal screen position for "set_rect".

y: Vertical screen position for "set_rect".

width: Window width for "set_rect".

height: Window height for "set_rect".

Notes: Use this tool for browser-window geometry and state. Use manage_tabs for switching between browser tabs.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
widthNo
actionNoget_rect
heightNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and mostly succeeds: it explains the read behavior of get_rect, the mutating behavior of set_rect with the all-four-required constraint, and the state changes for maximize/minimize. It stops short of a 5 because it does not address side effects such as persistence or reversibility of window state changes.

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

Conciseness5/5

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

The description is cleanly organized into an opening sentence, a compact Args list, and a short Notes block. Each line contributes necessary information, and the action list is scannable without unnecessary prose.

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

Completeness5/5

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

With an output schema present and all parameter semantics explained in the description, nothing critical is missing for invocation. The description also resolves the main contextual ambiguity by directing tab operations to manage_tabs.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by defining every parameter: the four action enum values with their effects, and x, y, width, and height scoped to set_rect with the required-parameter warning. This adds all the meaning the schema lacks.

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

Purpose5/5

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

The description opens with 'Get or change browser window geometry or state' – a specific verb and resource – then enumerates each action. It also distinguishes itself from manage_tabs by noting that manage_tabs handles tab switching, so an agent can select this tool confidently.

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

Usage Guidelines5/5

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

The Notes section explicitly states when to use this tool ('Use this tool for browser-window geometry and state') and names the sibling alternative ('Use manage_tabs for switching between browser tabs'). This is direct routing guidance rather than implied usage.

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

open_urlA

Navigate the current browser tab to the URL provided.

Use this when the browser needs to visit a new URL rather than move through its existing back/forward history.

If the URL does not include a protocol such as "https://", SeleniumBase automatically prefixes "https://" before navigation. For example, "seleniumbase.io" becomes "https://seleniumbase.io".

Navigation waits for the browser's navigation operation to complete before returning. Dynamic content may still be loading; use wait_for_condition when synchronization is required. If there's an error, that gets propagated through @handle_sb_errors.

Args: url: The destination URL. May be a complete URL such as "https://example.com", or a hostname such as "example.com".

Returns: A confirmation message containing the requested URL if successful.

Tool selection: - Navigate to a new URL -> use open_url. - Return to the previous page -> use manage_history(action="back"). - Go forward in history -> use manage_history(action="forward"). - Refresh the current page -> use manage_history(action="reload").

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden and does so well: it discloses automatic 'https://' prefixing for bare hostnames, that navigation blocks until the navigation operation completes, that dynamic content may still be loading (routing to wait_for_condition), and that errors propagate through @handle_sb_errors. These are exactly the behaviors an agent needs to sequence calls correctly.

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

Conciseness4/5

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

Front-loaded with purpose, then behavior, then routing, which is a sensible order and every paragraph carries information. The 'Returns:' block is mildly redundant given an output schema exists, and the Args/Returns scaffolding adds a little length, but there is no padding prose.

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

Completeness5/5

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

For a one-parameter navigation tool, the description covers purpose, alternative routing, input normalization, timing/synchronization semantics, and error behavior. With an output schema present, the brief return note is sufficient; nothing needed to call this correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and does: it explains that 'url' accepts either a complete URL such as 'https://example.com' or a bare hostname such as 'example.com', and what transformation occurs in the latter case. This is meaningfully more than the schema's bare string type.

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

Purpose5/5

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

Opens with a specific verb and resource: 'Navigate the current browser tab to the URL provided.' It explicitly distinguishes itself from history navigation, naming manage_history(action="back"/"forward"/"reload") as the alternative, so an agent can separate it from siblings without opening a schema.

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

Usage Guidelines5/5

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

The 'Tool selection' block gives explicit when-to-use and when-not-to-use routing: new URL -> open_url, back/forward/reload -> manage_history. The opening sentence also states the condition ('needs to visit a new URL rather than move through its existing back/forward history'). Nothing is left to inference.

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

run_javascriptA

Evaluate a JavaScript expression in the current page context.

Use this only when the required browser operation cannot be accomplished through the higher-level SeleniumBase tools.

The expression is evaluated through Chrome DevTools Protocol Runtime.evaluate in the currently active page. It executes with access to the page's JavaScript context, including DOM APIs, browser storage, and other same-origin page resources available to JavaScript.

Tool selection: - Prefer click_element, type_text, select_option, hover_action, focus_element, scroll_page, and other higher-level tools for normal browser interactions. - Prefer get_content, get_attributes, and find_elements for reading page content or element information. - Prefer manage_storage for ordinary localStorage/sessionStorage reads and writes. - Prefer manage_cookies for browser cookie operations. - Use this tool when a required operation needs arbitrary JavaScript that the higher-level tools do not expose.

Args: expression: A JavaScript expression or executable JavaScript code evaluated in the current page. It may reference standard browser globals such as document and window and may use DOM APIs.

    Examples:
        - "document.title"
        - "document.querySelector('button')?.textContent"
        - "localStorage.getItem('theme')"
        - "document.body.classList.contains('dark')"
        - "document.querySelector('#slider').value = '50'"

    The expression should produce a value when a result is needed.
    JavaScript that returns a Promise is supported and its resolved
    value is returned.

Returns: The JavaScript evaluation result when it can be serialized and returned across the MCP boundary. Primitive values, arrays, plain objects, and null are generally suitable return values. DOM objects, functions, symbols, and other non-serializable JavaScript values may not be returned directly; extract the needed property or convert the value to a serializable form first.

Security: This provides unrestricted JavaScript execution in the current browser page. It can read or modify page data and interact with the page in ways that bypass the higher-level tool abstractions. Only expose this MCP server to trusted clients.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYes

TDQS

A4.9/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden, and it does: it discloses the execution channel (CDP Runtime.evaluate in the active page), what the code can reach (DOM APIs, storage, same-origin resources), the escaping behavior for Promises, the return-serialization limits (DOM objects/functions/symbols may not cross the MCP boundary), and a security warning about unrestricted execution. That is a rich behavioral profile well beyond a restated name.

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

Conciseness4/5

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

Front-loaded with the verb and the core selection rule, then cleanly sectioned into Tool selection, Args, Returns, and Security. It is longer than strictly necessary — the Security paragraph partially restates the bypass point already made in the opening and tool-selection sections — but every remaining sentence is actionable.

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

Completeness5/5

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

For a single-parameter arbitrary-execution tool with no output schema and no annotations, the definition covers purpose, routing, parameter shape, return serialization, and safety implications. There is nothing an agent needs in order to invoke it correctly that is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate fully and does: it defines 'expression' as an evaluable expression or executable code referencing document/window, and supplies five concrete examples spanning reads, optional chaining, storage access, and a mutation, plus the Promise-return rule. This is more semantic detail than a schema would typically carry.

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

Purpose5/5

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

The opening sentence states a specific verb and resource ('Evaluate a JavaScript expression in the current page context') and the body clarifies the execution mechanism (CDP Runtime.evaluate) and scope (active page). An agent can distinguish this from every sibling because the description names the exact capability the higher-level tools lack.

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

Usage Guidelines5/5

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

Explicit when-to-use ('only when the required browser operation cannot be accomplished through the higher-level SeleniumBase tools') plus a categorized list of alternatives (click_element/type_text for interaction, get_content/find_elements for reading, manage_storage, manage_cookies). The condition that selects this tool over each alternative is spelled out, not inferred.

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

save_pageA

Save the current browser page to a local filesystem file.

Use this tool when the browser workflow needs a persistent file artifact from the current page: a PNG screenshot, the current page source as HTML, or a PDF representation of the current page.

A browser session must already be running. This tool operates on the currently active browser tab and does not navigate, click, type, or otherwise modify the webpage.

Args: format: - "screenshot": Save a PNG screenshot of the current page. - "html": Save the current page source as an HTML file. - "pdf": Save the current page as a PDF.

filename:
    Optional output filename. If omitted, defaults to:
    - "screenshot.png" for format="screenshot"
    - "page_source.html" for format="html"
    - "page.pdf" for format="pdf"

folder:
    Optional destination folder passed to SeleniumBase.
    If omitted, SeleniumBase uses its default output location.

Side effects and filesystem behavior: This tool writes a file to the filesystem and may overwrite an existing file with the same output name. Only use trusted and authorized filesystem paths. The MCP process must have permission to write to the requested destination.

The tool does not upload, publish, or transmit the saved file by
itself. The resulting file remains in the filesystem available to
the MCP server process.

Error behavior: If the browser session is not running, the tool returns a lifecycle error. Filesystem, browser, or SeleniumBase failures are converted into descriptive MCP error results by the server's error handler.

When not to use: - Do not use this tool merely to read page text or HTML; use get_content instead. - Do not use this tool when you only need page metadata such as the URL or title; use get_page_info instead. - Do not use this tool to manipulate the page; use the appropriate interaction tool such as click_element, type_text, or select_option.

Returns: A confirmation message containing the requested output format and filename after the save operation succeeds.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNo
formatNoscreenshot
filenameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden and does so: it discloses filesystem writes, overwrite risk, trusted-path requirement, permission needs, no upload/publish behavior, prerequisite of a running session, and error behavior. This is unusually complete for a mutation tool with zero annotation coverage.

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

Conciseness4/5

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

Well structured with front-loaded purpose and clearly labeled sections (Args, Side effects, Error behavior, When not to use, Returns). Slightly longer than strictly necessary, with some restatement in the error section, but every paragraph earns its place for a tool with no annotations.

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

Completeness5/5

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

Given zero annotation coverage, 0% schema description coverage, and mutation semantics, the description is complete: prerequisites, side effects, error handling, parameter behavior, and sibling routing are all covered. Output is a confirmation message, so the brief Returns note suffices even with an output schema present.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it defines the three format values, explains filename defaults per format, and clarifies that folder is passed to SeleniumBase with a stated default fallback.

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

Purpose5/5

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

Starts with a specific verb+resource ('Save the current browser page to a local filesystem file') and enumerates the three output formats. Clearly distinguished from read-only siblings like get_content and get_page_info.

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

Usage Guidelines5/5

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

Provides an explicit 'when to use' trigger (persistent file artifact needed) and a 'when not to use' section that names get_content, get_page_info, click_element, type_text, and select_option with the conditions that select each. Fully routable.

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

scroll_pageA

Scroll the current page vertically.

Args: direction: - "up": Scroll upward by amount percent of the window height. - "down": Scroll downward by amount percent of the window height. - "top": Scroll directly to the top; amount is ignored. - "bottom": Scroll directly to the bottom; amount is ignored.

amount: Percentage of the current viewport height used for relative
    up/down scrolling. For example, amount=25 scrolls approximately
    one quarter of the viewport height.

Notes: Values greater than 100 for amount are allowed. For example, 200 means approximately two viewport heights.

Tool selection: - Need to reveal a specific element -> use 'focus_element' with action="scroll_to_element". - Need to scroll the page by a relative amount -> use 'scroll_page'.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNo
directionNodown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

Since annotations are absent, the description carries the full burden of behavioral disclosure. It explains how the scroll works (percentage of viewport height, directions, top/bottom ignoring amount, allowed values >100). It does not describe edge cases like page load state or iframes, but for a scrolling tool this is adequate. It adds value beyond the raw schema by explaining semantics.

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

Conciseness5/5

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

The description is well-organized into sections (Args, Notes, Tool selection). Although it is moderately long, every section earns its place: args explain parameters, notes clarify behavior, and tool selection provides routing guidance. It is front-loaded with the core purpose and avoids redundancy.

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

Completeness5/5

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

Given that an output schema exists, the description need not explain return values (and indeed does not). It covers the parameters thoroughly, provides usage guidelines, and discloses behavioral nuances. All information an agent needs to invoke the tool correctly and decide when to use it is present.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain parameters. It does so excellently: the 'direction' enum is explained with each value and its effect, and 'amount' is defined as a percentage of viewport height with a concrete example (25 = quarter). It also notes that amount is ignored for 'top' and 'bottom', and that values >100 are allowed. This completeness compensates fully for the absent schema descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Scroll the current page vertically.' It specifies the verb (scroll), the resource (current page), and the direction of action (vertically). It also distinguishes itself from the sibling 'focus_element' by explicitly naming that alternative in the Tool selection section.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance: 'Need to reveal a specific element -> use focus_element with action="scroll_to_element". Need to scroll the page by a relative amount -> use scroll_page.' This names the alternative and defines the selection criteria, leaving no ambiguity for the agent.

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

select_optionA

Select an option from an HTML dropdown.

Args: dropdown_selector: CSS selector identifying the element.

value: The option's visible text, its HTML value attribute, or its
    0-based index, depending on by.

by:
    - "text": Match the option's visible text.
    - "value": Match the option's HTML value attribute.
    - "index": Match the option's 0-based position. Both integer and
      numeric-string values are accepted.

Raises: An error when the dropdown or requested option cannot be found.

This tool is for native elements. For custom JavaScript dropdowns made from div/button/list elements, use click_element or other element-interaction tools instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNotext
valueYes
dropdown_selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden. It discloses the error behavior ('Raises: An error when the dropdown or requested option cannot be found'), which is valuable failure-mode information. However, it doesn't cover whether the selection triggers change events, whether it waits for options to load, or what the success response looks like (though an output schema exists, reducing that need).

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

Conciseness4/5

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

Well-structured with Args and Raises sections, front-loaded purpose statement. The documentation is thorough but slightly verbose with the args restating what a schema normally covers; still, every sentence adds value given 0% schema coverage.

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

Completeness5/5

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

For a 3-param interaction tool with no annotations and 0% schema coverage, the description covers purpose, all parameter semantics, error behavior, and sibling routing. An output schema exists so return values needn't be explained. Nothing an agent needs to call this correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It thoroughly documents the semantics of 'by' (text/value/index) and explains what 'value' means for each mode, including that both integer and numeric-string index values are accepted. This goes well beyond the bare schema.

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

Purpose5/5

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

States a specific verb (select) and resource (option from an HTML <select> dropdown), and explicitly distinguishes this native-select tool from custom JS dropdowns. An agent can immediately tell it apart from click_element or hover_action.

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

Usage Guidelines5/5

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

Explicitly names the when-not condition ('This tool is for native <select> elements') and routes custom JS dropdowns to click_element or other element-interaction tools. This is the strongest possible sibling differentiation.

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

solve_captchaA

Attempt a SeleniumBase CDP-based CAPTCHA interaction, such as clicking a CAPTCHA checkbox, or performing a drag/drop action on a slider CAPTCHA.

This tool attempts to interact with CAPTCHA controls such as Cloudflare Turnstile, reCAPTCHA, hCaptcha, DataDome Slider, or FriendlyCaptcha via the Chrome DevTools Protocol (CDP), which is usually stealthier than JavaScript because CDP actions can avoid triggering isTrusted: false.

This tool automatically detects the coordinates of CAPTCHA checkboxes for determining the correct location to perform the click. If no CAPTCHA is detected on the current page, then no click action is attempted.

The tool does not guarantee that the CAPTCHA was solved. Some CAPTCHA controls are embedded inside shadow DOM or otherwise do not expose an easy success signal. A successful attempt may result in changes to page state or browser cookies.

Tool workflow: 1. Inspect the webpage with get_content when you need to determine whether CAPTCHA-related controls are present. 2. Call 'solve_captcha' to attempt the CAPTCHA interaction. 3. Use 'get_page_info', 'get_content', 'check_if_condition', or 'manage_cookies' to inspect resulting page/session state.

Returns: A message confirming that the CAPTCHA interaction was attempted. The message is the same for both successful and failed attempts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral disclosure burden and does so thoroughly. It honestly states that success is not guaranteed, that the return message is identical for success and failure, that the action may change page state or cookies, and that shadow DOM may prevent detection. It also explains the CDP mechanism and why it is stealthier.

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

Conciseness5/5

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

The description is longer than average but every section earns its place: purpose, mechanism, behavior, workflow, and return-value caveat. It is front-loaded with the core purpose, uses clear section breaks, and contains no filler or repetition.

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

Completeness5/5

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

For a no-parameter tool with an output schema and no annotations, the description is fully self-sufficient. It explains when to invoke it, what will happen, what will not happen, and how to verify the outcome using sibling tools. Nothing essential for correct invocation is missing.

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

Parameters4/5

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

The input schema has zero parameters, so there is nothing for the description to explain beyond the schema. The description correctly focuses on behavior rather than arguments. This matches the baseline for parameter-free tools.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Attempt a SeleniumBase CDP-based CAPTCHA interaction,' and enumerates concrete interactions (checkbox click, slider drag/drop). It also names target providers (Cloudflare Turnstile, reCAPTCHA, hCaptcha, etc.), making the purpose unambiguous and clearly distinct from sibling browser automation tools.

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

Usage Guidelines4/5

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

The tool provides a numbered workflow that tells the agent when to inspect with get_content, when to call solve_captcha, and which sibling tools to use afterward to verify results. It also states that no click is attempted if no CAPTCHA is detected. However, it does not explicitly discuss when not to use this tool or why it should be preferred over click_element or run_javascript in CAPTCHA scenarios.

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

start_browserA

Launch a persistent SeleniumBase Pure CDP Mode browser session.

Call this before using browser interaction tools such as open_url, get_content, click_element, type_text, or find_elements. The same browser session remains active across subsequent MCP tool calls until close_browser is called or the server process exits.

Pure CDP Mode controls the browser through the Chrome DevTools Protocol (CDP), not WebDriver.

Args: url: Optional URL to navigate to during browser startup. When provided, the tool waits for the browser launch/navigation operation to complete before returning. If omitted, the browser starts without navigating to a specified URL.

headless: Controls whether the browser runs without a visible window.
    True forces headless mode; False forces headed mode. If None, this
    tool defaults to headless on Linux and headed on Windows/macOS.

use_chromium: Use Chromium instead of Google Chrome. This is useful
    when Google Chrome is not installed. SeleniumBase can manage the
    Chromium browser when this option is enabled.

browser_executable_path: Optional path to the browser executable.
    Use this when the desired browser is installed at a non-standard
    location. Mutually exclusive with use_chromium.

incognito: Launch Chrome/Chromium in incognito mode.

guest: Launch Chrome/Chromium in guest mode.
    Do not combine this with incognito=True.

ad_block: Enable SeleniumBase's basic ad-blocking functionality.

proxy: Optional proxy server.
    Examples include "SERVER:PORT" or "USER:PASS@SERVER:PORT".

Returns: A confirmation message when the browser starts successfully, or a descriptive error if the browser startup fails.

Startup behavior: If the initial launch fails, the tool automatically retries once.

Lifecycle: Call start_browser once at the beginning of a browser automation workflow. Reusing the existing session preserves cookies, tabs, navigation history, localStorage/sessionStorage, and other browser state between tool calls. Call close_browser when finished. If a browser session is already running, this tool does not launch another browser and instead returns a message indicating that the existing session is active.

Environment requirements: The MCP runtime must have a compatible Chrome or Chromium browser available. If the browser executable cannot be discovered, use use_chromium=True or provide browser_executable_path explicitly.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
guestNo
proxyNo
ad_blockNo
headlessNo
incognitoNo
use_chromiumNo
browser_executable_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so richly: automatic single retry on launch failure, session persistence across calls (cookies, tabs, history, localStorage/sessionStorage), idempotent behavior when a session exists, OS-dependent headless default, and mutual-exclusivity constraints (guest vs incognito, browser_executable_path vs use_chromium). Environment requirements and fallback paths are also disclosed.

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

Conciseness4/5

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

Well front-loaded — purpose and the call-ordering rule come first, then Args, Returns, Lifecycle, Environment. However, the Args block is verbose for a no-required-parameter tool, and the 'Returns' paragraph partially restates what the output schema already provides, adding length without new information.

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

Completeness5/5

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

For an 8-parameter, zero-required, no-annotation session-launch tool, nothing an agent needs is missing: sequencing, idempotency, retry behavior, mutual exclusions, environment prerequisites, and cleanup via close_browser are all covered, and return values are backed by an output schema.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate for all 8 parameters, and it does: it explains the null-vs-bool semantics of headless and its Linux/Windows/macOS default, gives proxy format examples ('SERVER:PORT', 'USER:PASS@SERVER:PORT'), states url triggers a wait for navigation, and documents two mutual-exclusivity constraints that the schema cannot express. This is meaning well beyond the bare parameter names.

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

Purpose5/5

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

Opens with a specific verb+resource: 'Launch a persistent SeleniumBase Pure CDP Mode browser session,' and immediately distinguishes itself from siblings by naming the interaction tools it must precede (open_url, get_content, click_element, type_text, find_elements) and the sibling that ends it (close_browser). An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Explicitly states when to call ('before using browser interaction tools'), the lifecycle boundary ('once at the beginning of a workflow'), the termination counterpart (close_browser), and the when-not case ('If a browser session is already running, this tool does not launch another browser'). Alternatives and exclusions are spelled out rather than implied.

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

type_textA

Enter, append, directly set, or clear a value on a page element.

Use this tool to modify text/value fields such as inputs, textareas, contenteditable elements, and supported input sliders. It changes the target element's value or content; it does not submit a form or click other elements.

Choose the mode based on the desired interaction:

  • "fill_input": Normal user-like entry; clears the existing value first.

  • "append": Preserves the existing value and adds text via keystrokes.

  • "fast_type": Clears the existing value and types without typing pauses.

  • "set_value": Sets the value directly without simulating key events; prefer this for fast programmatic value changes when keyboard events are not required.

  • "clear_only": Clears the existing value; text is ignored.

The tool waits up to timeout seconds for the target element. If the target cannot be used successfully, the underlying SeleniumBase error is handled by handle_sb_errors rather than returning a success message.

Args: selector: CSS or SeleniumBase selector identifying the target element.

text: Text/value to enter or set. Ignored for "clear_only".

mode: Interaction mode. See the mode descriptions above.

timeout: Maximum seconds to wait for the target element.
    Must be appropriate for the page's expected load/interaction time.

Returns: A confirmation message after the operation succeeds; otherwise the error handler returns the resulting failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNofill_input
textNo
timeoutNo
selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full disclosure burden and does so thoroughly. It explains each mode's behavior—clearing, appending via keystrokes, typing without pauses, direct value setting without key events—and discloses timeout waiting and error handling via handle_sb_errors. This is rich behavioral context beyond what the schema could convey.

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

Conciseness5/5

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

Although longer than minimal, every section earns its place: purpose, scope, mode decision guide, timeout/error behavior, args, and returns. The structure is logical and front-loaded with the core purpose. There is no filler or repetition of schema defaults.

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

Completeness5/5

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

The tool is a moderately complex mutation operation with four parameters, no annotations, and zero schema-level descriptions. The description covers all parameters, all mode semantics, timeout behavior, error handling, and return values. Given the complexity, nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate, and it does. It provides an Args section explaining selector, text (including the 'ignored for clear_only' nuance), mode (with detailed enum semantics), and timeout. This converts an otherwise bare schema into actionable parameter guidance.

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

Purpose5/5

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

The description opens with a specific verb phrase—'Enter, append, directly set, or clear a value on a page element'—and clearly scopes the tool to modifying text/value fields. It distinguishes itself from siblings by explicitly noting it does not submit forms or click other elements. An agent can tell this apart from click, run_javascript, and select_option without opening schemas.

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

Usage Guidelines4/5

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

The description clearly states when to use the tool ('modify text/value fields such as inputs, textareas, contenteditable elements, and supported input sliders') and gives a when-not boundary ('does not submit a form or click other elements'). It also provides mode-selection guidance, including a 'prefer this' recommendation for set_value. However, it does not explicitly name alternative sibling tools for cases where this tool should not be used.

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

wait_for_conditionA

Wait for a page condition or for a specified duration.

Use this for synchronization when a dynamic page may need time to reach a condition before the next automation step. The tool blocks until the condition is met or the timeout expires. It does not intentionally scroll, click, or otherwise modify the page while waiting.

Use check_if_condition to inspect the current state without waiting. Use assert_condition to verify an expected condition rather than synchronize with a changing page.

When the condition is not reached before timeout, the underlying SeleniumBase wait failure is handled by the tool's error handler rather than returning a success confirmation.

If state="seconds_passed", selector and text are ignored and the tool blocks for the full timeout seconds.

If text is supplied, present/visible wait for the text to appear, while absent/not_visible wait for the text to disappear. If no selector is supplied, text is searched within the page body.

Args: state: - "present": Wait until the matching element exists. - "visible": Wait until the matching element is visible. - "not_visible": Wait until the matching element is not visible. - "absent": Wait until the matching element no longer exists. - "seconds_passed": Wait for the full timeout duration.

selector: CSS or SeleniumBase selector for the element.
    Required unless `text` is supplied or `state="seconds_passed"`.

text: Optional text to wait for or wait to disappear.
    With text, `present` and `visible` are equivalent,
    as are `absent` and `not_visible`.

timeout: Maximum seconds to wait for the condition;
    for `seconds_passed`, the exact duration to wait. Must be >= 0.

Returns: A success message when the requested condition is reached. If the condition times out or the underlying wait fails, the tool returns the error produced by its error handler.

Tool selection: - Inspect current state immediately -> check_if_condition. - Wait for a state change -> wait_for_condition. - Verify an expectation -> assert_condition.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
stateNovisible
timeoutNo
selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it declares the call blocks, that it does not scroll/click/modify the page, and that a timeout surfaces as an error-handler failure rather than a success confirmation. It also flags the interaction rules between text, selector, and seconds_passed, which materially changes behavior.

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

Conciseness4/5

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

Front-loaded with the core behavior and organized under Args/Returns/Tool selection headings. It is longer than strictly necessary because the final 'Tool selection' block restates routing advice already given in the opening paragraphs, creating mild redundancy.

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

Completeness5/5

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

For a blocking-wait tool with four parameters, an enum, and an output schema, the description covers side effects, failure semantics, parameter interdependencies, and sibling routing. Nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and it does: it enumerates every state enum value with its meaning, states selector's requirement condition, explains that text makes present/visible and absent/not_visible equivalent, and gives timeout's dual meaning (max wait vs. exact duration).

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

Purpose5/5

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

States a specific action (block until a page condition or duration elapses) with clear scope, and explicitly distinguishes itself from the two nearest siblings, check_if_condition and assert_condition, by naming what each does instead. An agent can route correctly without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('synchronization when a dynamic page may need time to reach a condition') plus a three-way selection guide: inspect now -> check_if_condition, wait for change -> wait_for_condition, verify expectation -> assert_condition. Exclusions are stated, not inferred.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 24 tool updatesv1.15.0
    • First observedassert_condition
    • First observedcheck_if_condition
    • First observedclick_element
    • First observedclose_browser
    • First observedfind_elements
    • First observedfocus_element
    • First observedget_attributes
    • First observedget_content
    • First observedget_page_info
    • First observedhover_action
    • First observedmanage_cookies
    • First observedmanage_history
    • First observedmanage_storage
    • First observedmanage_tabs
    • First observedmanage_window
    • First observedopen_url
    • First observedrun_javascript
    • First observedsave_page
    • First observedscroll_page
    • First observedselect_option
    • First observedsolve_captcha
    • First observedstart_browser
    • First observedtype_text
    • First observedwait_for_condition

TDQS

A4.6/5.0

Scored across 24 tools

Disambiguation5/5

Every tool targets a distinct purpose—navigation, interaction, reading, state checking, storage, tabs, window, etc. Even the three condition tools (check_if_condition, wait_for_condition, assert_condition) have clear behavioral differences reinforced by the 'Tool selection' guidance.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (start_browser, click_element, get_content, manage_tabs, etc.). No camelCase, no vague verbs, and the manage_* group is uniform.

Tool Count3/5

With 24 tools, the server sits in the 16–25 range, which feels heavy. Each tool is individually justified for a browser automation suite, but the count borders on overwhelming and could potentially be consolidated (e.g., merging some read/condition tools).

Completeness5/5

The tool surface covers the full browser automation lifecycle: session handling, navigation, element interaction, content reading, state synchronization, cookies, storage, tabs, window management, scrolling, capturing, and arbitrary JS execution. No obvious dead ends or missing core operations.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Undetectable browser automation server for MCP-compatible AI agents, offering 225 tools across 32 sections to navigate, extract, clone pages, and bypass antibot systems like Cloudflare.
    1
    -
  • A
    license
    A
    quality
    D
    maintenance
    Stealth browser automation for AI agents, using source-patched Chromium to bypass bot detection systems like Cloudflare, reCAPTCHA, and FingerprintJS.
    28
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    A stealth-enhanced browser automation MCP server for AI agents to interact with websites while bypassing anti-bot detection mechanisms like Cloudflare and reCAPTCHA.
    8
    MIT