seleniumbase-mcp
OfficialThis server provides browser automation over MCP, letting you drive a real browser through SeleniumBase with session control, navigation, DOM interaction, stealth/CDP features, CAPTCHA solving, and page inspection.
Session management: start and close a browser, choose chrome/edge/firefox, headless mode, incognito, guest mode, proxy, ad blocking, and undetected-chromedriver
Navigation: go to URLs, back/forward, refresh, get current URL and page title
Page inspection: get full HTML source, visible text of elements, count matching elements, check element visibility
Interaction: click elements by CSS/XPath, type into fields, select dropdown options, execute JavaScript
Waiting and assertions: wait for elements, assert text presence
Frames: switch into iframes and back to main content
Stealth/CDP: switch into Pure CDP Mode and attempt CAPTCHA solving (e.g. Cloudflare Turnstile)
Output: take screenshots and save them to disk
Supports scraping and automation against Cloudflare-protected sites using Pure CDP Mode, with CAPTCHA-solving capabilities.
Provides browser automation capabilities built on Selenium/SeleniumBase, including launching browser sessions, navigating, clicking, typing, selecting options, waiting for elements, executing JavaScript, and taking screenshots.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@seleniumbase-mcpNavigate to wikipedia.org and search for 'Selenium'."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
|
| Scraping/automation against bot-detection (Cloudflare, etc.) No WebDriver at all. Includes CAPTCHA-solving. |
|
| General automation with Selenium ecosystem support. |
|
| The broadest API surface: Everything |
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 syncuv 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-cdpseleniumbase-driverseleniumbase-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.pyThat 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 globallyThis 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.jsonWindows:
%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 |
| Launch a browser session (headless defaults to |
| End the session |
| Go to a URL |
| History navigation |
| Page metadata |
| Full HTML |
| Visible text of an element |
| Count matches |
| Visibility check |
| Click (CSS or XPath) |
| Fill a field |
| Choose a dropdown option |
| Explicit wait |
| iframe handling |
| Verify text is present |
| Save a screenshot |
| 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_idparameter 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. Passheadless=Truefor background/server use once you've confirmed a flow works.sb_server.py'suc=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 |
|
Navigation |
|
Finding & reading |
|
Interacting |
|
Waiting |
|
Assertions |
|
Cookies & storage |
|
Scrolling |
|
Windows & tabs |
|
Captcha |
|
Output & misc |
|
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, sofind_element_info/find_all_inforesolve 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, useclick_nth_element(acts by position) rather than "find, then click" as two separate steps.Captcha solving isn't universal.
solve_captchahandles 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 byclose_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, rawget_document/get_flattened_document), and exact method aliases (open/gotovsget) 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_browsersb 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 |
|
Extra interactions |
|
MFA |
|
Files |
|
Site health |
|
Visual feedback |
|
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=Trueat startup. Pass it instart_browserup front if you'll need them.activate_cdp_modedoesn't start a new session. It switches the existingsbsession's underlying mode to Pure CDP for subsequent actions — it's a mid-flow escalation, not a fresh browser.
Available Tools
25 toolsassert_conditionA
Verify an expected browser condition and fail when it is not met.
Use this tool for explicit verification. Unlike check_condition, which simply reports True or False on the current state, assert_condition treats a failed expectation as an error. (Note that URL/title checks do not wait for the 'timeout'.)
Args: check: - "element_present": Verify selector identifies a present element. - "element_visible": Verify selector identifies a visible element. - "text_visible": Verify expected text is visible within selector, or within the whole HTML document when selector is omitted. - "title": Verify the exact page title. - "url": Verify the exact current URL. - "url_contains": Verify that the current URL contains expected. selector: Element selector for element_present, element_visible, and text_visible checks. expected: Expected text/title/URL value for text_visible, title, url, and url_contains. exact: For check="text_visible", require exact text rather than a substring. timeout: Maximum seconds to wait for element/text checks. (Ignored for title and URL checks.)
Returns: A confirmation when the expectation passes.
Raises: An assertion-related SeleniumBase exception when the expectation fails; the MCP error wrapper converts it to a descriptive result.
Tool selection: - Just inspect current state -> use check_condition. - Wait for a condition to become true -> use wait_for. - Verify that an expected condition is true -> use assert_condition.
| Name | Required | Description | Default |
|---|---|---|---|
| check | No | element_visible | |
| exact | No | ||
| timeout | No | ||
| expected | No | ||
| selector | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Because no annotations are present, the description carries the full disclosure burden and succeeds. It states that failed expectations raise an error, that URL/title checks ignore the timeout, that text_visible can fall back to searching the whole document, and that failures surface as a descriptive MCP error wrapper.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is moderately long but tightly organized into Intro, Args, Returns, Raises, and Tool selection sections. It front-loads the core behavior and sibling differentiation before details, and every section contributes actionable information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For its complexity, the description covers invocation semantics, per-check behavior, error/return behavior, and alternative-tool routing—enough for an agent to select and call it correctly. Residual gaps are the under-defined exact and timeout parameters, and the timeout note is never expanded into a full argument description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description enriches parameter meaning well: the check enum is fully explained, selector is scoped to three check types, and expected is mapped to four checks. However, 'exact' is described only by which checks it applies to, not what it does, and 'timeout' is never listed in Args—it appears only in a parenthetical caveat—so two of five parameters remain under-specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action and resource: 'Verify an expected browser condition and fail when it is not met.' It immediately contrasts with check_condition, which 'simply reports True or False on the current state,' so an agent can distinguish it from the most similar sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'Tool selection' section provides explicit routing: use check_condition for inspecting current state, wait_for for waiting, and assert_condition for verifying an expected condition. This names alternatives and their exact trigger conditions, 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.
Defaults to "visible".
check is ignored when text is provided.
selector:
CSS selector or SeleniumBase selector identifying the element to
inspect. Defaults to "body". When `text` is provided, this also
identifies the element whose visible text is checked.
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.
Tool selection: - Immediate boolean observation -> use check_condition. - Wait for an element or text condition to become true/false -> use wait_for. - Verify an expected condition and fail when it is not met -> use assert_condition. - Need the number or details of matching elements -> use find_elements. - Need to read the actual 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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| check | No | visible | |
| selector | No | body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states that the tool does not intentionally wait, is for current-state checks only, and that text takes precedence over check. It could more explicitly state that a non-match returns False, but the 'boolean observation' phrasing and 'Return True when...' conditions make this largely clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then organizes usage guidance, arguments, and notes logically. It is slightly redundant because the note 'When text is provided, check is ignored' repeats the same statement from the parameter documentation, but every other sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple boolean-observation tool with no output schema, the description covers parameters, return semantics, no-wait behavior, and sibling alternatives. It could be more complete by explicitly stating what happens when the selector matches no elements or by defining the returned value for the false case, but the coverage is strong overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It explains the check enum values ('present', 'visible') with return conditions, describes selector as a CSS or SeleniumBase selector defaulting to 'body', and clarifies that text is optional, takes precedence over check, and scopes the visibility check.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: checking the current state of an element or text and returning an immediate boolean observation. It names specific verbs and resources ('check', 'element', 'text') and distinguishes itself from wait_for and assert_condition, so an agent can differentiate it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit routing guidance: use wait_for when a condition may become true later, use assert_condition when failure should raise an assertion error, use find_elements for counts/details, and use get_content for reading actual content. This is comprehensive and leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Click one or more elements matching a selector.
This is the primary element-clicking tool. The selector may be a CSS selector or SeleniumBase text-matching selector such as 'a:contains("Sign in")'.
Args: selector: Target CSS selector or text-matching selector. nth: Click only the Nth matching element, using 1-based indexing. Takes priority over all_matches. all_matches: Click every currently visible matching element, in order. Ignored when nth is provided. only_if_visible: Attempt the click only when the target is already visible. Does not wait for the element to become visible. parent_selector: Restrict the nested lookup to a parent element. Useful for elements inside iframes or nested containers when supported by SeleniumBase. timeout: Seconds to wait for a basic click when no specialized mode is selected. Defaults to 7 seconds. scroll: Scroll the target into view before clicking.
Tool selection: - Click one matching element -> basic click. - Click a specific matching occurrence -> set nth. - Click every visible match -> set all_matches=True. - Click only when already visible -> set only_if_visible=True. - Click an element nested inside another element -> set parent_selector.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | ||
| scroll | No | ||
| timeout | No | ||
| selector | Yes | ||
| all_matches | No | ||
| only_if_visible | No | ||
| parent_selector | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses important behaviors: only_if_visible does not wait for visibility, nth takes priority over all_matches, all_matches clicks visible matches in order, parent_selector support is conditional, and timeout defaults to 7 seconds. It does not describe failure behavior when no element matches, but the coverage is otherwise strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized with an Args section and a Tool selection summary. Some information is repeated between these sections, but the repetition serves as a quick-reference and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters, zero annotations, and no explanatory output schema, the description covers purpose, selector syntax, all parameters, defaults, precedence, visibility semantics, and scoping caveats. It is missing explicit edge-case behavior such as what happens when no element matches, but the overall guidance is sufficiently complete 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. Every parameter is explained with meaningful semantics: nth's 1-based indexing and precedence, all_matches' visibility and ordering, only_if_visible's no-wait behavior, parent_selector's iframe/nested-container usefulness, timeout's default, and scroll's intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: "Click one or more elements matching a selector," and declares itself "the primary element-clicking tool." It clearly identifies the tool's role among browser-interaction siblings and distinguishes supported selector syntax (CSS and SeleniumBase text-matching).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: when an element click is needed, and it is labeled the primary click tool. The "Tool selection" section provides actionable recipes for different click scenarios, though it does not explicitly contrast the tool with alternatives like hover_with_action or find_elements.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 resolves element handles immediately into ordinary JSON-like dictionaries. It does not return live SeleniumBase element objects.
Args: selector: CSS selector, or a SeleniumBase selector that can match visible text. Examples include "button", ".login-link", or 'a:contains("Sign in")'. timeout: Maximum number of seconds to wait for matching elements to be found. (Defaults to 0.5 seconds.) include_html: If True, include each matching element's outer HTML. If False, return only tag name and text. (Defaults to False.)
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 are no matching elements, returns an empty dictionary.
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.
Note: 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.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | ||
| selector | Yes | ||
| include_html | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers. It discloses that element handles resolve immediately into JSON-like dictionaries, that live SeleniumBase objects are not returned, and that element handles cannot be persisted across MCP calls. It also specifies the exact return shape and empty-result behavior, which is valuable beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured with clear sections: summary, args, returns, tool selection, and a note on handle persistence. Every sentence adds useful information, and the most important distinction from sibling tools is front-loaded. The length is justified by the absence of annotations and schema-level parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers the tool's purpose, when to use it versus alternatives, all parameter semantics, the return structure, and the key limitation that element handles cannot persist across MCP calls. This is everything an agent needs to correctly select and invoke the tool, even without annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides only names, types, and defaults, with 0% schema description coverage, so the description must compensate. It does so thoroughly by explaining selector syntax with concrete examples, defining timeout as maximum wait seconds with its default, and describing exactly what include_html controls. This adds real meaning beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Find matching elements and return structured element information.' It also explicitly distinguishes itself from siblings in the Tool selection section, naming get_content, click, and check_condition as alternatives, so an agent can easily tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Tool selection section gives concrete when-to-use guidance: use find_elements for structured information about matching elements, get_content for page/single-element text/HTML, click with nth for clicking one match, and check_condition for presence/visibility. This is explicit and actionable, leaving no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
focus_onA
Scroll to, focus, or highlight an element.
Use this tool when an element needs to be brought into view, focused for keyboard interaction, or highlighted for debugging/demonstration.
This tool does NOT click, type into, select from, hover over, or otherwise activate the element.
Args: selector: CSS selector or SeleniumBase selector identifying the target.
action:
- "scroll_to_element": Scroll the page until the element is in
the current viewport. This is the default action.
- "focus": Move keyboard focus to the element.
- "highlight": Temporarily highlight the element for debugging or
demonstration. This can affect timing and may reduce stealth.Tool selection: - Bring an element into view -> use focus_on with the default action. - Focus an element -> use focus_on(action="focus"). - Highlight element for debugging -> use focus_on(action="highlight"). - Click -> use click. - Type text into a text field -> use type_text. - Hover -> use hover_with_action.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | scroll_to_element | |
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does well: it discloses that scroll only ensures in-viewport presence, that focus moves keyboard focus, and that highlight 'can affect timing and may reduce stealth' — the last one is a non-obvious behavioral trait an agent must know. It omits edge-case behavior (e.g., what happens when a selector matches nothing), but the core profile is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the behavior, followed by the negative-scope sentence, then an Args block, then a 'Tool selection' table. Every sentence carries information. It is slightly longer than strictly necessary — the Tool selection section paraphrases the opening paragraphs — but the redundancy improves navigation, so I do not penalize further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool sits among 24 siblings that include click, type_text, hover_with_action, select_option and scroll, the description exhaustively routes the agent: it covers the primary use, the three actions' semantics, and the exclusions with alternative tool names. It also accounts for the stealth/timing implication of highlight. Nothing an agent needs in addition to the schema and sibling list is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — the schema provides only names, a default, and an enum. The description compensates: selector is defined as 'CSS selector or SeleniumBase selector,' and the three action enum values are each explained in a sentence of behavior. It doesn't specify selector validity rules, but for the coverage gap this is strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and two resources: 'Scroll to, focus, or highlight an element.' It immediately differentiates itself from siblings (click, type_text, hover_with_action) by explicitly stating it 'does NOT click, type into, select from, hover over, or otherwise activate the element.' This gives an agent a clear discriminator without opening any other schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'Tool selection' section lists each use apart ('Bring into view' -> default, 'Focus' -> action="focus") and names the exact sibling alternatives for excluded actions ('Click -> use click', 'Type text -> use type_text', 'Hover -> use hover_with_action'). It states when to use it AND when not to, referencing the right sibling names.
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 a matching element.
Use this tool when you need the value of one or more HTML attributes such as href, src, value, class, id, name, type, aria-label, or data-*.
Args: selector: CSS selector or SeleniumBase text-matching selector for the target element. attribute: Specific HTML attribute to retrieve. When omitted, return all HTML attributes of the element as a dictionary.
Returns: The requested attribute value, or a dictionary containing all HTML attributes of the element when attribute is omitted.
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 and does not modify the element.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | ||
| attribute | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure and explicitly states 'This is a read-only operation and does not modify the element.' It also describes the return behavior for both cases: the requested attribute value or a dictionary of all attributes. It does not specify behavior for multiple matching elements or missing selectors, but the key side-effect and return expectations are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, and Tool selection sections, and the main purpose is front-loaded in the first sentence. Every section earns its place; the bulleted alternatives are clear and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for a simple read-only getter: it explains parameter semantics, return values, and when to use alternatives, which matters because there is no output schema. It could additionally clarify whether the first matching element is used when a selector matches multiple elements, but this is a minor gap for the stated use case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining selector as 'CSS selector or SeleniumBase text-matching selector' and attribute as an optional parameter whose omission returns all HTML attributes. This adds substantial meaning beyond the bare schema types and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read HTML attributes from a matching element.' It clearly identifies the domain (HTML attributes) and the target (a matching element), and the Tool selection section explicitly distinguishes it from sibling tools like find_elements, get_content, and check_condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit 'Use this tool when you need the value of one or more HTML attributes' statement and then provides a bulleted Tool selection list naming exact alternatives for other needs. An agent can determine when to invoke this tool versus find_elements, get_content, or check_condition without guessing.
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 current page.
Use this tool when you need actual page content or URL information rather than page metadata.
Args: selector: Optional CSS selector or SeleniumBase text-matching selector identifying the element whose content should be read. For output_format="text" or "html", the selector scopes the returned content to that element. For output_format="urls", the selector scopes URL discovery to URLs within that element. When omitted, the operation applies to the whole page.
output_format:
- "text": Return visible text from the page or selected element.
- "html": Return HTML from the page or selected element.
- "urls": Return all discovered linked/resource URLs on the page
or within the selected element. URLs associated with elements
such as anchors, links, images, scripts, and metadata may be
included. SeleniumBase returns full URLs with their URL
prefixes.
include_shadow_dom: When output_format="html" and selector is omitted,
include any shadow-root HTML present in the page. This option has
no effect for "text" or "urls", or when a selector is specified.Returns: For output_format="text", a string containing visible text. For output_format="html", a string containing HTML. For output_format="urls", a list of URL strings. This is useful for crawling, link discovery, resource inspection, and finding candidate URLs before navigating to them.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | ||
| output_format | No | text | |
| include_shadow_dom | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It thoroughly explains what each output_format returns, how selector scopes the result, and the include_shadow_dom default behavior. It does not describe failure modes or edge cases like empty results, but for a read-only content tool this is a minor omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-organized into Args, Returns, and Tool selection sections. Each section adds value, and the core purpose is front-loaded. Minor redundancy between the intro use-case sentence and the Tool selection list, but it is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a tool of this complexity: it documents every parameter, defines all output formats, explains return types, and provides routing guidance to five sibling tools. The presence of an output schema additionally covers structured return details, so nothing an agent needs to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining all three parameters with concrete semantics: selector scoping per output_format, the exact meaning of each enum value, and include_shadow_dom's effect and default. This goes far beyond the schema's bare property names and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific action and resource: 'Read visible text, HTML, or discovered URLs from the current page.' It clearly distinguishes from siblings by listing specific alternatives in Tool selection, such as get_page_info for metadata, find_elements for structured element info, and check_condition for presence/visibility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Tool selection section explicitly maps user needs to the correct tool (e.g., 'Need URL, title, origin, or User-Agent -> use get_page_info') and to the correct output_format. The introductory sentence also sets the general condition: use when you need actual page content or URL information rather than page metadata.
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 a browser session is active. - 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does so thoroughly. It declares the operation READ-ONLY, lists what it does not do (inspect content, find elements, wait, assert), and explains the no-session fallback: returns {"running": False} instead of attempting page access. It also states that it does not navigate, reload, click, type, or modify the page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-line summary, a return-value breakdown, tool-selection bullets, and a final side-effect warning. Although slightly long, every section earns its place and the most important usage guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool, the description is complete: it specifies returned fields, session-inactive behavior, read-only guarantees, and sibling tool alternatives. The output schema exists, but the description's return section still adds useful context beyond a bare schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty input schema, so parameter documentation is unnecessary. The baseline of 4 applies because there is no parameter meaning to add; the description instead focuses usefully on return value semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Get current browser session and page metadata.' It also positions the tool as the primary way to determine where the browser currently is after navigation, clicks, redirects, reloads, or tab switches, which clearly separates it from content- and element-focused siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tool selection' section explicitly maps needs to tools: URL/title/origin/user-agent -> get_page_info; visible text/HTML -> get_content; matching elements -> find_elements; state checks -> check_condition; waits -> wait_for; assertions -> assert_condition. This gives an agent explicit routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hover_with_actionA
Hover over an element, optionally click another element, or drag-&-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 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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | none | |
| selector1 | Yes | ||
| selector2 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly explains the three behavioral modes (hover-only, hover-then-click, drag-and-drop), the roles of both selectors for each mode, and the return value ('Description of the performed operation'). It does not explicitly caution that clicking or dragging may trigger page changes, but the described actions inherently imply those effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with a clear summary followed by args, tool selection, and notes. It is somewhat repetitive: the Notes section largely restates selector roles already covered in the Args and Tool selection sections. This adds minor bloat but does not obscure the information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three distinct modes and two interdependent selectors, the description is complete. It covers every action value, explains which selectors are needed for each mode, and states the return value. An agent has enough information to select the right action and populate the arguments correctly without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must fully compensate. It does: selector1 and selector2 are each explained per action mode, including which parameters are required, which are unused, and what roles they play. The action parameter's enum values are also fully defined. This is excellent parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, concrete statement of what the tool does: 'Hover over an element, optionally click another element, or drag-&-drop.' It clearly differentiates this from the sibling click tool by emphasizing hover interactions, hover-triggered menus, and drag-and-drop operations. The three explicit action modes leave no ambiguity about the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use the tool: 'Use this tool for hover interactions, hover-triggered menus, and drag-and-drop operations.' It also gives a 'Tool selection' section mapping each scenario to the correct action value. However, it does not explicitly address when not to use it or name alternatives like the sibling 'click' tool, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. Defaults to "cookies.txt". 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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | get_all | |
| filename | No | cookies.txt |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: clear deletes all cookies, save may overwrite files, filename can access the server filesystem, cookies may contain credentials, and loading does not guarantee restored logins. These are exactly the side effects and limitations an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into Args, Returns, Security, and Notes, with the main purpose and use cases front-loaded. Every section earns its place; the length is justified by the tool's breadth and the absence of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-mode tool with no output schema, the description covers input semantics, per-action return values, filesystem and security caveats, and behavioral limitations. An agent can infer exactly what to expect from each action and what precautions to take.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), but the description fully documents each action value, the meaning of filename, the default, and that filename is ignored for get_all and clear. It more than compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear resource (browser cookies) and spells out four concrete operations: inspect, clear, save, and restore. It does not explicitly contrast with the sibling manage_storage tool, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides concrete use cases: inspecting session state, preserving logins, restoring sessions, and resetting website state during testing. It does not say when to avoid this tool or name alternatives such as manage_storage for web storage, so it lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_historyA
Navigate through the current browser history, reload the current page, or list the current browser history.
Use this tool for navigation relative to the current browser history or for displaying the current browser history. Use the 'navigate' tool when going to an arbitrary URL.
Args: action: - "back": Navigate to the previous history entry. Has no useful effect when there is no previous history entry. - "forward": Navigate to the next history entry. Has no useful effect when there is no forward history entry. - "reload": Reload the current page while ignoring the browser cache so page resources are fetched again. - "list": Return a tuple containing the current location in history (0-indexed) and the full navigation-history list.
Returns: A confirmation message describing the operation performed for navigation actions, or, for "list", a tuple containing the current history location (0-indexed) and the full navigation-history list.
Notes: These operations can trigger page loads, redirects, and other navigation events. Use the 'get_page_info' tool afterward when you need to verify the resulting URL or title.
Tool selection: - Arbitrary destination URL -> use navigate. - Previous/next browser history entry -> use this tool. - Refresh current page -> use this tool with action="reload". - List current history -> use this tool with action="list".
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | list |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 so well. It discloses that back/forward have no effect without history entries, that reload bypasses the browser cache, and that operations can trigger page loads requiring a wait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, and Notes sections. The only minor issue is slight redundancy between the opening sentence and the 'Use this tool...' paragraph, but it remains appropriately sized for a multi-action tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, one parameter, no annotations, and an output schema, the description covers invocation, parameter behavior, return values, side effects, and alternatives. Nothing essential is missing for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only an enum with no descriptions, but the description fully documents each action value: back, forward, reload, and list. It explains the effect of each action and the return behavior, completely compensating for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: navigate the current browser history, reload the current page, or list history. It also explicitly distinguishes itself from the 'navigate' tool by saying that tool is for arbitrary URLs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: for relative history navigation or displaying current history. It also gives an alternative: use the 'navigate' tool for arbitrary URLs, which is clear and actionable.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | No | ||
| action | No | get | |
| storage | No | local |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose read/write behavior, return shape, origin scoping, and sensitive-data security considerations. It does not explicitly mention side effects such as overwriting an existing key or how a null value is interpreted, which keeps this slightly below 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and uses clearly labeled sections, which helps an agent scan it quickly. There is minor redundancy between 'Tool selection' and 'When not to use' regarding cookies and arbitrary JavaScript, so it is well organized but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a simple 4-parameter storage tool despite having no annotations and no output schema: it covers purpose, selection, arguments, return values, security, and origin scoping. The only missing details are edge behaviors such as null handling and overwrite semantics, which are peripheral but could matter in some workflows.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the 'Args' section compensates by explain key, value, storage, and action, including the enum meanings and conditional value requirement for set. The semantics of a null value and the effect of setting an already-existing key are left to inference, so it is strong but not perfect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact operation ('Get or set') and the resource ('a key in localStorage or sessionStorage'), giving a specific verb+resource statement. The tool-selection list immediately distinguishes this tool from siblings like manage_cookies and run_javascript, so there is no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'Tool selection' section and a 'When not to use' section, naming alternatives such as manage_cookies, run_javascript, get_content, and get_attributes with clear exclusion conditions. An agent can determine exactly when to invoke this tool versus sibling tools without needing to inspect their schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_tabsA
List, open, switch between, or close browser tabs.
Use this tool for tab management. Browser navigation within the current tab belongs to navigate and manage_history.
Args: action: - "list": Return each open tab's index, URL, and title. Call this before switch when you need to determine a tab_index. - "open": Open a new tab, optionally navigating it to url. - "switch": Switch to the tab identified by tab_index from list. - "switch_newest": Switch to the newest tab. - "close_active": Close the currently active tab. url: URL for action="open". tab_index: Index returned by action="list" for action="switch". switch_to: For action="open", switch to the newly created tab when True.
Notes: Clicking a link or performing another browser action may open a new tab. Use action="list" to inspect available tabs before switching by index. Tab indexes should be treated as current-session values and may change after tabs are opened or closed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| action | No | list | |
| switch_to | No | ||
| tab_index | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral disclosure burden. It explains the behavior of each action value and warns that tab indexes can go stale because links or browser actions may open new tabs. It does not discuss reversibility or side effects of close_active, but the meaning of 'close' is reasonably explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized into an opening statement, scoping sentence, Args breakdown, and Notes. Each action is explained in its own line with enough detail to be useful, and the stale-index caveat is placed where it will be noticed. There is no significant wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description still covers action semantics, parameter meanings, return contents for list, and the important stale-index edge case. An agent has everything needed to call this tool correctly and recover from tab changes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by defining each parameter's role: action enum values, url for action='open', tab_index from action='list' for action='switch', and switch_to for action='open'. This adds substantial meaning beyond the bare input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a clear verb set and resource: 'List, open, switch between, or close browser tabs.' It also immediately differentiates from sibling tools by saying in-tab navigation belongs to navigate and manage_history, so an agent can distinguish manage_tabs from those related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly scopes usage to 'tab management' and excludes browser navigation within the current tab as belonging to navigate and manage_history. It also gives a concrete procedure: call action='list' before switch to obtain a valid tab_index, and re-check tabs after link clicks because new tabs may appear.
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 and state.
Args: action: - "get_rect": Return the current window coordinates 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/state. For switching between browser tabs, use manage_tabs instead.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| width | No | ||
| action | No | get_rect | |
| height | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It clearly explains what each action does, including that get_rect returns coordinates/size and that set_rect requires all four parameters. It does not mention returned values for non-get actions or coordinate units, but no annotation contradiction exists and the behavioral surface is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently organized: a one-line summary, a structured Args section, and a final routing sentence. Every part adds information, and the key purpose statement is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description supplies the essential actions, parameter meanings, and usage boundary. It does not specify coordinate units or return values for set_rect/maximize/minimize, which keeps it from being fully complete, but the core calling contract is clearly explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It does, by documenting every parameter: action's four enum values, x/y as screen positions, and width/height for set_rect, plus the requirement that all four be provided together. This goes beyond the schema's bare parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-and-resource statement: 'Get or change browser window geometry and state.' It then enumerates the exact actions, making its scope unmistakable and distinguishing it from sibling tools, particularly manage_tabs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for browser-window geometry/state and to use manage_tabs for switching tabs instead. This provides clear selection guidance relative to the most likely sibling alternative.
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_with_action, focus_on, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it excels. It discloses execution via Chrome DevTools Protocol Runtime.evaluate in the active page, access to page JS context, Promise support, serialization limits for return values, and a security warning about unrestricted read/write access to page data. Nothing about the tool's behavior is hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place due to the tool's complexity and safety implications. It is well-structured with clear headings (Tool selection, Args, Returns, Security), bulleted lists, and front-loaded purpose. No filler or repetition; the detail is necessary for correct and safe invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and one opaque parameter, the description covers everything an agent needs: what it does, when to use it, what the parameter accepts, what values can be returned, serialization caveats, and security context. Even the return behavior is explained despite no output schema, making the tool fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% coverage, so the description fully compensates. The Args section defines 'expression' comprehensively: what it is, how it is evaluated, browser globals available, five concrete examples, and guidance on producing values and Promise handling. This goes far beyond the schema's bare parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Evaluate a JavaScript expression in the current page context.' It clearly distinguishes itself from sibling tools by stating it is for operations that cannot be accomplished through higher-level SeleniumBase tools, so an agent immediately knows what this tool uniquely does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit and actionable. It says 'Use this only when the required browser operation cannot be accomplished through the higher-level SeleniumBase tools' and then lists specific alternative tools to prefer for interactions, reading content, storage, and cookies. It closes with a positive condition: use when arbitrary JavaScript is needed that higher-level tools do not expose.
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 as a screenshot, HTML file, or PDF.
Use this tool when an automation workflow needs a persistent artifact from the current page, such as a screenshot for debugging, page source for inspection, or a PDF representation.
Args: format: - "screenshot": Save a PNG screenshot. - "html": Save the current page source as HTML. - "pdf": Save the current page as a PDF. filename: Output filename. Defaults to screenshot.png, page_source.html, or page.pdf depending on format. folder: Optional destination folder.
Returns: A confirmation containing the output format and filename.
Security: filename and folder can affect filesystem paths available to the MCP server. Existing files may be overwritten. Use trusted, authorized paths only.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | ||
| format | No | screenshot | |
| filename | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It clearly warns that files may be overwritten and that filename/folder can affect server-accessible filesystem paths. It also states the write side effects and the confirmation return value. This is strong transparency for a file-writing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (Args, Returns, Security), front-loads the core purpose, and every sentence adds information. It is appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-optional-parameter tool with no required inputs, the description covers purpose, usage, all parameters, return behavior, and security caveats. Nothing needed 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.
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: format's three enum options, the format-dependent default filename, and the optional folder. This adds real meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Save the current browser page as a screenshot, HTML file, or PDF.' This clearly distinguishes the tool from all browser-navigation and element-interaction siblings, none of which produce persistent artifacts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit usage context: 'Use this tool when an automation workflow needs a persistent artifact from the current page.' While it does not name alternatives or state when not to use it, no sibling tool competes for this responsibility, so the guidance is sufficient.
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.
Use focus_on(action="scroll_to_element") when the goal is to reveal a specific element rather than scroll the page by a relative amount.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| direction | No | down |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explains that amount is a percentage of viewport height and that amount is ignored for top/bottom. It doesn't cover edge cases like no-overscroll or return behavior, but the output schema exists and the core behavior is well specified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then uses a compact Args block to document parameters, and finishes with a clear alternative tool. No sentence is wasted and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter scroll tool with an output schema and no annotations, the description covers all necessary semantics: direction values, amount meaning, ignored-argument behavior, and when to use a sibling tool. There are no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only parameter documentation. It fully describes every enum value for direction, defines amount as a percentage of viewport height, and provides a concrete example. It also notes when amount is ignored.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Scroll the current page vertically.' It enumerates all four direction behaviors and explicitly contrasts with focus_on(action='scroll_to_element'), distinguishing it from a key sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: 'Use focus_on(action="scroll_to_element") when the goal is to reveal a specific element rather than scroll the page by a relative amount.' This clearly identifies when to choose an alternative tool.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | text | |
| value | Yes | ||
| dropdown_selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It discloses the matching modes, the error condition when the dropdown or option cannot be found, and the native-select limitation. It does not fully specify side effects such as whether change events are fired or how disabled dropdowns are handled, but it is substantially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a one-line purpose, a compact Args list, a Raises note, and a clear alternative-tools sentence. Every section adds necessary information without redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and sibling tools provide surrounding context, the description is complete: it defines the operation, parameter semantics, error behavior, and the boundary against custom dropdowns. An agent has enough to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain the parameters. It does: dropdown_selector is defined as a CSS selector, value is explained with three matching modes, and by is clearly documented with text, value, and index semantics, including acceptance of integer or numeric-string index values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Select an option from an HTML <select> dropdown.' It clearly distinguishes itself from siblings by explicitly stating it targets native <select> elements and directing custom dropdowns to click or other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: for native <select> elements. It also states when NOT to use it and provides alternatives: 'For custom JavaScript dropdowns made from div/button/list elements, use click or other element-interaction tools instead.' This leaves no ambiguity.
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.
This tool attempts to interact with CAPTCHA controls such as Cloudflare Turnstile, reCAPTCHA, or FriendlyCaptcha using browser/CDP interaction.
The tool does not guarantee that a 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 page with get_content when you need to determine whether CAPTCHA-related controls are present. 2. Call solve_captcha to attempt the 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, not a guarantee that the CAPTCHA challenge was solved.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It clearly warns that the tool does not guarantee a solved CAPTCHA, that some controls are in shadow DOM and expose no success signal, and that attempts may change page state or cookies. This is unusually transparent about uncertainty and 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, followed by limitations, a numbered workflow, and return behavior. Every sentence contributes meaningful guidance; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a zero-parameter tool with an output schema. It covers what the tool attempts, why the result may be uncertain, what side effects may occur, how to verify outcomes with sibling tools, and what the return message conveys.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and 100% schema coverage, so there are no parameter semantics to document. The baseline of 4 applies since no parameters exist and no parameter information is missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Attempt a SeleniumBase CDP-based CAPTCHA interaction.' It goes on to name concrete CAPTCHA types (Cloudflare Turnstile, reCAPTCHA, FriendlyCaptcha), making the tool's scope unambiguous and distinct from browser automation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The workflow is explicit: inspect with get_content first to detect CAPTCHA controls, then call solve_captcha, then verify state with get_page_info, get_content, check_condition, or manage_cookies. This gives clear usage context, though it does not state any explicit 'when not to use' condition.
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.
This must be called before 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 communicates directly with the browser through the Chrome DevTools Protocol rather than WebDriver. This provides SeleniumBase's CDP-based browser automation capabilities without using WebDriver as the browser-control layer.
Args: url: Optional URL to open immediately after the browser launches. If omitted, the browser starts without navigating to a requested page.
headless: Controls whether the browser runs without a visible window.
If True, always run headless. If False, always run headed.
If omitted (None), the default depends on the operating system:
Linux defaults to headless because MCP/server environments
commonly do not have a graphical desktop, while Windows and macOS
default to headed so that a visible browser window is available.
Use True or False to explicitly override the OS-specific default
on any operating system.
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: Explicit filesystem path to the browser
executable when it is not installed in a standard location.
Do not combine this with use_chromium=True.
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, including the effective headless setting, or a descriptive error when browser startup fails.
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.
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.
On Linux, the default is headless=True so the browser can run in
typical server/container environments without a graphical desktop.
Set headless=False when a graphical display is available and a visible
browser is desired. On Windows and macOS, the default is
headless=False. Set headless=True when running without a desktop or
when a visible browser window is not desired.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| guest | No | ||
| proxy | No | ||
| ad_block | No | ||
| headless | No | ||
| incognito | No | ||
| use_chromium | No | ||
| browser_executable_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It thoroughly explains the persistent session, state preservation, CDP communication, OS-specific headless defaults, and environment prerequisites. It also describes return values and error behavior, leaving no ambiguity about 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with clear sections (Args, Returns, Lifecycle, Environment) and every section earns its place. However, the headless default explanation is repeated nearly verbatim in Args and Environment sections, adding minor redundancy. Overall, it remains focused and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool has 8 parameters, no annotations, and no schema description coverage, so the description must cover a lot. It addresses all parameters, lifecycle, environment, return values, and failure behavior. For a tool that establishes a persistent browser session, the description is exceptionally complete and leaves no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining each parameter's purpose, default behavior, and constraints. It even warns against combining mutually exclusive parameters (use_chromium with browser_executable_path, incognito with guest) and gives proxy format examples, adding significant value beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: launching a persistent SeleniumBase Pure CDP Mode browser session. It distinguishes this tool by defining the session lifecycle and its role as a prerequisite for other browser interaction tools, so an agent can easily tell it apart from siblings like navigate or close_browser.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('must be called before browser interaction tools') and when to close it ('call close_browser when finished'), plus environment requirements. However, it does not mention what happens if the tool is called again while a session already exists, which is a minor gap in usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textA
Fill, append, fast-type, directly set, or clear a form control.
Use this tool for input elements, textareas, and contenteditable elements.
Args: selector: CSS selector or SeleniumBase selector identifying the input, textarea, or contenteditable element. text: Text to enter or set. Not used when mode="clear_only". mode: - "fill_input": Clear the field and then type text normally. - "append": Keep the existing value and add text as keystrokes. - "fast_type": Clear the field and type text without pauses. - "set_value": Set the value directly and immediately. This can be useful for fast form filling but does not simulate normal key events. It can also be used to handle input sliders, e.g. 'input[type="range"]'. - "clear_only": Empty the text field; text is ignored. timeout: Maximum seconds to wait for the target element.
Tool selection: - Normal text entry to replace existing text -> mode="fill_input". - Add text without clearing the field first -> mode="append". - Fast typing to replace existing text -> mode="fast_type". - Directly set a value (e.g. input slider) -> mode="set_value". - Empty a field of all text -> mode="clear_only".
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | fill_input | |
| text | No | ||
| timeout | No | ||
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It provides per-mode semantics, including side effects: fill_input clears first, append keeps the existing value, fast_type avoids pauses, set_value does not simulate normal key events and supports range inputs, clear_only empties the field. This is thorough behavioral detail well beyond a generic 'enters text' line.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a concise summary, then follows with a clear Args list and a Tool-selection section. It is longer than minimal, but every sentence serves a purpose—no filler or repetition. The structured bullet lists and headings make it easy to scan. A slight deduction because the content could be tightened without losing substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully specifies parameter semantics, element restrictions, selection criteria, and mode-specific behaviors, and an output schema exists to cover return values. It does not mention error behavior (e.g., what happens if the selector matches nothing or timeout expires), but that is a minor gap given the richness of the rest and the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so admirably: the Args section explains selector meaning, text usage, timeout semantics, and each mode with concrete effects and an example for set_value with range inputs. The mode parameter is fully elaborated with five clearly described choices, giving the agent everything needed to choose correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action phrase 'Fill, append, fast-type, directly set, or clear a form control', naming the resource type and the distinct operations. It further delimits its scope to 'input elements, textareas, and contenteditable elements', which distinguishes it from sibling tools like 'click' or 'select_option'. The 'Tool selection' section explicitly routes away from text-entry toward 'get_content'/'find_elements' for listing inputs, so an agent can reliably tell this tool apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Tool selection' section states exactly when to use this tool: 'use it when you know the selector and want to change or clear its value', and when not to: for a complete listing of inputs use 'get_content' or 'find_elements'. It also explicitly restricts usage to form-control element types. This gives the agent explicit decision criteria rather than leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forA
Wait until an element or text reaches a requested state.
When text is provided, a state of 'present' or 'visible' both wait
for the text to appear within the selector, and a state of 'not_visible'
or 'absent' both wait for the text to be absent from the selector.
Use this tool when the page is dynamic and an automation step must wait for a condition before continuing.
Unlike check_condition, this tool intentionally waits. Unlike assert_condition, its purpose is synchronization rather than validating a test expectation.
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.
(This is handled differently when text is provided.)
selector: CSS selector or SeleniumBase selector for the element.
Required unless text is supplied.
text: If supplied and is not None, a state of 'present' or 'visible'
both wait for the text to appear within the selector, and a state
of 'not_visible' or 'absent' both wait for the text to be absent
from the selector (or within "body" when selector is omitted).
timeout: Maximum seconds to wait for the requested state to be true.
(Defaults to 7 seconds.)
Returns: A confirmation when the requested condition is reached.
Tool selection: - Check current state immediately -> use check_condition. - Wait for a state/content transition -> use wait_for. - Verify an expected value/condition -> use assert_condition.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| state | No | visible | |
| timeout | No | ||
| selector | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly states that this tool intentionally waits and is for synchronization rather than validation, and it explains the timeout parameter and text/state interactions. It does not explicitly describe what happens on timeout, but the intentional-wait behavior is well conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections and front-loads the core purpose. However, the text/selector relationship is repeated in the opening paragraph and again in the Args section, and the formatting is somewhat verbose. Still, the structure aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage context, parameter semantics, returns, and alternatives, which is strong for a tool with no annotations. Minor gaps remain: it does not state failure behavior on timeout, and there is some ambiguity about how text works when selector is omitted despite selector being described as 'required unless text is supplied.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain parameters. It does: each state value is defined, selector and text are described with their relationship, and timeout has a default. This goes well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and target: 'Wait until an element or text reaches a requested state.' It explicitly contrasts itself with check_condition and assert_condition, so an agent can distinguish it from siblings without inspecting their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct usage context: use when the page is dynamic and an automation step must wait. The 'Tool selection' list explicitly states when to use check_condition, wait_for, or assert_condition, making decision-making straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_secondsA
Block the MCP server for a fixed number of seconds.
This is a low-level timing tool. It performs no browser action while waiting and should not be used when waiting for a page condition.
Prefer wait_for when waiting for an element or text to appear/disappear, because wait_for can return as soon as the requested condition is met.
Args: seconds: Number of seconds to block. May be an integer or float.
| Name | Required | Description | Default |
|---|---|---|---|
| seconds | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the blocking behavior, the fact that no browser action occurs, and the fixed-duration nature. It does not mention potential side effects like all MCP requests being blocked or whether the wait is absolute, but the core behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: a one-sentence core definition, a brief explanatory paragraph on usage, and an Args section. Every sentence contributes value, with the most important statement front-loaded and no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema present, the description covers the essential purpose, usage constraints, and parameter semantics. It could add a caution about the impact of long blocking times, but the 'Block the MCP server' phrasing already implies this, and the output schema handles return-value information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the one parameter. It does so by defining 'seconds' as 'Number of seconds to block' and clarifying 'May be an integer or float,' which adds unit, type flexibility, and meaning beyond the bare schema type. It stops short of specifying bounds or validation rules, but for a single-parameter tool this is strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Block the MCP server for a fixed number of seconds.' It immediately differentiates itself from sibling wait_for by labeling itself a 'low-level timing tool' that performs no browser action, making its scope clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-not-to-use guidance is provided: 'should not be used when waiting for a page condition' and 'Prefer wait_for when waiting for an element or text to appear/disappear, because wait_for can return as soon as the requested condition is met.' This clearly routes an agent between the two wait tools.
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. Dates show when Glama detected each change.
10 tool updates
v1.2.5- Changed
assert_condition2 fields changed- removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / timeout / typeAdded value: +"number"
- Added
check_condition - Removed
check_for_condition - Changed
click2 fields changed- removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / timeout / typeAdded value: +"number"
- Changed
find_elements3 fields changed- removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "null" - } -] - changed
Input schema / properties / timeout / defaultPrevious value: -7New value: +0.5 - added
Input schema / properties / timeout / typeAdded value: +"number"
- Added
manage_history - Removed
navigate_history - Changed
type_text2 fields changed- removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / timeout / typeAdded value: +"number"
- Changed
wait_for2 fields changed- removed
Input schema / properties / timeout / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "null" - } -] - added
Input schema / properties / timeout / typeAdded value: +"number"
- Changed
wait_seconds2 fields changed- removed
Input schema / properties / seconds / anyOfRemoved value: -[ - { - "type": "integer" - }, - { - "type": "number" - } -] - added
Input schema / properties / seconds / typeAdded value: +"number"
2 tool updates
v1.2.4- Added
check_for_condition - Removed
check_state
4 tool updates
v1.2.3- Added
assert_condition - Removed
assert_that - Removed
fill_input - Added
type_text
5 tool updates
v1.2.2- Removed
act_on_element - Removed
drag_and_drop - Added
focus_on - Removed
hover - Added
hover_with_action
14 tool updates
v1.2.1- Added
act_on_element - Changed
assert_that1 field changed- changed
Input schema / properties / timeout / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +]
- Removed
browser_status - Changed
click1 field changed- changed
Input schema / properties / timeout / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +]
- Removed
element_action - Changed
fill_input1 field changed- changed
Input schema / properties / timeout / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +]
- Changed
find_elements1 field changed- changed
Input schema / properties / timeout / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +]
- Removed
get_all_urls - Added
get_content - Removed
get_page_content - Removed
get_user_agent - Changed
start_browser3 fields changed- added
Input schema / properties / headless / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "null" + } +] - changed
Input schema / properties / headless / defaultPrevious value: -falseNew value: +null - removed
Input schema / properties / headless / typeRemoved value: -"boolean"
- Changed
wait_for1 field changed- changed
Input schema / properties / timeout / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +]
- Changed
wait_seconds2 fields changed- added
Input schema / properties / seconds / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "number" + } +] - removed
Input schema / properties / seconds / typeRemoved value: -"number"
96 tool updates
v1.2.0- Removed
assert_element - Removed
assert_element_visible - Removed
assert_exact_text - Removed
assert_text - Added
assert_that - Removed
assert_title - Removed
assert_url - Removed
assert_url_contains - Added
browser_status - Added
check_state - Removed
clear_cookies - Removed
clear_input - Changed
click5 fields changed- added
Input schema / properties / all_matchesAdded value: +{ + "default": false, + "title": "All Matches", + "type": "boolean" +} - added
Input schema / properties / nthAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Nth" +} - added
Input schema / properties / only_if_visibleAdded value: +{ + "default": false, + "title": "Only If Visible", + "type": "boolean" +} - added
Input schema / properties / parent_selectorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Parent Selector" +} - changed
Input schema / properties / timeout / defaultPrevious value: -nullNew value: +7
- Removed
click_if_visible - Removed
click_link - Removed
click_nth_element - Removed
click_visible_elements - Removed
close_active_tab - Added
drag_and_drop - Added
element_action - Removed
evaluate - Added
fill_input - Removed
find_all_info - Removed
find_element_info - Added
find_elements - Removed
find_elements_count - Removed
focus - Removed
get_all_cookies - Added
get_attributes - Removed
get_current_url - Removed
get_element_attribute - Removed
get_element_attributes - Removed
get_element_html - Removed
get_html_source - Removed
get_local_storage_item - Removed
get_navigation_history - Removed
get_origin - Added
get_page_content - Added
get_page_info - Removed
get_session_storage_item - Removed
get_tabs_count - Removed
get_text - Removed
get_title - Removed
get_window_rect - Removed
go_back - Removed
go_forward - Removed
highlight - Added
hover - Removed
is_element_present - Removed
is_element_visible - Removed
is_text_visible - Removed
load_cookies - Added
manage_cookies - Added
manage_storage - Added
manage_tabs - Added
manage_window - Removed
maximize - Removed
minimize - Added
navigate_history - Removed
nested_click - Removed
open_new_tab - Removed
reload_page - Added
run_javascript - Removed
save_as_pdf - Removed
save_cookies - Added
save_output - Removed
save_page_source - Removed
save_screenshot - Added
scroll - Removed
scroll_down - Removed
scroll_into_view - Removed
scroll_to_bottom - Removed
scroll_to_top - Removed
scroll_up - Added
select_option - Removed
select_option_by_index - Removed
select_option_by_text - Removed
select_option_by_value - Removed
send_keys - Removed
set_local_storage_item - Removed
set_session_storage_item - Removed
set_value - Removed
set_window_rect - Removed
sleep - Changed
start_browser2 fields changed- added
Input schema / properties / browser_executable_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Browser Executable Path" +} - added
Input schema / properties / use_chromiumAdded value: +{ + "default": false, + "title": "Use Chromium", + "type": "boolean" +}
- Removed
submit - Removed
switch_to_newest_tab - Removed
switch_to_tab - Removed
type_text - Added
wait_for - Removed
wait_for_element_absent - Removed
wait_for_element_not_visible - Removed
wait_for_element_present - Removed
wait_for_element_visible - Removed
wait_for_text - Added
wait_seconds
15 tool updates
v1.1.0- Changed
find_all_info3 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / itemsRemoved value: -{ - "additionalProperties": true, - "type": "object" -} - removed
Output schema / properties / result / typeRemoved value: -"array"
- Changed
find_element_info1 field changed- changed
Output 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" +}
- Changed
find_elements_count2 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / typeRemoved value: -"integer"
- Changed
get_all_urls3 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / itemsRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / result / typeRemoved value: -"array"
- Changed
get_element_attributes1 field changed- changed
Output 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" +}
- Changed
get_tabs_count2 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / typeRemoved value: -"integer"
- Changed
get_window_rect1 field changed- changed
Output 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" +}
- Changed
is_element_present2 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / typeRemoved value: -"boolean"
- Changed
is_element_visible2 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / typeRemoved value: -"boolean"
- Changed
is_text_visible2 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "type": "boolean" + }, + { + "type": "string" + } +] - removed
Output schema / properties / result / typeRemoved value: -"boolean"
- Changed
select_option_by_index3 fields changed- removed
Input schema / properties / indexRemoved value: -{ - "title": "Index", - "type": "integer" -} - added
Input schema / properties / optionAdded value: +{ + "title": "Option", + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "dropdown_selector", - "index" -]New value: +[ + "dropdown_selector", + "option" +]
- Changed
select_option_by_text3 fields changed- added
Input schema / properties / optionAdded value: +{ + "title": "Option", + "type": "string" +} - removed
Input schema / properties / option_textRemoved value: -{ - "title": "Option Text", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "dropdown_selector", - "option_text" -]New value: +[ + "dropdown_selector", + "option" +]
- Changed
select_option_by_value3 fields changed- added
Input schema / properties / optionAdded value: +{ + "title": "Option", + "type": "string" +} - removed
Input schema / properties / valueRemoved value: -{ - "title": "Value", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "dropdown_selector", - "value" -]New value: +[ + "dropdown_selector", + "option" +]
- Removed
wait_for_element - Added
wait_for_element_present
79 tool updates
v1.0.2- Removed
activate_cdp_mode - Added
assert_element - Added
assert_element_visible - Added
assert_exact_text - Changed
assert_text4 fields changed- removed
Input schema / properties / selector / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - changed
Input schema / properties / selector / defaultPrevious value: -nullNew value: +"html" - added
Input schema / properties / selector / typeAdded value: +"string" - added
Input schema / properties / timeoutAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timeout" +}
- Added
assert_title - Added
assert_url - Added
assert_url_contains - Added
clear_cookies - Added
clear_input - Changed
click3 fields changed- removed
Input schema / properties / byRemoved value: -{ - "default": "css", - "title": "By", - "type": "string" -} - added
Input schema / properties / scrollAdded value: +{ + "default": true, + "title": "Scroll", + "type": "boolean" +} - added
Input schema / properties / timeoutAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timeout" +}
- Added
click_if_visible - Added
click_link - Added
click_nth_element - Added
click_visible_elements - Added
close_active_tab - Added
evaluate - Removed
execute_script - Added
find_all_info - Added
find_element_info - Changed
find_elements_count1 field changed- added
Input schema / properties / timeoutAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timeout" +}
- Added
focus - Added
get_all_cookies - Added
get_all_urls - Added
get_element_attribute - Added
get_element_attributes - Added
get_element_html - Added
get_html_source - Added
get_local_storage_item - Added
get_navigation_history - Added
get_origin - Removed
get_page_source - Added
get_session_storage_item - Added
get_tabs_count - Changed
get_text2 fields changed- added
Input schema / properties / selector / defaultAdded value: +"body" - removed
Input schema / requiredRemoved value: -[ - "selector" -]
- Added
get_user_agent - Added
get_window_rect - Added
highlight - Added
is_element_present - Added
is_text_visible - Added
load_cookies - Added
maximize - Added
minimize - Added
nested_click - Added
open_new_tab - Removed
refresh_page - Added
reload_page - Added
save_as_pdf - Added
save_cookies - Added
save_page_source - Added
save_screenshot - Removed
screenshot - Added
scroll_down - Added
scroll_into_view - Added
scroll_to_bottom - Added
scroll_to_top - Added
scroll_up - Removed
select_option - Added
select_option_by_index - Added
select_option_by_text - Added
select_option_by_value - Added
send_keys - Added
set_local_storage_item - Added
set_session_storage_item - Added
set_value - Added
set_window_rect - Added
sleep - Changed
start_browser5 fields changed- removed
Input schema / properties / browserRemoved value: -{ - "default": "chrome", - "title": "Browser", - "type": "string" -} - added
Input schema / properties / guestAdded value: +{ + "default": false, + "title": "Guest", + "type": "boolean" +} - removed
Input schema / properties / guest_modeRemoved value: -{ - "default": false, - "title": "Guest Mode", - "type": "boolean" -} - removed
Input schema / properties / ucRemoved value: -{ - "default": true, - "title": "Uc", - "type": "boolean" -} - added
Input schema / properties / urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Url" +}
- Added
submit - Removed
switch_to_default_content - Removed
switch_to_frame - Added
switch_to_newest_tab - Added
switch_to_tab - Changed
type_text2 fields changed- removed
Input schema / properties / clear_firstRemoved value: -{ - "default": true, - "title": "Clear First", - "type": "boolean" -} - added
Input schema / properties / timeoutAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Timeout" +}
- Changed
wait_for_element3 fields changed- added
Input schema / properties / timeout / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / timeout / defaultPrevious value: -10New value: +null - removed
Input schema / properties / timeout / typeRemoved value: -"integer"
- Added
wait_for_element_absent - Added
wait_for_element_not_visible - Added
wait_for_element_visible - Added
wait_for_text
23 tool updates
v0.1.1- First observed
activate_cdp_mode - First observed
assert_text - First observed
click - First observed
close_browser - First observed
execute_script - First observed
find_elements_count - First observed
get_current_url - First observed
get_page_source - First observed
get_text - First observed
get_title - First observed
go_back - First observed
go_forward - First observed
is_element_visible - First observed
navigate - First observed
refresh_page - First observed
screenshot - First observed
select_option - First observed
solve_captcha - First observed
start_browser - First observed
switch_to_default_content - First observed
switch_to_frame - First observed
type_text - First observed
wait_for_element
TDQS
Every tool has a distinct purpose, and similar tools (check_state, wait_for, assert_condition) are explicitly differentiated by their intended use. The lifecycle, navigation, inspection, and interaction categories are clearly separated with no ambiguous overlaps.
Most tools use a consistent verb_noun snake_case pattern (get_content, manage_tabs, save_output). Minor deviations like bare verbs (navigate, click, scroll) and the unusual hover_with_action and focus_on slightly break the pattern, but the overall style remains readable and predictable.
With 25 tools, the set sits at the heavy end of typical scope. While each tool serves a clear purpose, the count is inflated by fine-grained separation (e.g., check_state vs wait_for vs assert_condition, and four separate manage_* tools) rather than being a lean, tightly-curated set.
The tool surface thoroughly covers the browser automation lifecycle: launching, navigation, history, element inspection, interaction, waiting, assertion, cookie/storage management, tabs, windows, scrolling, captchas, and output saving. Only niche features like alert handling or file upload are absent, but core workflows have no dead ends.
Maintenance
Related MCP Connectors
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables browser automation through MCP clients like Claude or Cursor, using the client's existing LLM without requiring an additional API key.Apache 2.0
- FlicenseNot gradedqualityBmaintenanceEnables Claude Code to control a real browser using AI for web scraping, competitive intelligence, and UX auditing through the MCP protocol.-
- AlicenseNot gradedqualityBmaintenanceEnables Claude to perform stealth browser automation with anti-detection, including navigation, clicking, typing, screenshots, and network monitoring via an MCP server.MIT
- AlicenseBqualityCmaintenanceProvides undetectable browser automation for LLM agents via MCP, enabling real Chrome interaction with stealth features, DOM accessibility, and DevTools integration.983MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/seleniumbase/seleniumbase-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server