Skip to main content
Glama
nbiish

Better Browser MCP

by nbiish

What's different from @browsermcp/mcp?

@browsermcp/mcp@0.1.3

@nbiish/betterbrowsermcp@0.2.0

Port collision behavior

Silently kills the other process (lsof -ti:9009 | xargs kill -9)

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

BROWSER_MCP_AGENT_ID env var, exposed in WS path

WebSocket path

/ (any)

/ws/<agent-id>

Auth

None

Optional BROWSER_MCP_AUTH_TOKEN for shared-secret handshake

Recursion bug in server.close()

Yes (crashes on every reconnect)

Fixed — explicit __origClose binding

Workspace monorepo deps

Required @repo/* for build

Self-contained, builds from a single npm install

Bind address

Any

Defaults to 127.0.0.1 (localhost-only by default)

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.md and run node 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.js

The 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:

  1. Start one MCP process per agent (different ports, different BROWSER_MCP_AGENT_ID)

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

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

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

browser_list_tabs

List all bound tabs with their tabId, label, URL, active marker

browser_open_tab

Open a new tab and bind it (optional url, label)

browser_close_tab

Close a bound tab

browser_rename_tab

Set a human-readable label on a tab

browser_set_active_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

browser_bind_tab

Adopt an existing tab into the agent's bound set (no open, no focus)

browser_unbind_tab

Release a tab without closing it

browser_acquire_tab

Advisory per-tab lock (ttlMs, default 300000; returns lockId or BUSY + holder)

browser_release_tab

Release the advisory lock

browser_wait_for_content

Resolve when the tab's content script answers a readiness ping (default 10s)

browser_poll_events

Drain buffered tab_removed/tab_updated/binding_changed events (also appended to list_tabs/snapshot output)

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, /mcp requires Authorization: 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

BROWSER_MCP_AGENT_ID

default

Agent identifier. Used in the WS path (/ws/<id>) so the extension can route tab bindings.

BROWSER_MCP_PORT

9009

WebSocket port to bind. Use different ports for different agents.

BROWSER_MCP_BIND

localhost

Bind address. Loopback only by default — a non-loopback value requires BROWSER_MCP_AUTH_TOKEN (MCP-over-HTTP returns 401 without it; fail closed).

BROWSER_MCP_AUTH_TOKEN

(unset)

Optional shared secret. If set, the extension must send {type:"auth", token:"..."} as its first WS message, else the connection is closed with 4401. Required for /mcp when bound non-loopback.

BROWSER_MCP_WS_PATH_PREFIX

/ws

Path prefix for the WS endpoint. Default /ws means the agent's endpoint is at /ws/<agentId>.

BROWSER_MCP_HUB

false

Hub mode (v0.9.0+). true = one process serves many agents (see Hub mode).

BROWSER_MCP_PQC_SECRETS_BIN

(auto)

Override for the pqc-secrets binary path. Resolution order: this env → which pqc-secrets~/.local/bin/usr/local/bin → legacy ~/code/ainish-coder/bin. The winner is logged to stderr once.


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:

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

  2. 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: in createServerWithTools): capture originalClose before override

  • killProcessOnPort murder (removed entirely — src/utils.ts: only isPortInUse remains)

  • 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 tools
browser_clickC

Perform click on a web page

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdYesTab ID to close

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
expressionYesJavaScript 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

A4.9/5.0
Behavior5/5

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

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

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

A4.5/5.0
Behavior4/5

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

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

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
attrYesThe HTML attribute name to read (e.g. 'href', 'value', 'aria-label', 'data-testid')
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

A4.6/5.0
Behavior4/5

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

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

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

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

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

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

Usage Guidelines4/5

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_navigateC

Navigate to a URL

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to navigate to
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

C2.4/5.0
Behavior1/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. 'Navigate to a URL' is essentially a restatement of the tool name and provides no details about page load behavior, tab routing, failure handling, or side effects. It exceeds the minimal transparency seen in 'Process' descriptions.

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

Conciseness2/5

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

The description is extremely brief and under-specified. While it contains no wasted words, it does not earn its place by providing sufficient information for a navigation tool. The three-word sentence lacks the balance of conciseness and informativeness seen in higher-scoring examples.

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

Completeness2/5

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

For a navigation tool with 2 parameters and no output schema, the description is incomplete. It omits mention of tab targeting, waits for page load, error behavior, and relationship to sibling tools. The schema helps, but the description alone does not give an agent enough context to use the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%: both 'url' and 'tabId' are described in the input schema, including optional behavior and reference to browser_list_tabs. The description adds no extra parameter semantics, so the baseline of 3 applies.

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

Purpose4/5

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

The description uses a specific verb 'Navigate' and resource 'URL', clearly indicating the primary function. It distinguishes from sibling tools like browser_close_tab or browser_click, though it doesn't explicitly differentiate from related navigation tools like browser_open_tab or browser_go_back/forward.

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

Usage Guidelines2/5

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. The input schema mentions tabId and references browser_list_tabs, but the description itself offers no context or exclusions. Agents receive no situational cues for selecting this over other browser navigation tools.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional URL to navigate to after the tab opens
labelNoHuman-readable label for this tab (e.g. 'Stripe dashboard', 'OpenAI console'). If omitted, the tab's hostname or title is used.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoOptional element ref. If provided, the element is focused before the paste event is dispatched. If omitted, the currently focused element is used.
textYesThe text to paste into the focused element
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
elementNoHuman-readable description of the target element (required if `ref` is set, for permission)

TDQS

A4/5.0
Behavior4/5

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

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

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesName of the key to press or a character to generate, such as `ArrowLeft` or `a`
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelYesNew label for the tab
tabIdYesTab ID to rename

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
valuesYesArray of values to select in the dropdown. This can be a single value or multiple values.
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

C2.7/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness1/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdYesTab ID to make active. Must be bound to this agent.

TDQS

A4.3/5.0
Behavior4/5

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

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

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact target element reference from the page snapshot
textYesText to type into the element
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
submitYesWhether to submit entered text (press Enter after)
elementYesHuman-readable element description used to obtain permission to interact with the element

TDQS

C2.6/5.0
Behavior1/5

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.

Conciseness3/5

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.

Completeness2/5

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

With no annotations and no output schema, the description 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
timeYesThe time to wait in seconds

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text (or substring) to wait for. Case-insensitive. Whitespace-normalized.
tabIdNoOptional tab ID to target. When omitted, routes to the agent's active tab. Use browser_list_tabs to see available tab IDs.
timeoutNoMaximum seconds to wait. Default 30. Use 5-10 for fast SPAs, 60+ for dashboard loads.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

For a tool with no output schema, 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.

Parameters5/5

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.

Purpose5/5

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

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

Usage Guidelines5/5

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.

  1. 23 tool updatesv0.5.0
    • First observedbrowser_click
    • First observedbrowser_close_tab
    • First observedbrowser_copy_to_clipboard
    • First observedbrowser_evaluate
    • First observedbrowser_extract_text
    • First observedbrowser_get_attribute
    • First observedbrowser_get_console_logs
    • First observedbrowser_go_back
    • First observedbrowser_go_forward
    • First observedbrowser_hover
    • First observedbrowser_list_tabs
    • First observedbrowser_navigate
    • First observedbrowser_open_tab
    • First observedbrowser_paste_text
    • First observedbrowser_press_key
    • First observedbrowser_rename_tab
    • First observedbrowser_screenshot
    • First observedbrowser_select_option
    • First observedbrowser_set_active_tab
    • First observedbrowser_snapshot
    • First observedbrowser_type
    • First observedbrowser_wait
    • First observedbrowser_wait_for_text

TDQS

A3.6/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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

Completeness5/5

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

ActivityMaintained
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Local 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.
    165
    2
    MIT

Latest Blog Posts

MCP directory API

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

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

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