invisible-playwright-mcp
Run a stealth, anti-bot-resistant Firefox browser as an MCP server and control it with browser automation tools.
Navigate to URLs and read page content as visible text, cleaned HTML, or a snapshot of visible interactive elements with reliable selectors or coordinates.
Interact with pages: click by selector, click at viewport coordinates with optional hold, type into fields, press keys, and evaluate JavaScript.
Take screenshots of the active tab.
Manage tabs: open a new page, list open pages, switch the active page, and close pages.
Configure a proxy, deterministic fingerprint seed, persistent profile, headless/headed mode, and HTTP transport so multiple clients can attach to the same browser.
Serve a live view and a lightweight chat shell over HTTP for watching and driving the same browser session.
Provides browser automation through a stealth-patched Firefox engine, enabling navigation, clicking, typing, reading page content, and taking screenshots on real websites.
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., "@invisible-playwright-mcpGo to news.ycombinator.com and return the top 3 stories"
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.
invisible-playwright-mcp
A stealth Firefox as an MCP server. Add it to Claude Code, Claude Desktop, Codex, Cursor or any other MCP client, and your assistant gets a real browser: tabs, navigation, reading, clicking, typing, dropdowns, keys, screenshots, a live view of the window, and a JavaScript reader, on a Firefox whose fingerprint is set inside the engine rather than bolted onto the page.
The engine is invisible-playwright,
a Firefox patched at the C++ source. This package is the MCP layer over it:
every tool below is a thin wrapper, and there is no interface here. The
interface, when you want one, is AIHawk.
How to install this, and the two ways to use it, are in AIHawk's README. This page keeps what the server itself owns: the config block for clients that take a file, the settings, and the tools.
Adding it to your client
Claude Code, Codex and Gemini CLI have a command for it, and the command is in
AIHawk's README. The rest take a config file, and the file is not the same
everywhere: three different top-level keys, and one of them is not even
JSON. Find yours below. The block only tells the client how to start the
server; installing uv and fetching the engine come first, as AIHawk's README
shows.
If your client takes a config file
Most use a top-level mcpServers - Claude Desktop, Cursor, Windsurf, Cline:
{
"mcpServers": {
"stealth": {
"command": "uvx",
"args": ["invisible-playwright-mcp"]
}
}
}Client | File |
Claude Desktop (macOS) |
|
Claude Desktop (Windows) |
|
Cursor |
|
Windsurf |
|
Cline |
|
Zed calls the key context_servers, not mcpServers, in
~/.config/zed/settings.json (%APPDATA%\Zed\settings.json on Windows):
{
"context_servers": {
"stealth": {
"command": "uvx",
"args": ["invisible-playwright-mcp"]
}
}
}VS Code calls it servers, in .vscode/mcp.json for a workspace:
{
"servers": {
"stealth": {
"type": "stdio",
"command": "uvx",
"args": ["invisible-playwright-mcp"]
}
}
}Codex uses TOML, in ~/.codex/config.toml:
[mcp_servers.stealth]
command = "uvx"
args = ["invisible-playwright-mcp"]Continue uses YAML with its own block format, which changed recently enough that we would rather point you at their documentation than print a block here that may already be stale.
Where a proxy and the other settings go
Everything in Settings below goes under env on the server entry, in
whatever shape your client uses:
{
"mcpServers": {
"stealth": {
"command": "uvx",
"args": ["invisible-playwright-mcp"],
"env": {
"STEALTHFOX_PROXY": "http://user:pass@proxy.example.com:8080",
"STEALTHFOX_SEED": "4242"
}
}
}
}In Codex's TOML that is a [mcp_servers.stealth.env] table; on the command line,
Claude Code and Codex take -e KEY=value and --env KEY=value.
⛔ "Added" is not "connected". Every one of these writes a config entry
without running anything, so a typo, a missing uv, or the first-run browser
download all surface later as a server that will not start. Check before you
trust it: claude mcp list, codex mcp list, or your client's MCP panel.
Related MCP server: Local Browser MCP
Settings
Environment variables, all optional. A proxy is the one worth adding: without it the exit IP, timezone and locale are your own machine's, which is a real gap between what the browser says it is and where it appears to be.
Variable | Meaning |
| Proxy URL, e.g. |
|
|
| Integer seed for a deterministic fingerprint (same seed, same identity). A profile's own seed wins over this one. |
| A directory for a persistent profile, so logins survive across runs. |
| Path to an engine binary you already have. It must be the build the packaged seal pins, or startup refuses. |
|
|
|
|
| Bind address for the HTTP transport. Default |
| Port for the HTTP transport. Default |
Anything a tool call says wins over these. session_start can pick another
seed, another exit or another profile for one session; the variables are what a
session gets when nobody says anything.
Tools
session_status, session_start, session_new_page, session_list_pages,
session_select_page, session_close_page, browser_navigate,
browser_read_text, browser_snapshot, browser_read_html,
browser_take_screenshot, browser_watch, browser_click, browser_click_at,
browser_type, browser_select_option, browser_press_key, browser_evaluate.
Tool names mirror the Microsoft Playwright MCP, so prompts written for it work here too. Three groups: who is browsing and which tab, reading the page, and acting on it.
Session and tabs
Tool | Arguments | What it does |
| none | Who is browsing right now: the seed, the exit, the profile and the open tabs. Starts nothing; if no browser is up it says so. |
|
| Close whatever is open and start a browser as a particular person. Returns a sentence describing the session it actually started. |
| none | Open a tab, make it the active one, return its id. |
| none | Every open tab: id, title, url, and which one is active. |
|
| Make a tab the active one. Every |
|
| Close a tab, or the active one when the id is left out. |
You can ignore session_start entirely: the first tool that needs a page starts
a session on its own, as a different stranger every time, which is the right
default. There is one browser, so two identities are visited in turn, never at
once; a task that needs two accounts live at the same time cannot be done here.
seedis the identity. Same seed, same fingerprint, every time. Leave it out and one is drawn; the answer says which, so a session worth repeating can be repeated.profileis a directory that keeps cookies and logins between sessions. A profile also owns its seed: the first session on a new one stores the identity inside it and every later session reuses it, so a login never comes back wearing different hardware. Ask for a seed that contradicts the one a profile carries and you get a refusal naming both numbers, never a silent choice. A relative path is resolved against the server's own directory, and the answer reports the full path it used.proxyis where the traffic leaves,http://user:pass@host:portorsocks5://host:port. Timezone, locale and geography follow it.Pass
""forprofileorproxyto insist on none, even when the environment sets a default. That is how you get sessions a site cannot link to each other.
A profile does not own its exit the way it owns its seed. The same login arriving from another country is as visible as one arriving on different hardware. You are warned when a profile's exit changes, but only when you change it: a provider rotating its own addresses behind one host and port is indistinguishable from here.
A session_start that fails, usually because the proxy is down, leaves nothing
running, and every later tool repeats the refusal until a session_start works.
It does not quietly start a browser without the exit that was asked for.
Reading the page
Tool | Arguments | What it returns |
|
| Goes to the url in the active tab, opening one if none exists. |
|
| The visible text of an element, markup gone. The cheapest way to read a page. Long text is cut at |
|
| Title, url, and the interactive elements that are actually visible, each with a |
|
| The page's HTML reduced to what is worth reading: |
| none | A screenshot of the active tab, as an image. |
| none | The whole browser window as a person at the machine sees it: tab strip, address bar, page and the pointer, from a live capture the session keeps running on the active tab. |
The selectors a snapshot hands out are built to match exactly one element, and that is the reason to pass them verbatim rather than writing your own: measured across 958 elements on real pages, 88% could be addressed by a selector but only 48% unambiguously, and Playwright acts on the first match, so a caller aiming at the third of five identical links would silently hit the first.
browser_watch is for the person watching, not for the model acting. The
pointer is drawn in the browser chrome on purpose, so that no page can see it,
which is also why no page screenshot can ever contain it. The picture is window
pixels: feed browser_take_screenshot to browser_click_at, not this. It needs
an engine from firefox-28 on; an older engine answers with a sentence saying
so.
Acting on the page
Tool | Arguments | What it does |
|
| Clicks the first element matching a CSS selector, scrolling it into view and waiting for it to be clickable. The pointer approaches, hovers, presses and releases, the way a hand does. |
|
| Clicks a viewport coordinate instead of a selector: moves the pointer there, presses, holds if asked, releases, and returns a screenshot taken right after. For a slider track, a canvas-drawn challenge, a precise point inside a wider element. |
|
| Fills a field, replacing whatever it holds. It sets the value rather than typing key by key, so per-keystroke handlers such as an autocomplete do not fire; for those, click the field and use |
|
| Chooses an option in a |
|
| Presses a key on whatever has focus: |
|
| Runs JavaScript to read from the page and returns the result as JSON: a computed style, a value held in a framework's state, the length of a list. |
browser_click_at takes coordinates relative to the viewport, not to the
page, so the ones in a snapshot go stale the moment anything scrolls: a click, a
keypress, a lazy image loading above the fold. Nothing raises when that happens;
the click lands on whatever is at that spot now. Take a fresh snapshot after
anything that could have moved the page, and prefer browser_click with an
element's selector whenever it has one.
browser_evaluate reads; it will not act. Assigning to value, checked or
selected, or calling click(), dispatchEvent(), submit() or
requestSubmit(), is refused, and the refusal names the tool to use instead.
Script reaches the page with no keystroke and no pointer, so the event carries
isTrusted false, which is the clearest signal a page can collect that nobody
is really there. Reading those properties is fine. The refusal catches the
obvious spellings, not every possible one; a script that slips past it is still
the wrong way to do the thing.
The order to try them in
The server hands every client this ladder, because a model that cannot find a way down it invents one:
A named tool with a selector:
browser_click,browser_type,browser_select_option,browser_press_key.browser_snapshotsupplies the selector.Coordinates: the snapshot reports
at: [x, y]for every element, andbrowser_click_atmoves the pointer there. For a canvas, a slider, a map, a widget built out of divs.A screenshot:
browser_take_screenshot, thenbrowser_click_aton what you can see. For what the snapshot does not list at all.browser_evaluate, to read what none of the above can see.
Getting to the bottom of the ladder without a way to do the thing is a result too: a task reported as impossible is worth more than one completed in a way that gets the session blocked.
Why each tool returns what it does, with the measurements behind it: docs/tool-design.md.
More than one client on the same browser
Over stdio the browser belongs to the client that opened it. Set
STEALTHFOX_MCP_TRANSPORT=http and it does not: the session is owned by the
server, so a second client can attach to the browser the first one left open,
and closing a client no longer kills the browser.
STEALTHFOX_MCP_TRANSPORT=http uvx invisible-playwright-mcp # Linux$env:STEALTHFOX_MCP_TRANSPORT = "http"; uvx invisible-playwright-mcp # WindowsTo SEE the browser rather than share it, AIHawk shows the live page beside the conversation.
Notes
This is a browser, not a captcha solver. It does not solve or bypass challenges for you; it makes an ordinary Firefox session look like a real one.
One browser per server process. Tabs are the way to keep several pages open; two identities at once need two servers.
License
MIT, the same as the engine it wraps.
Available Tools
18 toolsbrowser_clickA
Click the first element matching a CSS selector.
Scrolls it into view and waits for it to be clickable. When no selector can describe the target, use browser_click_at with coordinates from browser_snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that the tool scrolls the element into view and waits for it to be clickable, which goes beyond the bare action of clicking. It does not mention failure behavior on timeout or missing elements, but the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The primary action and key behavioral details are front-loaded, and the fallback guidance is placed second without undermining the main purpose.
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 one-parameter tool, the description is complete: it explains what happens (scroll, wait, click), how the target is identified, and what to do when this tool is not appropriate. The presence of an output schema covers return-value details, so no further explanation is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does by clarifying that the selector is a CSS selector and that the click targets the first matching element. This adds meaningful context to the otherwise bare 'selector' property, though an example or further selector syntax detail would be even more helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (Click) and resource (first element matching a CSS selector). It also distinguishes itself from the sibling tool browser_click_at by contrasting selector-based clicking with coordinate-based clicking, making the tool's purpose immediately 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?
The description explicitly says when to use this tool versus browser_click_at: use browser_click_at when no selector can describe the target, using coordinates from browser_snapshot. This provides clear decision guidance and a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_click_atA
Click (or press-and-hold) a raw viewport coordinate instead of a selector - for targets a selector cannot reliably reach: a slider track, a canvas-drawn captcha, or a precise point inside a wider element. Moves the pointer there first (no teleport), then down, then up, holding first if hold_seconds is set. Returns a screenshot taken right after release.
hold_seconds needs invisible-playwright 0.9.0 or newer to mean anything. In every earlier version the wait it is built on returned instantly, so the press and the release happened in the same frame and the hold never happened - on the one tool that exists for sliders and press-and-hold challenges. The floor in pyproject.toml is set accordingly.
Coordinates are relative to the VIEWPORT, not to the page, so the ones in a
snapshot go stale the moment anything scrolls: a click, a keypress, a lazy
image loading in above the fold. Nothing raises when that happens - the
click simply lands on whatever is at that spot now. Take a fresh snapshot
after anything that could have moved the page, and prefer browser_click with
the element's selector whenever it has one.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| hold_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and over-delivers: pointer event ordering ('Moves the pointer there first (no teleport), then down, then up'), the return value (screenshot after release), a documented silent-failure version caveat for hold_seconds, viewport-relative coordinate semantics, the no-raise stale-coordinate behavior, and a concrete mitigation (take a fresh snapshot).
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 paragraphs, but high information density: the first front-loads purpose, use cases, mechanics, and return value; the third covers the staleness trap and routing. The only somewhat expendable line is the 'floor in pyproject.toml is set accordingly' remark in the version caveat, which reassures rather than instructs; otherwise every sentence earns its place.
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?
Complete for a 3-parameter click tool with several genuine traps. It covers the event sequence, the return value (stated, so no output schema is needed), the version trap, the coordinate-system trap, the silent failure mode, and the mitigation. Nothing an agent needs to invoke this 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 0% — the schema offers only bare titles ('X', 'Y', 'Hold Seconds') — so the description must compensate, and it does fully. It defines the coordinate reference frame (viewport, not page), what staleness does to a coordinate, and hold_seconds' real semantics plus its version dependency. Both parameters are materially clarified beyond 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 — 'Click (or press-and-hold) a raw viewport coordinate instead of a selector' — and gives concrete target examples (slider track, canvas-drawn captcha, precise point inside a wider element). It is explicitly framed against the sibling browser_click ('instead of a selector'), so there is no ambiguity about what it does or when it applies.
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 sets the selection condition — 'for targets a selector cannot reliably reach' — and closes with a direct routing instruction: 'prefer browser_click with the element's `selector` whenever it has one.' This is exactly the when-to-use vs alternative guidance the rubric asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateA
READ from the page with JavaScript and get the result as JSON.
For what the other tools cannot see: a computed style, a value held in a framework's state, the length of a list.
Acting on the page is refused, and the refusal names the tool to use.
Assigning to value, checked or selected, or calling click(),
dispatchEvent(), submit() or requestSubmit(), changes the page without
a real keystroke or pointer, and a page can tell. Use browser_click,
browser_type or browser_select_option instead; they do the same thing
through the pointer and the keyboard. Reading any of those properties is
fine.
The refusal catches the obvious spellings, not every possible one. A script that slips past it is still the wrong way to do the thing: report it in your answer rather than using it.
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well. It states that acting on the page is refused, that the refusal names the correct tool, and that attempts to bypass the guard are the wrong approach and should be reported rather than used. This gives the agent an accurate model of the tool's safety boundary.
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 capability, then gives concrete examples, then explains the read-only boundary and alternatives. Each paragraph earns its place, and the structure moves from what the tool does to when not to use it to the correct fallback behavior.
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 read-only evaluate tool, the description covers purpose, use cases, restrictions, alternatives, and expected output format. The presence of an output schema covers the return value details, so nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only says 'Expression' with no description, so the description must compensate. It explains that the expression is JavaScript and that its result is returned as JSON, and gives example targets. It does not spell out the exact expected syntax or return serialization rules, but for a single self-named parameter the provided context is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'READ from the page with JavaScript and get the result as JSON.' It also gives concrete use cases (computed style, framework state, list length) that are not covered by sibling tools, clearly distinguishing browser_evaluate from browser_read_text and browser_snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when browser_evaluate is the right tool ('For what the other tools cannot see') and when it is not: mutations, clicks, typing, and selection changes. It names browser_click, browser_type, and browser_select_option as the alternatives, giving the agent direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyA
Press a key on whatever has focus: "Enter", "Tab", "Escape", "ArrowDown", "Control+a", or a single character.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that the key press targets the focused element, which is important context. However, it does not mention potential side effects like form submission, navigation, or focus changes caused by keys such as Enter or Tab, nor what happens if nothing is focused.
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 a single, front-loaded sentence with an inline list of key examples. Every part is useful, and the structure makes the accepted values immediately visible without unnecessary prose.
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 input tool, the description is largely complete: it conveys the target, the key format, and common examples. An output schema is indicated, so return-value details are not required here. A little more detail about modifier formatting or unfocused-element behavior would make it fully comprehensive, but it is adequate for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a bare 'key' string with zero description coverage. The description adds essential meaning by listing accepted key forms, including named keys, navigation keys, modifier chords, and single characters, which gives the agent a concrete understanding of what to pass.
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 uses a specific verb ('Press') with a clear resource ('a key on whatever has focus') and gives concrete examples such as 'Enter', 'Tab', 'Escape', and 'Control+a'. This clearly differentiates it from sibling tools like browser_type, browser_click, and browser_navigate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool should be used: when a keyboard key or shortcut needs to be sent to the currently focused element. However, it does not explicitly contrast it with browser_type for text input, nor does it state when not to use it, leaving the decision partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_read_htmlA
The page's HTML, cleaned down to what is worth reading.
Use this when the STRUCTURE matters - a form and its labels, a table, what
a control is wired to. browser_snapshot gives a flat inventory of things
to click; this keeps the markup and the relationships inside it.
mode="form" keeps the interactive surface and the text explaining it, mode="text" returns the prose alone, mode="full" keeps the structure with the noise and the attribute soup removed.
Unlike browser_read_text this is NOT capped: it returns the whole reduced page, which on a large one is tens of thousands of characters. That is deliberate, because cutting markup in the middle leaves tags that no longer mean anything - but it means the answer can be long. Reach for browser_snapshot when you only need something to click, or browser_read_text when you only need the words.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | form |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavioral traits: it is uncapped and can return tens of thousands of characters, it returns the whole reduced page, and it explains why (cutting markup would break tags). It also details how each mode alters the output. This goes beyond what annotations would typically cover and fully informs the agent of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: it starts with the core purpose, then usage context, then mode details, then size caveat, and ends with alternatives. Every sentence serves a distinct informative purpose, and there is no redundancy. It is appropriately sized given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all essential aspects for correct usage: purpose, when to use, mode semantics, output size expectations, and explicit routing to alternatives. Given that an output schema exists, the description does not need to explain return values, so it is complete for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the 'mode' parameter (0% coverage), so the description must compensate. It does so thoroughly by explaining each mode: 'form' keeps interactive surface, 'text' returns prose alone, 'full' keeps structure with noise removed. This adds rich semantic meaning beyond the bare schema, making the parameter fully understandable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: returns the page's HTML cleaned down to readable content, and explicitly differentiates it from siblings by contrasting with browser_snapshot (flat inventory) and browser_read_text (capped text). The verb 'read' and resource 'HTML' are specific, and the purpose 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?
It explicitly instructs when to use this tool: 'Use this when the STRUCTURE matters' and gives concrete examples. It also provides exclusion guidance by naming alternatives and the conditions for choosing them: 'Reach for browser_snapshot when you only need something to click, or browser_read_text when you only need the words.' This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_read_textA
The visible text of an element, with the markup gone.
The cheapest way to read a page. Narrow the selector when you know where the answer is; use browser_read_html instead when the structure matters, or browser_snapshot when you need something to click.
Long text is cut at max_chars (6000 by default) and the cut is marked in what comes back, so text that ends without that marker is the whole thing.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | No | body | |
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden, and it delivers: it discloses that only visible text is returned, that long text is truncated at max_chars (6000 default), and that the return value marks the cut so the agent can detect truncation by the marker's absence. It doesn't cover edge cases like missing selectors, but the core read behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences with no filler. The most important outcome is first, followed by usage guidance, then a precise truncation caveat. Every sentence earns its place and the whole is scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return formatting is covered elsewhere) and only two optional parameters, the description supplies enough to invoke correctly: what it returns, how to narrow it, and how to detect truncation. A minor gap is not stating behavior for multiple matching elements or a missing selector, but the core workflow is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains selector as the element to narrow and max_chars as the truncation limit with a default of 6000 and a marker behavior. This adds real semantic meaning beyond the raw schema, though it doesn't explicitly state that selector uses CSS syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a crisp definition—'The visible text of an element, with the markup gone'—which names the resource (element text) and operation (read). It also distinguishes from siblings: browser_read_html for structure and browser_snapshot for clicking, so an agent can tell them apart immediately.
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 instructs when to use this tool: 'Narrow the selector when you know where the answer is' and when to prefer alternatives: 'use browser_read_html instead when the structure matters, or browser_snapshot when you need something to click.' It also frames it as 'the cheapest way to read a page,' giving a cost-based decision signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionA
Choose an option in a dropdown (<select>), by its visible label or by
its value.
Use this rather than clicking the dropdown and pressing arrow keys: a click plus arrows cannot tell you which row it landed on, and setting the value through browser_evaluate changes it without the page seeing a real interaction.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool performs a real interaction (as opposed to synthetic DOM changes) and explains why that matters. It does not detail error conditions or return values, but the output schema covers returns, and the behavioral distinction is clearly stated.
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?
Two concise sentences: the first states the action and parameters, the second justifies the preferred approach. Every sentence earns its place, with no redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description covers the essential purpose, the value parameter semantics, and the behavioral rationale. It does not mention edge cases like missing options or non-visible selects, but these are unlikely to block correct invocation given the clear guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explicitly explains that 'value' can be either the visible label or the underlying value, which is critical for correct usage. The 'selector' parameter is left implicit, but standard CSS selector semantics are widely understood and not a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (choose an option in a dropdown), identifies the target element type (`<select>`), and clarifies the two selection modes (visible label or value). It also distinguishes itself from sibling tools like browser_click and browser_evaluate, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts this tool with two alternatives: clicking + arrow keys (which cannot confirm the selected row) and browser_evaluate (which bypasses real interaction). This provides clear when-to-use and when-not-to-use guidance, leaving no ambiguity for an agent deciding among sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotA
Title, url, and the interactive elements that are actually visible.
Each element carries a selector when one can reach it: pass that string to
browser_click or browser_type VERBATIM. It is built to match exactly one
element, which the obvious selector often does not - measured across 958
elements on real pages, 88% could be addressed but only 48% unambiguously,
and Playwright acts on the first match, so a caller aiming at the third of
five identical links would silently hit the first.
Elements with no selector carry at, the centre coordinates, for
browser_click_at.
Not the accessibility tree: on a real sign-up page a single country
<select> contributes about two hundred <option> nodes, which fill the
character cap before the form the caller was looking for appears at all.
| Name | Required | Description | Default |
|---|---|---|---|
| max_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it is unusually rich: it discloses the unique-selector guarantee, the 88%/48% real-world measurement, Playwright's first-match behavior, coordinate fallback for elements without selectors, and the character-cap rationale for excluding options. This lets an agent anticipate silent wrong-click failures.
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 every sentence earns its place: the first line front-loads the output, the second paragraph gives selector safety guidance, and the third justifies the filtering behavior. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given complexity and no annotations, the description covers output structure, selector semantics, coordinate fallback, and interaction routing impressively well. It falls just short of completeness by leaving the max_chars parameter unexplained and not explicitly distinguishing this tool from sibling read tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only max_chars with a default and no description, so schema coverage is 0%. The description mentions a 'character cap' but never says that max_chars controls it, how values behave, or what the default means; an agent cannot determine how to set this parameter from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names exactly what is returned — title, url, and actually visible interactive elements — so an agent knows the resource and output. It also distinguishes itself from 'the accessibility tree' and explains why, which prevents confusing it with a DOM dump.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to consume its output: pass selector VERBATIM to browser_click/browser_type, or use at coordinates with browser_click_at. It gives clear context for choosing the tool (visible interactive elements for interaction) but does not explicitly say when to prefer it over sibling read tools like browser_read_text or browser_read_html.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_take_screenshotA
One screenshot of the active tab, on demand.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of explaining behavior. It does disclose that exactly one screenshot is taken, from the active tab, and only on demand. However, it does not mention what happens after capture, such as return format or whether the screenshot is saved, which keeps it adequate but not rich.
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 a single, front-loaded sentence with no wasted words. Every component adds meaning: 'one', 'screenshot', 'active tab', and 'on demand' all clarify scope and behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has no parameters, but there is also no output schema or annotations. The description explains what is captured but not what the agent receives in return, such as an image path, base64 data, or dimensions. This missing return-value guidance leaves a gap for an agent trying to use 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?
The tool has zero parameters and an empty schema with 100% coverage, so there is no parameter meaning for the description to add. The baseline of 4 applies because no parameter documentation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'One screenshot of the active tab, on demand.' It clearly identifies what is captured, the active tab, and the trigger condition. This is distinct from sibling tools like browser_navigate or browser_read_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use this tool versus alternatives such as browser_snapshot, browser_read_text, or browser_read_html. There are no explicit exclusions or conditions, so the agent must infer appropriate usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeA
Fill a field, replacing whatever it holds.
This sets the value rather than typing key by key, so it will not fire the per-keystroke handlers an autocomplete needs. For those, click the field and use browser_press_key.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| selector | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool replaces the field's current value and does not fire per-keystroke handlers, which is a critical trait. It could also mention broader side effects like input/change events, but it covers the key differentiator well.
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 two short sentences, with the primary action front-loaded. Every sentence adds value: the first states the purpose, the second provides a key caveat and an alternative. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool that has an output schema, the description covers the essential behavior and the most important exception (autocomplete). It does not address error conditions or focus requirements, but those are not critical given the tool's simplicity and sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It indirectly clarifies that 'text' is the value to fill and 'selector' is the target field, but it does not define acceptable selector syntax or text encoding, leaving room for ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and outcome: filling a field and replacing its current content. It clearly differentiates the tool from typing-based tools like browser_press_key by emphasizing that it sets the value rather than typing key by key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when not to use this tool (when the field needs autocomplete per-keystroke handlers) and names the alternative (click the field and use browser_press_key). This gives agents unambiguous selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_watchA
The whole browser window as a person at the machine sees it: tab strip, address bar, the page and the pointer, from a live capture kept running on the active tab. For watching the work, not for acting on it: the picture is window pixels, so do not feed its coordinates to browser_click_at; use browser_take_screenshot for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals that this is a live capture, that coordinates are window pixels rather than page coordinates, and that it is unsuitable for action. However, it doesn't explicitly state the return format (e.g., single frame vs. continuous stream) or how/when the capture stops, which is a modest gap.
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 appropriately short and front-loaded: the first sentence defines the tool's core behavior, the second provides usage constraints and an alternative. Every sentence serves a purpose with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter watch tool, the description is largely complete, covering purpose, limitations, and a recommended sibling alternative. The main omission is the exact delivery/return mechanics of the 'live capture' and whether any session or lifecycle management is required, especially since no output schema exists to fill that 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 has zero parameters and the schema is empty, so no parameter description is needed. The description still enriches the tool's semantics by describing what is captured (tab strip, address bar, page, pointer), matching the baseline expectation for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: it shows the whole browser window (tab strip, address bar, page, pointer) via a live capture on the active tab. It also explicitly frames the tool as 'watching the work, not for acting on it,' which differentiates it from siblings like browser_click_at and browser_take_screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct usage guidance: use it for watching, not for acting, and explicitly warns against feeding its coordinates to browser_click_at, directing the agent to browser_take_screenshot instead. This makes the choice between sibling tools clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_close_pageA
Close a tab, or the active one when page_id is left out.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It clearly states the destructive action (closing a tab) and the default behavior when page_id is omitted. However, it does not mention side effects such as whether the closing is permanent, what happens if the last tab is closed, or whether any confirmation is needed. The word 'Close' implies destruction, but more transparency would improve the score.
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 one concise sentence with no filler. The primary action is front-loaded and the optional behavior is appended naturally. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an output schema, the description is nearly complete. It covers the core action and the parameter default. Minor missing context includes how to identify page_id and any irreversible side effects, but these are partially inferable from sibling tools and the word 'Close.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does add meaning: page_id identifies the tab to close, and leaving it out closes the active tab. This explains the optionality and default behavior beyond the bare schema. It does not specify how to obtain a valid page_id, but the sibling session_list_pages provides that context.
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 uses a specific verb and resource: 'Close a tab.' It clearly distinguishes this from sibling tools like session_new_page, session_select_page, and browser_navigate by indicating the action of closing. The optional active-tab behavior is also stated explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool when you want to close a tab, optionally specifying which one via page_id. It does not explicitly mention when not to use alternatives or list exclusions, but the scope is straightforward and unlikely to be confused with sibling actions like navigating or selecting pages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_list_pagesA
Every open tab: id, title, url, and which one is active.
Use it before session_select_page: the id alone does not tell you which tab you are switching to.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It clearly states what the tool returns and notes a meaningful limitation about the id alone. A small gap is that it doesn't explicitly state read-only behavior, but the verb 'list' reasonably implies a non-mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the essential output contract front-loaded and the usage guidance in the second sentence. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list operation with an output schema available, the description covers everything an agent needs: the scope of results, the fields returned, and the recommended usage ordering relative to session_select_page. Nothing important 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 has zero parameters and the schema is already fully descriptive, so the description couldn't add much parameter-level detail. It instead adds value by explaining the output fields and how they relate to subsequent tool usage, which is appropriate for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a list operation over open tabs with specific output fields (id, title, url, active state). It also distinguishes itself from session_select_page by explicitly naming it, so an agent can tell them apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit contextual guidance: use this tool before session_select_page because the tab id alone doesn't indicate which tab you're switching to. This tells the agent not just what the tool does, but when to call it relative to a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_new_pageA
Open a new tab and make it the active one. Returns its page id.
Tabs persist across calls and across clients, so this is how you keep one page while working on another rather than navigating back and forth.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses key behaviors: opens a new tab, makes it active, returns a page id, and persists tabs across calls and clients. This goes beyond the schema and gives the agent a clear model of the tool's effect. It could mention more about cleanup or session boundaries, but it is transparent for the operation it describes.
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?
Two short sentences with no filler. The action is front-loaded, the return value is stated, and the persistence behavior is explained in the second sentence to justify when to use it. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description is complete: it explains the action, the side effect, the return type, and the recommended usage pattern. The sibling context and persistence rationale give the agent enough to call it appropriately without further investigation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description appropriately does not invent parameter details, and there is nothing additional to explain about inputs. The return value is mentioned, which is useful context.
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 tab and make it the active one.' It clearly distinguishes itself from sibling tools like session_list_pages, session_select_page, and session_close_page by describing creation of a new page rather than listing, selecting, or closing one.
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?
Provides clear context for when to use the tool: when you want to keep one page while working on another, since tabs persist across calls and clients. It does not explicitly name alternative tools or state when not to use it, but the guidance is sufficient for most agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_select_pageA
Switch the active tab. Every other browser_* tool acts on it.
Take the id from session_list_pages or from session_new_page.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add useful behavioral context: the tool changes session state (active tab) and has a broad effect on all subsequent browser_* calls. This is the key behavioral trait beyond a simple read/write hint, and it is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, then a concise dependency/scope note. No filler or repeated schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter state-selection tool, the description covers what it does, how it affects browser tools, and where the parameter value comes from. The presence of an output schema covers return-value expectations, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates by telling the agent exactly where to obtain page_id (session_list_pages or session_new_page). This adds actionable meaning beyond the bare 'page_id' string 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?
The description opens with a specific verb and resource ('Switch the active tab') and immediately explains the tool's role in the session: every browser_* tool acts on this tab. This clearly distinguishes it from session_new_page/list_pages/close_page and from the browser_* actions.
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 the prerequisite source for page_id ('Take the id from session_list_pages or from session_new_page') and implies that selection should precede browser_* calls by saying those tools act on the active tab. It lacks explicit when-not/alternatives, but the contextual guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_startA
Start a browsing session as a particular person, and say who that is.
Call this when you want to control WHO is browsing: a fresh stranger, the same person as last time, or a saved profile that is already logged in somewhere. Calling it closes whatever browser is open and starts another, so anything not saved in a profile is gone.
You do not have to call it at all. The first tool that needs a page starts a
session on its own; session_status then tells you who that turned out to
be.
There is only ONE browser. Two identities are visited in turn, never at the same time, so a task that needs both accounts live at once cannot be done here and is worth saying so rather than half-starting.
seed the browser identity. Same seed, same fingerprint, every time.
Leave it out and one is drawn, and the answer tells you which, so
you can ask for it again later.
profile a directory that keeps cookies and logins between sessions. A
profile also KEEPS ITS SEED: the first session on a new one stores
the identity inside it, and every session after reuses it, so a
login does not come back wearing different hardware. Pass "" to
insist on no profile at all, which is how you get sessions a site
cannot link to each other. A relative path is resolved against the
server's own directory, so the answer reports the full path it
used.
proxy where the traffic goes out, as http://user:pass@host:port or
socks5://host:port. Pass "" to insist on going out from this
machine's own address. A profile does NOT pin its exit the way it
pins its seed: timezone, locale and geography come from the exit,
so the same login arriving from another country is as visible as
one arriving on different hardware. You are warned when a profile's
exit changes, but only when YOU change it - a provider that rotates
its own addresses behind one host and port looks identical here.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| proxy | No | ||
| profile | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly. It discloses that calling it closes the current browser, that unsaved profile data is lost, that there is only one browser, that profiles persist their seed, and that proxy changes are only warned about when the user changes them—not when a provider rotates addresses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but densely informative, with every sentence earning its place. It is front-loaded with purpose and usage, then limitations, then parameter semantics, and it avoids repeating schema details since the schema has no descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three optional but semantically complex parameters and an output schema, the description is complete. It covers when to call, what happens on call, persistence behavior, identity semantics, and the single-browser limitation, leaving nothing an agent needs in order to decide and invoke 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 0%, so the description must fully compensate, and it does. It explains seed determinism, profile persistence and seed-carrying behavior, the empty-string convention for no profile, relative path resolution, and proxy format and its identity implications.
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: 'Start a browsing session as a particular person, and say who that is.' It clearly differentiates this tool from siblings by focusing on controlling the browser identity, while other session_* tools handle status, pages, and navigation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it ('Call this when you want to control WHO is browsing'), when not to call it ('You do not have to call it at all'), and what to use instead (session_status). It also gives a concrete exclusion: tasks needing two identities live simultaneously cannot be done here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
session_statusA
Who is browsing right now: the identity, the exit, the profile and the tabs.
Ask whenever you need to know which person the browser currently is, or from
where its traffic leaves. The seed is what you would pass to session_start
to become this person again, so this is also how you record a session that
is worth repeating.
It starts nothing. If no browser is running yet it says so, because until one is running there is no identity to report.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the tool starts nothing, that it reports when no browser is running, and why that state matters: 'If no browser is running yet it says so, because until one is running there is no identity to report.' This is strong side-effect and empty-state transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and stays reasonably concise. Each paragraph earns its place, though the opening is a sentence fragment and terms like 'exit' are used without immediate explanation.
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 parameterless status tool with an output schema, the description covers the essential points: what is reported, when to ask, how the seed relates to session_start, and what happens when no browser is running. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and the schema is complete, so the baseline is 4. The description adds useful context about the session seed concept even though no parameters exist, which is appropriate for a parameterless status tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a status reporter: 'Who is browsing right now: the identity, the exit, the profile and the tabs.' It also distinguishes itself by stating 'It starts nothing,' which separates it from session_start and other mutating session 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?
It explicitly says when to use it: 'Ask whenever you need to know which person the browser currently is, or from where its traffic leaves.' It also explains the seed's role for replaying a session, but it does not explicitly contrast itself with sibling tools like session_list_pages, so the alternative routing is slightly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.15.2- Added
browser_watch
3 tool updates
v0.11.0- Added
browser_select_option - Added
session_start - Added
session_status
4 tool updates
v0.8.1- Added
browser_click_at - Added
browser_read_html - Changed
browser_snapshot1 field changed- changed
Input schema / properties / max_chars / defaultPrevious value: -6000New value: +0
- Removed
browser_wait_for
13 tool updates
v0.1.0- First observed
browser_click - First observed
browser_evaluate - First observed
browser_navigate - First observed
browser_press_key - First observed
browser_read_text - First observed
browser_snapshot - First observed
browser_take_screenshot - First observed
browser_type - First observed
browser_wait_for - First observed
session_close_page - First observed
session_list_pages - First observed
session_new_page - First observed
session_select_page
TDQS
Scored across 18 tools
Each tool targets a distinct operation: session lifecycle, tab management, navigation, reading modes, and input actions are cleanly separated. Even the overlapping read tools (text, HTML, snapshot) explicitly describe when to use each, so an agent can select them without ambiguity.
The set consistently uses snake_case with `session_*` and `browser_*` prefixes and mostly action+object names like `browser_select_option` and `session_close_page`. Minor noun-style exceptions such as `session_status` and `browser_snapshot` are small deviations but do not break the overall pattern.
18 tools is slightly above the typical 3-15 sweet spot, but for browser automation each tool earns its place by covering a distinct capability. There is little redundant filler, so the count feels reasonable rather than bloated.
The surface covers session/identity management, tab lifecycle, navigation, multiple read modes, and the common input actions well. Obvious gaps are minor—no explicit wait-for-selector, hover, upload, or back/forward—but agents can usually work around them using navigate, wait_until, click, or press_key.
Maintenance
Related MCP Connectors
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Related MCP Servers
- AlicenseBqualityCmaintenanceBrowser MCP server that connects to your existing browser, preserving sessions, passwords, and extensions, enabling AI agents to interact with web pages without bot detection.31101MIT
- AlicenseAqualityBmaintenanceA headless, agent-controllable real browser as an MCP server that enables AI agents to navigate, click, fill, eval JavaScript, and take screenshots on localhost and allowed hosts, with no GUI required.274MIT
- AlicenseNot gradedqualityDmaintenanceA stealth-enhanced browser automation MCP server for AI agents to interact with websites while bypassing anti-bot detection mechanisms like Cloudflare and reCAPTCHA.8MIT
- AlicenseNot gradedqualityBmaintenanceThis MCP server exposes an anti-detect Firefox browser that passes bot-detection tests, allowing LLMs to automate web interactions with humanized clicks and fingerprint randomization.MIT