Skip to main content
Glama

SeleniumBase MCP Server

SeleniumBase 브라우저 자동화를 Model Context Protocol을 통한 도구로 노출하므로, 모든 MCP 클라이언트(Claude Desktop, Claude Code 등)가 실제 브라우저를 구동할 수 있습니다.

이 폴더에는 세 가지 서버 변형이 있습니다:

파일

기반 기술

용도에 따른 장점

cdp_server.py

seleniumbase.sb_cdp.Chrome() (Pure CDP 모드, 동기식)

봇 탐지(Cloudflare 등)를 상대하는 스크래핑/자동화. WebDriver를 전혀 사용하지 않음. CAPTCHA 해결 포함.

driver_server.py

seleniumbase.Driver() (WebDriver)

Selenium 생태계 지원이 필요한 일반 자동화.

sb_server.py

seleniumbase.SB() (with 없이 수동 __enter__/__exit__로 사용)

가장 넓은 API 표면: Driver가 제공하는 모든 것에 더해 드래그 앤 드롭, MFA 처리, 파일 다운로드 등. activate_cdp_mode로 흐름 중간에 CDP 모드로 전환 가능

세 서버 모두 기본값은 headless=False입니다. 세션 시작 시 headless=True를 전달하지 않으면 브라우저 창이 보입니다.

MCP 클라이언트 설정에서 작업에 맞는 *_server.py를 가리키세요(아래 3단계 참조) — 또는 세 개 모두 다른 이름으로 등록하세요.

1. 설치

(Python 3.10+ 및 uv 필요)

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

uv syncpyproject.toml을 읽고 이 폴더에 .venv/를 만든 다음 두 의존성(mcp[cli], seleniumbase)과 이 프로젝트 자체를 설치합니다 — 이 프로젝트는 [project.scripts]를 통해 세 개의 콘솔 스크립트 명령을 등록합니다:

  • seleniumbase-driver

  • seleniumbase-cdp

  • seleniumbase-sb

각각 해당 서버 파일의 main() 함수(mcp.run(transport="stdio"))만 호출합니다. 이 덕분에 uv run <name> — python 경로, venv 경로, 스크립트 경로 없이 — 아래 3단계와 4단계에서 MCP 클라이언트 명령으로 작동합니다.

# 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.)

(uv가 없나요? 일반 python3 -m venv venv && pip install -e .도 동일하게 작동합니다 — 아래 모든 곳에서 uv run <name> 대신 python <script>.py를 사용하고, MCP 클라이언트 설정에는 경로 없는 옵션 대신 절대 경로 venv/bin/python + 스크립트 경로를 사용하세요.)

Related MCP server: gotham-browser

2. 단독 실행해 보기(선택적 확인)

uv run mcp dev cdp_server.py

그러면 SeleniumBase의 "Pure CDP 모드" MCP 서버용 MCP Inspector가 열리고, 명령("도구")을 테스트할 수 있습니다. Ctrl+C로 종료합니다. 실제 테스트는 클라이언트에 연결하는 것입니다(다음 단계).

3. Claude Desktop에 연결

Claude Desktop은 Claude Code처럼 "프로젝트" 디렉터리에서 실행되지 않으므로, 단순한 uv run <name>이 이 저장소를 찾는다는 보장이 없습니다. 안정적인 설정을 얻는 두 가지 방법이 있습니다:

옵션 A — 전역 설치(권장, 어디에도 경로 없음):

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

이렇게 하면 seleniumbase-driver/seleniumbase-cdp/seleniumbase-sbPATH에 영구적으로 등록됩니다(바이너리 디렉터리가 PATH에 없다는 경고가 나오면 uv tool ensurepath를 한 번 실행하세요). 그러면 claude_desktop_config.json은 다음과 같이만 하면 됩니다:

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

옵션 B — uv가 저장소를 직접 가리키게 하기(절대 경로 하나지만, venv/인터프리터 경로를 추적할 필요가 없고 별도 설치 단계도 없음):

{
  "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"]
    }
  }
}

claude_desktop_config.json의 위치는 시스템에 따라 다릅니다:

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

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

Claude Desktop을 다시 시작하세요. 🔨 도구 아이콘이 표시되어 서버가 연결되었음을 알리고, start_browser, navigate, click 등의 도구를 사용할 수 있습니다. 실제로 필요한 항목만 유지하세요 — 하나만 필요하다면 브라우저 자동화 서버 세 개는 너무 많습니다.

4. Claude Code에 연결

이 저장소의 .mcp.json은 체크인되어 있으며 수정 없이 바로 사용할 수 있습니다 — uv run <name>이 현재 디렉터리의 pyproject.toml에서 이 프로젝트를 해석하므로 경로 편집이 필요 없습니다:

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

Claude Code는 claude를 실행하는 디렉터리에서 .mcp.json을 자동으로 로드하므로, 이 저장소(또는 복제본) 안에서 claude를 실행하기만 하면 그대로 작동합니다 — 저장소를 복제한 모든 팀원에게 동일하게, 머신별 편집 없이 작동합니다.

.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

(위와 같은 이유로 저장소 디렉터리 안에서 실행하세요.)

노출되는 도구 (driver_server.py)

도구

용도

start_browser(browser, headless, uc, incognito)

브라우저 세션 시작(headless 기본값은 False)

close_browser()

세션 종료

navigate(url)

URL로 이동

go_back() / go_forward() / refresh_page()

기록 탐색

get_current_url() / get_title()

페이지 메타데이터

get_page_source()

전체 HTML

get_text(selector)

요소의 표시 텍스트

find_elements_count(selector)

일치 개수 세기

is_element_visible(selector)

표시 여부 확인

click(selector, by)

클릭(CSS 또는 XPath)

type_text(selector, text, clear_first)

필드 채우기

select_option(selector, option_text)

드롭다운 옵션 선택

wait_for_element(selector, timeout)

명시적 대기

switch_to_frame(selector) / switch_to_default_content()

iframe 처리

assert_text(text, selector)

텍스트 존재 확인

screenshot(filename)

스크린샷 저장

execute_script(script)

JS 스크립트 실행

설계 참고 사항 / 사용 사례에 맞게 조정할 사항

  • 단일 전역 세션. 각 서버는 한 번에 하나의 브라우저 세션만 유지합니다. 이는 MCP 서버가 일반적으로 실행되는 방식(클라이언트 연결당 하나의 프로세스)과 일치하며 도구 표면을 단순하게 유지합니다. 여러 동시 브라우저 탭/세션이 필요하다면 명명된 세션의 dict로 확장하고 각 도구에 session_id 매개변수를 추가해야 합니다.

  • 차단 호출. SeleniumBase의 호출은 동기식이며 페이지가 로드되거나 요소를 기다리는 동안 서버를 차단합니다. 단일 사용자 로컬 도구에는 문제없지만, 다중 클라이언트 서버라면 asyncio.to_thread를 통해 스레드 풀에서 실행하는 것이 좋습니다.

  • Headless vs Headed. 기본은 headed(headless=False)이므로 브라우저가 작동하는 것을 볼 수 있고 headless Chrome을 차단하는 사이트도 작동합니다. 흐름이 확인된 후에는 백그라운드/서버 사용을 위해 headless=True를 전달하세요. sb_server.pyuc=True(undetected- chromedriver)도 봇 탐지 벽에 대응하는 데 도움이 됩니다.

확장

도구를 추가하는 것은 해당 SeleniumBase 메서드를 호출하는 @mcp.tool() 데코레이터가 붙은 함수를 추가하는 것뿐입니다 — SeleniumBase에는 파일 업로드, 호버링, 알림, 네트워크 조건 등 위에서 아직 래핑하지 않은 메서드가 더 있습니다.


cdp_server.py — Pure CDP 모드

seleniumbase.sb_cdp.Chrome을 래핑합니다. SeleniumBase의 가장 은밀한 모드입니다: 브라우저는 Chrome DevTools Protocol로만 구동되며 WebDriver가 전혀 관여하지 않습니다. 참조: cdp_mode_methods.md.

도구 그룹

그룹

예시

세션

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

탐색

navigate, reload_page, go_back/go_forward, get_current_url, get_title

찾기 및 읽기

find_element_info, find_all_info, get_text, get_html_source, get_element_attribute(s), is_element_present/visible

상호작용

click, click_if_visible, click_visible_elements, type_text, send_keys, set_value, select_option_by_text/value/index, nested_click

대기

wait_for_element, wait_for_element_visible/not_visible/absent, wait_for_text

어서션

assert_element, assert_text, assert_exact_text, assert_title, assert_url(_contains)

쿠키 및 저장소

get_all_cookies, save_cookies/load_cookies, get/set_local_storage_item, get/set_session_storage_item

스크롤

scroll_into_view, scroll_to_top/bottom, scroll_up/down

탭 및 창

open_new_tab, switch_to_tab/switch_to_newest_tab, close_active_tab, maximize/minimize, get/set_window_rect

캡차

solve_captcha

출력

save_screenshot, save_page_source, save_as_pdf, evaluate

CDP 특정 설계 노트

  • 요소는 핸들로 전달되지 않습니다. 네이티브 CDP 모드에서 find_element()는 자체 메서드(el.click(), el.get_html(), ...)를 가진 라이브 객체를 반환합니다. MCP 도구는 JSON 직렬화 가능한 데이터만 반환할 수 있으므로, find_element_info/find_all_info는 추가 메서드를 호출할 수 있는 핸들을 반환하는 대신 요소를 즉시 일반 dict(tag_name, text, html)로 변환합니다. 여러 일치 항목 중 하나에 대해 작업해야 하는 경우 "찾은 다음 클릭"을 두 단계로 나누는 대신 click_nth_element(위치 기준으로 작동)를 사용하세요.

  • 캡차 해결은 보편적이지 않습니다. solve_captcha는 지원되는 챌린지 유형(예: SeleniumBase 데모 앱의 Cloudflare Turnstile)을 처리합니다. 임의의 CAPTCHA에 대한 보장된 우회는 아닙니다.

  • 세션 종료. sb.quit()(close_browser에서 사용)은 세션을 종료하는 문서화된 방법입니다. 프로세스가 종료될 때 호출하지 않아도 브라우저는 자동으로 닫힙니다.

  • 래핑되지 않음: PyAutoGUI 기반 gui_* 메서드(설계상 제외 — 최상위 설계 노트 참조), 저수준 내부 연결(get_websocket_url, add_handler, 권한 부여, 원시 get_document/get_flattened_document) 및 정확한 메서드 별칭(open/goto vs get)은 도구 목록을 집중적으로 유지하기 위해 제외되었습니다 — 필요하다면 다른 도구와 동일한 방식으로 추가하세요.


sb_server.py — with 문 없이 사용하는 SB()

일반적으로 컨텍스트 관리자로 사용되는 seleniumbase.SB()를 래핑합니다:

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

MCP 서버의 도구 호출은 별도의 함수 호출에서 한 번에 하나씩 발생합니다 — with를 감쌀 단일 들여쓰기 블록이 없으므로 — 이 서버는 대신 컨텍스트 관리자 프로토콜을 수동으로 호출합니다:

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

sbBaseCase 인스턴스로, SeleniumBase의 가장 광범위한 API입니다 — Driver(driver_server.py에 있음)가 노출하는 것의 상위 집합이며, UC 모드 스텔스 헬퍼와 driver_server.py/cdp_server.py에는 없는 몇 가지 추가 기능이 포함됩니다. 이 서버는 이미 다루어진 모든 것을 다시 래핑하는 대신 이러한 추가 기능에 초점을 맞춥니다:

그룹

도구

UC/CDP 스텔스

activate_cdp_mode (흐름 중간에 동일한 세션을 Pure CDP 모드로 전환)

추가 상호작용

hover_and_click, drag_and_drop, double_click, context_click, choose_file (업로드)

MFA

get_mfa_code, enter_mfa_code (비밀 키에서 생성된 TOTP/Google Authenticator 스타일 코드)

파일

download_file

사이트 상태

assert_no_404_errors, assert_no_js_errors

시각적 피드백

highlight, flash

또한 다른 두 서버와 동일한 핵심 탐색/상호작용/대기/어서션/쿠키/ 스크롤링/탭/출력 도구가 Driver나 CDP의 메서드 이름이 아닌 BaseCase 메서드 이름(예: sb.goto, sb.click, sb.assert_element)을 통해 호출됩니다.

SB() 관련 설계 노트

  • UC 모드(스텔스 모드)는 시작 시 uc=True가 필요합니다. 필요할 경우 start_browser에서 미리 전달하세요.

  • activate_cdp_mode는 새 세션을 시작하지 않습니다. 기존 sb 세션의 기본 모드를 후속 작업을 위해 Pure CDP로 전환합니다 — 새 브라우저가 아닌 흐름 중간의 확장입니다.

Available Tools

25 tools
assert_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkNoelement_visible
exactNo
timeoutNo
expectedNo
selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nthNo
scrollNo
timeoutNo
selectorYes
all_matchesNo
only_if_visibleNo
parent_selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does. 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.

Purpose5/5

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

The description opens with a specific action 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

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

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

Conciseness5/5

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

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

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

Completeness5/5

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

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

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

Parameters4/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

find_elementsA

Find matching elements and return structured element information.

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

This tool 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeoutNo
selectorYes
include_htmlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoscroll_to_element
selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description starts with a specific verb and 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorYes
attributeNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description 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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectorNo
output_formatNotext
include_shadow_domNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, 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.

Conciseness4/5

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.

Completeness5/5

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

The description is complete for 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.

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining 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.

Purpose5/5

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.

Usage Guidelines5/5

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

The Tool selection section explicitly maps 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, 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.

Conciseness5/5

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.

Completeness5/5

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

For a zero-parameter tool, 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

The 'Tool selection' section explicitly maps 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.
ParametersJSON Schema
NameRequiredDescriptionDefault
actionNonone
selector1Yes
selector2No

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoget_all
filenameNocookies.txt

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly: 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolist

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and 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.

Conciseness4/5

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.

Completeness5/5

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

Given the tool's moderate complexity, 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

It explicitly says when to use this tool: for 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
valueNo
actionNoget
storageNolocal

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 0%, but the 'Args' section 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
actionNolist
switch_toNo
tab_indexNo

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by defining 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNo
yNo
widthNo
actionNoget_rect
heightNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description must fully compensate. It 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.

Purpose5/5

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

The description opens with a specific verb-and-resource 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.

Usage Guidelines5/5

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

It explicitly says to use this tool 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
folderNo
formatNoscreenshot
filenameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining each parameter: 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.

Purpose5/5

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

The description opens with a specific verb and resource: 'Save the current browser page 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNo
directionNodown

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description carries the 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description 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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines5/5

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

The description gives explicit usage guidance: '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.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNotext
valueYes
dropdown_selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations 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.

Conciseness5/5

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.

Completeness5/5

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

Given that an output schema exists 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.

Parameters5/5

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

Schema description coverage is 0%, so the description must fully explain 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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description 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.

Conciseness5/5

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.

Completeness5/5

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

The description is complete for 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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb and resource: 'Attempt a SeleniumBase CDP-based CAPTCHA interaction.' 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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
urlNo
guestNo
proxyNo
ad_blockNo
headlessNo
incognitoNo
use_chromiumNo
browser_executable_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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

The description explicitly states when to use the tool ('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".

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNofill_input
textNo
timeoutNo
selectorYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate. 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.

Purpose5/5

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

The description opens with a specific action 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNo
stateNovisible
timeoutNo
selectorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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

Schema coverage is 0%, so the description must fully explain 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.

Purpose5/5

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

The description opens with a specific action 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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
secondsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 0%, so the description must compensate 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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines5/5

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.

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

TDQS

A4.5/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness5/5

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

ActivityNo data
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/seleniumbase/seleniumbase-mcp'

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