Skip to main content
Glama

SeleniumBase MCP Servers

This package provides three different SeleniumBase MCP servers for driving stealthy browser automation over the Model Context Protocol.

Here are the three server variants in this folder:

File

Backs onto

Best for

cdp_server.py

seleniumbase.sb_cdp.Chrome() (Pure CDP Mode, sync)

Scraping/automation against bot-detection (Cloudflare, etc.) No WebDriver at all. Includes CAPTCHA-solving.

driver_server.py

seleniumbase.Driver() (WebDriver)

General automation with Selenium ecosystem support.

sb_server.py

seleniumbase.SB() (used without with, via manual __enter__/__exit__)

The broadest API surface: Everything Driver offers, plus drag-and-drop, MFA-handling, file downloads, etc. Can switch to CDP Mode mid-flow via activate_cdp_mode

All three set headless=False by default, where the browser window is visible unless you pass headless=True when starting a session.

Point your MCP client config at whichever *_server.py fits the task (see step 3 below), or register all three under different names.

1. Install

(Requires Python 3.10+ and uv)

git clone https://github.com/seleniumbase/seleniumbase-mcp.git
cd seleniumbase-mcp
uv sync

uv sync reads pyproject.toml, creates a .venv/ in this folder, and installs the seleniumbase[mcp] dependency along with this project itself, which registers three console-script commands via [project.scripts]:

  • seleniumbase-cdp

  • seleniumbase-driver

  • seleniumbase-sb

Each just calls that server file's main() function (mcp.run(transport="stdio")). This is what lets uv run <name> work as the MCP client command in steps 3 and 4 below.

# SeleniumBase's Driver() and SB() formats need a browser driver downloaded:
uv run seleniumbase get chromedriver
# (Not needed for the "seleniumbase-cdp" Pure CDP Mode MCP Server,
#  which doesn't use WebDriver at all.)

(No uv? A regular python3 -m venv venv && pip install -e . works too if you substitute python <script>.py for uv run <name> everywhere below, and use absolute venv/bin/python + script paths in your MCP client config instead of the path-free options.)

Related MCP server: gotham-browser

2. Try it standalone (optional sanity check)

uv run mcp dev cdp_server.py

That opens the MCP Inspector for SeleniumBase's "Pure CDP Mode" MCP Server, where you can test commands ("Tools"). Ctrl+C to exit. Next step is wiring it into a client.

3. Connect it to Claude Desktop

Claude Desktop doesn't run from a "project" directory the way Claude Code does, so a bare uv run <name> isn't guaranteed to find this repo. Two ways to get a stable config:

Option A — global install (recommended, zero paths anywhere):

uv tool install .    # from inside the repo, installs the 3 commands globally

This puts seleniumbase-driver/seleniumbase-cdp/seleniumbase-sb on your PATH permanently (run uv tool ensurepath once if it warns that its bin directory isn't on PATH yet). Then claude_desktop_config.json can be just:

{
  "mcpServers": {
    "seleniumbase-cdp": { "command": "seleniumbase-cdp" },
    "seleniumbase-driver": { "command": "seleniumbase-driver" },
    "seleniumbase-sb": { "command": "seleniumbase-sb" }
  }
}

Option B — point uv at the repo directly (one absolute path, but no venv/interpreter path to track down, and no separate install step):

{
  "mcpServers": {
    "seleniumbase-cdp": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/seleniumbase-mcp", "run", "seleniumbase-cdp"]
    },
    "seleniumbase-driver": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/seleniumbase-mcp", "run", "seleniumbase-driver"]
    },
    "seleniumbase-sb": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/seleniumbase-mcp", "run", "seleniumbase-sb"]
    }
  }
}

The location of claude_desktop_config.json depends on your system:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Restart Claude Desktop. You should see a 🔨 tools icon indicating the server(s) connected, with tools like start_browser, navigate, click, etc. available. Only keep the entries you actually want. Three separate browser-automation servers is a lot if you only need one.

4. Connect it to Claude Code

This repo's .mcp.json is checked in and ready to use as-is. No path editing is required because uv run <name> resolves this project from pyproject.toml in the current directory:

{
  "mcpServers": {
    "seleniumbase-cdp": {
      "type": "stdio",
      "command": "seleniumbase-cdp",
      "args": []
    },
    "seleniumbase-driver": {
      "type": "stdio",
      "command": "seleniumbase-driver",
      "args": []
    },
    "seleniumbase-sb": {
      "type": "stdio",
      "command": "seleniumbase-sb",
      "args": []
    }
  }
}

Claude Code auto-loads .mcp.json from the directory you launch claude in, so as long as you run claude from inside this repo (or a clone of it), it just works.

If you'd rather register the servers manually instead of relying on .mcp.json:

claude mcp add seleniumbase-cdp -- uv run seleniumbase-cdp
claude mcp add seleniumbase-driver -- uv run seleniumbase-driver
claude mcp add seleniumbase-sb -- uv run seleniumbase-sb

(run from inside the repo directory, for the same reason as above.)

Tools exposed (driver_server.py)

Tool

Purpose

start_browser(browser, headless, uc, incognito)

Launch a browser session (headless defaults to False)

close_browser()

End the session

navigate(url)

Go to a URL

go_back() / go_forward() / refresh_page()

History navigation

get_current_url() / get_title()

Page metadata

get_page_source()

Full HTML

get_text(selector)

Visible text of an element

find_elements_count(selector)

Count matches

is_element_visible(selector)

Visibility check

click(selector, timeout)

Click (CSS or XPath)

type_text(selector, text, clear_first, timeout)

Fill a field

select_option_by_text(dropdown_selector, option)

Choose a dropdown option

wait_for_element_present(selector, timeout)

Explicit wait

switch_to_frame(selector) / switch_to_default_content()

iframe handling

assert_text(text, selector)

Verify text is present

screenshot(filename)

Save a screenshot

execute_script(script)

Run a JS script

Design notes / things to adapt for your use case

  • Single global session. Each server holds one browser session at a time. This matches how MCP servers are typically launched (one process per client connection) and keeps the tool surface simple. If you need multiple concurrent browser tabs/sessions, you'd extend this to a dict of named sessions and add a session_id parameter to each tool.

  • Blocking calls. SeleniumBase's calls are synchronous and will block the server while a page loads or an element is waited on. For a single-user local tool this is fine; for a multi-client server you'd want to run them in a thread pool via asyncio.to_thread.

  • Headless vs Headed. Default is headed (headless=False) so you can watch the browser work and so sites that block headless Chrome still function. Pass headless=True for background/server use once you've confirmed a flow works. sb_server.py's uc=True (undetected- chromedriver) also helps against bot-detection walls.

Extending

Adding a tool is just adding a @mcp.tool()-decorated function that calls the matching SeleniumBase method — SeleniumBase has methods for file uploads, hovering, alerts, network conditions, and more that aren't wrapped above yet.


cdp_server.py — Pure CDP Mode

Wraps seleniumbase.sb_cdp.Chrome, SeleniumBase's stealthiest mode: the browser is driven entirely over the Chrome DevTools Protocol, no WebDriver in the loop at all. Reference: cdp_mode_methods.md.

Tool groups

Group

Tool(s)

Session

start_browser(url, headless, use_chromium, browser_executable_path, incognito, guest, ad_block, proxy), close_browser

Navigation

navigate, navigate_history(action: back/forward/reload), get_page_info (running status, url, title, origin, user agent, history in one call)

Finding & reading

find_elements(selector, timeout, include_html), get_content(selector, output_format: text/html/urls, include_shadow_dom), get_attributes, check_state(check: present/visible/count/text_visible)

Interacting

click(selector, nth, all_matches, only_if_visible, parent_selector, timeout, scroll), hover_action(selector1, selector2, action: none/click/drag_and_drop), type_text(mode: fill_input/append/fast_type/set_value/clear_only), select_option(by: text/value/index), focus(action: scroll_to_element/focus/highlight)

Waiting

wait_for(state: present/visible/not_visible/absent/seconds_passed, text)

Assertions

assert_condition(check: element_present/element_visible/text_visible/title/url/url_contains)

Cookies & storage

manage_cookies(action: get_all/clear/save/load), manage_storage(storage: local/session, action: get/set)

Scrolling

scroll(direction: up/down/top/bottom, amount)

Windows & tabs

manage_window(action: get_rect/set_rect/maximize/minimize), manage_tabs(action: list/open/switch/switch_newest/close_active)

Captcha

solve_captcha

Output & misc

save_output(format: screenshot/html/pdf), run_javascript

CDP-specific design notes

  • Elements don't cross the wire as handles. In native CDP Mode, find_element() returns a live object with its own methods (el.click(), el.get_html(), ...). MCP tools can only return JSON-serializable data, so find_element_info/find_all_info resolve the element immediately to a plain dict (tag_name, text, html) instead of returning a handle you could call further methods on. If you need to act on one of several matches, use click_nth_element (acts by position) rather than "find, then click" as two separate steps.

  • Captcha solving isn't universal. solve_captcha handles supported challenge types (e.g. Cloudflare Turnstile in the SeleniumBase demo app); it isn't a guaranteed bypass for arbitrary CAPTCHAs.

  • Session teardown. sb.quit() (used by close_browser) is the documented way to end a session; the browser also auto-closes if the process exits without it.

  • Not wrapped: PyAutoGUI-based gui_* methods (excluded by design — see the top-level design notes), low-level plumbing (get_websocket_url, add_handler, permission grants, raw get_document/get_flattened_document), and exact method aliases (open/goto vs get) were left out to keep the tool list focused — add them the same way as any other tool if you need them.


sb_server.py — SB() without the with statement

Wraps seleniumbase.SB(), normally used as a context manager:

with SB(uc=True) as sb:
    sb.goto(...)

An MCP server's tool calls happen one at a time across separate function invocations — there's no single indented block to put with around — so this server calls the context manager protocol manually instead:

sb_context = SB(**kwargs)
sb = sb_context.__enter__()   # in start_browser
...
sb_context.__exit__(None, None, None)   # in close_browser

sb is a BaseCase instance, SeleniumBase's broadest API — a superset of what Driver (in driver_server.py) exposes, plus UC Mode stealth helpers and a few extras driver_server.py/cdp_server.py don't have. This server focuses on those extras rather than re-wrapping everything already covered:

Group

Tools

UC/CDP stealth

activate_cdp_mode (flips the same session into Pure CDP Mode mid-flow)

Extra interactions

hover_and_click, drag_and_drop, double_click, context_click, choose_file (upload)

MFA

get_mfa_code, enter_mfa_code (TOTP/Google-Authenticator-style codes from a secret key)

Files

download_file

Site health

assert_no_404_errors, assert_no_js_errors

Visual feedback

highlight, flash

Plus the same core navigation/interaction/waiting/assertions/cookies/ scrolling/tabs/output tools as the other two servers, called through the BaseCase method names (e.g. sb.goto, sb.click, sb.assert_element) rather than Driver's or CDP's.

SB()-specific design notes

  • UC Mode (stealth mode) requires uc=True at startup. Pass it in start_browser up front if you'll need them.

  • activate_cdp_mode doesn't start a new session. It switches the existing sb session's underlying mode to Pure CDP for subsequent actions — it's a mid-flow escalation, not a fresh browser.

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_condition, this tool does not merely return whether a condition is true: a failed expectation is an error. Unlike wait_for, 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_condition. - Wait for a condition to become true -> wait_for. - 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?

No annotations are present, so the description carries full burden. It discloses read-only behavior, blocking semantics for element/text assertions, immediate checks for title/URL, timeout handling, and that failures are returned as errors via handle_sb_errors. This is thorough behavioral context beyond the schema.

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

Conciseness5/5

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

The description is well-structured with clear sections, front-loading the purpose and distinguishing features. Every section (Args, Returns, Tool selection) is purposeful and efficient, with no wasted words.

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

Completeness5/5

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

Given the tool's complexity (multiple assertion types, blocking vs immediate checks, error handling), the description covers all necessary aspects: parameter details, return behavior, and selection guidance. The output schema exists, but the description does not need to explain return values, and it doesn't.

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 document all parameters, and it does. Each parameter is explained with allowed values, requirements, and specific behavior (e.g., 'exact' only for text_visible, 'timeout' ignored for title/URL). It adds 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 clearly states the tool verifies a browser condition and reports failure as an error, with a specific verb and resource. It enumerates the exact conditions and distinguishes from check_condition and wait_for.

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

Usage Guidelines5/5

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

Explicitly explains when to use it versus alternatives, with a dedicated 'Tool selection' section. It says to use check_condition for inspection without failing, wait_for for synchronization, and assert_condition for verifying expectations, leaving no ambiguity.

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

check_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 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_condition. - Wait for a state/content transition -> use wait_for. - 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 instead.

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

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?

Describes return behavior (boolean, False for missing elements, string on error) and explicitly states it does not wait. Also notes the precedence of text over check, providing full transparency about behavior without reliance on annotations.

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

Conciseness5/5

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

The description is well-structured with sections for Args, Returns, Tool selection, and Notes. It is thorough but not wordy, with all content directly relevant to using the tool.

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

Completeness5/5

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

Given the tool's moderate complexity, it covers purpose, usage, behavior, parameters, and return values. It also includes notes about waiting behavior, making it complete for an agent to use 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?

Explains all three parameters: check (with enum values), selector (CSS selector), and text (optional, with precedence over check). This adds meaning beyond the raw schema, which has no parameter descriptions.

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

Purpose5/5

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

The description clearly states the tool checks the current state of an element or text without waiting, and distinguishes it from wait_for and assert_condition. It also provides a tool selection section that clarifies its specific role.

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

Usage Guidelines5/5

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

Explicitly states when to use this tool ('immediate boolean observation') and contrasts with wait_for and assert_condition, providing clear guidance on alternatives. Also notes it does not wait, so users know not to use it for async conditions.

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

clickA

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. 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 a click induces page navigation, then subsequent clicks are
    cancelled.

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 one element: click("button.submit") - Click the 2nd matching element: click("button", nth=2) - Click all visible matches: click(".dismiss", all_matches=True) - Click only if already visible: click("#menu", only_if_visible=True) - Click inside a container: click(".item", parent_selector="#result")

ParametersJSON Schema
NameRequiredDescriptionDefault
nthNo
scrollNo
timeoutNo
selectorYes
all_matchesNo
only_if_visibleNo
parent_selectorNo

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?

No annotations are provided, so the description carries the full burden, and it delivers: it discloses selection precedence, visibility waiting behavior, navigation-cancellation side effects, timeout applicability, and scroll default. This goes well beyond a generic click description.

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?

Despite being long, the description is front-loaded with a one-line purpose, followed by a compact precedence list, detailed Args, and examples. No filler; the length is justified by the number of modes and caveats.

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 seven-parameter tool with no annotations, the description covers all invocation modes, edge cases, and defaults. The presence of an output schema means return-value details are not required; nothing needed to call this tool correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, but the Args section explains every parameter's meaning, default, constraints, and interactions, such as nth being 1-based, parent_selector enabling iframe scoping, and all_matches being ignored when nth is set. Examples map parameters to concrete calls.

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: 'Click element(s) matching a CSS, XPath, or supported text selector.' The enumerated click modes and examples make clear this is the click action, distinct from siblings like hover_action, type_text, or focus.

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?

Gives explicit conditions for each click mode, including precedence order and a warning to use all_matches only when multiple clicks are intentionally desired. It does not explicitly contrast with sibling tools like hover_action, but the mode guidance is strong enough to select the correct invocation.

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 with nth. - Need to know whether an element is present/visible -> use check_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?

No annotations exist, so the description carries the full behavioral burden and does so richly: it states results are converted to ordinary serializable dicts (not live element objects), that handles cannot persist across MCP calls, that timeout may be shortened for non-convertible XPath, and that errors surface as an 'error' key. These are exactly the traits an agent needs to avoid misuse.

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 and gated by clear section headers (Args, Returns, Tool selection, Notes), so it is navigable. It is somewhat long and the Returns block partially restates the output schema, but nearly every line adds routing or behavioral value.

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?

Complete for a discovery tool: it explains purpose, parameter behavior, return shape (even beyond the existing output schema), error behavior, and the critical cross-call handle limitation. No gap remains that would cause an incorrect 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 description coverage is 0%, yet the Args section documents all three parameters with meaning beyond the schema: selector as CSS or SeleniumBase-convertible XPath with the contains(...) limitation called out, timeout as a wait-for-first-match bound with a fallback caveat, and include_html controlling outer HTML in output.

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 ('Find matching elements and return structured element information') and then explicitly distinguishes itself from siblings get_content, click, and check_condition in the Tool selection section. An agent can identify the tool's role 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 'Use this tool when...' trigger list (count, text/tag inspection, HTML of multiple matches) and a Tool selection block naming the alternative for each adjacent need. When/when-not and alternatives are all covered.

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

focusA

Scroll to, focus, or highlight an element.

This tool does not click, type, select, hover, or otherwise activate the element. Use click, 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 will return details from the exception raised.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoscroll_to_element
timeoutNo
selectorYes

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 does well: it discloses that 'highlight' changes the border color, may affect timing, and may 'reduce stealth', and that a timeout raises an exception surfaced by @handle_sb_errors. It does not state side effects on page state (e.g., whether focusing can trigger blur/focus handlers or scroll the page layout), leaving a small gap for a tool with UI side effects.

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

Conciseness5/5

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

Front-loaded purpose sentence, then the exclusion clause, then a clean Args breakdown ordered by importance. Every sentence adds information; there is no filler or restatement of the name.

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

Completeness5/5

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

The tool is non-mutating but has UI side effects and an output schema, so return values need no explanation. Given no annotations, the description supplies the safety profile (does not activate), the enum semantics, the timeout default, and the error path — enough for an agent to invoke it correctly.

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

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 compensates fully: it defines `selector` as a CSS or SeleniumBase selector, explains each of the three `action` enum values with their actual effect, and restates the `timeout` semantics and default. Nothing in the schema is left semantically unexplained.

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 line names a specific verb set (scroll to, focus, highlight) and the resource (an element), and it immediately distinguishes the tool from its siblings by naming the operations it does NOT perform. An agent can separate this from `click`, `scroll`, or `hover_action` 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?

Explicit when-not guidance is given: 'This tool does not click, type, select, hover, or otherwise activate the element. Use `click`, `type_text`, or `hover_action` for those operations.' This routes the agent to the correct alternatives with the selecting condition stated.

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.

Returns: The requested attribute(s).

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_condition'.

This is a read-only operation.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorYes
attributeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it declares the operation read-only, documents the timeout default of 5 seconds, and states that a missing element surfaces via @handle_sb_errors rather than silently succeeding. It does not cover whether the element is waited for, retried, or searched in iframes/shadow DOM, which keeps it 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 one-line purpose, then structured Args/Returns/Tool selection sections that are easy to scan. Slightly heavier than needed — the 'Returns' line adds little given an output schema exists, and the classification of attributes is somewhat verbose — but no sentence is truly wasted.

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

Completeness4/5

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

Given an output schema exists, the brief Returns note is acceptable, and the description covers input semantics, timeout behavior, failure mode, and sibling routing. Enough for an agent to call this correctly; only edge cases like frames or waiting semantics are unaddressed.

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 it documents all three parameters: selector accepts CSS or SeleniumBase-supported XPath, attribute is optional and yields a dictionary of all attributes when omitted, and timeout defaults to 5 seconds. This adds real meaning beyond the bare schema, though it doesn't clarify selector-matching semantics (first match vs. uniqueness) in detail.

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

Purpose5/5

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

States a specific verb (Read), resource (HTML attributes), and scope (first matching element), with examples of the attribute kinds returned (href, src, class, aria-label). The 'Tool selection' section explicitly separates it from find_elements, get_content, and check_condition, so an agent can route correctly 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?

Provides explicit when-to-use guidance plus a routing table naming three sibling alternatives and the condition that selects each. The single-attribute vs. all-attributes distinction is also spelled out, leaving nothing to inference.

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.

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 -> use output_format="text". - Need page or element HTML -> use output_format="html". - Need URLs from the page or an element -> use output_format="urls". - Need structured information about matching elements -> use find_elements. - Need to check element presence/visibility -> use check_condition. - Need to wait for content to appear -> use wait_for.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorNobody
output_formatNotext

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the timeout default of 5 seconds and that returned URLs are normalized with protocol prefixes, but it says nothing about failure behavior (e.g., element not found / timeout expiry) or that this is a non-mutating read.

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 core sentence followed by Args and tool-selection blocks; each line is informative. The tool-selection list slightly restates the output_format descriptions, costing a little redundancy.

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

Completeness4/5

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

With an output schema present, return-value detail is not required, and the description still clarifies format semantics. It covers params and alternatives well; the only shortfall is unstated error/timeout behavior for a browser-automation 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 it largely does: it defines selector as CSS or SeleniumBase XPath, enumerates all three output_format values with meaning, and states the timeout default. Only minor gaps remain (e.g., selector default 'body').

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: 'Read visible text, HTML, or discovered URLs from the selected element.' An agent can distinguish it from siblings like get_page_info and find_elements directly from this sentence.

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 explicitly names the conditions that route to get_page_info, find_elements, check_condition, wait_for, and the three internal output_format modes. This is exactly the when-to-use/when-to-not guidance an agent needs.

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_condition. - Need to wait for a condition -> use wait_for. - 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?

Despite having no annotations, the description explicitly labels the operation as READ-ONLY, states it does not navigate/reload/click/type, explains the running:false no-session behavior, and clarifies it will not attempt page-level operations when no session exists. This thoroughly covers behavioral expectations.

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-organized and front-loaded, with distinct sections for purpose, return value, and tool selection. It is longer than minimal, but the extra length is mostly functional; one sentence ('Unlike a dedicated browser-status tool...') is somewhat redundant with the rest of the description.

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

Completeness5/5

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

For a zero-parameter, read-only metadata tool, the description covers the exact return fields, the false-running edge case, what it does not do, and routes to all relevant siblings. No important context is missing.

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

Parameters4/5

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

The tool has zero parameters)Skip baseline of 4 appliesheart. The description compensates by documenting the return fields (url, title, origin, user_agent, running) and the no-session case, which is meaningful context even though there is nothing to explain about parameters.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Get current browser session and page metadata.' It immediately distinguishes itself from siblings by identifying when to use it and what it does not do (find elements, check visibility, get content), making disambiguation easy.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use it ('primary tool for determining where the browser currently is after navigation, clicks...') and includes a tool-selection list mapping sibling tools to their specific use cases. No ambiguity 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: selector1: The primary element selector. For action="none", this is the element to hover over. For action="click", this is the element to hover over before clicking selector2. For action="drag_and_drop", this is the draggable source element.

selector2:
    The secondary element selector.
    Required for action="click", where it identifies the element
    revealed or targeted after hovering selector1.
    Required for action="drag_and_drop", where it identifies the
    destination/drop target.
    Not used for action="none".

action:
    - "none": Hover over selector1 only.
    - "click": Hover over selector1, then click selector2.
    - "drag_and_drop": Drag selector1 and drop it onto selector2.

Returns: A confirmation message describing the performed operation.

Tool selection: - Simple hover -> action="none". - Hover over one element and then click another -> action="click". - Drag one element onto another -> action="drag_and_drop".

Notes: For action="click", selector1 is the hover target and selector2 is the click target.

For action="drag_and_drop", selector1 is the source and selector2
is the destination.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionNonone
selector1Yes
selector2No

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?

The description discloses the main behaviors: hovering, clicking, dragging, dropping, and returning a confirmation message. It doesn't mention potential side effects like navigation or waiting, but with no annotations provided this is a reasonable level of transparency.

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 organized with clear sections, but the Notes section repeats selector-role information already stated earlier. It is still concise enough to be easily parsed.

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

Completeness5/5

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

The description covers the action enum, selector requirements, tool-selection guidance, and return value. Given that no annotations or output schema were provided, this is a complete description for an agent to invoke the tool correctly.

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

Parameters5/5

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

Every parameter is thoroughly explained: selector1, selector2, and the action enum. The description states when selector2 is required and clarifies the role each selector plays for each action value.

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: hover over an element, optionally click another, or drag-and-drop. This distinguishes it from sibling tools like click and find_elements.

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 section explicitly maps use cases to action values: simple hover to none, hover-then-click to click, and drag-and-drop to drag_and_drop. This leaves no ambiguity about when to use each mode.

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 'navigate' for 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.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 burden of behavioral disclosure. It warns that navigation actions can trigger page loads or redirects and recommends verification afterward. It does not fully describe failure modes or state effects of reload, but the key behavioral risk is surfaced.

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?

Compact and front-loaded: the purpose, action options, and the important caveat about page loads are all stated efficiently. Every sentence contributes value without redundancy.

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

Completeness5/5

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

Given a single enum parameter, an output schema, and no annotations, the description covers the essential operational details: action semantics, the risk of navigation effects, and a follow-up verification step. Nothing critical is missing for correct 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 description coverage is 0%, but the description fully compensates by defining the semantics of every enum value: back, forward, reload (including cache bypass), and list (returning history position and entries). This gives the agent everything needed to choose the right action.

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 purpose: managing or inspecting the current browser tab's navigation history, and enumerates four distinct actions. It also explicitly distinguishes itself from the sibling 'navigate' tool by directing arbitrary URL navigation to that tool.

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 clear guidance on when to use each action and explicitly names the alternative tool ('navigate') for arbitrary URLs. It also instructs the agent to call get_page_info afterward to verify the resulting URL or title, which is actionable and useful.

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 navigate and manage_history for navigation within the active tab.

Args: action: - "list": Return each tab's index, URL, and title. Use this to find the tab_index for "switch". - "open": Open a new tab, optionally navigating it to url. - "switch": Switch to the tab at tab_index from "list". - "switch_newest": Switch to the newest tab. - "close_active": Close the active tab.

url: URL for "open".

tab_index: Tab index from "list" for "switch".

switch_to: For "open", switch to the new tab when True.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
actionNolist
switch_toNo
tab_indexNo

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 behavioral burden. It discloses what `list` returns, that `switch` depends on `tab_index` from `list`, that indexes are session-relative and may change, and that re-listing is needed before switching. It does not explicitly describe side effects of closing a tab, but 'close' is self-explanatory.

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 organized with a front-loaded purpose and clear action-by-action bullets. The opening sentence is slightly redundant with the following 'Use this for...' sentence, but the overall structure is efficient and scannable.

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

Completeness5/5

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

This is a complete, self-contained definition for a multi-action tab tool: all actions and parameters are covered, the unstable tab-index behavior is called out, the `list` output is described, and sibling tools are named for alternative usage. The existing output schema covers return shape details.

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 explaining each parameter in action context: `url` is for `open`, `tab_index` is for `switch`, and `switch_to` controls whether to switch after opening. It also explains every action enum value.

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 it manages browser tabs and explicitly scopes operations to listing, opening, switching, and closing. It also distinguishes itself from `navigate` and `manage_history`, which are for in-page navigation, so an agent can tell it apart from siblings.

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 direct guidance: use this tool for tab-level operations and use `navigate`/`manage_history` for navigation within the active tab. The per-action bullets further clarify which action is appropriate for each use case.

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

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.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 is the only behavioral source. It states the meaning of each action and the set_rect requirement that all four geometric values be present, which gives a clear expectation. It does not disclose preconditions like whether a browser window must already be active or how maximize/minimize interact with existing geometry, leaving a small gap.

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

Conciseness5/5

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

The description is well-organized with a one-line summary, a compact action list, parameter explanations, and a usage boundary note. Every section contributes information an agent needs, with no filler or repetition.

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

Completeness4/5

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

The output schema exists, so return-value documentation is not needed. The description covers the action semantics, parameter constraints, and the key sibling alternative. It only omits minor preconditions such as requiring an already-open browser window, which is a small gap given the tool context.

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 carry parameter meaning by itself. It defines what each parameter means, ties x/y/width/height specifically to set_rect, and corrects the schema's all-optional impression by noting that all four are required for set_rect.

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 line clearly states the tool works on browser window geometry and state, and the enumerated actions (get_rect, set_rect, maximize, minimize) leave no ambiguity about what it does. It also distinguishes itself from the sibling manage_tabs in the final sentence.

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

Usage Guidelines5/5

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

The description explicitly says to use it for browser-window geometry and state, and directly points to manage_tabs for the likely alternative use case. This gives agents a clear when-to-use and when-not-to-use signal.

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, type_text, select_option, hover_action, focus, scroll, 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

A5/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 burden and does well: it warns that this provides unrestricted JavaScript execution, can read or modify page data, bypasses higher-level abstractions, and should only be exposed to trusted clients. It also discloses return serialization 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 long but well-organized under Args, Returns, and Security sections, and every sentence serves a purpose. The length is justified by the need to convey safety implications, return behavior, and usage boundaries.

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?

Even without an output schema, the description explains what kinds of values can be returned and what cannot be serialized. It also provides enough security context and usage boundaries for an agent to decide when this tool is appropriate.

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

Parameters5/5

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

Although the schema provides only a type and title for the expression parameter, the description fully compensates by explaining what the expression may reference, providing multiple examples, and noting Promise support. This gives the agent sufficient semantic understanding despite 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 description clearly states the tool evaluates a JavaScript expression in the current page context, using a specific verb and resource. It also distinguishes itself from higher-level SeleniumBase tools by explaining it is for operations those tools do not expose.

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 use this tool only when higher-level tools cannot accomplish the operation, and it lists the preferred sibling tool categories for clicking, typing, reading content, managing storage, and cookies. This gives an agent concrete selection guidance.

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

save_outputA

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

A5/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavioral transparency burden. It discloses side effects (writes a file, may overwrite), permissions, filesystem safety, that it does not navigate or modify the page, that no upload/publish occurs, and the error behavior for missing session and filesystem failures. This is comprehensive beyond what any structured field would 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 the description is long, it is well-organized into clear sections (side effects and filesystem behavior, error behavior, when not to use, returns) that each carry essential information. The core purpose is front-loaded and every section has a distinct purpose in guiding correct invocation.

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?

Taking into account the tool's complexity, the absence of annotations, and the spare schema, the description is sufficiently complete. It covers prerequisites, parameter semantics, side effects, error behavior, and expected return, leaving no critical gap an agent would need to guess about.

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 has no descriptions (0% coverage), but the description covers all three parameters thoroughly. It explains each format enum value, the default filename per format, the optional nature of folder/filename, and what the folder does. This gives the agent full semantic understanding that the schema alone cannot provide.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Save the current browser page to a local filesystem file.' It further clarifies it produces a PNG screenshot, HTML source, or PDF from the active tab, and the 'When not to use' section distinguishes it from get_content, get_page_info, and interaction tools. This makes the tool's purpose unmistakable and well differentiated from siblings.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: when a persistent file artifact is needed from the current page. It also provides clear negative guidance, listing get_content for reading text/HTML, get_page_info for metadata, and interaction tools for page manipulation. This is exactly the level of directional guidance an agent needs.

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

scrollA

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.

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

Use focus(action="scroll_to_element") when the goal is to reveal a specific element rather than scroll the page by a relative amount.

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?

With no annotations, the description carries the burden of behavioral disclosure. It explains that scrolling is relative to viewport height, that amount is a percentage, allows values >100, and that top/bottom ignore amount. It does not mention side effects like scroll events or page loading, but for a simple scroll operation this is adequate.

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

Conciseness5/5

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

The description is concise and well-structured: a one-sentence purpose, followed by a clear list of parameters with explanations, and a final line for alternative usage. Every sentence adds necessary value with no redundancy.

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

Completeness5/5

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

For a scroll tool, the description covers the main action, all parameter semantics, and when to choose an alternative, which is all an agent needs to call it correctly. An output schema exists, so not describing return values is acceptable.

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% and the description fully compensates: it explains the direction enum with behavior for each value, defines amount as a percentage of viewport height with an example (amount=25 → one quarter), and notes that values >100 are valid. This goes far 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 clearly states it scrolls the current page vertically, and lists explicit direction options (up, down, top, bottom) with their behavior. It distinguishes itself from the sibling tool focus, which is for scrolling to a specific element, by explicitly naming it as an alternative for that use case.

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

Usage Guidelines5/5

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

Provides explicit guidance: 'Use focus(action="scroll_to_element") when the goal is to reveal a specific element rather than scroll the page by a relative amount.' Also explains when each direction value applies and notes that amount is ignored for top/bottom, giving clear context for parameter selection.

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

The description discloses that an error is raised when the dropdown or requested option cannot be found. It does not mention potential side effects like triggering change events, but this is a minor omission given the straightforward nature of the action.

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

Conciseness5/5

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

The description is concise, well-organized, and every sentence adds useful information. No redundant or vague phrasing.

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

Completeness4/5

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

The description covers all necessary usage context, parameter semantics, and error behavior. It does not describe a return value, but the tool's output is likely not a primary concern for a selection action.

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

Parameters5/5

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

Although the schema lacks descriptions, the tool description fully explains every parameter: dropdown_selector, value, and by, including the meaning of each enum value for 'by' and acceptable types for 'value'.

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: selecting an option from an HTML <select> dropdown. It also distinguishes itself from other element-interaction tools by explicitly limiting its use to native <select> elements.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool (native <select> elements) and when not to use it, directing users to click or other element-interaction tools for custom JavaScript dropdowns.

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 stealthier than JavaScript actions 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 performed.

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_condition, or manage_cookies to inspect resulting page/session state.

Returns: A message confirming that the CAPTCHA interaction was attempted. (There's no guarantee that the CAPTCHA challenge was solved.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 burden of behavioral disclosure. It does an excellent job: it explains the stealth mechanism (CDP vs JavaScript, avoiding isTrusted: false), automatic coordinate detection, the lack of guarantee of success, limitations with shadow DOM, and potential side effects (changes to page state or cookies). It also outlines the return message and its non-guarantee. This is comprehensive and honest.

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-structured with sections and a numbered workflow, which aids readability. It is somewhat lengthy but every sentence adds value: it covers purpose, stealth, detection, limitations, workflow, and return value. It is front-loaded with a clear purpose statement, and the workflow steps are concise. The length is justified by the need to explain complex behavioral nuances.

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

Completeness5/5

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

Given the tool's simplicity (0 parameters), the absence of annotations, and the existence of an output schema (which the description aligns with), the description is complete. It explains what the tool does, how it works under the hood, its limitations, and how to integrate it into a broader workflow. An agent has all necessary information to invoke it correctly and understand its outcome.

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 by design, so there are no parameter semantics to describe. However, the description compensates by explaining what the tool does automatically (detects coordinates, no need for manual input). Since schema coverage is 100% but empty, the description adds value by clarifying that no arguments are necessary and that behavior is determined by page context. This is above the baseline for zero parameters.

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

Purpose5/5

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

The description clearly states the tool attempts CAPTCHA interactions via CDP, listing specific CAPTCHA types (Cloudflare Turnstile, reCAPTCHA, hCaptcha, DataDome Slider, FriendlyCaptcha) and actions (click, drag/drop). It distinguishes itself from simpler JavaScript actions by emphasizing stealth, and from other tools like 'click' by focusing on CAPTCHA-specific automation. The purpose is unambiguous and well-scoped.

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 an explicit workflow: first inspect with get_content, then call solve_captcha, then verify with get_page_info or check_condition. It names specific sibling tools for pre- and post-conditions, and states when not to use (if no CAPTCHA is detected, no action is performed). This gives clear guidance on when and how to use the tool, and what to do after.

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 navigate, get_content, click, 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 provided, the description carries the full burden and excels: it discloses session persistence via CDP rather than WebDriver, the automatic single retry on launch failure, platform-specific headless defaults, and the fact that an existing session is reused. It also covers return behavior and environment prerequisites, which is exemplary for a tool with zero structured annotations.

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

Conciseness4/5

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

The description is long but the length is largely justified by 8 parameters and important lifecycle/environment context. It is well-sectioned and front-loaded with the core purpose, though there is minor redundancy in the lifecycle section that could be trimmed without loss.

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—8 optional parameters, platform-dependent behavior, and session lifecycle responsibilities—the description provides everything an agent needs: when to invoke, how to resolve missing browser discovery, what happens on retry, and how state persists. The output schema covers return values, so the brief Return section is appropriate.

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 documents all 8 parameters in an Args section with meaningful details. It adds mutual-exclusion guidance (browser_executable_path vs use_chromium), a warning not to combine guest with incognito=True, and practical examples for proxy formats.

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: 'Launch a persistent SeleniumBase Pure CDP Mode browser session.' It clearly distinguishes itself from sibling interaction tools such as navigate and click by framing it as the prerequisite startup step, making its role unambiguous.

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

Usage Guidelines5/5

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

The description explicitly says to call this before using browser interaction tools such as navigate, get_content, click, type_text, or find_elements, and to call close_browser when finished. It also explains that if a session is already running, the tool does not launch another one, giving an agent clear routing and lifecycle guidance.

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_forA

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_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_condition. - Wait for a state change -> wait_for. - 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 provided, the description carries the full burden of behavioral disclosure. It states that the tool 'blocks until the condition is met or the timeout expires,' declares it 'does not intentionally scroll, click, or otherwise modify the page while waiting,' and explains the error-handling behavior when timeouts occur. It also details state-specific semantics (e.g., text handling with present/visible vs absent/not_visible).

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 thorough and well-structured, front-loading the core purpose and then branching into specifics. It is longer than average, but every sentence adds meaningful information. The use of bullet-like 'Args' and 'Returns' sections aids scanning. It loses one point only because brevity could be improved without losing substance.

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 (4 parameters, multiple state modes, and dynamic-page use case), the description covers all necessary aspects: usage context, behavioral guarantees, parameter semantics, return values, and error handling. The inclusion of a 'Tool selection' section further completes the picture. Nothing an agent would need 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 coverage is 0%, so the description must fully explain parameter meaning. It does: for each parameter, it provides detailed semantic explanation. For example, it clarifies that for `seconds_passed`, selector and text are ignored, that `text` changes the meaning of `present`/`visible`, and that `selector` is required unless text is supplied or state is seconds_passed. This goes far beyond the schema's bare types and defaults.

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 'Wait for a page condition or for a specified duration,' which clearly states the verb and resource. It explicitly distinguishes from siblings by naming check_condition and assert_condition and their different purposes, so an agent can tell them apart without inspecting schemas.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'Use this for synchronization when a dynamic page may need time to reach a condition before the next automation step.' It then names alternatives: 'Use check_condition to inspect the current state without waiting' and 'Use assert_condition to verify an expected condition rather than synchronize with a changing page.' This leaves no ambiguity about tool selection.

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. 3 tool updatesv1.3.2
    • Changedfocus1 field changed
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 5,
        +  "title": "Timeout",
        +  "type": "number"
        +}
    • Changedget_attributes2 fields changed
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 5,
        +  "title": "Timeout",
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "get_attributesOutput",
        +  "type": "object"
        +}
    • Changedget_content5 fields changed
      • removedInput schema / properties / include_shadow_dom
        Removed value: -{
        -  "default": true,
        -  "title": "Include Shadow Dom",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / selector / default
        Previous value: -nullNew value: +"body"
      • addedInput schema / properties / selector / type
        Added value: +"string"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 5,
        +  "title": "Timeout",
        +  "type": "number"
        +}
  2. 1 tool updatev1.3.1
    • Changedstart_browser2 fields changed
      • removedInput schema / properties / headless / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / headless / enum
        Added value: +[
        +  false,
        +  true,
        +  null
        +]
  3. 8 tool updatesv1.3.0
    • Changedassert_condition1 field changed
      • changedInput schema / properties / timeout / default
        Previous value: -7New value: +5
    • Changedclick1 field changed
      • changedInput schema / properties / timeout / default
        Previous value: -7New value: +5
    • Changedget_page_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "title": "get_page_infoDictOutput",
        +  "type": "object"
        +}
    • Changedmanage_tabs1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "manage_tabsOutput",
        +  "type": "object"
        +}
    • Changedmanage_window1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "manage_windowOutput",
        +  "type": "object"
        +}
    • Changedtype_text1 field changed
      • changedInput schema / properties / timeout / default
        Previous value: -7New value: +5
    • Changedwait_for2 fields changed
      • changedInput schema / properties / state / enum
        Previous value: -[
        -  "present",
        -  "visible",
        -  "not_visible",
        -  "absent"
        -]New value: +[
        +  "present",
        +  "visible",
        +  "not_visible",
        +  "absent",
        +  "seconds_passed"
        +]
      • changedInput schema / properties / timeout / default
        Previous value: -7New value: +5
    • Removedwait_seconds
  4. 6 tool updatesv1.2.6
    • Changedcheck_condition1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "type": "boolean"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "check_conditionOutput",
        +  "type": "object"
        +}
    • Addedfocus
    • Removedfocus_on
    • Changedget_page_info1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "anyOf": [
        -        {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        {
        -          "type": "string"
        -        }
        -      ],
        -      "title": "Result"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "get_page_infoOutput",
        -  "type": "object"
        -}New value: +null
    • Addedhover_action
    • Removedhover_with_action
  5. 10 tool updatesv1.2.5
    • Changedassert_condition2 fields changed
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timeout / type
        Added value: +"number"
    • Addedcheck_condition
    • Removedcheck_for_condition
    • Changedclick2 fields changed
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timeout / type
        Added value: +"number"
    • Changedfind_elements3 fields changed
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / timeout / default
        Previous value: -7New value: +0.5
      • addedInput schema / properties / timeout / type
        Added value: +"number"
    • Addedmanage_history
    • Removednavigate_history
    • Changedtype_text2 fields changed
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timeout / type
        Added value: +"number"
    • Changedwait_for2 fields changed
      • removedInput schema / properties / timeout / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / timeout / type
        Added value: +"number"
    • Changedwait_seconds2 fields changed
      • removedInput schema / properties / seconds / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / seconds / type
        Added value: +"number"
  6. 2 tool updatesv1.2.4
    • Addedcheck_for_condition
    • Removedcheck_state
  7. 4 tool updatesv1.2.3
    • Addedassert_condition
    • Removedassert_that
    • Removedfill_input
    • Addedtype_text
  8. 5 tool updatesv1.2.2
    • Removedact_on_element
    • Removeddrag_and_drop
    • Addedfocus_on
    • Removedhover
    • Addedhover_with_action
  9. 14 tool updatesv1.2.1
    • Addedact_on_element
    • Changedassert_that1 field changed
      • changedInput schema / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Removedbrowser_status
    • Changedclick1 field changed
      • changedInput schema / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Removedelement_action
    • Changedfill_input1 field changed
      • changedInput schema / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedfind_elements1 field changed
      • changedInput schema / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Removedget_all_urls
    • Addedget_content
    • Removedget_page_content
    • Removedget_user_agent
    • Changedstart_browser3 fields changed
      • addedInput schema / properties / headless / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / headless / default
        Previous value: -falseNew value: +null
      • removedInput schema / properties / headless / type
        Removed value: -"boolean"
    • Changedwait_for1 field changed
      • changedInput schema / properties / timeout / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedwait_seconds2 fields changed
      • addedInput schema / properties / seconds / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  }
        +]
      • removedInput schema / properties / seconds / type
        Removed value: -"number"
  10. 96 tool updatesv1.2.0
    • Removedassert_element
    • Removedassert_element_visible
    • Removedassert_exact_text
    • Removedassert_text
    • Addedassert_that
    • Removedassert_title
    • Removedassert_url
    • Removedassert_url_contains
    • Addedbrowser_status
    • Addedcheck_state
    • Removedclear_cookies
    • Removedclear_input
    • Changedclick5 fields changed
      • addedInput schema / properties / all_matches
        Added value: +{
        +  "default": false,
        +  "title": "All Matches",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / nth
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Nth"
        +}
      • addedInput schema / properties / only_if_visible
        Added value: +{
        +  "default": false,
        +  "title": "Only If Visible",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / parent_selector
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Parent Selector"
        +}
      • changedInput schema / properties / timeout / default
        Previous value: -nullNew value: +7
    • Removedclick_if_visible
    • Removedclick_link
    • Removedclick_nth_element
    • Removedclick_visible_elements
    • Removedclose_active_tab
    • Addeddrag_and_drop
    • Addedelement_action
    • Removedevaluate
    • Addedfill_input
    • Removedfind_all_info
    • Removedfind_element_info
    • Addedfind_elements
    • Removedfind_elements_count
    • Removedfocus
    • Removedget_all_cookies
    • Addedget_attributes
    • Removedget_current_url
    • Removedget_element_attribute
    • Removedget_element_attributes
    • Removedget_element_html
    • Removedget_html_source
    • Removedget_local_storage_item
    • Removedget_navigation_history
    • Removedget_origin
    • Addedget_page_content
    • Addedget_page_info
    • Removedget_session_storage_item
    • Removedget_tabs_count
    • Removedget_text
    • Removedget_title
    • Removedget_window_rect
    • Removedgo_back
    • Removedgo_forward
    • Removedhighlight
    • Addedhover
    • Removedis_element_present
    • Removedis_element_visible
    • Removedis_text_visible
    • Removedload_cookies
    • Addedmanage_cookies
    • Addedmanage_storage
    • Addedmanage_tabs
    • Addedmanage_window
    • Removedmaximize
    • Removedminimize
    • Addednavigate_history
    • Removednested_click
    • Removedopen_new_tab
    • Removedreload_page
    • Addedrun_javascript
    • Removedsave_as_pdf
    • Removedsave_cookies
    • Addedsave_output
    • Removedsave_page_source
    • Removedsave_screenshot
    • Addedscroll
    • Removedscroll_down
    • Removedscroll_into_view
    • Removedscroll_to_bottom
    • Removedscroll_to_top
    • Removedscroll_up
    • Addedselect_option
    • Removedselect_option_by_index
    • Removedselect_option_by_text
    • Removedselect_option_by_value
    • Removedsend_keys
    • Removedset_local_storage_item
    • Removedset_session_storage_item
    • Removedset_value
    • Removedset_window_rect
    • Removedsleep
    • Changedstart_browser2 fields changed
      • addedInput schema / properties / browser_executable_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Browser Executable Path"
        +}
      • addedInput schema / properties / use_chromium
        Added value: +{
        +  "default": false,
        +  "title": "Use Chromium",
        +  "type": "boolean"
        +}
    • Removedsubmit
    • Removedswitch_to_newest_tab
    • Removedswitch_to_tab
    • Removedtype_text
    • Addedwait_for
    • Removedwait_for_element_absent
    • Removedwait_for_element_not_visible
    • Removedwait_for_element_present
    • Removedwait_for_element_visible
    • Removedwait_for_text
    • Addedwait_seconds
  11. 15 tool updatesv1.1.0
    • Changedfind_all_info3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedfind_element_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "find_element_infoOutput",
        +  "type": "object"
        +}
    • Changedfind_elements_count2 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"integer"
    • Changedget_all_urls3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_element_attributes1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "get_element_attributesOutput",
        +  "type": "object"
        +}
    • Changedget_tabs_count2 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"integer"
    • Changedget_window_rect1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "result": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ],
        +      "title": "Result"
        +    }
        +  },
        +  "required": [
        +    "result"
        +  ],
        +  "title": "get_window_rectOutput",
        +  "type": "object"
        +}
    • Changedis_element_present2 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"boolean"
    • Changedis_element_visible2 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"boolean"
    • Changedis_text_visible2 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "type": "boolean"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • removedOutput schema / properties / result / type
        Removed value: -"boolean"
    • Changedselect_option_by_index3 fields changed
      • removedInput schema / properties / index
        Removed value: -{
        -  "title": "Index",
        -  "type": "integer"
        -}
      • addedInput schema / properties / option
        Added value: +{
        +  "title": "Option",
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "dropdown_selector",
        -  "index"
        -]New value: +[
        +  "dropdown_selector",
        +  "option"
        +]
    • Changedselect_option_by_text3 fields changed
      • addedInput schema / properties / option
        Added value: +{
        +  "title": "Option",
        +  "type": "string"
        +}
      • removedInput schema / properties / option_text
        Removed value: -{
        -  "title": "Option Text",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "dropdown_selector",
        -  "option_text"
        -]New value: +[
        +  "dropdown_selector",
        +  "option"
        +]
    • Changedselect_option_by_value3 fields changed
      • addedInput schema / properties / option
        Added value: +{
        +  "title": "Option",
        +  "type": "string"
        +}
      • removedInput schema / properties / value
        Removed value: -{
        -  "title": "Value",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "dropdown_selector",
        -  "value"
        -]New value: +[
        +  "dropdown_selector",
        +  "option"
        +]
    • Removedwait_for_element
    • Addedwait_for_element_present
  12. 79 tool updatesv1.0.2
    • Removedactivate_cdp_mode
    • Addedassert_element
    • Addedassert_element_visible
    • Addedassert_exact_text
    • Changedassert_text4 fields changed
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • changedInput schema / properties / selector / default
        Previous value: -nullNew value: +"html"
      • addedInput schema / properties / selector / type
        Added value: +"string"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timeout"
        +}
    • Addedassert_title
    • Addedassert_url
    • Addedassert_url_contains
    • Addedclear_cookies
    • Addedclear_input
    • Changedclick3 fields changed
      • removedInput schema / properties / by
        Removed value: -{
        -  "default": "css",
        -  "title": "By",
        -  "type": "string"
        -}
      • addedInput schema / properties / scroll
        Added value: +{
        +  "default": true,
        +  "title": "Scroll",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timeout"
        +}
    • Addedclick_if_visible
    • Addedclick_link
    • Addedclick_nth_element
    • Addedclick_visible_elements
    • Addedclose_active_tab
    • Addedevaluate
    • Removedexecute_script
    • Addedfind_all_info
    • Addedfind_element_info
    • Changedfind_elements_count1 field changed
      • addedInput schema / properties / timeout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timeout"
        +}
    • Addedfocus
    • Addedget_all_cookies
    • Addedget_all_urls
    • Addedget_element_attribute
    • Addedget_element_attributes
    • Addedget_element_html
    • Addedget_html_source
    • Addedget_local_storage_item
    • Addedget_navigation_history
    • Addedget_origin
    • Removedget_page_source
    • Addedget_session_storage_item
    • Addedget_tabs_count
    • Changedget_text2 fields changed
      • addedInput schema / properties / selector / default
        Added value: +"body"
      • removedInput schema / required
        Removed value: -[
        -  "selector"
        -]
    • Addedget_user_agent
    • Addedget_window_rect
    • Addedhighlight
    • Addedis_element_present
    • Addedis_text_visible
    • Addedload_cookies
    • Addedmaximize
    • Addedminimize
    • Addednested_click
    • Addedopen_new_tab
    • Removedrefresh_page
    • Addedreload_page
    • Addedsave_as_pdf
    • Addedsave_cookies
    • Addedsave_page_source
    • Addedsave_screenshot
    • Removedscreenshot
    • Addedscroll_down
    • Addedscroll_into_view
    • Addedscroll_to_bottom
    • Addedscroll_to_top
    • Addedscroll_up
    • Removedselect_option
    • Addedselect_option_by_index
    • Addedselect_option_by_text
    • Addedselect_option_by_value
    • Addedsend_keys
    • Addedset_local_storage_item
    • Addedset_session_storage_item
    • Addedset_value
    • Addedset_window_rect
    • Addedsleep
    • Changedstart_browser5 fields changed
      • removedInput schema / properties / browser
        Removed value: -{
        -  "default": "chrome",
        -  "title": "Browser",
        -  "type": "string"
        -}
      • addedInput schema / properties / guest
        Added value: +{
        +  "default": false,
        +  "title": "Guest",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / guest_mode
        Removed value: -{
        -  "default": false,
        -  "title": "Guest Mode",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / uc
        Removed value: -{
        -  "default": true,
        -  "title": "Uc",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Url"
        +}
    • Addedsubmit
    • Removedswitch_to_default_content
    • Removedswitch_to_frame
    • Addedswitch_to_newest_tab
    • Addedswitch_to_tab
    • Changedtype_text2 fields changed
      • removedInput schema / properties / clear_first
        Removed value: -{
        -  "default": true,
        -  "title": "Clear First",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / timeout
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Timeout"
        +}
    • Changedwait_for_element3 fields changed
      • addedInput schema / properties / timeout / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / timeout / default
        Previous value: -10New value: +null
      • removedInput schema / properties / timeout / type
        Removed value: -"integer"
    • Addedwait_for_element_absent
    • Addedwait_for_element_not_visible
    • Addedwait_for_element_visible
    • Addedwait_for_text
  13. 23 tool updatesv0.1.1
    • First observedactivate_cdp_mode
    • First observedassert_text
    • First observedclick
    • First observedclose_browser
    • First observedexecute_script
    • First observedfind_elements_count
    • First observedget_current_url
    • First observedget_page_source
    • First observedget_text
    • First observedget_title
    • First observedgo_back
    • First observedgo_forward
    • First observedis_element_visible
    • First observednavigate
    • First observedrefresh_page
    • First observedscreenshot
    • First observedselect_option
    • First observedsolve_captcha
    • First observedstart_browser
    • First observedswitch_to_default_content
    • First observedswitch_to_frame
    • First observedtype_text
    • First observedwait_for_element

TDQS

A4.4/5.0

Scored across 24 tools

Disambiguation5/5

Each tool targets a clearly distinct browser operation, and descriptions include explicit 'Tool selection' guidance that resolves potential overlaps (e.g., check_condition vs wait_for vs assert_condition, get_content vs find_elements vs get_page_info). The few ambiguous pairs like scroll vs focus(action='scroll_to_element') are explicitly differentiated in the descriptions.

Naming Consistency4/5

The tool set uses consistent snake_case throughout, but several tools are single verbs (navigate, click, focus, scroll) while most others follow a verb_noun pattern (start_browser, get_content, manage_cookies). This minor deviation is still readable and predictable overall.

Tool Count3/5

24 tools is at the upper end and feels heavy for a single browser-automation server, even though most tools serve distinct purposes. The surface is comprehensive and well-organized, but it borders on over-provisioned for the stated scope.

Completeness4/5

The server covers browser lifecycle, navigation, content inspection, interaction, cookies/storage, windows/tabs, waits/assertions, CAPTCHA, and JavaScript fallback, which is a broad and coherent surface. Minor gaps include explicit alert/dialog handling, file upload, and full iframe switching, though some of these can be worked around via run_javascript or scoped click.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers