Better Browser MCP
Better Browser MCP is a local browser automation server for AI agents, providing MCP-compatible tools for driving a shared browser across one or many agents and tabs.
Navigate, click, hover, type, select options, press keys, wait, screenshot, snapshot, go back/forward, and read console logs
Manage tabs: list, open, close, rename, set active tab, bind/unbind tabs, and acquire/release per-tab locks
Wait for page content/text, extract attributes or text, evaluate arbitrary JavaScript, and copy/paste text via clipboard-aware tools
Route tool calls to a specific tab with optional
tabId, or default to the agent's active tabRun multi-agent setups with per-agent ports and WebSocket paths (
/ws/<agent-id>), plus optional shared-secret authSupport hub mode, where one process serves many agents over WebSocket and Streamable HTTP at
/mcp/<agentId>No port conflicts: hard error on port collision instead of killing other processes; localhost-only by default
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Better Browser MCPnavigate to github.com/nbiish/betterbrowsermcp/issues"
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.
What's different from @browsermcp/mcp?
|
| |
Port collision behavior | Silently kills the other process ( | Hard error, process exits with clear message |
Multiple agents on one machine | Each MCP process fights for the same port | Each agent runs on its own port — no fighting |
Agent identification | None |
|
WebSocket path |
|
|
Auth | None | Optional |
Recursion bug in | Yes (crashes on every reconnect) | Fixed — explicit |
Workspace monorepo deps | Required | Self-contained, builds from a single |
Bind address | Any | Defaults to |
All browser_navigate, browser_click, browser_snapshot, etc. tool names are identical to upstream — no client changes needed on the LLM side.
Agent self-service: agents can onboard themselves with zero MCP settings changes — see
.agents/skills/bbmcp/SKILL.mdand runnode scripts/bbmcp-connect.mjs --agent <id> --port 9223.
Related MCP server: concurrent-playwright-mcp
Quick start
Single agent (one process, one browser)
npx @nbiish/betterbrowsermcp@latest
# or, from this checkout:
npm install
npm run build
node dist/index.jsThe server binds port 9009, WebSocket at ws://127.0.0.1:9009/ws/default. The browser extension connects there.
Multi-agent (one process per agent, all sharing one browser)
# Agent "hermes" on port 9009
BROWSER_MCP_AGENT_ID=hermes BROWSER_MCP_PORT=9009 \
npx @nbiish/betterbrowsermcp@latest &
# Agent "omp" on port 9010
BROWSER_MCP_AGENT_ID=omp BROWSER_MCP_PORT=9010 \
npx @nbiish/betterbrowsermcp@latest &
# Agent "codex" on port 9011
BROWSER_MCP_AGENT_ID=codex BROWSER_MCP_PORT=9011 \
npx @nbiish/betterbrowsermcp@latest &Each process binds its own port. They never fight. The browser extension connects to all three WebSocket endpoints and lets the user bind each tab to a specific agent.
Multi-agent setup
The user-facing flow:
Start one MCP process per agent (different ports, different
BROWSER_MCP_AGENT_ID)Configure the browser extension with the list of WS endpoints to monitor (e.g.
ws://127.0.0.1:9009/ws/hermes,ws://127.0.0.1:9010/ws/omp)For each browser tab, the user clicks the extension icon and picks which agent controls it. The binding persists for that tab until changed or disconnected.
Different tabs can be bound to different agents — the same browser serves many agents concurrently.
The MCP processes don't know about each other. The browser extension is the multiplexer that knows which agent controls which tab.
Multi-tab per agent (v0.3.0+)
A single agent can have multiple browser tabs bound to it, so a Hermes-style agent can drive Stripe in one tab and the inference provider dashboard in another, all from one MCP process. The LLM picks which tab to act on.
Tools for multi-tab work
Tool | Purpose |
| List all bound tabs with their tabId, label, URL, active marker |
| Open a new tab and bind it (optional |
| Close a bound tab |
| Set a human-readable label on a tab |
| Switch which tab unspecific tool calls route to |
Every existing browser_* tool also accepts an optional tabId parameter. If omitted, the call routes to the agent's active tab.
Example: driving Stripe + OpenAI console from one agent
LLM: "I need to set up a Stripe webhook. Let me check what tabs are bound."
-> browser_list_tabs
-> response:
tabId=12345 label="Stripe dashboard" url=https://dashboard.stripe.com
tabId=67890 label="OpenAI console" url=https://platform.openai.com ← ACTIVE
LLM: "I should focus on Stripe first."
-> browser_set_active_tab(tabId=12345)
LLM: "Let me take a snapshot of the Stripe dashboard."
-> browser_snapshot
-> response: full ARIA tree, refs like e1, e2, ... for the Stripe dashboard
LLM: "Click 'Webhooks'."
-> browser_click(element="Webhooks link in sidebar", ref="e14")
LLM: "Now switch to the OpenAI console and grab the API key."
-> browser_set_active_tab(tabId=67890)
-> browser_snapshot
-> browser_click(element="API keys", ref="e7")Multi-tab vs. multi-agent
Multi-agent = multiple MCP processes, one per agent (e.g. Hermes + OMP + Codex), each with its own port and WS endpoint
Multi-tab = within ONE agent's MCP process, multiple browser tabs are bound, with per-tab labels and an "active" tab for unspecific calls
The two compose: spawn N MCP processes (multi-agent), each connects to the same browser with M tabs (multi-tab), and the LLM picks which (agent, tab) pair to drive for each tool call.
Parallel-tabs tools (v0.9.0+)
Tool | Purpose |
| Adopt an existing tab into the agent's bound set (no open, no focus) |
| Release a tab without closing it |
| Advisory per-tab lock ( |
| Release the advisory lock |
| Resolve when the tab's content script answers a readiness ping (default 10s) |
| Drain buffered |
browser_open_tab gains makeActive (default false) — background tabs by default; pass true only when you actually want focus. When driving multiple tabs, pass explicit tabId on every call.
Hub mode (v0.9.0+)
One process can now serve MANY agents:
BROWSER_MCP_HUB=true BROWSER_MCP_PORT=9009 node dist/index.js
# extension connects to ws://localhost:9009/ws/<anyAgentId>
# MCP clients POST JSON-RPC to http://localhost:9009/mcp/<agentId>
curl http://localhost:9009/
# {"mode":"hub",...,"agents":[{"agentId":"hermes","connected":true,"boundTabs":2}, ...]}Any
/ws/<agentId>is accepted; the per-agent Context is lazily created on first connect. The auth handshake ({type:"auth", token}) is enforced per Context, exactly like single-agent mode.MCP is also mounted over Streamable HTTP on the same HTTP server:
POST /mcp/<agentId>(stateless JSON-RPC; each request dispatches against that agent's Context).Security: on a non-loopback
BROWSER_MCP_BIND,/mcprequiresAuthorization: Bearer $BROWSER_MCP_AUTH_TOKEN(401 otherwise, fail closed — including when no token is configured).stdio is disabled in hub mode; the process is a daemon (SIGINT/SIGTERM to stop). Single-agent mode (default) is unchanged and byte-compatible.
Environment variables
Var | Default | Description |
|
| Agent identifier. Used in the WS path ( |
|
| WebSocket port to bind. Use different ports for different agents. |
|
| Bind address. Loopback only by default — a non-loopback value requires |
| (unset) | Optional shared secret. If set, the extension must send |
|
| Path prefix for the WS endpoint. Default |
|
| Hub mode (v0.9.0+). |
| (auto) | Override for the |
Browser extension
Better Browser MCP is server-side only. The browser extension that talks to it is a fork of the upstream @browsermcp extension with two changes:
Configurable WS endpoints — instead of a hard-coded
ws://localhost:9009, the extension popup lets the user add/remove WS endpoints to monitor. Each is identified by agent ID.Per-tab agent binding — when the user clicks the extension icon on a tab, they see a list of currently-connected agents (i.e. which WS endpoints are open and which tabs they're bound to). Picking one binds the current tab to that agent until changed or disconnected.
The forked extension is built separately and lives in nbiish/betterbrowsermcp-extension (forthcoming).
Until that's ready, you can patch the upstream extension to:
Read WS endpoints from a config (instead of hardcoded
localhost:9009)Show a tab-binding UI in the popup
Why this exists
The original @browsermcp/mcp@0.1.3 has two design flaws that cause constant pain in multi-agent setups:
1. killProcessOnPort on startup
Every time the server starts, it runs lsof -ti:9009 | xargs kill -9 before binding. This was meant to free the port from a stale previous instance, but in a multi-agent world it means every agent's MCP process murders every other agent's MCP process on startup. The result: keepalive failures every ~90s, ClosedResourceError on every tool call, weeks of debugging.
Better Browser MCP removed this. Port collision is now a hard error with a clear message: which port, which env var to change, and how to investigate (lsof -ti:<port> | xargs ps -p).
2. Single WebSocket per process, no agent awareness
The upstream server has a single Context object holding the one WebSocket. There's no concept of "I'm agent X, please route my tool calls to my tab". The result: in a multi-agent setup, only one agent can have a tab connected at a time, and the others fail with "No connection to browser extension".
Better Browser MCP gives each MCP process an explicit BROWSER_MCP_AGENT_ID. The WebSocket is served at /ws/<agentId>. The browser extension binds tabs to specific agent IDs. Each agent gets its own dedicated tab.
3. Recursion bug in server.close()
The upstream dist/index.js has server.close = async () => { await server.close(); ... } — it calls itself recursively, blowing the stack on every reconnect with RangeError: Maximum call stack size exceeded.
Better Browser MCP fixes this with explicit __origClose binding.
Development
# Install deps
npm install
# Typecheck
npm run typecheck
# Build (ESM via tsup)
npm run build
# Test (manual)
BROWSER_MCP_AGENT_ID=hermes BROWSER_MCP_PORT=9099 \
npm start
# in another shell:
curl http://127.0.0.1:9099/
# {"name":"Better Browser MCP (agent: hermes)","bind":"127.0.0.1","port":9099, ...}Project structure
src/
config.ts env var resolution, WS URL helpers, hub/loopback config
context.ts per-agent Context (one WebSocket = one agent's tabs)
registry.ts AgentRegistry (agentId → Context, hub mode)
events.ts bounded per-agent tab-event ring buffer (cap 200)
messaging.ts WS message protocol (inlined from upstream)
server.ts MCP server, tool routing (shared by both transports)
toolset.ts the full tool list (stdio + HTTP MCP)
http.ts MCP over Streamable HTTP at /mcp(/<agentId>)
tools/ tool implementations (navigate, click, etc.)
utils.ts helpers (wait, port check)
ws.ts WebSocket server + hub routing + health JSON
index.ts entry point (single-agent stdio / hub daemon)
types.ts Zod schemas (inlined from upstream's monorepo)Patched bugs from upstream
server.close()recursion (src/server.ts: increateServerWithTools): captureoriginalClosebefore overridekillProcessOnPortmurder (removed entirely — src/utils.ts: onlyisPortInUseremains)Workspace monorepo deps (inlined into single-package repo)
Credits
Better Browser MCP is a fork of browsermcp/mcp with the multi-agent fixes needed for the Hermes + OMP + Codex multi-agent workflow. Originally adapted from Microsoft's Playwright MCP server.
By Nbiish — first repo, but probably not the last.
Available Tools
23 toolsbrowser_clickC
Perform click on a web page
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
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, but it simply states 'Perform click' with no mention of side effects (e.g., navigation), permission requirements, or prerequisites like obtaining an element reference from a snapshot. This is a significant transparency gap for a potentially mutating 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 a single succinct sentence that immediately states the tool's purpose without any filler or redundant words. It is optimally structured for a tool with a clear verb and resource, earning a high score for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, no annotations, and no output schema, the description is too sparse to be contextually complete. It fails to explain how to identify the element (e.g., via snapshot) or when clicking is appropriate relative to other browser actions, leaving important gaps for an agent to resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with descriptions for all three parameters, so the baseline is 3. The description adds no parameter-specific information; it does not clarify how the 'element' or 'ref' parameters should be used beyond what the schema already 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?
The description 'Perform click on a web page' clearly identifies the action (click) and the resource (web page), distinguishing it from sibling actions like hover or type. However, it lacks specificity about clicking on a particular element or the need for a snapshot reference, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as browser_hover or browser_type. It does not mention that a snapshot reference is required or that clicking might trigger navigation, leaving the agent to infer usage from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_tabA
Close a browser tab previously bound to this agent. The tab's binding is automatically removed.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to close |
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 a key side effect: 'The tab's binding is automatically removed.' However, it does not state whether the operation is reversible, what happens if the tabId is invalid or not bound, or any permissions needed. The destructive nature is implied by 'close' but not elaborated.
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 extremely concise—two short sentences with no filler. It front-loads the primary action ('Close a browser tab') and then provides a single important side effect. 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 simple one-parameter tool with no output schema, the description is largely adequate. It covers the main purpose, the binding prerequisite, and a key side effect. It does not detail error handling or return values, but given the simplicity and the absence of an output schema, this is sufficient. Sibling tools like browser_list_tabs can provide tabId details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already describes tabId as 'Tab ID to close' (100% coverage), the description adds semantic value by clarifying that the tab must be 'previously bound to this agent.' This goes beyond the schema's definition and helps the agent select the correct tab.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Close a browser tab previously bound to this agent.' It uses a specific verb ('close') and resource ('browser tab') and adds a crucial constraint ('previously bound'), distinguishing it from siblings like browser_open_tab or browser_set_active_tab.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to close a bound tab) but does not explicitly provide when-not-to-use scenarios or alternatives. It does not mention that tabId can be obtained via browser_list_tabs, though this is a reasonable inference. No exclusions or alternative tool references are given, leaving usage guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_copy_to_clipboardA
Click a 'Click to copy' button on the page and return the value the page wrote to the clipboard. Use this for Stripe's publishable key / secret key copy buttons, GitHub PAT copy buttons, AWS access key copy buttons, and any other 'click to copy' UI patterns. The content script patches navigator.clipboard.writeText to capture the value as it is written, then returns it to the LLM.
The returned value is plain text (the literal content of the copy button). For secret material, the LLM should pipe it to the user's PQC secrets store (e.g. via the pqc-secrets CLI) rather than persisting it in chat history or unencrypted state.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: it patches navigator.clipboard.writeText to capture the value, returns plain text, and advises secure handling of secrets. This goes well beyond what structured fields reveal and gives the agent a strong mental model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core action and use cases, then adds necessary security context. Every sentence serves a purpose without redundancy. It is well-structured and easy to scan.
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?
Despite lacking an output schema, the description explains the return value and handling, covers usage context, and mentions implementation details. Combined with a fully documented parameter schema, the tool is complete enough for an agent to select 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 description coverage is 100%, so the baseline is 3. The description does not add parameter-level semantics beyond the schema, but it does clarify the return value's nature, which indirectly informs what the 'element' should be. The schema itself is sufficient for the three parameters.
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: 'Click a Click to copy button on the page and return the value the page wrote to the clipboard.' It clearly distinguishes from siblings by focusing on copy-button UI patterns and explicitly lists examples (Stripe, GitHub PAT, AWS keys), making the tool's 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?
The description says 'Use this for Stripe's ... and any other click to copy UI patterns,' giving clear when-to-use context. It does not explicitly name alternative tools like browser_click for non-copy interactions, so it stops short of a full when-not/alternatives list, but the guidance is nonetheless clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateA
Run an arbitrary JavaScript expression in the page's main frame context. Returns the JSON-serializable result. Escape hatch for when ARIA snapshots cannot introspect something — React/Vue component state, computed styles, custom data attributes, third-party widget internals, hidden DOM the snapshot can't reach. The result must be JSON-serializable and is capped at 10KB. The expression runs in the page's global scope via indirect eval (sees window, document, etc.) and any side effects DO persist — only call this with code you have reviewed.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| expression | Yes | JavaScript expression to evaluate. The last expression value is returned. Example: `document.querySelector('h1').textContent` or `Array.from(document.querySelectorAll('a')).map(a => a.href)`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses indirect eval, global scope access (window/document), persistent side effects, JSON-serializability requirement, and the 10KB result cap. This is rich behavioral context beyond what any structured field would provide.
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 three dense, front-loaded sentences. The first sentence states the core function, the second explains when to use it, and the third covers technical constraints and safety. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a powerful and potentially dangerous tool, the description covers purpose, use case, execution model, constraints, and safety. It lacks explicit error-handling details, but given no output schema and no annotations, it provides sufficient context for the agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, providing a solid baseline (3). The description adds further meaning by detailing the execution environment (indirect eval, global scope, side effects persist) and result constraints, enriching the semantics of the 'expression' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs arbitrary JavaScript in the page's main frame context and returns a JSON-serializable result. It also positions itself as an escape hatch for ARIA snapshot limitations, effectively distinguishing it from sibling browser tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use the tool: when ARIA snapshots cannot introspect React/Vue state, computed styles, custom data attributes, third-party widget internals, or hidden DOM. It also warns about persistent side effects, implying safer alternatives for ordinary interactions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_extract_textA
Extract the textContent of a single element by ref. Cheaper than a full snapshot when you just need the visible text of one element. Returns the text as a plain string with whitespace normalized. Use to grab a heading, a status message, or a single field's value without paying the snapshot cost.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
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 reveals the operation is read-only ('Extract'), specifies the return format ('plain string with whitespace normalized'), and notes a performance trait ('Cheaper than a full snapshot'). However, it does not describe behavior for invalid refs or when the element is not found, which would be useful but is a minor gap for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence presents the core action and object, followed by the efficiency rationale, return behavior, and use-case examples. Every sentence contributes information without redundancy, making it efficient and well-structured.
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 read tool, the description integrates purpose, usage guidance, return behavior, and performance context. The schema covers all parameters, and the description states the output format (plain string) even without an output schema. It is sufficiently complete for an agent to select and invoke the tool correctly among its siblings.
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 describes all three parameters (ref, tabId, element) with details, achieving 100% coverage. The tool description adds minimal parameter-specific semantics, only reinforcing that the element is selected 'by ref.' Since the schema already handles parameter meaning, the baseline score of 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 states the exact operation: 'Extract the `textContent` of a single element by ref.' It uses a specific verb and target, and distinguishes itself from the full snapshot by noting it is 'Cheaper than a full snapshot' and returns only one element's text. This clearly differentiates it from sibling tools like browser_snapshot or browser_get_attribute.
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 states when to use this tool ('when you just need the visible text of one element'), gives concrete use cases ('grab a heading, a status message, or a single field's value'), and contrasts it with the alternative of taking a full snapshot at higher cost. This provides clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_attributeA
Read a single HTML attribute from an element referenced by snapshot ref. Use attr: 'href' to get a link's URL (e.g. extract a Stripe payment link from a share button), attr: 'value' for current input values, attr: 'aria-label' for accessibility text, or any custom data-* attribute. Returns the attribute value as a string, or an empty string if the attribute is not set. Cheaper and more precise than a full snapshot when you need one specific value.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| attr | Yes | The HTML attribute name to read (e.g. 'href', 'value', 'aria-label', 'data-testid') | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly communicates the read-only nature ('Read'), the return behavior (string, empty string if not set), and performance characteristics (cheaper than snapshot). It doesn't explicitly state it has no side effects, but 'Read' strongly implies that.
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: purpose, examples, and return/performance note. Every sentence adds useful information, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool, the description adequately covers its purpose, usage, and output. It doesn't address error cases like invalid references, but that's acceptable given the tool's simplicity and the schema's clarity. The absence of an output schema is compensated by the return type explanation.
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% with all parameters already described. The description adds value by giving practical examples for the 'attr' parameter and explaining the return behavior for unset attributes, enriching understanding 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?
The description clearly states the tool reads a single HTML attribute from a snapshot-referenced element. It differentiates itself from siblings by noting it's 'cheaper and more precise than a full snapshot', making its unique value distinct.
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 explicit usage context with concrete examples (href for links, value for inputs, aria-label for accessibility) and implies the alternative scenario: use this instead of a full snapshot when only one value is needed. This gives clear guidance on when to choose the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_get_console_logsB
Get the console logs from the browser
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure, but it simply restates the operation. It does not mention return format, whether logs are cleared, or the scope (active tab vs. all tabs), leaving the agent without important context.
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, concise sentence with no filler. It is front-loaded with the verb and object, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and no output schema, so some minimalism is acceptable. However, the description does not mention what the returned console logs look like or whether they are filtered by tab, which could leave the agent uncertain. It is minimally viable but not rich.
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 fully documents the single optional parameter 'tabId' with a clear description of active-tab fallback and reference to browser_list_tabs. The description itself adds no parameter-level detail, so it receives the baseline score for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('console logs'), making the tool's function immediately clear. It also distinguishes itself from sibling browser tools, none of which explicitly target console log retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives like browser_evaluate or browser_get_attribute. There is no mention of appropriate contexts, exclusions, or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_go_backB
Go back to the previous page
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
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, but it only states the action. It does not mention edge cases like missing history, side effects, or what happens after going back.
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, direct sentence with no unnecessary words. It is appropriately sized for the simple 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?
The description is incomplete for a tool with no output schema and an optional tabId parameter. It does not explain the result of the action or how the tabId affects behavior, leaving significant context 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?
The schema already fully documents the tabId parameter (100% coverage). The description adds no additional parameter semantics, so the baseline score of 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 'Go back to the previous page' uses a specific verb and resource, clearly distinguishing it from siblings like browser_go_forward 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?
No guidance is provided on when to use this tool versus alternatives. It does not mention browser_go_forward, browser_navigate, or any context about browser history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_go_forwardC
Go forward to the next page
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
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 only states the action, with no mention of side effects, what happens if there is no forward history, or how tabId routing works. The behavior is underexplained for a navigation-triggering 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 a single seven-word sentence with zero wasted words. It is front-loaded and perfectly sized for the simple action it describes, though it could have added more value without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description is minimal, but it lacks essential context such as when forward navigation is applicable, behavior at the end of history, and differentiation from sibling tools. The schema covers the parameter but not the operational context, making the description incomplete.
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 already has 100% coverage for the sole tabId parameter, including guidance to use browser_list_tabs. The description adds nothing beyond the schema, so the baseline score of 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 'Go forward to the next page' clearly states the action (go forward) and the resource (next page). It is not a tautology and inherently distinguishes from the sibling tool browser_go_back by direction, though it does not explicitly refer to browsing history or name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like browser_navigate or browser_go_back. There is no mention of prerequisites, when forward navigation is applicable, or conditions under which this tool should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverB
Hover over element on page
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It simply states 'Hover over element on page' without explaining that this moves the mouse cursor, may trigger hover/JavaScript events, or requires a page snapshot reference. The behavioral impact is not disclosed beyond the tautological 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 a single, concise sentence with no filler. It front-loads the primary action clearly, though it omits behavioral context that other dimensions require.
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 action tool without an output schema and without annotations, the description is minimal but not wholly inadequate. However, it does not explain return behavior, prerequisites (e.g., need for a snapshot), or potential side effects, which the absence of annotations makes necessary.
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 descriptions cover all three parameters (element, ref, tabId) at 100% coverage, so the description need not add parameter meaning. The description adds no semantic detail beyond the schema, leaving the baseline score of 3 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 uses a specific verb ('Hover') and resource ('element on page'), clearly distinguishing it from siblings like browser_click or browser_type. The intent is immediately obvious and 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?
The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention any exclusions. The only implied usage is that hovering is the desired action, which is evident from the name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_tabsA
List all browser tabs bound to this agent. Returns tabId, label, URL, title, and which one is the agent's active tab. Use this to discover what's available before issuing tool calls that need a specific tab.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 states the output fields (tabId, label, URL, title, active tab) and the verb 'List' implies a non-mutating operation. This is sufficient for a read-only listing tool, though it does not explicitly declare 'read-only' or discuss error conditions.
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 sentences with no superfluous words. The first sentence states the core function, and the second sentence provides output details and usage context. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple tool with no parameters and no output schema. The description covers purpose, output fields, and usage context, which is complete for an agent to decide when and how to use it. The lack of an output schema is mitigated by listing the returned fields directly in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline per the rubric is 4. The description does not need to explain parameters, and the schema coverage is effectively 100% since there are no parameters. No additional semantic information is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List all browser tabs bound to this agent.' This clearly states what the tool does and inherently distinguishes it from sibling tools, which are all actions (close, navigate, click, etc.) rather than listing operations. The mention of returned fields reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this to discover what's available before issuing tool calls that need a specific tab.' This tells the agent when to invoke the tool, which is a clear context. However, it does not explicitly mention alternatives or when-not-to-use scenarios, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_tabA
Open a new browser tab and bind it to this agent. Optionally provide a URL (will navigate after open) and a human-readable label (the LLM uses the label to refer to the tab in subsequent calls). The new tab is set as the agent's active tab.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional URL to navigate to after the tab opens | |
| label | No | Human-readable label for this tab (e.g. 'Stripe dashboard', 'OpenAI console'). If omitted, the tab's hostname or title is used. |
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 key side effects: the tab is bound to the agent, set as the active tab, and optionally navigates to a URL. It also explains the label's role in subsequent calls. While it doesn't cover edge cases like invalid URLs or tab management on agent termination, it provides substantial transparency for a simple open-tab operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured, consisting of two sentences that front-load the core purpose. Every sentence adds value: the first defines the action, and the second explains parameters and the active-tab side effect. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two optional parameters and no output schema, the description covers the essential aspects: what it does, how parameters behave, and immediate side effects. It could explicitly state what happens when no URL is provided (e.g., opens a blank tab), but this is implied. The description is adequate for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: both 'url' and 'label' have detailed descriptions in the schema. The tool description adds some context beyond the schema, such as the label being used by the LLM to refer to the tab in subsequent calls, and the URL navigating after open. However, this is minor additional meaning; the schema already 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?
The description clearly states the tool's action: 'Open a new browser tab and bind it to this agent.' It specifies the resource (browser tab) and the binding behavior, which distinguishes it from sibling tools like browser_close_tab or browser_navigate. The additional note about setting the tab as active further clarifies its unique role.
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 for when to use this tool: when a new tab needs to be opened and bound to the agent. It explains optional URL and label parameters, implying use cases. However, it does not explicitly name alternatives or state when not to use it (e.g., when an existing tab should be navigated instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_paste_textA
Paste text into a focused element on the page. If ref is provided, that element is focused first; otherwise the currently focused element receives the paste. Counterpart to browser_copy_to_clipboard — copy a value with the copy tool, then paste it elsewhere. Dispatches a synthetic paste event (clipboardData.setData + 'insertFromPaste') so React/Vue/Angular controlled inputs accept the value. Use for Stripe webhook secret fields, generated API key fields, or any text you need to push into a form.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Optional element ref. If provided, the element is focused before the paste event is dispatched. If omitted, the currently focused element is used. | |
| text | Yes | The text to paste into the focused element | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| element | No | Human-readable description of the target element (required if `ref` is set, for permission) |
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 the synthetic paste event (clipboardData.setData + 'insertFromPaste'), focus behavior, and controlled-input compatibility. It omits failure modes and permission nuances, but provides substantial behavioral detail beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each earning its place: purpose, ref behavior, counterpart workflow, event mechanism, and concrete use cases. Front-loaded and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers purpose, behavior, use cases, and integration with the copy tool. It leaves tabId routing and the element permission requirement to the schema, which is acceptable, though it could mention potential failure scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds little beyond the schema: it restates ref focus behavior and text purpose but does not elaborate on tabId or element semantics. It paraphrases rather than adds meaning over 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+resource+scope: 'Paste text into a focused element on the page.' It clearly distinguishes itself from copy via 'Counterpart to browser_copy_to_clipboard', but does not explicitly contrast with browser_type or browser_press_key, so sibling differentiation is limited.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases ('Use for Stripe webhook secret fields, generated API key fields, or any text you need to push into a form') and a copy-then-paste workflow. However, it does not state when to prefer this over browser_type or other input tools, nor does it mention exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyC
Press a key on the keyboard
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Name of the key to press or a character to generate, such as `ArrowLeft` or `a` | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral disclosure burden, but it merely states the action without revealing any side effects, such as keydown/keyup behavior, target element requirements, or impact on page state. This is a significant gap for a tool that simulates user input.
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, compact sentence with no superfluous words. It is appropriately sized for the simplicity of the action, and every word contributes to conveying the primary function.
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?
Despite the schema covering parameters, the description lacks crucial context for an agent: it does not mention the optional tabId behavior (even though the schema does), nor any return value or side effects. For a tool with no annotations and no output schema, this level of under-specification leaves the agent with an incomplete picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for both parameters, covering 100% of them. The description adds no extra parameter meaning, so the baseline score of 3 is appropriate since the schema already handles parameter semantics effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Press' and the resource 'a key on the keyboard', making the core action obvious. It does not explicitly distinguish from sibling tools like browser_type, but the specific mention of keyboard key press separates it adequately from clicking or typing 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?
There is no guidance on when to use this tool versus alternatives such as browser_type or browser_click. The description does not mention scenarios, prerequisites (e.g., focused element), or exclusion cases, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_rename_tabA
Set a human-readable label on a bound tab. The label is what the LLM uses to refer to the tab in conversation and in browser_list_tabs output.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | New label for the tab | |
| tabId | Yes | Tab ID to rename |
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 discloses that the label affects how the LLM refers to the tab and appears in browser_list_tabs output, giving important behavioral context beyond the schema. It does not mention reversibility or permissions, but for a simple rename operation, this is adequate.
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, front-loaded with the action, and every word adds value. No fluff 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 2-parameter tool with no output schema and no annotations, the description is complete. It explains the tool's purpose, the label's significance, and its effect on output. No additional details are necessary.
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 meaning by explaining that the label is 'human-readable' and used by the LLM and list output, clarifying the semantic purpose of the 'label' parameter beyond the schema's 'New label for the tab'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set a human-readable label') and the resource ('a bound tab'). It distinguishes itself from sibling tools like browser_close_tab or browser_set_active_tab by focusing on labeling, and mentions the label's role in conversation and list output.
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 on when to use this tool: when you want to assign a human-readable label to a tab for LLM reference and list output. It does not explicitly name alternatives or exclusions, but the context is sufficient for appropriate use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotB
Take a screenshot of the current page
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It states only that it takes a screenshot, but does not disclose return format, whether it captures viewport or full page, or any side effects. This is minimal and leaves the agent guessing about 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 a single, succinct sentence with no redundant wording. It earns its place without extra fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with full schema coverage, the description is minimally viable. However, it lacks context about output behavior and does not clarify differences from sibling tools like browser_snapshot, so completeness is only average.
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 a full description of the optional tabId parameter, covering 100% of parameters. The description adds no additional meaning, so baseline of 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 uses a specific verb ('Take') and resource ('screenshot of the current page'), clearly indicating the tool's purpose. It distinguishes from the sibling tool browser_snapshot, which implies capturing DOM state rather than visual pixels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention browser_snapshot or other browser tools, leaving the agent without context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionC
Select an option in a dropdown
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| values | Yes | Array of values to select in the dropdown. This can be a single value or multiple values. | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It merely restates the tool name; it does not disclose that it operates on snapshot references, that it may trigger change events, or that permission may be required. There is no added behavioral context.
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, concise sentence that is front-loaded and directly states the tool's purpose. Every word earns its place; there is no 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?
For a browser automation tool with no annotations and no output schema, the description is severely lacking. It does not explain how elements are identified (ref), what 'values' means, whether multiple selection is supported, or any side effects. The tool is much more complex than the description suggests.
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 description does not need to add parameter details. It adds nothing beyond the schema, which is acceptable but not enriching. The baseline of 3 is appropriate since the schema handles semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Select') and the resource ('an option in a dropdown'), which is specific enough to distinguish from sibling tools like browser_click or browser_type. It could explicitly mention 'HTML select element' or 'multiple values', but it is still 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?
No guidance is provided on when to use this tool versus alternatives. The description does not mention that it is for native dropdowns, how it relates to clicking, or any preconditions like having a snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_set_active_tabA
Set which bound tab is the agent's active tab. Tool calls that don't specify a tabId route to the active tab. Use this to switch the agent's focus between bound tabs.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | Yes | Tab ID to make active. Must be bound to this agent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a key behavioral trait—that tool calls not specifying a tabId route to the active tab—which is beyond the name and schema. While it doesn't elaborate on side effects (like state changes to the previous tab), this is a simple setter and the core behavior is adequately disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, direct, and front-loaded. The first sentence states the core action, and the second explains the routing implication. No filler or redundant content, 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 simple one-parameter tool, the description is complete. It explains what the tool does, the effect on other tool calls, and the intended use case. The schema provides the remaining parameter detail, and no output schema is needed. There are no major gaps in 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 100%, so the baseline is 3. The description does not add significant meaning about the tabId parameter beyond what the schema already states. It implies the parameter's role in routing, but the schema already describes it as 'Tab ID to make active.' No extra nuance is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb and resource: 'Set which bound tab is the agent's active tab.' It also distinguishes itself from sibling tools by explaining the routing behavior (calls without tabId go to the active tab), which differentiates it from tab-management siblings like browser_open_tab or browser_list_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?
The description provides clear context for when to use the tool: 'Use this to switch the agent's focus between bound tabs.' It also explains the effect on other tool calls. However, it does not explicitly mention when not to use it or name alternative tools, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotA
Capture accessibility snapshot of the current page. Use this for getting references to elements to interact with. The snapshot also lists all bound tabs so the LLM can pick a different tab via tabId on subsequent calls.
| Name | Required | Description | Default |
|---|---|---|---|
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool captures a snapshot and lists bound tabs, implying it is a read-only operation, but does not explicitly state safety characteristics or potential side effects. It provides useful behavioral context (e.g., using tabId on subsequent calls) but lacks explicit non-destructive statements or permission requirements.
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 concise sentences, front-loaded with the tool's core purpose. Every sentence contributes meaningful information without fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional param, no output schema) and the absence of annotations, the description sufficiently explains what the tool returns (element references and tab list) and how it fits into the broader workflow. It doesn't enumerate return format details, but the purpose and key behaviors are covered. Minor gap: it doesn't explicitly state that the snapshot reflects the current page state, but that is implied.
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 already provides 100% coverage for the single 'tabId' parameter, including its optionality and how to see available IDs. The description adds a small contextual clue about using tabId on subsequent calls, but this does not significantly go beyond the schema, so the baseline score of 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 uses a specific verb ('capture') and resource ('accessibility snapshot of the current page'), clearly stating what the tool does. It further distinguishes itself from siblings by highlighting its dual purpose: providing element references for interaction and listing all bound 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?
The description gives clear context on when to use the tool ('getting references to elements to interact with') and explains how the tab listing helps with tab selection. However, it does not explicitly mention when not to use it or name alternative tools, such as browser_list_tabs for tabs or browser_extract_text for text extraction, which would strengthen the guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeC
Type text into editable element
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Exact target element reference from the page snapshot | |
| text | Yes | Text to type into the element | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| submit | Yes | Whether to submit entered text (press Enter after) | |
| element | Yes | Human-readable element description used to obtain permission to interact with the element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only says 'Type text into editable element'. It fails to disclose whether text replaces existing content, how focus is handled, whether the element must already be editable, or what the submit option does. This is a minimal statement with no behavioral depth.
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 short sentence, which is concise and front-loaded. However, it is under-specified for a tool with 5 parameters and complex browser context, so it is not appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description carries the full contextual burden. It doesn't explain tab targeting, permissions, or return behavior, and it's too brief to give the agent enough context for confident selection and invocation. It's not completely empty, but it's clearly inadequate.
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% for all 5 parameters, so the baseline is 3. The description adds no additional meaning beyond the schema's parameter descriptions, but it also doesn't need to since the schema already covers them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'type' and the resource 'text into editable element', which communicates the core action. However, it doesn't differentiate this tool from siblings like browser_paste_text or browser_press_key, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as browser_paste_text or browser_press_key. There are no usage contexts, prerequisites, or exclusions mentioned, leaving the agent to infer appropriateness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_waitB
Wait for a specified time in seconds
| Name | Required | Description | Default |
|---|---|---|---|
| time | Yes | The time to wait in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden but only states the basic function. It does not disclose that the wait is blocking, whether it returns a value, or how invalid inputs are handled. The description essentially restates the schema parameter description, adding no behavioral context.
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 that conveys the essential information without any fluff. It is appropriately sized for a simple 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 tool is simple with one well-described parameter, so the description covers the core functionality. However, it lacks details about return behavior, potential blocking nature, and differentiation from browser_wait_for_text. These gaps prevent a higher score.
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 already has 100% coverage with a clear description for the single 'time' parameter ('The time to wait in seconds'). The tool description adds no additional parameter semantics, so the baseline score of 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 clearly states the action ('Wait') and the target ('time in seconds'), making the tool's purpose unmistakable. It also distinguishes from sibling tools like browser_wait_for_text by specifying a fixed time delay rather than waiting for a condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. While the tool name and description imply a time-based wait, there is no explicit mention of browser_wait_for_text or other context, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_for_textA
Wait for a specific text to appear anywhere in the page DOM (case-insensitive substring match). Polls every 500ms until the text is found or the timeout elapses. Replaces blind browser_wait(time) calls. Returns a fresh ARIA snapshot once the text appears. Use after clicking a submit button, or to wait for a Stripe dashboard to finish loading. On timeout, returns an error with the current page text length so you can diagnose what is or isn't rendering.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text (or substring) to wait for. Case-insensitive. Whitespace-normalized. | |
| tabId | No | Optional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs. | |
| timeout | No | Maximum seconds to wait. Default 30. Use 5-10 for fast SPAs, 60+ for dashboard loads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description discloses key behaviors: polling every 500ms, returning a fresh ARIA snapshot, and returning an error with current page text length on timeout. This gives the agent a complete picture of side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, delivering purpose, usage, behavior, and error handling in four sentences with no redundant content. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description explains the return value (ARIA snapshot), polling behavior, timeout error handling, and parameter tuning guidance. It is fully self-contained and leaves no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema covers 100% of parameters, the description adds valuable semantics: text is whitespace-normalized, tabId defaults to the agent's active tab, and timeout suggests 5-10s for fast SPAs. These details go beyond the schema descriptions.
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: "Wait for a specific text to appear anywhere in the page DOM (case-insensitive substring match)." It clearly distinguishes from the sibling browser_wait by stating it "Replaces blind browser_wait(time) calls."
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 explicit usage context: "Use after clicking a submit button, or to wait for a Stripe dashboard to finish loading." It also names the alternative tool (browser_wait) and explains when to prefer this tool over that one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
23 tool updates
v0.5.0- First observed
browser_click - First observed
browser_close_tab - First observed
browser_copy_to_clipboard - First observed
browser_evaluate - First observed
browser_extract_text - First observed
browser_get_attribute - First observed
browser_get_console_logs - First observed
browser_go_back - First observed
browser_go_forward - First observed
browser_hover - First observed
browser_list_tabs - First observed
browser_navigate - First observed
browser_open_tab - First observed
browser_paste_text - First observed
browser_press_key - First observed
browser_rename_tab - First observed
browser_screenshot - First observed
browser_select_option - First observed
browser_set_active_tab - First observed
browser_snapshot - First observed
browser_type - First observed
browser_wait - First observed
browser_wait_for_text
TDQS
Each tool targets a distinct browser action or data type: navigation, tab management, user interaction, page introspection, and utility functions are clearly separated. Even the three read-ish tools (snapshot, extract_text, get_attribute) are distinguished by use case: full snapshot with refs vs. targeted text/attribute retrieval.
All 23 tools share the consistent 'browser_' prefix and use snake_case throughout. While some names are single verbs (navigate, click, wait) and others are verb phrases (go_back, wait_for_text, copy_to_clipboard), the pattern is uniform and predictable, with no mixed conventions or style breaks.
At 23 tools, the count falls into the 'heavy' range (16–25) per the rubric. Each tool is legitimately distinct and useful for browser automation, but the sheer number may add selection overhead and suggests the surface could potentially be consolidated (e.g., merging extract_text and get_attribute into a single read tool).
The tool surface covers the full browser automation lifecycle: tab management (open, close, list, set active, rename), navigation (navigate, back, forward), interaction (click, hover, type, select, press key), page inspection (snapshot, screenshot, attributes, text), waiting (wait, wait_for_text), console logs, clipboard, and arbitrary JS evaluation. There are no obvious dead ends for common browser workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server to assist with JxBrowser development.
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
Stealth web browser for agents: search, fetch, click, download and type in persistent MCP sessions.
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
Related MCP Servers
- AlicenseAqualityCmaintenanceMulti-agent Playwright MCP server with tab isolation via targetId, enabling multiple agents to share a single Chrome browser while maintaining isolated tab groups and shared sessions.14143MIT
- AlicenseAqualityAmaintenanceAn MCP server that runs concurrent, session-isolated Playwright browser contexts, so many agents can each drive their own browser at the same time without colliding.23292MIT
- FlicenseBqualityBmaintenanceUltra-fast browser automation server over Chrome DevTools Protocol (CDP), exposed as MCP, enabling AI agents to control a real Chrome browser with low latency and minimal token usage.21-
- AlicenseNot gradedqualityBmaintenanceLocal MCP server for persistent Chrome automation with multi-profile support, enabling tab management, page inspection, element interaction, JavaScript evaluation, and screenshots while preserving login sessions across restarts.1652MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nbiish/betterbrowsermcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server