agent-in-browser
Drives the Brave browser over the Chrome DevTools Protocol (CDP), letting agents navigate pages, read snapshots with element refs, click, type, fill forms, take screenshots, and capture console/network activity.
Drives Firefox (and Firefox Developer Edition / Nightly) over WebDriver BiDi, exposing the same tool catalogue for navigation, page snapshots, form filling, clicking, screenshots, and console/network inspection.
Drives the Opera browser over the Chrome DevTools Protocol (CDP), enabling agents to automate navigation, page understanding, input, screenshots, and console/network capture.
Browser detection support for Safari via WebDriver (safaridriver) is included, with full automation support planned on the roadmap.
Drives the Vivaldi browser over the Chrome DevTools Protocol (CDP), providing browser automation for navigation, element interaction, form filling, screenshots, and diagnostics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@agent-in-browserGo to localhost:3000, fill the signup form, click Sign up, and check console errors."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agent-in-browser
A real browser for any AI agent, any model, and any test runner β one dependency-free binary.

Real recording, not a mock-up. The agent reads the page as a snapshot with element refs, types, fills the form and clicks, first in Chrome (CDP), then in Firefox (WebDriver BiDi). Regenerate it with task demo.
agent-in-browser is an open take on "Claude in Chrome". It doesn't need an extension or a vendor-specific runtime. It drives the browsers you already have through their native automation protocols:
Browser | Protocol | Status |
Chrome, Chrome Beta/Canary, Chromium, Edge, Brave, Vivaldi, Opera | Chrome DevTools Protocol (CDP) | β |
Firefox, Firefox Developer Edition / Nightly | WebDriver BiDi | β |
Safari | WebDriver (safaridriver) | π£ detected, roadmap |
It's available three ways, all backed by the same tool catalogue:
MCP server (
agent-in-browser mcp): plugs into Claude Code, Claude Desktop, Cursor, Codex, Gemini CLI, Windsurf, VS Code/Copilot, Zed, opencode and any other MCP client, whatever model sits behind it.Shell CLI (
agent-in-browser call <tool> β¦): for agents without MCP, for scripts, and for humans. Calls share one persistent browser.Scenario runner (
agent-in-browser run test.yaml --browser chrome,firefox): replays tool calls as automated tests across a browser matrix, with JUnit/JSON reports.
An agent skill (skills/agent-in-browser/SKILL.md) ships inside the binary and teaches agents the workflow.
Install
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/Gwakko/agent-in-browser/main/scripts/install.sh | sh
# Windows (PowerShell)
irm https://raw.githubusercontent.com/Gwakko/agent-in-browser/main/scripts/install.ps1 | iex
# Homebrew (macOS / Linux)
brew install gwakko/tap/agent-in-browser
# With Go
go install github.com/gwakko/agent-in-browser/cmd/agent-in-browser@latest
# From a checkout (needs Task: https://taskfile.dev)
task install # β ~/.local/bin/agent-in-browser + alias `aib`Related MCP server: Web Agent MCP
Connect your agent
agent-in-browser setup claude-code --write # runs `claude mcp add --scope user β¦`
agent-in-browser setup cursor --write # merges ~/.cursor/mcp.json (a .bak is kept)
agent-in-browser setup codex --write # appends to ~/.codex/config.toml
agent-in-browser setup gemini --write # ~/.gemini/settings.json
agent-in-browser setup vscode # prints the snippet for .vscode/mcp.json
agent-in-browser skill install --for claude # ~/.claude/skills/agent-in-browser (also: codex, agents, --dir)Claude Desktop, one click: download agent-in-browser-<version>.mcpb from the latest release and open it. It also appears in the MCP Registry as io.github.Gwakko/agent-in-browser.
Without --write, setup only prints the config. Pass browser options through with --args "--browser firefox --headless". See docs/integrations.md for every client.
Use it from the shell
agent-in-browser call navigate url=localhost:3000
agent-in-browser call snapshot
# - textbox "Email" [ref=e3] (required, type=email)
# - button "Sign up" [ref=e7]
agent-in-browser call type ref=e3 text=me@example.com
agent-in-browser call click ref=e7
agent-in-browser call wait_for text=Welcome
agent-in-browser call console_messages level=error
agent-in-browser call screenshot # β prints PNG path
agent-in-browser stopUseful flags (they work anywhere on the command line): --browser firefox, --headless, --instance work for a second, independent browser, --endpoint http://127.0.0.1:9222 to attach to a browser you started yourself, and --viewport 390x844.
Test scenarios
name: signup
browsers: [chrome, firefox]
steps:
- navigate: http://localhost:3000/signup
- fill_form:
fields:
- { selector: "#email", value: "qa@example.com" }
- { match: "I accept the terms", value: true }
- click: Sign up
- wait_for: { text: "Welcome" }
- assert: { url_contains: "/dashboard", no_console_errors: true }agent-in-browser run tests/*.yaml --browser chrome,firefox,edge --junit report.xmlFull format: skills/agent-in-browser/references/scenarios.md.
Tools
browser_status Β· browsers_installed Β· tabs_list Β· tab_new Β· tab_select Β· tab_close Β· navigate Β· snapshot Β· find Β· click Β· hover Β· type Β· press_key Β· fill_form Β· scroll Β· wait_for Β· get_text Β· screenshot Β· evaluate Β· console_messages Β· network_requests Β· resize Β· browser_close
Arguments are documented in docs/tools.md, which task docs:tools generates.
How it works
agent ββMCP/stdioβββ
shell ββcallββββββββΌβββΆ tools βββΆ session βββΆ Driver ββCDPβββββββΆ Chrome / Edge / Brave / β¦
CI ββββrun yamlβββββ (one catalogue) (attach|launch) ββBiDiββββββΆ Firefox
page lib (injected JS):
snapshot Β· refs Β· fill Β· findThe browser runs on a dedicated profile (
~/.agent-in-browser/profiles/<instance>-<browser>) and is detached, so it survives MCP server restarts. Separate CLI calls reuse it through~/.agent-in-browser/instances/<name>.json.Page understanding (snapshot, refs, form filling) is injected JavaScript that works the same in every engine. Trusted input, screenshots, tabs and console/network capture come from each protocol's driver.
Details: docs/architecture.md Β· browser notes: docs/browsers.md Β· plans: docs/roadmap.md.
Development
task build # bin/agent-in-browser
task test # unit tests
task test:e2e # scenario on every installed browser
task smoke # CLI scenario run, chrome+firefox
task inspect # MCP Inspector against the local build
task build:all # cross-compile 6 targets into dist/
task release TAG=v0.1.0 # tag β GitHub Actions β goreleaserSecurity notes
The debugging endpoint listens on
127.0.0.1only. Even so, any local process can drive that browser, so don't sign it into accounts you wouldn't hand to the agent.Since Chrome 136, remote debugging is refused for your default Chrome profile. agent-in-browser always uses its own profile. To reuse your logins, sign in once inside the agent's browser window and the profile keeps them.
License: MIT
Available Tools
23 toolsbrowser_closeA
Shut down the browser agent-in-browser is driving, closing all its tabs and discarding in-memory page state; the profile on disk (cookies, logins) is kept. This also closes a browser you attached to with an endpoint. The next tool call starts a fresh browser automatically. Use it to finish a session or recover from a stuck browser; to close one page use tab_close.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that all tabs are closed, in-memory page state is discarded, the on-disk profile (cookies, logins) is preserved, attached endpoint browsers are also closed, and the next tool call auto-starts a fresh browser. This is exactly the kind of destructive-scope and lifecycle context annotations cannot convey.
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?
Front-loaded with the core action and its consequences, then the alternative routing sentence. Slightly dense in the opening clause ('the browser agent-in-browser is driving') but every clause carries real 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 zero-parameter session-termination tool with no output schema, the description covers everything an agent needs: destruction scope, what survives, attached-browser behavior, and post-close lifecycle.
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?
Zero parameters, so there is nothing to document; baseline applies. The description does not need to explain inputs and correctly avoids doing so.
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?
States a specific verb (shut down) and resource (the browser the agent is driving), and explicitly contrasts with tab_close for closing a single page. An agent can distinguish it from tab_close, browser_status, and browsers_installed without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the two situations to use it (finish a session, recover from a stuck browser) and the alternative for the narrower case (tab_close for one page). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browsers_installedARead-only
Read-only: list the browsers installed on this machine (Chrome, Edge, Brave, Chromium, Vivaldi, Opera, Firefox, Safari), one per line with name, protocol, executable path and whether agent-in-browser can drive it (Safari is detected but not yet supported). Does not launch anything. Use the listed name as the browser option when starting the server; browser_status shows the one in use.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the 'Read-only' and 'Does not launch anything' statements are reinforcing rather than novel. The description does add real behavioral context beyond the annotations: the per-line return shape, the protocol/executable path fields, and the caveat that Safari is detected but not yet drivable.
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?
Front-loaded with the safety qualifier and the core action, then the output shape, then the consumer instruction. It is dense but every clause carries information; the enumerated browser list is the only mildly expendable element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies exactly what an agent needs: the line-per-browser return format, the fields emitted, the drivability flag, and the Safari support caveat. Nothing required to call it correctly is absent.
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 takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter-level detail is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('list the browsers installed on this machine') plus the enumerated set of browsers covered. It also draws a clear line against the sibling browser_status ('shows the one in use'), so an agent can pick between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent what to do with the result ('Use the listed name as the browser option when starting the server') and names browser_status as the alternative for the active browser. There is no explicit 'when not to use' framing, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_statusARead-only
Read-only health check: report which browser is connected (name, protocol CDP or BiDi, endpoint, and for launched browsers the PID, headless flag and profile directory) and list the open tabs with the current one marked. Starts the browser first if none is running, so it is a good first call in a session. Use tabs_list when you only need the tabs, browsers_installed to see what could be launched.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses a non-obvious side effect: it will launch a browser if none is running, which the readOnlyHint alone would not reveal. It also spells out what the report contains. It stops short of saying what happens if the launch fails or how long the start-up can take, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: what it returns, the launch side effect plus when to call it, and the sibling alternatives. Front-loaded with the core purpose and free of 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?
There is no output schema, so the description carries the return-value burden and does so fully, enumerating every reported field including protocol type and tab marking. Annotations cover the open-world/read-only framing, and the auto-launch caveat closes the last 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?
The tool takes no parameters, so there is no parameter semantics to add and the baseline of 4 applies. Nothing in the description misdescribes the empty input object.
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?
Names a specific verb and resource ('health check: report which browser is connected') and enumerates the returned fields (name, protocol, endpoint, PID, headless, profile dir, open tabs with current marked). It also explicitly distinguishes itself from siblings tabs_list and browsers_installed, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a positive usage rule ('a good first call in a session') and names two alternatives with the exact condition that selects each ('Use tabs_list when you only need the tabs, browsers_installed to see what could be launched'). No inference required.
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, chosen by ref, CSS selector or visible text, or a viewport point x,y, using real trusted mouse events (so it works on links, buttons, custom widgets and checkboxes). The element is scrolled into view first. Returns what was clicked (and warns if another element covers it); if the click navigated, it waits for the new page and reports its title and URL. Refs may be stale after navigation, so snapshot again. Use hover to move without clicking, fill_form for form fields.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Viewport x coordinate in CSS px, used instead of an element. | |
| y | No | Viewport y coordinate in CSS px. | |
| ref | No | Element ref from the latest snapshot or find, e.g. "e12". Preferred: unambiguous and fastest; stale after navigation. | |
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| match | No | Visible text or accessible name to match (case-insensitive substring), e.g. "Sign up"; use when you have no ref. | |
| button | No | Mouse button (default left). | |
| double | No | Double-click instead of a single click (default false). | |
| selector | No | CSS selector; the first matching element is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true; the description goes well beyond by disclosing the scroll-into-view side effect, the coverage warning, the navigation wait with title/URL reporting, and ref staleness after navigation. These are exactly the operational traits an agent needs before invoking a page-mutating click.
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?
Front-loaded with the action and supported addressing modes, then consequences, then alternatives β a good information order. It is five dense sentences and slightly long, but no sentence is filler; the only redundancy is restating addressing modes already in the schema.
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?
No output schema exists, and the description compensates by describing the return payload (what was clicked, coverage warning, navigated title/URL). Combined with 8 optional params, the staleness caveat, and the named alternatives, an agent has everything needed to call it correctly and interpret results.
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 100% schema description coverage, the schema already documents all 8 parameters including ref preference and x/y-as-alternative. The description restates the addressing modes (ref, CSS selector, visible text, x/y) but adds no syntax, precedence rules, or conflict resolution beyond what the schema says; baseline 3 applies.
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?
States a specific verb (click) and resource (element, addressed by ref/selector/text/coordinates) and immediately names the mechanism (real trusted mouse events) and its consequence (works on links, buttons, custom widgets, checkboxes). This is clearly differentiated from siblings like hover, fill_form, and evaluate.
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?
Explicitly routes the agent: 'Use hover to move without clicking, fill_form for form fields,' and the schema-preferred ref path is reinforced in prose. It also gives a follow-up rule β 'Refs may be stale after navigation, so snapshot again' β which is a when-to-do-what-else instruction, not just a fact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
console_messagesARead-only
Read-only: list browser console output (console.log/warn/error and uncaught exceptions) captured since agent-in-browser attached to the tab, one line per entry as [time] LEVEL text, oldest first. Use it to debug a page after an action fails or to confirm no errors. Capture starts on attach, so messages printed during an earlier page load are missed: navigate with action=reload first. Use clear to reset between steps. For HTTP traffic use network_requests.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| clear | No | Empty the console buffer after reading so the next call only shows new messages. | |
| level | No | Only entries of this level (error also includes uncaught exceptions). | |
| limit | No | Return only the last N matching entries (default 100). | |
| pattern | No | Regular expression the message text must match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotation, the description discloses important behavioral traits: capture begins when the agent attaches, earlier page-load messages are missed, output is one line per entry in `[time] LEVEL text` form oldest first, and clear empties the buffer.
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 purpose, then usage, caveats, and alternatives. Every sentence contributes useful selection or invocation guidance with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only console-listing tool with full schema coverage and no output schema, the description covers purpose, capture behavior, output format, usage guidance, reset behavior, and the relevant alternative.
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 100%, so tab, clear, level, limit, and pattern are already documented in the schema. The description adds context around clear and error-level inclusion of uncaught exceptions, but most parameter meaning is carried by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: list browser console output including console.log/warn/error and uncaught exceptions. It also distinguishes the tool from network_requests, making selection clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool (debug after an action fails, confirm no errors), gives a prerequisite (navigate with action=reload first because capture starts on attach), explains how to reset via clear, and names an alternative for HTTP traffic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluateA
Run JavaScript inside the page and return the result as JSON text. A bare expression is returned as is (document.title); code with several statements needs an explicit return. Promises are awaited. Output is truncated after 50000 characters. Use for data the other tools cannot read (computed styles, storage, app state) and for custom checks; prefer click, type and fill_form for interaction, since they send real input events. Side effects on the page are real.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| code | Yes | JavaScript: a single expression, or a function body that uses `return`, e.g. "return [...document.links].length". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: 50000-character output truncation, promise awaiting, bare-expression vs explicit-return evaluation, and an explicit warning that page side effects are real. This directly complements readOnlyHint=false and openWorldHint=true.
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?
Front-loaded with the core action and return semantics, then evaluation rules, then limits, then routing guidance. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description covers return form, truncation limit, and side-effect risk, which is everything an agent needs to invoke an eval-style tool safely and 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 coverage is 100%, so baseline is 3, but the description adds genuine meaning about the code parameter's evaluation model (bare expression returned as-is, multi-statement code needs return). The tab parameter is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run JavaScript inside the page') and the return form ('return the result as JSON text'). Clearly distinguishable from siblings like get_text or snapshot, which read fixed representations.
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?
Explicitly names the use case ('data the other tools cannot read... computed styles, storage, app state') and the exclusions, routing interaction to click, type and fill_form because those send real input events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_formA
Set the values of several form fields in one call: text inputs and textareas (string), selects (option value or visible label), checkboxes and radios (true/false). Each field is located by ref, selector or visible label and scrolled into view; input and change events are fired so React, Vue and Angular see the update. Returns one line per field with the value set, and stops with an error naming the failing fields[i]. It does not submit the form: click the submit button afterwards. For typing key by key use type.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| fields | Yes | Fields to set, in order. Each needs a target (ref, selector or match) and a value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses scrolling into view, firing input/change events for React/Vue/Angular, returning one line per field, stopping with an error that names `fields[i]`, and not submitting the form. These are meaningful behavioral details for a browser form mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with what the tool does and immediately covering value types, targeting, side effects, return behavior, and the non-submission caveat without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-field form mutation tool with no output schema, the description covers the important missing pieces: target resolution, supported value types, event firing, return format, error behavior, and the required follow-up submit action.
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 100%, so the baseline is 3. The description adds useful semantic detail: selects accept an option value or visible label, checkboxes/radios take true/false, and fields are set in order using ref, selector, or visible label.
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βsetting values of several form fields in one callβand distinguishes the tool from siblings by explaining that it does not submit the form and that key-by-key typing is handled by `type`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool versus `type`, and it tells the agent to use `click` afterwards to submit the form. It also explains supported field types and how targets are located.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findARead-only
Read-only: search the page for visible elements whose text, accessible label, placeholder, id or name contains the query (case-insensitive) and return each with its role, name and a ref you can pass to click, type, hover or fill_form. Use it to locate one element on a large page without a full snapshot. Returns nothing when no visible element matches; try a shorter query or call snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| limit | No | Maximum number of matches to return (default 20). | |
| query | Yes | Text to look for in element text, label, placeholder, id or name (case-insensitive substring). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, so leading with 'Read-only' earns no credit, but the description adds real substance: only visible elements are searched, matching is case-insensitive substring, results carry a ref usable by click/type/hover/fill_form, and an empty return means no match. It does not mention caveats such as iframe/shadow-DOM scoping or whether matches are capped beyond the limit parameter.
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?
Three tight sentences: capability first, then when-to-use, then failure behavior. Every sentence carries distinct information with zero restatement of the schema.
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-parameter read-only tool with no output schema, the description covers what is returned (role, name, ref), how refs are consumed, and the empty-result case. Only edge-case scoping (frames, hidden elements, ordering of matches) is unaddressed, which is a minor 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 coverage is 100%, so query, tab and limit are already documented in the schema with the same semantics (case-insensitive substring over text/label/placeholder/id/name). The description restates the query behavior but adds nothing new, and says nothing about tab or limit beyond the schema. Baseline 3 is appropriate.
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?
States a specific verb and resource (search the page for visible elements) plus exactly what is matched (text, accessible label, placeholder, id or name), and returns role/name/ref. It is clearly differentiated from snapshot and get_text by the 'without a full snapshot' framing.
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?
Explicitly says when to use it (locate one element on a large page without a full snapshot), names the alternative (snapshot), and gives a recovery path when no match is found (shorten the query or call snapshot). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_textARead-only
Read-only: return the visible text of the page, or of the first element matching a CSS selector, as plain text. Best for reading articles, search results, table contents and status messages; the text is prefixed with the page title and URL. It carries no element refs: use snapshot when you need to click or type, and screenshot for visual layout. Hidden text is excluded. Output is cut at max_chars; narrow with a selector for long pages.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| selector | No | CSS selector of the region to read (default: the whole body). | |
| max_chars | No | Maximum characters to return (default 30000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description still adds real behavioral detail beyond themβoutput is prefixed with page title and URL, hidden text is excluded, and results are truncated at max_chars. It stops short of describing pagination or error behavior on bad selectors, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the core capability front-loaded, followed by use cases, sibling routing, and the truncation caveat. No filler or restated 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?
No output schema exists, and the description compensates by explaining the return shape (plain text prefixed with title/URL, hidden text omitted, truncated at max_chars). Combined with the annotations, nothing essential for a correct call 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 coverage is 100%, so the baseline is 3, but the description adds purpose-level meaning: selector narrows output for long pages and max_chars causes the cut. It does not explain selector syntax edge cases or tab defaulting beyond what the schema states.
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?
States a specific verb (return/read) and resource (visible text of the page or a CSS-selected element) with the output format (plain text). It explicitly distinguishes itself from siblings by noting it carries no element refs, pointing to snapshot and screenshot instead.
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?
Gives concrete use cases (articles, search results, tables, status messages) and names the alternatives with the condition selecting each: snapshot for click/type, screenshot for visual layout. An agent can route correctly without inspecting other schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hoverA
Move the real mouse pointer over an element or a viewport point without clicking, to open hover menus, tooltips or lazy content. The element is scrolled into view and its centre is used. Returns what is being hovered (and warns if another element covers it). Take a snapshot or screenshot afterwards to see what appeared. Give one of ref, selector, match or x+y; use click to press instead.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Viewport x in CSS px, used instead of an element. | |
| y | No | Viewport y in CSS px. | |
| ref | No | Element ref from the latest snapshot or find, e.g. "e12". Preferred: unambiguous and fastest; stale after navigation. | |
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| match | No | Visible text or accessible name to match (case-insensitive substring), e.g. "Sign up"; use when you have no ref. | |
| selector | No | CSS selector; the first matching element is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the thin annotation set (readOnlyHint=false, openWorldHint=true) by disclosing that the element is scrolled into view, that its centre is targeted, that the return value reports what is hovered, and that an occlusion warning is emitted. The "real mouse pointer" phrasing signals this is a genuine input-device event rather than a synthetic DOM dispatch, which matters for triggering CSS/JS hover handlers.
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?
Five short sentences, front-loaded with what the tool does and why, then mechanics, then the alternate targeting modes and the anti-recommendation. No filler and nothing repeated from the schema.
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?
There is no output schema, and the description compensates by describing the return payload and its warning case. Combined with the follow-up snapshot advice and the pointing-input rules, an agent has everything needed to call this correctly on the first attempt.
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 100%, so the per-parameter docs already carry the baseline burden and the score starts at 3. The description adds the cross-parameter constraint (choose one of ref/selector/match/x+y) and the behavioural note that element coordinates come from a scroll-into-view centre rather than the raw viewport, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move the pointer over) and resource (an element or viewport point) plus the absence of clicking, which sharply separates it from the sibling `click`. The stated purpose (open hover menus, tooltips, lazy content) tells an agent exactly what outcome it buys.
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?
Explicitly routes away from the tool: "use click to press instead", and gives the follow-up step "Take a snapshot or screenshot afterwards to see what appeared" so the agent does not rely on the return value alone. It also states the selection rule among targeting inputs ("Give one of ref, selector, match or x+y").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
network_requestsARead-only
Read-only: list network requests made by the tab since agent-in-browser attached, one line per request with method, HTTP status (or FAILED reason / pending), resource type and URL. Use it to check that an API call fired, find 4xx/5xx errors or see what a page loads. Request and response bodies are not included. Requests made before attaching are missed, so navigate with action=reload first. For script errors use console_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| clear | No | Empty the request buffer after reading so the next call only shows new requests. | |
| limit | No | Return only the last N matching requests (default 100). | |
| pattern | No | Regular expression the request URL must match, e.g. "/api/". | |
| failed_only | No | Only network failures and responses with HTTP status 400 or above. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and the description's 'Read-only:' opener is consistent with that. Beyond annotations it discloses the retention window (only requests since attach), the absence of request/response bodies, the per-request output shape including FAILED/pending states, and the workaround (reload) to capture earlier traffic β context an agent cannot infer from 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?
Front-loaded with 'Read-only' and the core operation, then use cases, then caveats, then the sibling redirect. Four sentences with no filler; each carries distinct information (output shape, purpose, limitation, alternative).
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?
No output schema exists, but the description compensates by describing the returned line format and the FAILED/pending states. With annotations covering safety and a fully documented schema, nothing material is missing 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 100%, and every parameter (tab, clear, limit, pattern, failed_only) is already documented with an example in the schema. The description adds no additional semantics for these parameters beyond what is structured, so the baseline 3 applies.
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?
States a specific verb and resource ('list network requests made by the tab') plus the scope constraint ('since agent-in-browser attached') and the exact line format returned. It also explicitly names the sibling it is not for ('For script errors use console_messages'), so an agent can distinguish it from console_messages and get_text without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use cases (verify an API call fired, find 4xx/5xx, see what a page loads) and explicit exclusions (response bodies not included, use console_messages for script errors). It also names the prerequisite failure mode and the remedy: requests before attaching are missed, so navigate with action=reload first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyA
Send a real key press (or combination) to whatever element currently has focus: submit with Enter, close dialogs with Escape, move with Tab or the arrow keys, or use shortcuts such as Control+a, Control+c, Control+v. Focus first with click or type if needed. To enter text use type instead; to set form fields use fill_form. Returns the key and repeat count; page changes are not reported, so snapshot afterwards. An unrecognised key name returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| keys | Yes | One key or a '+'-joined combo, e.g. Enter, Escape, Tab, ArrowDown, PageDown, a, Control+a, Meta+Shift+k. Modifiers: Control, Shift, Alt, Meta. | |
| repeat | No | Times to press the key (default 1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that this sends a real key press to the focused element, that page changes are not reported and a snapshot should follow, that it returns the key and repeat count, and that an unrecognised key name returns an error. These are useful operational details for a non-read-only, open-world browser 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 action, then gives examples, focus guidance, alternative tools, return behavior, and error behavior in a compact sequence. Every sentence contributes useful selection or invocation information without 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?
There is no output schema, but the description covers return behavior (key and repeat count), side-effect visibility (page changes not reported; snapshot afterwards), error behavior, and the focus prerequisite. Combined with the fully documented schema and annotations, an agent has enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents keys, repeat, and tab. The description reinforces that keys can be combos and clarifies the focus context, but it does not add substantial parameter-level meaning beyond the schema, so the baseline 3 is appropriate.
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: "Send a real key press (or combination) to whatever element currently has focus." It gives concrete examples and explicitly distinguishes the tool from siblings type and fill_form, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool (Enter to submit, Escape to close dialogs, Tab/arrows to move, shortcuts like Control+a) and names alternatives for adjacent tasks: "To enter text use type instead; to set form fields use fill_form." It also explains the prerequisite to focus first with click or type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resizeA
Set the tab's viewport to a given size in CSS pixels, to test responsive layouts (e.g. 390x844 phone, 768x1024 tablet, 1440x900 desktop). It emulates the size inside the page and does not move or resize the browser window. Applies to this tab until the browser is closed or you resize again; reload may be needed for layouts that read the size on load. Returns the size set; width and height must be positive. Screenshots afterwards use the new size.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| width | Yes | Viewport width in CSS px, e.g. 390. | |
| height | Yes | Viewport height in CSS px, e.g. 844. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is not read-only and is open-world; the description supplies the substance β emulation happens inside the page rather than resizing the window, the size persists until browser close or the next resize, some layouts need a reload, and later screenshots use the new size. These are non-obvious stateful behaviors an agent could easily get wrong.
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?
Front-loaded with the action and purpose, then each subsequent clause adds a distinct operational fact (emulation scope, persistence, reload caveat, validation, screenshot impact). No redundant restatement of the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still says it returns the size set, and it covers validation, persistence, and downstream effects on screenshots. For a small three-parameter mutation tool, nothing an agent needs before calling 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 coverage is already 100% (tab defaults to current tab, width/height examples given), so baseline would be 3. The description adds a genuine constraint not in the schema: 'width and height must be positive,' which prevents an invalid invocation.
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?
States a specific verb and resource β set the tab's viewport to a given CSS-pixel size β and immediately scopes it with the use case (responsive layout testing) plus concrete examples. No sibling tool touches viewport sizing, so the boundary is unambiguous.
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 explicit: responsive layout testing with phone/tablet/desktop examples, and it clarifies this does not move or resize the browser window, steering the agent away from expecting OS-level behavior. It doesn't name alternatives, but none exist among the siblings for this capability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotARead-only
Read-only: capture the visible viewport of a tab as a PNG image returned to you (full-page capture is not supported: scroll and capture again). Use it to check visual layout, colours or images, since snapshot and get_text only describe structure and text. Pass path to also save the file, creating folders as needed; the result then includes the saved path. Size follows the viewport set by resize.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| path | No | File path to also save the PNG to, e.g. out/page.png (parent folders are created). Omit to only return the image. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint/openWorldHint, and the description adds real value: the image is returned inline, capture is viewport-limited (not full-page), size is determined by the viewport set through resize, and path triggers folder creation plus a saved path in the result. That folder-creating side effect is the one behavior worth flagging more loudly since it is a filesystem write, but it is at least disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight paragraph, front-loaded with the action, with no filler sentences. Dense nested parentheticals (the full-page caveat and the path clause) make it slightly less scannable than it could be split into bullets.
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-param capture tool with no output schema, the description covers what is returned (inline PNG), the limitation (viewport only), the reload/scroll workaround, the resize dependency, and the optional save result. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, including the 'Tab id from tabs_list, defaults to current tab' and the path/parent-folder semantics. The description restates the path behavior and default size source rather than adding new meaning, so baseline 3 is appropriate.
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?
States a concrete verb and resource ('capture the visible viewport of a tab as a PNG image') and immediately scopes it against siblings by saying snapshot and get_text only describe structure and text. An agent knows exactly what this returns and how it differs from the other read tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the selection condition explicitly: use this for visual layout, colours or images, because snapshot/get_text are text/structural. It also states the negative case (full-page capture unsupported; scroll and capture again) and the optional save flow, leaving no routing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollA
Scroll the page, or a scrollable container, by an amount in a direction; or scroll a given element (ref, selector or match) into the centre of the view. Returns the new scroll position and the maximum scroll, so you can tell when you reached the end. Use it for lazy-loaded or long pages; click and hover already scroll their target into view, so you rarely need it for those.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from the latest snapshot or find, e.g. "e12". Preferred: unambiguous and fastest; stale after navigation. | |
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| match | No | Visible text or accessible name to match (case-insensitive substring), e.g. "Sign up"; use when you have no ref. | |
| amount | No | Distance in CSS pixels (default 600). | |
| within | No | CSS selector of a scrollable container (e.g. a modal or list) to scroll instead of the window. | |
| selector | No | CSS selector; the first matching element is used. | |
| direction | No | Scroll direction (default down). Ignored when an element is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and openWorldHint=true; the description adds genuine behavioral context by disclosing the return payload (new scroll position and maximum scroll, so you can tell when you reached the end) and by clarifying that click/hover auto-scroll. It does not contradict the annotations. It stops just short of noting rate/lazy-load timing caveats, so a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, the two modes follow, and the closing sentence carries non-obvious routing advice. No sentence is filler and nothing important is buried.
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?
There is no output schema, but the description compensates by explaining what is returned (new scroll position and max scroll). For a 7-parameter, all-optional tool the coverage is strong; only minor edge cases (e.g. behavior when no scrollable area exists) are unaddressed.
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 100%, so every parameter (ref, tab, match, amount, within, selector, direction) is already fully documented, including the default amount of 600 and that direction is ignored when an element is given. The description groups these into two usage modes but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 ("Scroll") and clearly delineates its two distinct modes: scrolling by an amount in a direction, and scrolling a given element (ref, selector or match) into the centre of the view. This is far more precise than the bare tool name and lets an agent distinguish it from siblings like click or hover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to reach for it ("lazy-loaded or long pages") and when not to ("click and hover already scroll their target into view, so you rarely need it for those"). Naming the siblings whose behavior overlaps is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotARead-only
Read-only: return a compact text outline of the page: headings, landmarks and every visible interactive element (links, buttons, inputs, selects) with its role, accessible name, state and a ref such as [ref=e12]. It sees through shadow DOM and same-origin iframes. Use the refs with click, hover, type, fill_form and scroll. Call it first on any page, and again after navigation or large page changes, because refs go stale. Far cheaper than screenshot for understanding structure. mode=all also includes text blocks; use get_text to just read content.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| mode | No | interactive (default): headings and interactive elements only; all: also include text blocks. | |
| selector | No | CSS selector of a subtree to outline instead of the whole page, e.g. "form" or "#checkout". | |
| max_chars | No | Maximum characters of output (default 20000); narrow with selector for big pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, but the description adds substantial context beyond that: refs go stale, it sees through shadow DOM and same-origin iframes, output includes stale ref identifiers, and it is cheaper than screenshot. These are operational traits an agent needs and they are not in the annotations.
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?
Front-loads the read-only nature and what is returned, then moves to refs, usage timing, alternatives, and mode caveat. Every sentence contributes a distinct decision or behavioral fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description explains the output format (role, accessible name, state, [ref=e12]), coverage (shadow DOM, iframes), staleness, and mode differences. An agent has everything needed to call it correctly and interpret the result.
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 100%, so all four parameters are already documented. The description mentions mode=all including text blocks and implies selector-based narrowing, but largely repeats schema content. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
Uses a specific verb ('return a compact text outline') and names exactly what is included: headings, landmarks, interactive elements with role, name, state, and ref. It clearly differentiates itself from screenshot and get_text, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Call it first on any page, and again after navigation'), names the alternatives ('Far cheaper than screenshot', 'use get_text to just read content'), and explains the staleness condition that triggers re-invocation. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tab_closeA
Close one tab and discard its page state; the browser itself keeps running. Defaults to the current tab; pass tab to close another. Returns the id of the tab that is current afterwards. To shut down the whole browser use browser_close. Element refs from the closed tab are gone.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id from tabs_list. Defaults to the current tab. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true) by naming exactly what is destroyed β the tab's page state and any element refs from it β and by stating the post-condition that the browser keeps running. It also pre-announces the return value (the id of the tab that is current afterwards), which is important for an agent that must re-anchor after a destructive close.
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?
Three short sentences, front-loaded with the action and scope, then default/override, then the sibling escape hatch and the invalidation warning. No filler and nothing 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 one-optional-param mutation with no output schema, the description covers destruction, scope, default, alternative, and return value β nearly everything needed. The only gap is unspecified failure behavior when `tab` is unknown or already closed.
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 100% and the single parameter already documents its source ('Tab id from tabs_list') and its default, so the description only restates the default. Baseline 3 is appropriate since the schema carries the semantic load.
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?
States a specific verb and resource ('Close one tab') plus the scope boundary ('the browser itself keeps running'), which immediately separates it from browser_close and tab_new/tab_select. An agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the default behavior (closes the current tab), the override ('pass `tab` to close another'), and an explicit pointer to the alternative for a different intent ('To shut down the whole browser use browser_close'). The when-to-use and when-to-use-something-else conditions are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tab_newA
Open a new browser tab, optionally at a URL, and make it the current tab so later page tools act on it. Waits for the page to load when a URL is given. Returns the new tab id, title and URL; use that id with tab_select, tab_close or the tab argument of other tools. Use navigate instead to change the page of an existing tab.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to open; scheme defaults to https://. Omit for a blank tab. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: it blocks waiting for page load when a URL is given, and it mutates global state by making the new tab current so later page tools target it. That side effect and blocking behavior are not derivable from readOnlyHint=false/openWorldHint=true alone. Not a 5 only because there is no mention of failure modes (e.g., bad URL, load timeout).
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?
Three tight sentences, each doing distinct work: what it does, how it behaves and what it returns, and which sibling to use instead. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by naming the return values (tab id, title, URL) and explaining how to use the id downstream. For a one-parameter tab-creation tool this covers everything needed to call 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 coverage is 100% and the single parameter already documents the https:// default and the omit-for-blank-tab behavior. The description's 'optionally at a URL' merely restates that, so baseline 3 applies.
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?
States a specific verb and resource ('Open a new browser tab') plus the side effect that it becomes the current tab. It explicitly distinguishes itself from the sibling navigate, which handles changing pages of existing tabs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the alternative explicitly: 'Use navigate instead to change the page of an existing tab.' It also names the follow-on tools (tab_select, tab_close, `tab` argument) so the agent knows where this tool fits in a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tab_selectA
Switch to an existing tab: brings it to the front and makes it the default target of all page tools. Returns the tab's title and URL. Get ids from tabs_list or tab_new; an unknown id returns an error. Does not reload or change the page. To act on a tab once without switching, pass tab to that tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes | Tab id from tabs_list, e.g. as printed in its first column. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint=false / openWorldHint=true: it discloses the side effect (fronts the tab and changes the default target of all page tools), the non-effects ('Does not reload or change the page'), the return value (title and URL), and the error behavior for unknown ids. Nothing here contradicts the annotations β readOnlyHint=false is consistent with the client-side state change of switching the active target.
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?
Four short sentences, each carrying distinct information: effect, return value, id source/error, non-effects, and the alternative path. The core effect is front-loaded and the escape hatch ('pass `tab` to that tool instead') closes the definition without padding.
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 one-parameter, non-readonly tool with no output schema, the description covers effect, side effects, return values, id sourcing, error case, and the do-not-switch alternative. An agent can call this correctly without consulting anything else.
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 100% and the property description already explains the tab id, so the baseline is 3. The description earns the extra point by adding provenance (tabs_list or tab_new) and the invalid-id outcome, which are not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Switch to an existing tab') and immediately defines the mechanism and effect: brings it to the front and makes it the default target of all page tools. This clearly separates it from tab_new, tab_close, and tabs_list by naming the tab-lifecycle siblings in the id-sourcing sentence.
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?
Gives explicit when-to-use routing ('Get ids from tabs_list or tab_new') and an explicit alternative for the case where switching is unnecessary: 'To act on a tab once without switching, pass `tab` to that tool instead.' It also states the failure mode for an unknown id, so the agent knows what a bad call looks like.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_listARead-only
Read-only: list the open tabs of the connected browser, one per line as tab id, title and URL, where * marks the current tab (the default target of page tools). Use the ids with tab_select, tab_close or any tool's tab argument. Launches the browser if needed. For browser details as well use browser_status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description reinforces "Read-only" while adding genuinely new context: the line-based output format, the current-tab marker, the fact that it launches the browser if needed (a real side effect of an otherwise read-only call), and the cross-tool data contract. It stops just short of mentioning timing (e.g., waiting for the page to be ready) or what happens when no browser is installed.
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?
Three tight sentences, front-loaded with the read-only guarantee and the resource, then the output contract, then the cross-tool routing. Every clause carries information an agent would otherwise have to discover empirically.
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, no-output-schema list tool, everything an agent needs is present: what it returns, how to interpret the `*` marker, what to do with the ids, and what side effect to expect. 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?
The tool takes zero parameters, so the baseline is 4 and there is nothing the description could clarify beyond confirming the implicit scope of "connected browser." The schema is closed (additionalProperties: false), so no undocumented inputs exist.
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?
States a specific verb and resource ("list the open tabs of the connected browser") and goes further to specify the exact output shape: one tab per line as id, title, and URL, with `*` marking the current tab. That output contract lets an agent distinguish this from browser_status and snapshot without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: "Use the ids with tab_select, tab_close or any tool's `tab` argument" names the concrete consumers of this tool's output, and "For browser details as well use browser_status" names the sibling and when to prefer it. It even warns of the browser-launch side effect so the agent can anticipate state changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeA
Type text into an input, textarea or contenteditable using real keyboard input events. If an element is given (ref, selector or match) it is focused and, by default, cleared first; otherwise the text goes to the element that already has focus. submit=true presses Enter afterwards and, if that navigates, reports the new page. Returns the number of characters typed. To set several fields, selects or checkboxes in one call use fill_form; for non-text keys such as Tab or Escape use press_key.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Element ref from the latest snapshot or find, e.g. "e12". Preferred: unambiguous and fastest; stale after navigation. | |
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| text | Yes | Text to type, inserted as typed input. | |
| clear | No | Clear the field before typing (default true when an element is given; set false to append). | |
| match | No | Visible text or accessible name to match (case-insensitive substring), e.g. "Sign up"; use when you have no ref. | |
| submit | No | Press Enter after typing, e.g. to submit a search box (default false). | |
| selector | No | CSS selector; the first matching element is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond annotations: focusing the element, clearing by default first, submit=true pressing Enter and reporting the new page if navigation occurs, and returning the character count. It does not mention failure modes (e.g. what happens if no element matches the selector or the ref is stale) β the schema hints refs go stale, but the description doesn't address it.
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?
Front-loaded with the core action, then defaults, then return value, then sibling routing β a sensible order in a single tight paragraph. Slightly dense, but no sentence is waste.
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?
No output schema exists, and the description does state the return value (characters typed), so that gap is covered. For an open-world, mutating browser tool, more on error/no-match behavior would complete it, but everything needed to call it correctly is present.
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 100% so the baseline is 3; the description earns above baseline by stating the default clear-on-focus/append semantics, the ref-vs-selector-vs-match precedence, and the submit behavior. It does not add format details for text or tab beyond what the schema already carries.
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?
States a specific verb and target (type text into input/textarea/contenteditable) and immediately distinguishes the mechanism (real keyboard input events) from a value-setting operation. The named alternatives (fill_form, press_key) make its scope unambiguous relative to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to fill_form for multiple fields/selects/checkboxes and to press_key for non-text keys like Tab or Escape, and explains the no-element case (types into the focused element). An agent can pick the right tool without opening other schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_forARead-only
Read-only: pause until a condition holds, polling every 200 ms: given text appears in the page, a CSS selector becomes visible, or the URL contains a substring; gone=true waits for the opposite. Returns how long it waited, or an error on timeout. Use it after clicks that load content asynchronously instead of guessing delays. With only ms it just sleeps (up to 60000). Give exactly one of text, selector or url.
| Name | Required | Description | Default |
|---|---|---|---|
| ms | No | Plain sleep in milliseconds (max 60000); only used when no text, selector or url is given. | |
| tab | No | Tab id from tabs_list. Defaults to the current tab. | |
| url | No | Substring the tab URL should contain. | |
| gone | No | Wait for the condition to become false instead, e.g. for a spinner to disappear. | |
| text | No | Text that should appear somewhere in the page body. | |
| selector | No | CSS selector of an element that should become visible. | |
| timeout_ms | No | Give up and return an error after this many milliseconds (default 10000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description adds the facts an agent actually needs: 200 ms polling cadence, timeout returns an error, the call returns elapsed wait time, and the ms-sleep cap of 60000. It also states the gone=true inversion covers disappearance cases like spinners.
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?
Front-loaded with the read-only/safety tag and the core polling behavior; nearly every clause carries new information (poll interval, timeout error, return value, exclusive params). The opening sentence packs three semicolon-separated clauses, which costs a little readability against a tool this simple.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly covers the return value and the failure mode. Combined with 100% schema parameter coverage and the stated exclusivity rule, an agent can call this correctly without further guessing.
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 100%, so the baseline is 3; the description goes beyond it by stating the mutual-exclusivity constraint ('exactly one of text, selector or url') and the asymmetric behavior when only ms is supplied β neither of which the schema encodes. It does not, however, restate the default timeout of 10 s or the tab parameter, leaving those to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a concrete action (pause/poll until a condition holds) and enumerates the three condition types plus the plain-sleep mode, which no sibling tool offers. The distinction from navigate/click/scroll is implicit but unmistakable given the polling semantics and the explicit 'instead of guessing delays' framing.
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?
Explicitly tells the agent when to reach for it ('after clicks that load content asynchronously instead of guessing delays'), and gives the selection rule among its own modes ('give exactly one of text, selector or url' vs. ms-only sleep). No competing sibling exists for this job, so no alternative tool needed to be named.
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.
18 tool updates
v0.1.2- Changed
click6 fields changed- changed
Input schema / properties / double / descriptionPrevious value: -"Double-click."New value: +"Double-click instead of a single click (default false)." - changed
Input schema / properties / match / descriptionPrevious value: -"Visible text / accessible name to match (case-insensitive substring)."New value: +"Visible text or accessible name to match (case-insensitive substring), e.g. \"Sign up\"; use when you have no ref." - changed
Input schema / properties / ref / descriptionPrevious value: -"Element ref from snapshot/find, e.g. \"e12\". Preferred."New value: +"Element ref from the latest snapshot or find, e.g. \"e12\". Preferred: unambiguous and fastest; stale after navigation." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector (first match)."New value: +"CSS selector; the first matching element is used." - changed
Input schema / properties / x / descriptionPrevious value: -"Viewport x coordinate (instead of an element)."New value: +"Viewport x coordinate in CSS px, used instead of an element." - changed
Input schema / properties / y / descriptionPrevious value: -"Viewport y coordinate."New value: +"Viewport y coordinate in CSS px."
- Changed
console_messages4 fields changed- changed
Input schema / properties / clear / descriptionPrevious value: -"Clear the buffer after reading."New value: +"Empty the console buffer after reading so the next call only shows new messages." - changed
Input schema / properties / level / descriptionPrevious value: -"Only this level (error includes uncaught exceptions)."New value: +"Only entries of this level (error also includes uncaught exceptions)." - changed
Input schema / properties / limit / descriptionPrevious value: -"Last N entries (default 100)."New value: +"Return only the last N matching entries (default 100)." - changed
Input schema / properties / pattern / descriptionPrevious value: -"Regex the text must match."New value: +"Regular expression the message text must match."
- Changed
evaluate1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"JavaScript expression or function body."New value: +"JavaScript: a single expression, or a function body that uses `return`, e.g. \"return [...document.links].length\"."
- Changed
fill_form5 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Fields to set."New value: +"Fields to set, in order. Each needs a target (ref, selector or match) and a value." - changed
Input schema / properties / fields / items / properties / match / descriptionPrevious value: -"Visible text / accessible name to match (case-insensitive substring)."New value: +"Visible text or accessible name to match (case-insensitive substring), e.g. \"Sign up\"; use when you have no ref." - changed
Input schema / properties / fields / items / properties / ref / descriptionPrevious value: -"Element ref from snapshot/find, e.g. \"e12\". Preferred."New value: +"Element ref from the latest snapshot or find, e.g. \"e12\". Preferred: unambiguous and fastest; stale after navigation." - changed
Input schema / properties / fields / items / properties / selector / descriptionPrevious value: -"CSS selector (first match)."New value: +"CSS selector; the first matching element is used." - changed
Input schema / properties / fields / items / properties / value / descriptionPrevious value: -"Value: string, number or boolean."New value: +"Value to set: a string or number for inputs and selects, true/false for checkboxes and radios."
- Changed
find2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 20)."New value: +"Maximum number of matches to return (default 20)." - changed
Input schema / properties / query / descriptionPrevious value: -"Text to look for."New value: +"Text to look for in element text, label, placeholder, id or name (case-insensitive substring)."
- Changed
get_text2 fields changed- changed
Input schema / properties / max_chars / descriptionPrevious value: -"Max characters (default 30000)."New value: +"Maximum characters to return (default 30000)." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector to read (default body)."New value: +"CSS selector of the region to read (default: the whole body)."
- Changed
hover5 fields changed- changed
Input schema / properties / match / descriptionPrevious value: -"Visible text / accessible name to match (case-insensitive substring)."New value: +"Visible text or accessible name to match (case-insensitive substring), e.g. \"Sign up\"; use when you have no ref." - changed
Input schema / properties / ref / descriptionPrevious value: -"Element ref from snapshot/find, e.g. \"e12\". Preferred."New value: +"Element ref from the latest snapshot or find, e.g. \"e12\". Preferred: unambiguous and fastest; stale after navigation." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector (first match)."New value: +"CSS selector; the first matching element is used." - changed
Input schema / properties / x / descriptionPrevious value: -"Viewport x."New value: +"Viewport x in CSS px, used instead of an element." - changed
Input schema / properties / y / descriptionPrevious value: -"Viewport y."New value: +"Viewport y in CSS px."
- Changed
navigate3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"History action instead of url."New value: +"History action to run instead of loading a url." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Load timeout (default 30000)."New value: +"How long to wait for the page to finish loading, in milliseconds (default 30000)." - changed
Input schema / properties / url / descriptionPrevious value: -"Destination URL; scheme defaults to https://"New value: +"Destination URL; scheme defaults to https://, file:// and about: URLs are accepted."
- Changed
network_requests4 fields changed- changed
Input schema / properties / clear / descriptionPrevious value: -"Clear the buffer after reading."New value: +"Empty the request buffer after reading so the next call only shows new requests." - changed
Input schema / properties / failed_only / descriptionPrevious value: -"Only failed requests and HTTP status >= 400."New value: +"Only network failures and responses with HTTP status 400 or above." - changed
Input schema / properties / limit / descriptionPrevious value: -"Last N entries (default 100)."New value: +"Return only the last N matching requests (default 100)." - changed
Input schema / properties / pattern / descriptionPrevious value: -"Regex the URL must match."New value: +"Regular expression the request URL must match, e.g. \"/api/\"."
- Changed
press_key2 fields changed- changed
Input schema / properties / keys / descriptionPrevious value: -"Key or combo; modifiers: Control, Shift, Alt, Meta."New value: +"One key or a '+'-joined combo, e.g. Enter, Escape, Tab, ArrowDown, PageDown, a, Control+a, Meta+Shift+k. Modifiers: Control, Shift, Alt, Meta." - changed
Input schema / properties / repeat / descriptionPrevious value: -"Times to press (default 1)."New value: +"Times to press the key (default 1)."
- Changed
resize2 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"Height in CSS px."New value: +"Viewport height in CSS px, e.g. 844." - changed
Input schema / properties / width / descriptionPrevious value: -"Width in CSS px."New value: +"Viewport width in CSS px, e.g. 390."
- Changed
screenshot1 field changed- changed
Input schema / properties / path / descriptionPrevious value: -"File path to save the PNG to."New value: +"File path to also save the PNG to, e.g. out/page.png (parent folders are created). Omit to only return the image."
- Changed
scroll6 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"Pixels (default 600)."New value: +"Distance in CSS pixels (default 600)." - changed
Input schema / properties / direction / descriptionPrevious value: -"Direction (default down)."New value: +"Scroll direction (default down). Ignored when an element is given." - changed
Input schema / properties / match / descriptionPrevious value: -"Visible text / accessible name to match (case-insensitive substring)."New value: +"Visible text or accessible name to match (case-insensitive substring), e.g. \"Sign up\"; use when you have no ref." - changed
Input schema / properties / ref / descriptionPrevious value: -"Element ref from snapshot/find, e.g. \"e12\". Preferred."New value: +"Element ref from the latest snapshot or find, e.g. \"e12\". Preferred: unambiguous and fastest; stale after navigation." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector (first match)."New value: +"CSS selector; the first matching element is used." - changed
Input schema / properties / within / descriptionPrevious value: -"CSS selector of a scroll container instead of the window."New value: +"CSS selector of a scrollable container (e.g. a modal or list) to scroll instead of the window."
- Changed
snapshot3 fields changed- changed
Input schema / properties / max_chars / descriptionPrevious value: -"Output budget (default 20000)."New value: +"Maximum characters of output (default 20000); narrow with selector for big pages." - changed
Input schema / properties / mode / descriptionPrevious value: -"interactive (default) or all (adds text blocks)."New value: +"interactive (default): headings and interactive elements only; all: also include text blocks." - changed
Input schema / properties / selector / descriptionPrevious value: -"Limit the snapshot to the subtree matching this CSS selector."New value: +"CSS selector of a subtree to outline instead of the whole page, e.g. \"form\" or \"#checkout\"."
- Changed
tab_new1 field changed- changed
Input schema / properties / url / descriptionPrevious value: -"URL to open; scheme defaults to https://"New value: +"URL to open; scheme defaults to https://. Omit for a blank tab."
- Changed
tab_select1 field changed- changed
Input schema / properties / tab / descriptionPrevious value: -"Tab id from tabs_list."New value: +"Tab id from tabs_list, e.g. as printed in its first column."
- Changed
type6 fields changed- changed
Input schema / properties / clear / descriptionPrevious value: -"Clear the field first (default true when an element is given)."New value: +"Clear the field before typing (default true when an element is given; set false to append)." - changed
Input schema / properties / match / descriptionPrevious value: -"Visible text / accessible name to match (case-insensitive substring)."New value: +"Visible text or accessible name to match (case-insensitive substring), e.g. \"Sign up\"; use when you have no ref." - changed
Input schema / properties / ref / descriptionPrevious value: -"Element ref from snapshot/find, e.g. \"e12\". Preferred."New value: +"Element ref from the latest snapshot or find, e.g. \"e12\". Preferred: unambiguous and fastest; stale after navigation." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector (first match)."New value: +"CSS selector; the first matching element is used." - changed
Input schema / properties / submit / descriptionPrevious value: -"Press Enter after typing."New value: +"Press Enter after typing, e.g. to submit a search box (default false)." - changed
Input schema / properties / text / descriptionPrevious value: -"Text to type."New value: +"Text to type, inserted as typed input."
- Changed
wait_for6 fields changed- changed
Input schema / properties / gone / descriptionPrevious value: -"Wait for the condition to become false instead."New value: +"Wait for the condition to become false instead, e.g. for a spinner to disappear." - changed
Input schema / properties / ms / descriptionPrevious value: -"Plain sleep in milliseconds (max 60000)."New value: +"Plain sleep in milliseconds (max 60000); only used when no text, selector or url is given." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector that should be visible."New value: +"CSS selector of an element that should become visible." - changed
Input schema / properties / text / descriptionPrevious value: -"Text that should appear in the page."New value: +"Text that should appear somewhere in the page body." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Timeout (default 10000)."New value: +"Give up and return an error after this many milliseconds (default 10000)." - changed
Input schema / properties / url / descriptionPrevious value: -"Substring the URL should contain."New value: +"Substring the tab URL should contain."
23 tool updates
v0.1.1- First observed
browser_close - First observed
browser_status - First observed
browsers_installed - First observed
click - First observed
console_messages - First observed
evaluate - First observed
fill_form - First observed
find - First observed
get_text - First observed
hover - First observed
navigate - First observed
network_requests - First observed
press_key - First observed
resize - First observed
screenshot - First observed
scroll - First observed
snapshot - First observed
tab_close - First observed
tab_new - First observed
tab_select - First observed
tabs_list - First observed
type - First observed
wait_for
TDQS
Scored across 23 tools
Tools split cleanly along interaction vs. inspection lines, and descriptions actively cross-reference each other (get_text vs snapshot vs screenshot, click vs hover, type vs fill_form vs press_key, browser_status vs tabs_list vs browsers_installed). The only soft spot is the read-inspection cluster (snapshot, find, get_text, evaluate), which could occasionally be confused, but each is scoped to a different need.
Everything is snake_case, which is good, but the ordering pattern mixes verb-first (get_text, fill_form, press_key, wait_for) with noun-first (browser_close, tabs_list, tab_new, console_messages, network_requests). Prefixes also drift between singular `tab_*` and plural `tabs_*`, and `browser_*` vs `browsers_*`, making the scheme only loosely predictable.
23 tools is heavy for the stated scope and pushes into the crowded band; a browser agent genuinely needs much of this surface, but some tools (browsers_installed, resize, scroll, find) are arguably niche relative to core navigate/snapshot/click/type. It is defensible but not tightly scoped.
Coverage is broad: navigation and history, tab lifecycle, trusted input, form filling, keyboard, scrolling, screenshots, viewport emulation, console/network diagnostics, JS evaluation and waiting. Gaps exist around file upload/download, dialog handling, cross-origin iframe targeting and full-page capture, but most are workable via evaluate or press_key.
Maintenance
Related MCP Connectors
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI to control a real browser through MCP tools for clicking, typing, navigation, screenshots, and more. It supports a follow mode that tracks the active tab, plus fixed mode for controlling specific tabs.8 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control a real browser via MCP tools for web navigation, interaction, page inspection, tabs, forms, files, sessions, and browser automation.MIT
- AlicenseBqualityBmaintenanceEnables AI agents to perform low-latency web automation with a persistent headed Chrome/Chromium instance, including navigation, DOM interaction, content extraction, screenshots, tab management, and batch/code execution via 18 MCP tools.20MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents and human operators to launch and drive isolated, persistent browser profiles β each with its own cookies, fingerprint, and proxy β from any MCP client. Exposes tools for navigating, clicking, typing, extracting content, taking screenshots, evaluating JavaScript, managing tabs and cookies, and waiting on page events.MIT