tabpilot-mcp
TabPilot MCP server drives your real, logged-in Chrome to read, navigate, and interact with web pages token-efficiently and without bot detection.
Read pages efficiently:
read_tabextracts markdown/text/HTML with token caps and link-density mode;query_dominspects specific elements with minimal tokens.Manage tabs:
list_tabs,open_tab,close_tab,navigate, andactivate_tab(with regex filtering and background operation).Interact like a human:
clickemits trusted mouse events;fillworks with React/Vue/SPA forms using native setters;select_optionhandles native/Select2;select_option_uidrives React-Select/Headless UI dropdowns.Run JavaScript:
eval_jsexecutes arbitrary JS, awaits promises, and returns JSON.Handle matrix surveys:
scan_matrixfinds grid questions andfill_matrixanswers them row-by-row to avoid React batching bugs.Wait for page states:
wait_forpolls for visibility, text, presence, enabled state, or a custom JS predicate.Capture evidence:
screenshotcaptures any tab (even background/headless) as PNG/JPEG, full-page or element, with inline image option.Live resources:
tab://activeandtab://{tab_id}provide markdown streams of tabs.Server status:
browser_statusreports backend, capabilities, and tab count.
Provides tools for controlling and reading an existing logged-in Google Chrome browser, including DOM querying, token-efficient page extraction, clicking and form filling, handling SPA/React form traps, and capturing screenshots from background tabs.
π§ TabPilot
Most browser MCP servers launch a fresh, blank browser instance. That works for scraping static pages, but fails completely on tasks that matter:
π« Cloudflare & Bot Shields immediately flag fresh automation browsers.
π« Corporate SSO, Okta, & 2FA make authenticating from scratch painful or impossible.
π« Read-only tab viewers can only look at DOM text, not click or fill forms.
TabPilot bridges this gap. It attaches directly to your existing, logged-in Google Chrome. Your AI agents (Claude, Cursor, Antigravity, Cline) can read pages with up to 99% token savings, click elements with authentic mouse events (isTrusted: true), defeat React state caching traps, solve multi-row survey grids, and capture background screenshots without stealing window focus.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YOUR WORKSPACE TABPILOT MCP ENGINE REAL BROWSER β
β β
β ββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββ β
β β AI Agents β β TabPilot MCP Server β β Real Chrome β β
β β - Claude Desktop β stdio / β - Token Budget Slicerβ CDP β - Active SSO β β
β β - Cursor IDE β βββββββ> β - Native Form Settersβββββ> β - Cookies β β
β β - Antigravity/Gemini β SSH β - Matrix Grid Driver β<ββββ β - 2FA Saved β β
β β - Cline / Windsurf β β - Dual CDP/AppleScr. β β - Real Fingerβ β
β ββββββββββββββββββββββββ ββββββββββββββββββββββββ ββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘ Quick Start
1. Test your environment in one command
Run tabpilot doctor via uvx (no installation required):
uvx tabpilot-mcp doctor(Or install via pip: pip install tabpilot-mcp)
2. Configure your MCP Client
Add to claude_desktop_config.json or .cursor/mcp.json:
{
"mcpServers": {
"tabpilot": {
"command": "uvx",
"args": ["tabpilot-mcp"]
}
}
}3. Launch Chrome with Remote Debugging
Quit Chrome completely, then start it pointing to your persistent automation profile:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
--remote-debugging-port=9222 --user-data-dir="$HOME/tabpilot-chrome"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/tabpilot-chrome"
# Windows
taskkill /F /IM chrome.exe
"C:\Program Files\Google\Chrome\Application\chrome.exe" ^
--remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\tabpilot-chrome"π macOS Zero-Config Fallback:
On macOS, if you do not launch Chrome with debugging flags, TabPilot automatically falls back to AppleScript to drive the Chrome you already have open.
Prerequisite: In Google Chrome, go to View β Developer β check "Allow JavaScript from Apple Events".
Related MCP server: Browser MCP
π° How TabPilot Saves 90%+ Tokens
Naive browser automation dumps document.body.innerText or raw HTML, wasting 15,000β45,000 tokens on navigation bars, cookies banners, and tracking scripts.
TabPilot provides Progressive Token Slicing:
Raw Page Dump (eval_js body) ββββββββββββββββββββββββββββββββββββββ 18,000+ tokens
read_tab() (Link-Density) ββββββββββββββββββββββββββββββββββββββ ~1,200 tokens (93% saved)
read_tab(selector) ββββββββββββββββββββββββββββββββββββββ ~350 tokens (98% saved)
query_dom(selector) β ~18 tokens (99.9% saved)Method | Tokens | Savings | Best For |
| ~15β30 | 99.9% | Checking button states ( |
| ~300β600 | 98.0% | Reading isolated articles, ticket cards, or form sections |
| ~1,200β1,800 | 93.0% | Full-page reads with nav, ads, headers, and footers stripped |
β Naive | 15,000β35,000 | 0% | Context budget incinerator |
π‘ Enforced Character Budget: Reads default to
--max-chars 20000. If truncated, TabPilot alerts the model with exact cut sizes, prompting it to narrow down withselectorinstead of hallucinating.
π₯ Driving Forms That Fight Back
Modern Single-Page Applications (React, Vue, Svelte) defeat standard automation scripts. TabPilot solves the 3 most infamous SPA traps:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRAP 1: React Synthetic Cache β
β Standard `.value = 'x'` is ignored by React's internal tracker. β
β β
TabPilot calls native property setters + fires both `input` and `change`. β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β TRAP 2: Multi-Row Survey Grid Batching β
β Clicking 25 matrix rows in one JS tick causes React to commit only the last row. β
β β
`fill_matrix` clicks row-by-row across microtasks with delays, then confirms. β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β TRAP 3: Virtual Portals (React-Select, Headless UI) β
β No `<select>` exists; options render only after clicking the trigger. β
β β
`select_option_ui` clicks trigger, awaits portal mount, and selects option. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββοΈ Comparison
Capability | Read-Only Tab Readers | Headless Bots (Puppeteer/Playwright) | π§ TabPilot |
Uses Existing Sessions & Cookies | β | β Fresh empty profile | β Real Chrome (No re-login) |
Bypasses Cloudflare & Bot Shields | β Human | β Bot fingerprint | β Human browser fingerprint |
Form Driving & Clicking | β Read-only | β | β Full Bidirectional Driving |
React Synthetic Event Fix | β | β οΈ Often missed | β Native prototype setters |
Survey Matrix Handler | β | β Batched drops | β
|
Token-Optimized Extraction | β οΈ Basic text | β Raw DOM / costly vision | β
|
Background Tab Screenshots | β Must be active | β | β Off-screen CDP captures |
Headless Ubuntu 24/7 Daemon | β macOS only | β οΈ Complex Docker | β Native systemd stack |
External Dependencies | Minimal | β Heavy Node/Playwright binaries | β Zero dependencies beyond MCP |
π§ 24/7 Headless Ubuntu Server Stack
TabPilot is engineered to run permanently on cloud VPS servers (AWS, Hetzner, DigitalOcean) with zero exposed ports:
[ Laptop / Client ] ββ( Encrypted SSH Pipe )ββ> [ Remote Ubuntu Server ]
β
βΌ
[ TabPilot MCP Server ]
β (CDP 127.0.0.1:9222)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Managed Systemd User Stack (Restart=always, Linger Enabled) β
β tabpilot-xvfb.service ββ> tabpilot-wm.service ββ> tabpilot-chrome.service
β (Virtual Framebuffer) (Openbox Window Mgr) (Real Chrome + SSO) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββOne-Command Setup:
bash deploy/ubuntu/install.shconfigures Xvfb, Openbox, Chrome, and systemd services withRestart=always.Font Protection (Anti-Tofu): Headless servers often render Vietnamese and CJK characters as empty square boxes.
install.shinstalls Noto and Liberation fonts;doctorvalidates text rendering.Cgroup Memory Caps: Prevent Chrome from exhausting host RAM:
tabpilot install-stack --memory-high 4GZero Remote Attack Surface: Chrome CDP stays locked to
127.0.0.1. Remote MCP connections run securely through SSH pipes (ssh you@server "tabpilot serve").
π§° Tools & Resources Reference
TabPilot exposes 17 tools and 2 live resources:
π Reading & DOM Inspection
query_dom(selector, attrs, limit, visible_only): Atomic element inspection (~18 tokens). Checks disabled, checked, values.read_tab(selector, mode, max_chars, url_pattern): Link-density markdown extraction with token caps.list_tabs(url_pattern): Lists open tabs with IDs, titles, and URLs (regex filterable).eval_js(expression, timeout_ms): Runs arbitrary JS in tab context; automatically awaits Promises in CDP.
π§ Navigation & Tabs
open_tab(url, activate, wait_for_load): Opens a URL in a new tab, awaiting page completion.close_tab(url_pattern, tab_id): Closes tab and polls until process confirms destruction.navigate(url, wait_for_load): Points tab to a new URL and awaits document load.activate_tab(url_pattern, tab_id): Brings target tab to foreground focus.
π±οΈ Interaction & Complex Forms
click(selector, text, nth): Scrolls element into view and emits trusted mouse event (isTrusted: true).fill(selector, value, clear, press_enter): Sets form inputs via native prototype setters to trigger React/Vue.select_option(selector, values, by): Selects options in native<select>or Select2 dropdowns.select_option_ui(control_selector, option_text): Clicks trigger, waits for popup portal, and selects item.wait_for(selector, state, text, timeout_ms): Polls until condition holds (visible,hidden,text,enabled).
π Matrix Surveys & Evidence
scan_matrix(selector): Discovers multi-row grid questions and flags unanswered rows.fill_matrix(column_index, rows, delay_ms): Answers matrix rows sequentially with task delays.screenshot(full_page, selector, label): Offscreen capture of any tab (local path or inline base64).browser_status(): Reports active backend, capabilities, CDP endpoint, and open tab count.
π¦ Live MCP Resources
tab://activeβ Markdown stream of the currently focused tab.tab://{tab_id}β Markdown stream of any specific tab by ID.
π οΈ CLI Reference
tabpilot doctor # Run diagnostic suite (Chrome, CDP, fonts, permissions)
tabpilot tabs # List open browser tabs in terminal
tabpilot serve # Start MCP server on stdio
# Linux Managed Stack Commands
tabpilot install-stack # Install systemd user services
tabpilot up / tabpilot down # Start or stop the headless stack
tabpilot status # Check systemd stack status
tabpilot logs chrome -f # Follow live Chrome logsπ§ͺ Testing
git clone https://github.com/hunglp97/tabpilot-mcp.git
cd tabpilot-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Unit tests (Zero browser needed)
pytest -v
# Live integration tests (against Chrome on port 9222)
pytest -v -m liveπ License
Distributed under the MIT License. See LICENSE for details.
Available Tools
17 toolsactivate_tabA
Bring a target browser tab to the front and focus its window.
Side effects: Changes system window focus and switches the user's active tab viewport. Does not reload the page or alter DOM state.
Usage guidelines:
When to use: Use when a human user needs to observe the active page, or before capturing desktop-wide OS screenshots and video screencasts.
When NOT to use: Do NOT call this before reading or interacting with tabs. TabPilot tools (
read_tab,query_dom,click,fill,eval_js,screenshot) work off-screen in background tabs without stealing focus.
Args:
tab_id: Exact tab identifier (e.g. from list_tabs). If omitted,
uses the frontmost tab or matches by url_pattern.
url_pattern: Optional regex pattern matched against tab URLs
(e.g. 'github.com').
Returns: Confirmation message containing the activated tab ID and title/URL. Returns an error message if no matching tab is found.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses side effects (changes system window focus, switches active tab viewport) and explicitly states non-effects (does not reload or alter DOM). This is thorough and accurate, going beyond a generic 'activates a tab' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear section headers (Side effects, Usage guidelines, Args, Returns). Each sentence adds value; nothing is redundant. It is front-loaded with the core action and side effects before diving into usage and parameters, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and lack of annotations, the description covers all necessary context: what it does, side effects, when to use/avoid, parameter details, and return behavior. The presence of an output schema (though not shown) is complemented by the description's explicit note about error messages. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides detailed semantics for both parameters: 'tab_id' is explained as an exact identifier from 'list_tabs' with fallback behavior, and 'url_pattern' is described as a regex pattern with an example. This adds meaningful context that the raw schema (types and defaults only) lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Bring a target browser tab to the front and focus its window.' It immediately distinguishes itself from sibling tools by explicitly noting that TabPilot tools work off-screen without stealing focus, so the agent can clearly identify when to use this tool versus others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' and 'When NOT to use' sections are explicit and actionable. It names concrete scenarios (observation, screenshots) and explicitly forbids use before reading/interacting, listing the alternative tools. This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_statusA
Report which backend is connected, what it can do, and how many tabs are open.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; 'Report' signals a read-only diagnostic operation and the sentence spells out the three things it returns (backend, capabilities, tab count). It does not explicitly state 'does not modify browser state', but the report semantics make side effects unlikely, and an output schema exists for return details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One efficient, front-loaded sentence covers the operation and its outputs with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter diagnostic tool with an output schema available, the description plausibly covers everything needed to call it. It does not explain the meaning of 'what it can do' in detail, but that detail belongs to the output schema, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the parameter burden is minimal; per the baseline for 0 params, no parameter-level documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete action (report) and resource (backend connection, capabilities, tab count), making the tool's purpose clear. It stops short of a 5 because it does not explicitly contrast with siblings such as list_tabs, which overlap on the tab-count aspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the status-reporting wording: call it to check the active backend, its capabilities, or the number of tabs. However, there is no explicit guidance about when to prefer it over list_tabs or when its capabilities report is relevant, so the agent must infer the trigger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clickA
Click an element, scrolling it into view first.
On the CDP backend this is a real mouse event at the element's centre, so widgets that only react to genuine mousedown behave correctly.
Args: selector: CSS selector. text: Visible text to match. Combined with selector it narrows within those matches; alone it searches clickable elements. Exact matches win over partial ones, and the innermost match wins. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. nth: Which match to click, 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | ||
| text | No | ||
| tab_id | No | ||
| selector | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does it well: it discloses scrolling, a real CDP mouse event at the element's center, and the resulting effect on mousedown-only widgets. It does not mention failure modes or default-tab behavior, but the core side effects are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the action and key behavioral caveat, and then lists each parameter in a scannable block. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The parameter list is well covered and an output schema exists, so return values are not needed. However, all parameters are optional and the description never says which tab is used when tab_id and url_pattern are absent, nor what happens if no locator is supplied. That is a clear gap for an agent choosing arguments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates by explaining all five parameters, including detailed text-matching semantics and the role of nth. It could be stronger on how tab_id, url_pattern, and the active tab interact when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and object ('Click an element') and adds the concrete behavior of scrolling it into view. It does not explicitly differentiate this from sibling tools such as eval_js or fill, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The CDP note implies this tool is for genuine mouse interactions, but the description never says when to prefer it over an alternative or when not to use it. Usage context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_tabA
Close a tab.
Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. Must identify one tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of disclosing side effects. It only says 'Close a tab' and adds a uniqueness constraint, but doesn't state that closing is irreversible, whether the active tab can be closed, or how browser state changes. This is insufficient for a destructive browser operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded; 'Close a tab' is the first sentence and the Args block is terse. Every line earns its place and no redundant schema information is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-optional-parameter tool with an output schema, the core mechanics are present, but key selection details are missing: whether tab_id and url_pattern are alternatives or cumulative, and what happens if no tab or multiple tabs match. An agent could invoke it correctly in the common case but lacks full error and selection context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the parameter lines add necessary semantics: tab_id is 'Exact tab id' and url_pattern is 'Regex matched against tab URLs' with 'Must identify one tab.' This goes beyond the schema's bare property titles, though it doesn't specify whether the two parameters are mutually exclusive or can be combined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Close a tab' names a specific action and resource, and the action is clearly distinct from sibling tools like open_tab, activate_tab, and list_tabs. It tells an agent exactly what operation this tool performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when/when-not guidance or alternative routing. It relies on the tool name and the closing verb to imply usage, but it never states, for example, to prefer this over navigating away or activating another tab. This is implied usage rather than explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eval_jsA
Run a JavaScript expression in a tab and return its value as JSON.
The expression's value is returned, so write document.title, not
return document.title. Promises are awaited on the CDP backend.
Do not use this to dump document.body.innerText β read_tab and
query_dom answer those questions for a fraction of the tokens.
Args: expression: A JavaScript expression. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. timeout_ms: Per-call timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| expression | Yes | ||
| timeout_ms | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It usefully discloses that the expression's value (not a return statement) is returned, that Promises are awaited, and that results are JSON. With no annotations, though, it never states that running arbitrary JS in a tab can mutate the page or mentions auth/error behavior, leaving the side-effect profile implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with the core action, then adds return-value semantics, a targeted anti-usage note, and a compact Args list. Every sentence carries actionable information and none pad the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter eval tool with no annotations, the description covers purpose, all args, JSON return, promise handling, and token-aware routing. It is only slightly incomplete in not calling out that eval can change page state or what happens with missing/invalid tab targets, but the output schema removes the need to explain return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the Args section is the only semantic source, and it defines all four params beyond their titles. 'url_pattern: Regex matched against tab URLs' and 'timeout_ms: Per-call timeout' are genuinely new; only the relationship between tab_id and url_pattern is left unspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb (Run) and resource (JavaScript expression in a tab) and states the result format (JSON). It also clearly distinguishes this from read_tab/query_dom by warning against using it for DOM text dumps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-not with named alternatives: 'Do not use this to dump document.body.innerText β read_tab and query_dom answer those questions for a fraction of the tokens.' This is model-level routing guidance, not just a feature list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillA
Set a form field's value so React, Vue and jQuery all notice.
Works on text inputs, textareas, contenteditable, checkboxes and radios (pass 'true'/'false' for those).
Args: selector: CSS selector for the field. value: Value to set. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. clear: Empty the field first. nth: Which match to fill, 0-based. press_enter: Press Enter afterwards, for search boxes.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | ||
| clear | No | ||
| value | Yes | ||
| tab_id | No | ||
| selector | Yes | ||
| press_enter | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It discloses a key behavioral trait: the value is set so React, Vue, and jQuery notice the change, rather than merely assigning a property. It also transparently describes the clear and press_enter behaviors, though it does not cover broader side effects like possible form submission or navigation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with a front-loaded purpose, supported element types, and a clean Args list. Each line adds useful information and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers most aspects well, but the tab-selection mechanism is ambiguous: tab_id and url_pattern are described individually, yet it is not stated what happens if both are omitted or how they interact when both are provided. Given there are no annotations and seven parameters, this is a meaningful gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. Every parameter is given a meaningful one-line explanation: selector is a CSS selector, url_pattern is a regex against tab URLs, nth is 0-based, etc. This adds substantial value beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Set a form field's value' and explains the framework-aware behavior. It also lists the exact element types it supports, distinguishing it from siblings like click or select_option.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context by stating the supported field types (text inputs, textareas, contenteditable, checkboxes, radios) and even notes value conventions for checkboxes/radios. However, it does not explicitly mention alternatives or exclusions such as dropdowns, where select_option would be appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_matrixA
Answer a matrix/grid question one row at a time, then verify the result.
Rows are clicked in separate JavaScript tasks with a delay between them. Clicking them in a loop instead makes React batch the updates and commit only the last row, leaving the rest blank and the page stuck failing validation.
Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. selector: Override the matrix container selector. question_index: Which matrix question, as numbered by scan_matrix. column_index: Which answer column to pick. Negative counts from the right, so -1 is the last column. rows: Specific row indices. Defaults to whichever rows need answering. only_unanswered: Skip rows that already have an answer. delay_ms: Delay between rows. Raise it to 150-250 if rows stay blank.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | ||
| tab_id | No | ||
| delay_ms | No | ||
| selector | No | ||
| url_pattern | No | ||
| column_index | No | ||
| question_index | No | ||
| only_unanswered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the critical implementation detail that rows must be clicked in separate tasks with a delay, warns of the React batching failure mode if looped, and advises adjusting delay_ms to 150-250 if rows stay blank. It also mentions verification after filling, which is valuable beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the purpose in the first sentence, then gives a concise but essential behavioral warning, followed by a compact Args list. Every sentence adds operational value and there is no redundant repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 8-parameter browser automation tool with no schema descriptions and no annotations, the description covers all parameters, the key failure mode, and the verification step. An output schema exists, so not describing return values is acceptable; the description is sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates by documenting all 8 parameters with meaningful semantics. It explains defaults (rows defaults to needing answering, only_unanswered defaults true), negative column index behavior, and the relationship between question_index and scan_matrix, plus concrete delay guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear specific action: 'Answer a matrix/grid question one row at a time, then verify the result.' It names the resource (matrix/grid) and method (answer one row at a time), and distinguishes it from generic fill/click tools by its row-by-row verification behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: the tool addresses matrix/grid questions, rows are clicked in separate JavaScript tasks with a delay, and question_index comes from scan_matrix. It warns against looping due to React batching, giving concrete conditions when to raise delay. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tabsA
List open tabs with their ids, titles and URLs.
Args: url_pattern: Optional regex; only tabs whose URL matches are listed.
| Name | Required | Description | Default |
|---|---|---|---|
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It states the operation is to list tabs, implying a read-only action, but does not explicitly confirm no side effects or mention any permissions or failure conditions. The description is adequate but not rich in behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a single main sentence followed by a parameter explanation. It is front-loaded with the core purpose and has no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains what is returned and the filter behavior. Since an output schema exists, return value details are not required. It does not mention whether all windows are included or any prerequisites, but for a simple list tool this is minor. Overall, an agent can invoke it correctly with the given information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. The 'Args' section fully explains the url_pattern parameter: it is optional, expects a regex, and filters results by URL match. This adds significant meaning beyond the schema's type-only definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'open tabs', and explicitly enumerates the returned fields (ids, titles, URLs). This distinguishes it from sibling tools like activate_tab or read_tab without needing to reference them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. It does not mention that this is useful for obtaining tab IDs before activation or reading content, nor does it exclude any scenarios. The sibling list is provided but the description does not reference it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_tabA
Open a URL in a new tab and return its id.
Args: url: Absolute URL to open. activate: Bring the new tab to the front. wait_for_load: Wait until the document finishes loading.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| activate | No | ||
| wait_for_load | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it discloses that a new tab is created, an id is returned, activate controls foreground/background placement, and wait_for_load blocks until the document finishes loading. This goes beyond the bare operation implied by the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior and return value, followed by a compact, clearly labeled Args list. Every sentence earns its place; there is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter browser tool, the description is complete: it states the required URL, explains both optional booleans, and names the return value, while an output schema exists for the exact return structure. Error handling is not described, but it is not essential for correct invocation here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no property descriptions (0% coverage), but the description's Args section documents all three parameters: url requires an absolute URL, activate means 'bring to front,' and wait_for_load means wait for document load. The description fully compensates for the missing schema-level parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair: 'Open a URL in a new tab and return its id.' This clearly distinguishes it from sibling tools like navigate (implied current tab), activate_tab, and close_tab, and includes the key return value.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the action itself: use this when you want to open a URL in a new tab. However, the description gives no explicit guidance about when to prefer open_tab over navigate, activate_tab, or other siblings, and offers no exclusions or alternative conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_domA
Inspect specific elements: tag, text, attributes, size, visibility.
Use this instead of reading the page when the question is about particular elements β form fields, buttons, error messages, option lists.
Args: selector: CSS selector. tab_id: Exact tab id. Prefer url_pattern. url_pattern: Regex matched against tab URLs. limit: Maximum elements to return. attrs: Only report these attributes. Defaults to a useful set (id, name, type, href, value, placeholder, role, aria-label, data-testid, class) plus disabled/checked/selected state. text_max: Truncate each element's text at this many characters. visible_only: Skip elements that are not rendered.
| Name | Required | Description | Default |
|---|---|---|---|
| attrs | No | ||
| limit | No | ||
| tab_id | No | ||
| selector | Yes | ||
| text_max | No | ||
| url_pattern | No | ||
| visible_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It communicates read-only intent via 'Inspect' and 'instead of reading the page', and it details behavior like truncating text and skipping non-rendered elements. It does not explicitly state 'does not modify the page' or cover rate/auth limits, but for a DOM inspection tool the implication is strong enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: a one-line purpose, a sentence on when to use it, then a compact Args list. Every sentence contributes, and the most important scoping guidance is front-loaded before parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all parameters, usage, and output fields, and the output schema exists to specify return values. However, the relationship between tab_id and url_pattern is not fully specified (what happens if both or neither are provided), which leaves a small gap for correct invocation in multi-tab scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the parameter explanation is critical. The Args section explains all seven parameters with meaningful semantics: url_pattern is 'Regex matched against tab URLs', attrs defaults to a useful attribute set, text_max truncates text, and visible_only skips non-rendered elements. This exceeds baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb and resource: 'Inspect specific elements' and enumerates the kinds of data returned (tag, text, attributes, size, visibility). It also distinguishes this from reading the whole page by stating it is for particular elements such as form fields and buttons, which separates it from siblings like read_tab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is present: 'Use this instead of reading the page when the question is about particular elements β form fields, buttons, error messages, option lists.' This names the alternative (reading the page) and the triggering condition, so an agent can decide when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_tabA
Read a tab's content, converted to markdown and capped in size.
Args: tab_id: Exact tab id from list_tabs. Prefer url_pattern. url_pattern: Regex matched against tab URLs. mode: 'readable' (markdown, boilerplate stripped), 'text', or 'html'. selector: Read only this element's subtree. Use it β it is the cheapest way to keep a read small and on-topic. max_chars: Character budget. Defaults to the server's --max-chars. include_links: Keep links as markdown in 'readable' mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | readable | |
| tab_id | No | ||
| selector | No | ||
| max_chars | No | ||
| url_pattern | No | ||
| include_links | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behaviors: conversion to markdown, size capping, mode-specific output (readable strips boilerplate, text, html), and link handling. It also mentions the max_chars default. It does not cover error cases or permissions, but for a read-only operation, this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: a one-sentence purpose followed by a clean list of arguments with brief but informative explanations. Every sentence contributes value, and the most important usage guidance (selector use) is embedded in the parameter list without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to detail return values. It covers all six parameters, gives selection guidance between tab_id and url_pattern, and explains the mode and capping behavior. It could mention prerequisites like needing an active tab or what happens if no tab matches, but overall it is quite complete for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates by explaining each parameter: tab_id, url_pattern, mode, selector, max_chars, and include_links. It adds semantics beyond the schema, such as 'Prefer url_pattern', 'Defaults to the server's --max-chars', and what 'readable' mode does. This is thorough parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Read a tab's content, converted to markdown and capped in size.' This distinguishes it from siblings like list_tabs, query_dom, and eval_js, which have different purposes. It is specific enough that an agent can immediately understand what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers internal usage tips, such as 'Prefer url_pattern' for selecting between tab_id and url_pattern, and advises using the selector because it is 'the cheapest way to keep a read small and on-topic.' However, it does not explicitly contrast with sibling tools like query_dom or eval_js, leaving the when-not-to-use-this-tool guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_matrixA
List the matrix/grid questions on a page and which rows are unanswered.
Call this before fill_matrix to see the shape of the question and to confirm the row indices.
Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. selector: Override the matrix container selector.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| selector | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. The word 'List' implies a read-only scan, and it adds context about surfacing unanswered rows and row indices, but it does not explicitly state side-effect behavior, error conditions, or whether any navigation occurs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose in the first sentence, usage directive second, and a terse parameter list. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-optional-parameter scan tool with an output schema, the description covers purpose, usage context, and parameter meanings. It leaves minor ambiguity about how tab selection resolves when both tab_id and url_pattern are omitted, but the output schema handles return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description defines all three parameters with meaningful distinctions: tab_id as exact ID, url_pattern as regex, and selector as an override. It does not explain precedence or interactions between the optional parameters, so it is not a perfect 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the matrix/grid questions on a page and which rows are unanswered.' It clearly identifies what the tool returns and distinguishes it from fill_matrix by naming fill_matrix as the follow-up action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Call this before fill_matrix to see the shape of the question and to confirm the row indices.' This tells the agent the intended context, though it does not discuss alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Capture a tab and save it to disk.
Captures the tab that was asked for even if it is not frontmost, and works headless β so this is also how evidence gets captured on a server. Needs the CDP backend.
Args: tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. full_page: Capture the whole scrollable page, not just the viewport. selector: Capture only this element. image_format: 'png' or 'jpeg'. quality: JPEG quality, 1-100. Ignored for PNG. label: Included in the filename, to make the file findable later. return_image: Inline the image in the result. Defaults on when the client is on another machine (TABPILOT_REMOTE / --return-images), since a saved path means nothing there.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| tab_id | No | ||
| quality | No | ||
| selector | No | ||
| full_page | No | ||
| url_pattern | No | ||
| image_format | No | png | |
| return_image | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well. It discloses side effects (saving to disk), behavior for background tabs, headless operation, the CDP dependency, and the remote-client condition for return_image. This goes well beyond the minimum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior, followed by a concise, well-structured argument list. Every sentence adds useful information, and there is no filler or repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, no annotations, and no output schema, the description is remarkably complete. It covers capture modes, format, quality, selection targeting, filename labeling, and the return_image behavior, giving an agent everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Args block meaningfully explains all 8 parameters beyond their schema titles: url_pattern is a regex on tab URLs, full_page captures the scrollable page, quality is ignored for PNG, and return_image defaults based on remote/client context. The description fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Capture a tab and save it to disk.' It also clarifies the tool's unique value versus browsing siblings by noting it works headless and for non-frontmost tabs, which sets it apart from read_tab or query_dom.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use it: capturing evidence, including on servers, and notes the CDP backend requirement. It does not explicitly name alternatives or exclusions, but the usage context is unambiguous enough for an agent to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_optionA
Choose option(s) in a native or a Select2 widget.
Pass several values for a multi-select. If the element turns out to be a React-Select style widget with no underlying , this says so and you should use select_option_ui instead.
Args: selector: CSS selector for the . values: Option values or labels to select. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. by: Match options by 'value', 'label', or 'auto' (either). nth: Which match to use, 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | auto | |
| nth | No | ||
| tab_id | No | ||
| values | Yes | ||
| selector | Yes | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of behavioral disclosure. It does disclose a key behavior: if the element turns out to be a React-Select widget, the tool 'says so' and directs the caller to select_option_ui. It also implies multi-select behavior. It could add more about error handling or side effects, but it is well beyond a bare description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The main purpose is in the first sentence, followed by usage-specific notes and then a clean, scannable Args list. Every line adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter interaction tool with zero annotation coveragetingham, the description covers the tool's purpose, the distinguishing alternative, how to handle multi-select, and all parameter meanings. The presence of an output schema means return values do not need to be explained in the description. Nothing essential for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters, and it does: selector, values, tab_id, url_pattern, by, and nth each receive an explanation that goes beyond the schema's property names. The descriptions are concise and meaningful, especially 'by' and 'nth'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Choose option(s)') on a specific resource ('native <select> or a Select2 widget'), and explicitly distinguishes itself from select_option_ui for React-Select style widgets. This makes its purpose immediately clear and differentiates it from the relevant sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the alternative (select_option_ui) and gives the precise condition for using it: when the element is a React-Select style widget with no underlying <select>. It also notes that multiple values should be passed for multi-select, providing direct usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_option_uiA
Choose an option in a React-Select / Headless UI dropdown by driving its UI.
These have no to set, so the menu is opened, awaited, and the option clicked β which cannot be done in a single JavaScript call because the menu does not exist yet when the click would fire.
Args: control_selector: CSS selector for the control that opens the menu. option_text: Visible text of the option to choose. tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. option_selector: Override the option selector if the defaults miss. timeout_ms: How long to wait for the menu to appear.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | No | ||
| timeout_ms | No | ||
| option_text | Yes | ||
| url_pattern | No | ||
| option_selector | No | ||
| control_selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that the tool opens the menu, waits for it, and clicks the option, and explains the asynchronous constraint. It also mentions the timeout for menu appearance, which is valuable behavioral context beyond a simple 'select' action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and immediately explains why the tool behaves as it does. The Args list is compact and each line earns its place by clarifying a parameter. There is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete for a 6-parameter UI-driving tool: it explains the mechanism, the parameters, and the waiting behavior. Since an output schema exists, return-value details are not required. It could be slightly stronger by mentioning failure modes or when to prefer a native select alternative, but it is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does by documenting all six parameters. Each parameter gets a concise functional explanation, such as 'control_selector: CSS selector for the control that opens the menu' and 'option_selector: Override the option selector if the defaults miss.' This adds real meaning beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Choose an option in a React-Select / Headless UI dropdown by driving its UI.' It also distinguishes this tool from native select handling by explaining that these dropdowns have no <select> to set, making the purpose clear relative to sibling tools like select_option.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: for React-Select / Headless UI dropdowns that cannot be set via a native <select>. It explains the UI-driving approach and why a single JavaScript call will not work, but it does not explicitly name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forA
Poll until a condition holds, then return. Fails with what it last saw.
Args: selector: CSS selector to watch. state: 'visible', 'hidden', 'present', 'absent', 'enabled', or 'text' (with the text argument). text: Substring to look for when state is 'text'. predicate: A JavaScript expression to poll instead of a selector, e.g. "document.readyState === 'complete'". tab_id: Exact tab id. url_pattern: Regex matched against tab URLs. timeout_ms: How long to keep polling. poll_ms: Interval between checks, minimum 50.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| state | No | visible | |
| tab_id | No | ||
| poll_ms | No | ||
| selector | No | ||
| predicate | No | ||
| timeout_ms | No | ||
| url_pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses polling behavior, timeout, interval, failure mode ('Fails with what it last saw'), and the two mutually exclusive modes. It does not mention side effects (likely none) or whether it throws on timeout vs. returns a sentinel, but the core behavioral contract is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core behavior is in the first sentence, followed by a tight parameter list. Every line adds information; there is no filler or repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no annotations and 0% schema coverage, the description covers the main usage modes, parameters, and failure behavior. It does not specify the return value format, but the presence of an output schema mitigates that gap. It also does not clarify precedence when multiple filters (selector, predicate, tab_id, url_pattern) are combined, which is a minor completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains the meaning of selector, state, text, predicate, tab_id, url_pattern, timeout_ms, and poll_ms, including the minimum poll interval and the text/state dependency. It does not document the output/return value, but an output schema exists, so that is not required here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Poll until a condition holds, then return.' It clearly distinguishes this from sibling tools like query_dom or read_tab by framing it as a waiting/synchronization operation rather than a read. The failure behavior ('Fails with what it last saw') adds useful specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two main polling modes (selector+state vs. predicate) and gives a concrete example for predicate. It does not explicitly name sibling alternatives or state when not to use it, but the context makes the usage scenario clear: wait for a condition before proceeding. A short exclusion note (e.g., 'for one-shot DOM checks use query_dom') would push this to 5.
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.
17 tool updates
v0.1.0- First observed
activate_tab - First observed
browser_status - First observed
click - First observed
close_tab - First observed
eval_js - First observed
fill - First observed
fill_matrix - First observed
list_tabs - First observed
navigate - First observed
open_tab - First observed
query_dom - First observed
read_tab - First observed
scan_matrix - First observed
screenshot - First observed
select_option - First observed
select_option_ui - First observed
wait_for
TDQS
Scored across 17 tools
Each tool targets a distinct operation: reading page content (read_tab) vs inspecting specific elements (query_dom) vs running custom JS (eval_js), and interaction tools (click, fill, select_option, select_option_ui) have clear boundaries. Even similar tools like scan_matrix/fill_matrix and select_option/select_option_ui are explicitly distinguished by widget type and purpose.
Most names follow a verb_noun pattern (list_tabs, read_tab, open_tab, activate_tab, fill_matrix), but a few deviate: navigate, click, fill, and screenshot are single verbs or nouns used as verbs, while browser_status and wait_for use different structures. The pattern is still predictable and readable.
With 17 tools, the set is slightly larger than the ideal 3β15 range but each tool serves a concrete browser automation function (tab management, reading, interaction, waiting, screenshots, matrix handling). The count feels justified for the domain, not bloated.
The tool surface covers tab lifecycle (open, close, list, navigate), multiple read modes (markdown, DOM inspection, screenshots), form interaction (fill, click, select, matrix-specific tools), and synchronization (wait_for). Minor gaps exist like no explicit back/forward or keyboard shortcuts, but these can be worked around with navigate or eval_js.
Maintenance
Related MCP Connectors
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Undetectable cloud browser sessions for AI agents and scrapers. Navigate, extract, click, captcha.
Hosted browser for AI agents: screenshots, post-JS DOM, console, WCAG. No install, no API key.
Browser MCP for logged-in tasks. Uses your Chrome β credentials stay local. Zero-token replay.
Related MCP Servers
- AlicenseBqualityAmaintenanceControls a real Chrome browser for AI agents, enabling authenticated automation with parallel lanes, token-efficient page reads, and robust recovery mechanisms.121665 npm236MIT
- AlicenseAqualityAmaintenanceEnables AI agents to drive your real, logged-in Chrome browser with existing sessions and cookies, bypassing CAPTCHA and anti-bot measures, with support for multi-session and human-in-the-loop workflows.4044MIT
- AlicenseAqualityDmaintenanceDrives your real local Chrome with profile isolation, allowing LLMs to interact with your logged-in sessions without modifying your actual profile.1321 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants and terminal users to control a logged-in Chrome browser, performing actions like opening pages, searching, filling forms, and taking screenshots without re-authentication.MIT