Skip to main content
Glama

Kitsune

Kitsune: an orange fox in a browser window, connecting your browser and your AI agent

kitsune-browser-mcp on PyPI kitsune-browser on PyPI Python Release License: MIT

Bring your coding agent into Firefox and keep working alongside it.

Kitsune lets AI agents such as Claude Code, Codex, Pi, and OpenCode use the Firefox, Zen, or LibreWolf browser you already have open. Your sessions, cookies, and extensions stay where they are, and there is no Playwright, Chromium, or WebDriver to install. Your own scripts can use it the same way, through the Python API.

The agent can research in background tabs and prepare form drafts while you keep using the same browser. You stay with the agent you already use; Kitsune is not a separate browser or a built-in assistant.

The design follows two principles: the user's browser belongs to the user, and the agent gets fewer, sharper tools. See Philosophy.

Claude Code uses Kitsune to search Google Flights and Google Maps in background Zen tabs for a weekend in Tokyo, booking nothing, while the user's Google tab stays in front

A real screen recording of Claude Code and Zen Browser on the live Google sites, sped up while the agent thinks and zoomed in afterwards (full 38-second video).

Why Kitsune?

  • Tabs the agent creates open in the background. Kitsune holds writes to a tab while you are typing or clicking in it, refuses writes that name no tab until the agent has opened or selected one, and closing one of your own tabs takes a separate confirmation step. This reduces interference, but OS-level clicks and popups opened by sites still have focus and input limitations.

  • You decide how much to delegate. KITSUNE_MODE=read, draft, or act limits both the tools the agent sees and the requests the bridge accepts. Draft mode lets the agent fill supported fields without click or submit tools, although sites may still autosave what it types. The default, act, has no such restriction. See Task modes.

  • The agent starts with Playwright MCP's 25 core tools. Kitsune's other tools stay off until you allow them, and the agent can find and call the allowed ones without restarting its session. See Choosing tools.

  • With the optional automation capability, an interrupted batch, parallel, or workflow call can be resumed without resending the writes that already succeeded. A write with an uncertain outcome needs an observation before it is retried. Checkpoints are temporary and are lost when the bridge restarts.

Related MCP server: marionette-mcp

What can it do?

In your browser, the agent can:

  • Search the web, read pages, and summarize what it finds with links.

  • Click, type, select options, set sliders, and fill forms, including on sites where you are already signed in.

  • Take screenshots or turn page content into text and Markdown.

  • Keep research and tasks in separate tabs without replacing the page you are using.

Benchmark

Kitsune v0.7.0 vs Playwright MCP 0.0.83: kept the user's tab in front in 28 of 28 tasks vs 2 of 28; 0.68 to 0.91 times the cost on tasks both solved; both solved 209 of 210 tasks

With the same tasks and tool allowlist, Kitsune v0.7.0 kept the user's tab in front in 28 of 28 shared-browser tasks, against 2 of 28 for Playwright MCP. On the tasks both solved, Kitsune cost 0.68 to 0.91 times as much, at about the same number of tool calls. Each solved 209 of 210 tasks. Each task was run once with Claude Opus 5.5. Playwright MCP was not designed to share a browser with a person. See the v0.7.0 report and the full reports. scripts/benchmark_chart.py draws the chart from the report's numbers.

How is it different?

Kitsune is one of several ways to connect an agent to a browser. Which one fits depends on the browser you use and the work you want to hand off:

If you want to…

Consider

Delegate tasks in the Firefox-family browser you are using, with background tabs, read/draft/act modes, and resumable batches

Kitsune

Debug or profile pages in Firefox (debugger, profiler, deep protocol access)

Mozilla Firefox DevTools MCP, which attaches to a running Firefox started with remote-debugging flags

Test across Chromium, Firefox, and WebKit in launched browsers

Playwright MCP; Kitsune publishes its 25 core tools, so prompts written for it carry over

Drive the Chrome you already use

A Chromium extension MCP such as Browser MCP

Kitsune connects through an extension and a local bridge, so Firefox needs no startup flags or WebDriver. Other Firefox extension projects also reuse your logins. Kitsune concentrates on sharing the browser with you while the agent works. Positioning has the full comparison and its limits.

How do I use it?

Kitsune is two PyPI packages, released together with one version. kitsune-browser-mcp is the MCP server for agents, set up as below. kitsune-browser, which it installs, is the code, with a Python API for your own scripts.

  1. Install uv, then follow the MCP setup for your agent below. Install the browser extension in Firefox, Zen, or LibreWolf. The signed build stays installed; the developer build, which browser_evaluate needs, is a temporary add-on.

  2. Keep the browser open. Kitsune starts its shared bridge automatically. Before your first task, ask the agent to check the connection.

  3. Ask in plain language. For example:

    Research these three products in new background tabs and compare them with source links. Leave my current tab alone.

    Inspect this page's form and fill a draft. Don't submit it yet.

    Open Hacker News in a background tab and summarize the top three stories with links.

    Asking in plain language does not change the mode. To enforce a draft-only tool set, set KITSUNE_MODE=draft before starting the MCP client.

Use a dedicated browser profile, and give the agent access only to the accounts it needs. Have it ask you before it sends, buys, or deletes anything. The opt-in ask-before-act policy makes the bridge hold submits, payment pages, JavaScript, and cookie access until the agent repeats the call with a confirmation token. The agent can make that second call on its own, so it does not prove that a person approved, and none of these controls prevent prompt injection. Read the security guidance before using sensitive accounts.

MCP setup

Every client launches the same local stdio server: uvx --from kitsune-browser-mcp kitsune. Use only one setup method per client. Several clients can share one bridge; keep them on the same Kitsune version and install source.

On macOS, OS-level trusted clicks (for example to open "Continue with Google" popups) need uvx --from 'kitsune-browser-mcp[macos]' kitsune or brew install cliclick, plus Accessibility permission; see Sign-in popups.

CLI registration: Claude Code, Codex, and Pi

Claude Code, available in every project with --scope user:

claude mcp add --scope user kitsune -- uvx --from kitsune-browser-mcp kitsune

Codex CLI, which registers the server in ~/.codex/config.toml:

codex mcp add kitsune -- uvx --from kitsune-browser-mcp kitsune

Pi has built-in MCP support and registers servers for your user by default:

pi mcp add kitsune -- uvx --from kitsune-browser-mcp kitsune
pi mcp list

To register the server only for the current project, add --local before kitsune. In a Pi session that is already running, run /reload, then /mcp to check the connection. If an MCP adapter extension replaces Pi's built-in support, follow that extension's instructions instead.

OpenCode

Merge this into ~/.config/opencode/opencode.json (global) or opencode.json in your project root. OpenCode uses an mcp object with a command array, not mcpServers:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "kitsune": {
      "type": "local",
      "command": ["uvx", "--from", "kitsune-browser-mcp", "kitsune"],
      "enabled": true
    }
  }
}

JSON configuration: Pi, Claude Desktop, and Cursor

These clients use the same mcpServers format. Instead of CLI registration, where a client has it, you can merge this entry into the client's config file and keep any servers already there:

Client

Config file

Pi (built-in MCP)

~/.pi/agent/mcp.json (user) or .pi/mcp.json (project; requires project trust)

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Cursor

~/.cursor/mcp.json (global) or .cursor/mcp.json (project)

{
  "mcpServers": {
    "kitsune": {
      "command": "uvx",
      "args": ["--from", "kitsune-browser-mcp", "kitsune"]
    }
  }
}

After configuring a client, restart or reconnect it and ask it to list your tabs (browser_tabs with action: "list"). If that fails, the error's hint says what to fix. A GUI app that does not inherit your shell's PATH may need the full path from which uvx in place of uvx.

Choosing tools

By default Kitsune publishes Playwright MCP's 25 core tools with the same names, descriptions, and schemas, and they drive your own browser. Prompts and clients written for Playwright MCP work unchanged (Core tools). Kitsune's own tools are sorted into capability groups, which you enable with KITSUNE_CAPS in the MCP server's environment:

Group

Tools for

browse

Scrolling, forward navigation, checkboxes, focus, form submits, trusted OS clicks

read

Page text and Markdown, forms, DOM, links, images, metadata

inspect

Element bounds, computed styles, selector diagnosis, highlights

tabs

Pinning, muting, zoom, windows, tab tags, keep-alive

automation

Batches, retries, workflows, parallel tabs, resume

network

Downloads, request interception and capture

admin

Connection status, logs, audit, cache, policy

storage, history

Cookies, page storage, clipboard and saved sessions; history and bookmarks. They read personal data, so all leaves them out and you enable them by name

You can allow more tools than you publish, which keeps the agent's starting tool list small. With KITSUNE_CAPS=all and KITSUNE_PUBLISH=core, the agent starts with the core tools and can find and call the others in the same session (Finding tools without a restart). With Claude Code, for example:

claude mcp add --scope user kitsune -e KITSUNE_CAPS=all -e KITSUNE_PUBLISH=core -- uvx --from kitsune-browser-mcp kitsune

In the JSON configurations above, add "env": {"KITSUNE_CAPS": "all", "KITSUNE_PUBLISH": "core"} next to "args". The bridge checks the groups on every request, including batch steps. A tool called without a tab acts on the agent's current tab, not the one you are looking at; until the agent has one, writes and navigations without a tab fail with no_current_tab.

If you are upgrading from 0.3: the devtools, parallel, windows and session groups were replaced by the groups above, and all no longer includes storage. A configuration that names a removed group fails at startup. Tools lists where each tool went.

Installation covers Codex's TOML configuration, environment variables, version pinning, and upgrades.

Python API

The same extension and bridge also work from your own code. The code is the kitsune-browser package, which the MCP server's package installs with the server; pip install kitsune-browser alone gives you a Python API with every capability group, storage and history included:

import kitsune

browser = kitsune.connect()                        # starts the bridge if none runs
tab = browser.new_tab("https://news.ycombinator.com")   # a background tab you don't see
for link in tab.query(".titleline > a", fields=["text", "href"], limit=3):
    print(link["text"], link["href"])
tab.close()

The MCP server limits what an agent sees; the Python API does not, but the bridge's shared-browser rules hold for both: tabs open in the background, your own tabs close only with your approval, and sensitive fields stay redacted. kitsune.connect(confirm=...) lets a person approve each action that needs it. See Python API.

Until 0.6.0 the code was part of kitsune-browser-mcp. If you upgrade a pip install of 0.6.0 or earlier, see Upgrading for the one extra step.

More documentation

Tools · Configuration · Troubleshooting · Updating · API reference · Python API · Development · FAQ

The architecture, product trade-offs, and comparisons with other browser MCP servers are in Positioning.

Available Tools

25 tools
browser_clickB
Destructive

Perform click on a web page

NameRequiredDescriptionDefault
buttonNoButton to click, defaults to left
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
modifiersNoModifier keys to press
doubleClickNoWhether to perform a double click instead of a single click

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, indicating the tool mutates state and can be destructive. The description adds no further behavioral disclosure, such as possible navigation or permission requirements. It does not contradict annotations, but provides no value beyond them.

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. However, it is terse and omits useful context that could be added without bloat, such as the requirement for a snapshot target. It is appropriately sized but not front-loaded with any distinguishing information.

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?

Given the tool's moderate complexity (5 parameters, no output schema), the description alone is minimally sufficient because the schema fully describes parameters. However, it lacks context about return values, when to use click vs other actions, and potential side effects. The schema covers parameter semantics, so a score of 3 is appropriate.

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%, with every parameter documented (e.g., target is 'Exact target element reference from the page snapshot, or a unique element selector'). The description itself adds no additional parameter meaning, 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 clearly states the action ('Perform click') and the resource ('web page'), which is specific enough. However, it does not differentiate from sibling interaction tools like browser_hover or browser_drag; the agent must infer that 'click' is a distinct action without additional context. It is unambiguous about the core operation but lacks detail on the target element requirement.

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. It does not mention prerequisites such as needing a page snapshot to obtain a valid target, nor does it contrast with browser_hover or browser_drag. An agent receives no context for tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_closeB
Destructive

Close the page

NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior2/5

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

The annotation already indicates destructiveHint=true, so the agent knows the action is destructive. The description simply repeats that by saying 'close' without adding any extra context about side effects (e.g., whether it closes just the current tab, loses unsaved state, or affects other tabs). It does not contradict the annotation, but it adds no new behavioral information.

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, using only three words. It communicates the essential action and target without any fluff, making it easy to parse and understand 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?

Given the simplicity of the tool (no parameters, no output schema), the description is functional but lacks completeness. It leaves open the scope of 'close'—does it close the current page/tab, or the entire browser? In a context with sibling tools like browser_tabs, this ambiguity could be problematic. More detail would improve it.

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?

There are no parameters, so the schema coverage is trivially complete at 100%. The description does not need to explain any parameter semantics, and 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 'Close the page' clearly states the action (close) and the resource (page), making it unambiguous. It is distinct from sibling tools like browser_navigate or browser_snapshot, so an agent can easily identify it.

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. It does not mention potential alternatives (e.g., using browser_tabs to manage multiple pages) or any conditions that would make closing appropriate. The context is minimal and leaves the decision entirely to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_console_messagesC
Read-only

Returns all console messages

NameRequiredDescriptionDefault
allNoReturn all console messages since the beginning of the session, not just since the last navigation. Defaults to false.
levelYesLevel of the console messages to return. Each level includes the messages of more severe levels. Defaults to "info".info
filenameNoFile name to save the console messages to. Relative file names are resolved against the workspace root. If not provided, messages are returned as text.

TDQS

C2.9/5.0
Behavior2/5

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

The free-text adds almost no behavioral nuance beyond what annotations already provide. It does not mention the default scope of 'after navigation' versus 'from the session start' (controlled by the 'all' flag), nor the possibility of saving to a file rather than returning text. The sentence simply restates the resource name without additional procedural insight.

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 one-sentence description is extremely concise and free of unnecessary wording, front-loading the main idea efficiently. It could be longer, but as a brief summary it is appropriately structured and not bloated.

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 tool's behavior is actually nuanced—console messages can be filtered by severity level and can be limited to the current page. The description fails to explain the return format ( text or file) or the existence of these parameters/capabilities. Without supplemental information from the schema, an agent might assume 'all' means all severities whereas only retrieving info-level messages by default is the actual outcome.

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 complete descriptions for all 3 parameters and covers 100% of them, so the baseline is adequate. The description adds no extra meaning about level filtering, filename handling, or the interaction between 'all' and 'level'; it does not conflict but also does not compensate beyond 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 states a specific resource ('console messages') and a specific action ('Returns'), and the tool name confirms this. It can be clearly distinguished from sibling tools like browser_network_requests or browser_snapshot, which address different browser features. However, the word 'all' is slightly misleading because the level parameter actually filters output.

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 about when to use this tool versus alternatives, nor any mention of typical use cases, prerequisites, or exclusions. The description only states the core product and does nothing to route an agent to the correct selection between this and related browser tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_dragA
Destructive

Perform drag and drop between two elements

NameRequiredDescriptionDefault
endTargetYesExact target element reference from the page snapshot, or a unique element selector
endElementNoHuman-readable target element description used to obtain the permission to interact with the element
startTargetYesExact target element reference from the page snapshot, or a unique element selector
startElementNoHuman-readable source element description used to obtain the permission to interact with the element

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the destructive nature is covered. The description adds no extra behavioral context such as side effects on the DOM or event firing, but it does not contradict the annotations.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the action and provides the core information without any irrelevant detail.

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 action with well-described parameters and no output schema, the description is mostly complete. It does not mention any return values or wait behavior, but the lack of output schema makes this acceptable. It could have added a note about the order of start and end parameters, but the parameter names and descriptions handle that.

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% with all four parameters described. The tool description adds no additional parameter semantics beyond what the schema already provides, so the 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 clearly states the action (perform drag and drop) and the resource (between two elements), distinguishing it from sibling tools like browser_click, browser_hover, and browser_drop. It is specific 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide any guidance on when to use this tool versus alternatives. It does not mention conditions such as needing to move an element or triggering drag-and-drop events, nor does it reference sibling tools like browser_drop or browser_click.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_dropA
Destructive

Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of "paths" or "data" must be provided.

NameRequiredDescriptionDefault
dataNoData to drop, as a map of MIME type to string value (e.g. {"text/plain": "hello", "text/uri-list": "https://example.com"}).
pathsNoAbsolute paths to files to drop onto the element.
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element

TDQS

A4/5.0
Behavior3/5

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

Annotations already convey destructive and non-read-only behavior, so the description does not need to repeat that. The description adds useful semantic context about simulating an external drag, but does not disclose any side effects beyond the basic drop 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, focused sentence that concisely explains both the action and the key parameter requirement. 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?

The description, combined with the detailed schema and annotations, provides enough information to invoke the tool correctly. There is no output schema, so return-value details are not required, and the parameter permission explanation is handled by the 'element' field 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?

All parameters have clear schema descriptions. The tool description adds an important cross-parameter constraint that at least one of 'paths' or 'data' must be provided, which is not otherwise expressed in 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 action: dropping files or MIME-typed data onto an element. It uses a specific verb and resource, and distinguishes itself from in-page drag operations by specifying 'as if dragged from outside the page'.

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 gives a useful usage constraint ('At least one of paths or data must be provided') and hints at external drag context, but it does not explicitly name sibling tools or state when to prefer this over browser_file_upload or browser_drag.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_emulate_mediaA
Destructive

Emulate CSS media features for the page, for example switch between the light and dark color scheme. Omitted parameters are left unchanged; null clears an override.

NameRequiredDescriptionDefault
mediaNoChanges the CSS media type of the page
contrastNoEmulates the prefers-contrast media feature
colorSchemeNoEmulates the prefers-color-scheme media feature
forcedColorsNoEmulates the forced-colors media feature
reducedMotionNoEmulates the prefers-reduced-motion media feature

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already signal a non-read-only, potentially destructive operation. The description adds genuine behavioral nuance: omitted parameters are left unchanged, and null clears an override, which clarifies how state mutates and how to reset it. This adds value beyond the annotations without contradicting them.

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 tight sentences: the first states the tool's purpose with an example, and the second states the omission/null behavior. No filler is present, and the primary action is front-loaded.

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 five optional parameters and complete schema coverage, the description is largely sufficient. It lacks explicit details about persistence scope or how to clear all overrides at once, but the null-clears-override rule and the schema fill most practical gaps.

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 already documents all five parameters thoroughly, so the baseline is 3. The description adds a cross-cutting semantic not present in the schema: omitted parameters remain unchanged while null clears an override. This distinction is essential for correct invocation.

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 ('Emulate'), names the resource ('CSS media features for the page'), and includes a concrete light/dark example. This clearly distinguishes it from the sibling browser tools and tells an agent exactly what domain it operates on.

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 important invocation semantics: omitted parameters are left unchanged, and null clears an override. However, it does not explicitly state when to prefer this tool over alternatives, though the unique purpose among siblings makes the intended context largely inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_evaluateC
Destructive

Evaluate JavaScript expression on page or element

NameRequiredDescriptionDefault
targetNoExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
filenameNoFile name to save the result to. Relative file names are resolved against the workspace root. If not provided, result is returned as text.
functionYes() => { /* code */ } or (element) => { /* code */ } when element is provided

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, indicating this is a mutating, potentially harmful operation. The description adds no additional behavioral context—no mention of side effects, permission requirements, or what exactly could be destroyed. It essentially restates the tool's name without enriching the safety profile beyond what the annotations already provide.

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 extremely concise—a single sentence. While this is efficient, it lacks any structural breakdown or additional context. It is not front-loaded with critical details like safety warnings or usage hints. It is concise but under-specified, missing the balance between brevity and informativeness.

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 complexity (executes arbitrary JavaScript) and destructive nature, the description is notably incomplete. It does not explain return value format, error handling, or what happens when the function mutates the page. There is no output schema, so the description must cover these aspects, but it fails to do so. The presence of a sibling like browser_run_code_unsafe further highlights the need for differentiation, which is absent.

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 every parameter (target, element, filename, function) is documented in the schema. The description adds no extra semantic information about the parameters, such as how the function signature works or how target interacts with element. Since the schema fully covers parameter meanings, a 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 clearly states the action ('Evaluate JavaScript expression') and the target ('on page or element'). It is specific enough to convey the core function. However, it does not differentiate from the sibling tool browser_run_code_unsafe, which also executes JavaScript, so the agent might struggle to choose between them based solely on the description.

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 gives no guidance on when to use this tool versus alternatives. It does not mention browser_run_code_unsafe or any other relevant sibling, nor does it state any prerequisites, limitations, or conditions that would steer the agent toward or away from this tool. This leaves the agent without clear decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_file_uploadB
Destructive

Upload one or multiple files

NameRequiredDescriptionDefault
pathsNoThe absolute paths to the files to upload. Can be single file or multiple files. If omitted, file chooser is cancelled.

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already indicate destructive behavior and non-read-only semantics, so the description does not need to restate those. However, the description does not mention side effects beyond uploading, such as navigating away, opening or cancelling a file chooser, or potential overwrite behavior, though the parameter description partially covers the cancellation case.

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 and free of filler. Every word contributes meaning, and the parameter description adds necessary details without redundancy.

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 one-parameter tool with no output schema, the description and parameter comment cover the essential input and basic behavior. However, it does not describe what happens after the upload, what success or failure looks like, or how this fits into the broader browser automation workflow, leaving some practical context missing.

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 schema only defines an array of strings, but the parameter description adds important meaning: paths must be absolute, multiple files are allowed, and omitting the parameter cancels the file chooser. This goes beyond the raw schema and helps an agent use the parameter correctly.

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 ('Upload') and the resource ('files'), and specifies 'one or multiple'. It does not explicitly state the destination or context, but the tool name and sibling set make the browser file-upload intent sufficiently clear.

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 gives no guidance on when to use this tool versus alternatives such as browser_drop or other browser interaction tools. It also does not mention prerequisites like whether the file chooser must already be open or how paths should be formatted beyond 'absolute'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_fill_formB
Destructive

Fill multiple form fields

NameRequiredDescriptionDefault
fieldsYesFields to fill in

TDQS

B3.2/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=false and destructiveHint=true, so the write and potentially destructive nature is covered. The description adds the 'multiple form fields' detail but does not disclose additional behavior such as overwriting values or submitting the form.

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 clear sentence with no redundant words or boilerplate. It is appropriately short and easy to parse, though it sacrifices deeper context for brevity.

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?

The rich schema fully documents the nested field objects, including target references, type-specific value behavior, and permission-related element descriptions. Combined with the read-only and destructive annotations, the description is sufficient for correct invocation; only alternative-selection guidance is missing.

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%: the fields array and its nested target, name, type, value, and element properties all have descriptive text. The description itself does not add parameter-level meaning beyond what the schema already provides.

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 'Fill multiple form fields' clearly identifies the action and resource, and the word 'multiple' helps distinguish it from single-field tools like browser_type. It does not explicitly contrast with sibling tools, but the core purpose is unambiguous.

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

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided for when to use this tool instead of alternatives such as browser_type, browser_select_option, or browser_click. The term 'multiple' implies batch usage, but there is no explicit when-to-use or exclusion context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_findA
Read-only

Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.

NameRequiredDescriptionDefault
textNoPlain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both.
regexNoRegular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. "/error/i" for case-insensitive. Provide either text or regex, not both.
filenameNoSave results to a file instead of returning them in the response. Relative file names are resolved against the workspace root.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly/non-destructive/openWorld, so the bar is lower. The description adds valuable behavioral context the annotations don't: matching nodes are returned with surrounding context snippets under their tree path, which sets expectations about result shape and relative cost.

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?

A single dense sentence, front-loaded with what it searches and what it returns. It is efficient, though the third clause (cost comparison) is slightly compressed and could be its own sentence for readability.

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?

No output schema, but the description explains the return values (matching nodes, context snippets, tree paths), which is the key missing piece. For a read-only find tool with full annotation and schema coverage, this is essentially complete.

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 the schema fully documents text, regex, and filename including mutual exclusivity and case sensitivity rules. The description only restates 'text or a regular expression' and adds no syntax detail beyond the schema, so baseline 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?

States a specific verb (search) and resource (accessibility snapshot of the current page) and even describes the return shape. It implicitly distinguishes itself from browser_snapshot by framing itself as the cheaper alternative for locating an element.

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?

Clearly indicates the use case: use this when you only need to locate an element and its ref rather than capture the whole snapshot. The alternative (full snapshot) is described by function but not named explicitly, so routing is clear but not fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_handle_dialogC
Destructive

Handle a dialog

NameRequiredDescriptionDefault
acceptYesWhether to accept the dialog.
promptTextNoThe text of the prompt in case of a prompt dialog.

TDQS

C2.2/5.0
Behavior2/5

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

The annotations indicate readOnlyHint=false and destructiveHint=true, covering the main safety aspect. However, the description adds no detail about side effects, such as submitting a form or canceling a prompt, beyond what the parameter names imply. It does not clearly disclose the consequences of accepting or rejecting.

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 short and lacks necessary detail, making it under-specified. It is terse but not informative enough to guide an agent effectively, similar to a placeholder like 'Process'.

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?

No output schema or additional context is provided. The description does not explain what happens after handling the dialog, how the parameters interact, or any post-conditions. This is insufficient for an agent to fully understand the tool's behavior.

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% with clear descriptions for both 'accept' (boolean) and 'promptText' (string for prompt dialogs). The description does not add extra meaning, but the schema already provides adequate parameter semantics, so the baseline of 3 is appropriate.

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

Purpose3/5

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

The description 'Handle a dialog' identifies the action and resource but is vague. It does not specify the type of dialog (alert, confirm, prompt) or the precise effect, though the 'accept' parameter implies accept/dismiss. It is distinct from sibling tools, but the purpose is under-specified.

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

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool, such as after a dialog appears or in contrast to other browser actions. The description gives no context for the appropriate situation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_hoverA
Destructive

Hover over element on page

NameRequiredDescriptionDefault
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=true, so the description doesn't need to re-state them. The description adds no extra behavioral detail about side effects (e.g., triggering JavaScript events, potential menu changes). With annotations present, the bar is lower, but there's still room for more transparency about outcomes.

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—six words, no redundancy, and perfectly focused on the action. It follows a clear verb-object structure with no extra fluff, making it easy to parse and understand.

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 interaction tool, the description, alongside the parameter schema and annotations, is adequate. It lacks details on return values (but no output schema exists) and does not mention any prerequisites or setup. Given the simplicity, it covers essential context without being overlong.

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?

Both parameters (target and element) have descriptions in the schema, achieving 100% coverage. The tool description does not add further meaning beyond the schema; it simply restates the action. Since schema coverage is complete, a 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 clearly states the action (hover) and the target (element on page). It distinguishes itself from sibling tools like click, drag, and type by specifying the hover action. However, it lacks detail about what the hover does (e.g., showing tooltips or hover menus), but the core purpose is clear.

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 gives no explicit guidance on when to use hover versus other interactions. While it's intuitive that hover is for mouse-over actions, the description doesn't mention edge cases or alternative tools (e.g., use click for activating, hover for previews). It provides minimal implicit usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigateC
Destructive

Navigate to a URL

NameRequiredDescriptionDefault
urlYesThe URL to navigate to

TDQS

C2.7/5.0
Behavior2/5

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

The description does not elaborate on side effects such as discarding the current page, waiting for load, or handling errors. While annotations indicate destructiveHint=true, the description adds no extra context about the navigation behavior beyond the literal 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, direct sentence with no unnecessary words. It is appropriately sized for the simple action, though it could benefit from some additional context 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?

The description lacks important context such as whether navigation waits for page load, how errors are reported, or the impact on the current browsing session. Given the tool modifies state (as indicated by destructiveHint), more context about the navigation behavior would be expected.

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 fully describes the only parameter 'url' with the same text as the description. Since schema coverage is 100%, the description adds no additional meaning or constraints (e.g., format, absolute vs. relative) beyond what is already in 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 clearly states the action 'Navigate to a URL' with a specific resource. It distinguishes from sibling tools like browser_navigate_back by implying forward navigation to a new URL, though it could be more explicit about the effect on the current page.

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

Usage Guidelines1/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 over alternatives. It does not mention scenarios where browser_navigate is preferred over browser_navigate_back or other navigation methods, nor any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_navigate_backA
Destructive

Go back to the previous page in the history

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

The description and annotations are consistent; destructiveHint is true, matching the navigation action which changes the current page. The description adds minimal behavioral context beyond the annotations, but does not contradict them. It does not mention potential side effects like what happens if there is no history or whether it affects new tabs.

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 redundant wording. It directly states the action and target without unnecessary detail, which is ideal for a tool with no parameters.

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, parameterless tool, the description is largely complete. It communicates the essential operation. It could be improved by noting the behavior when there is no previous history entry, but the given context is sufficient for most use cases.

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 tool has zero parameters, so the description does not need to explain parameter semantics. The empty input schema is fully covered by the lack of parameters, making this baseline 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 clearly states the action: 'Go back to the previous page in the history.' It identifies the resource (browser history) and the direction (back), making the core purpose unambiguous. It does not explicitly differentiate from sibling tools like browser_navigate or browser_tabs, but the meaning is clear enough in context.

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 the tool: when the user wants to go back to the previous page in history. However, it provides no explicit guidance on when not to use it, such as when a direct URL navigation via browser_navigate would be more appropriate, or what to do if no prior history exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestA
Read-only

Returns full details (headers and body) of a single network request, or a single part if part is set. Use the number from browser_network_requests.

NameRequiredDescriptionDefault
partNoReturn only this part of the request. Omit to return full details.
indexYes1-based index of the request, as printed by browser_network_requests.
filenameNoFile name to save the result to. Relative file names are resolved against the workspace root. If not provided, output is returned as text.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so no safety disclosure is needed. The description adds that the result includes headers and body and that `part` narrows the output, but it does not describe deeper behavior such as response size, formatting, or error cases. This is acceptable for a read-only 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 focused sentence plus one essential usage pointer. No filler, and the core behavior is front-loaded before the optional part behavior.

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 retrieval tool with one required parameter and complete schema descriptions, the description covers the essential invocation path: select a request from the list, optionally choose a part, and get full details. It does not explain output structure beyond 'headers and body,' but no output schema exists and the tool's behavior is straightforward.

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 schema fully documents index, part, and filename. The description's mention of `part` and the index reference restates schema content rather than adding new meaning. Baseline 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-resource pair ('Returns full details ... of a single network request') and immediately contrasts with the plural sibling by referencing the index from browser_network_requests. This makes the tool's singular, detail-retrieval role unmistakable.

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?

It gives clear context: use an index obtained from browser_network_requests, and optionally narrow to one part via `part`. It does not explicitly state when not to use this tool versus alternatives, but the singular-vs-list relationship to the sibling is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_network_requestsA
Read-only

Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.

NameRequiredDescriptionDefault
filterNoOnly return requests whose URL matches this regexp (e.g. "/api/.*user").
staticYesWhether to include successful static resources like images, fonts, scripts, etc. Defaults to false.
filenameNoFile name to save the network requests to. Relative file names are resolved against the workspace root. If not provided, requests are returned as text.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context by noting the list is numbered and scoped to requests since page load, plus it explicitly points to the companion tool for deeper inspection. No contradiction with annotations.

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 tight sentences, with the core behavior first and the routing instruction second. Every sentence earns its place and there is no redundant wording.

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 read-only listing tool, the description explains what is returned, the page-load scope, and the natural next step for details. The input schema handles parameter semantics and filename behavior, so nothing essential is missing.

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 schema fully documents filter, static, and filename. The tool description does not add parameter-level details, but it does not need to because the schema already carries that burden.

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 a specific verb and resource: 'Returns a numbered list of network requests since loading the page.' It also explicitly distinguishes the tool from its sibling browser_network_request by telling the agent to use that sibling with a number for full details.

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 gives a clear workflow: list requests here, then call browser_network_request with the number for details. This directly tells the agent when to use this tool versus the relevant alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_press_keyB
Destructive

Press a key on the keyboard

NameRequiredDescriptionDefault
keyYesName of the key to press or a character to generate, such as `ArrowLeft` or `a`

TDQS

B3.2/5.0
Behavior2/5

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

The description does not mention any side effects, such as triggering keyboard events or potential destructive behavior. The annotations indicate destructiveHint: true, but the description adds no additional behavioral context beyond 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?

The description is extremely concise — a single sentence that directly conveys the action. No unnecessary information or repetition.

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 action with a single well-defined parameter, the description is adequate. It lacks mention of when to use this tool (e.g., for shortcuts or navigation keys) but is otherwise complete for basic invocation.

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 parameter 'key' is fully described in the schema with examples, and schema coverage is 100%. The description adds minimal extra meaning ('on the keyboard') but doesn't clarify key formats or special keys, which is already covered by 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 clearly states the action (press) and the resource (key on the keyboard). It is distinct from broader actions like navigate or click, though it does not explicitly differentiate from browser_type (typing) or browser_click (clicking).

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 its siblings (e.g., browser_type for text entry or browser_click for mouse actions). The description lacks any contextual cues for choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_resizeB
Destructive

Resize the browser window

NameRequiredDescriptionDefault
widthYesWidth of the browser window
heightYesHeight of the browser window

TDQS

B3.1/5.0
Behavior2/5

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

The description does not disclose any behavioral traits beyond the bare action. Annotations already indicate it is not read-only and is destructive, but the description adds no extra context about side effects like layout reflows or potential viewport changes.

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, short declarative sentence with no unnecessary words. It is perfectly concise and well-structured for the simple action it describes.

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, the description is adequate, but it lacks any extra context such as units (e.g., pixels), constraints, or when resizing might be appropriate. Given the simplicity and schema coverage, it is minimally complete 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 already provides descriptions for both parameters (width and height), achieving 100% coverage. The description adds no additional meaning about the parameters, so it stays at the baseline of 3.

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 (resize) and the resource (browser window), making it distinct from sibling tools like navigate or click. However, it lacks any nuance about whether it resizes the viewport or the entire window, but the core purpose is clear.

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 about when to use this tool versus alternatives. It does not mention scenarios like adjusting viewport for responsive testing or any conditions that would make it preferable to other navigation tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_run_code_unsafeA
Destructive

Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.

NameRequiredDescriptionDefault
codeNoA JavaScript function containing Playwright code to execute. It will be invoked with a single argument, page, which you can use for any page interaction. For example: `async (page) => { await page.getByRole('button', { name: 'Submit' }).click(); return await page.title(); }`
filenameNoLoad code from the specified file. Relative file names are resolved against the workspace root. If both code and filename are provided, code will be ignored.

TDQS

A4.4/5.0
Behavior5/5

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

Even though destructiveHint=true and readOnlyHint=false already signal danger, the description adds crucial context: the code runs in the Playwright server process, can execute arbitrary JavaScript, and is RCE-equivalent. This is more transparent than the annotation alone and gives an agent a concrete safety boundary.

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

Conciseness5/5

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

Two short sentences deliver the action, the resource, the execution context, and a stark safety warning. Every word earns its place, and the danger is front-loaded immediately after the verb.

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 dangerous arbitrary-code tool with no output schema, the description gives the critical context an agent needs: where the code runs and why it is unsafe. It does not describe the return value or error behavior, but given the open-ended nature of the tool and the complete parameter schema, this is a minor gap.

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%, and both 'code' and 'filename' are already well documented in the schema, including the precedence rule when both are provided. The description adds no parameter-specific meaning, but it does not need to because the schema carries the full burden.

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 names a specific verb ('Run'), a specific resource ('a Playwright code snippet'), and immediately identifies the defining scope: arbitrary JavaScript in the Playwright server process. This clearly sets it apart from sibling tools like browser_evaluate, which executes in the page, even though both are code-execution tools.

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 does not name alternatives explicitly, but the 'Unsafe' and 'RCE-equivalent' framing strongly implies this is a last-resort escape hatch rather than a routine tool. It gives enough context for an agent to know it should prefer the safer specialized browser sibling tools unless it truly needs arbitrary Playwright code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_select_optionB
Destructive

Select an option in a dropdown

NameRequiredDescriptionDefault
targetYesExact target element reference from the page snapshot, or a unique element selector
valuesYesArray of values to select in the dropdown. This can be a single value or multiple values.
elementNoHuman-readable element description used to obtain permission to interact with the element

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate destructive=true, so the description does not contradict that. But the description adds no further behavioral detail (e.g., side effects on the page). With annotations present, the bar is lower, and the description is neutral.

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 redundant words. It is well-structured and to the point.

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?

The tool is simple and the schema covers all parameters. The description is short but sufficient for a basic understanding. It does not specify whether values are labels or values, but that is a minor omission given the 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 coverage is 100% with clear parameter descriptions for target and values. The tool description itself does not explain parameters beyond what the schema already provides, so it adds no extra semantic value.

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 target (option in a dropdown), distinguishing it from more general actions like click or type. However, it does not explicitly contrast with sibling tools, so it misses a bit of distinction.

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. It does not mention when selecting is appropriate or when other actions (e.g., click, type) might be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_snapshotA
Read-only

Capture accessibility snapshot of the current page, this is better than screenshot

NameRequiredDescriptionDefault
boxesNoInclude each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect)
depthNoLimit the depth of the snapshot tree
targetNoExact target element reference from the page snapshot, or a unique element selector
filenameNoSave snapshot to a file instead of returning it in the response. Relative file names are resolved against the workspace root.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds that the result is an accessibility snapshot rather than a visual screenshot, which is useful behavioral context, but it does not describe the output structure or any other side effects. With annotations present, this is adequate but not rich.

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

Conciseness5/5

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

The description is a single efficient sentence that front-loads the action and object. The comparative note about screenshots earns its place by helping tool selection without adding bloat.

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?

The tool is simple, read-only, and all parameters are documented in the schema. The description covers the core behavior and differentiates from screenshots, though it could be slightly more explicit about what the returned accessibility snapshot contains given there is no output schema.

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%, with all four parameters clearly documented in the input schema. The description itself adds no parameter-level meaning, so the baseline 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 states a specific verb ('Capture') and resource ('accessibility snapshot of the current page'), making the tool's function immediately clear. It also distinguishes itself from the screenshot alternative, which is directly relevant to sibling browser_take_screenshot.

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

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'this is better than screenshot' provides a clear comparison and implicit routing away from browser_take_screenshot. However, it does not explicitly state when not to use this tool or list other alternatives, so the guidance is context rather than a full routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_tabsA
Destructive

List, create, close, or select a browser tab.

NameRequiredDescriptionDefault
urlNoURL to navigate to in the new tab, used for new.
indexNoTab index, used for close/select. If omitted for close, current tab is closed.
actionYesOperation to perform

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known. However, the description adds no behavioral context beyond what the schema provides (e.g., index omission for close closes current tab is in schema). No mention of side effects like tab switching or browser-level changes.

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 sentence that efficiently lists all supported actions. It is front-loaded with verbs and avoids unnecessary words.

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 has multiple actions and a required action parameter. The description lists the actions but does not explain action-specific requirements (e.g., URL required for new, index for close/select) or edge cases like closing the last tab. Given the schema covers parameter details, the description is adequate but not rich. With no output schema, the agent must infer return values from the action.

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% with each parameter having a description (url, index, action with enum). The tool description adds no parameter-level detail, so it does not go beyond schema. Baseline 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 clearly states the tool's purpose with specific verbs (list, create, close, select) and a specific resource (browser tab). It distinguishes from siblings like browser_close (closes the entire browser) and browser_navigate (navigates current tab) by focusing on tab operations.

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 usage through the list of actions but provides no explicit when-to-use guidance or exclusions. Given siblings like browser_close (closes the entire browser) and browser_navigate (navigates current tab), an agent might benefit from explicit differentiation, but the actions themselves are clear enough that usage is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_take_screenshotA
Read-only

Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.

NameRequiredDescriptionDefault
typeNoImage format for the screenshot. If unset, inferred from the filename extension, otherwise png.
scaleYesImage resolution scale. "css" produces a screenshot sized in CSS pixels (smaller, consistent across devices). "device" produces a high-resolution screenshot using device pixels (larger, accounts for the device pixel ratio). Default is css.css
targetNoExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element
filenameNoFile name to save the screenshot to. Relative file names are resolved against the workspace root. If not specified, the screenshot is saved into the output directory as `page-{timestamp}.{png|jpeg|webp}`.
fullPageNoWhen true, takes a screenshot of the full scrollable page, instead of the currently visible viewport. Cannot be used with element screenshots.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description adds one meaningful behavioral trait beyond annotations: the screenshot is a passive artifact that cannot drive actions. However, it leaves file-saving/output behavior to the schema's filename parameter rather than disclosing it in prose.

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 short sentences, each earning its place: the first states the operation, the second carries the critical usage caveat and sibling routing. No filler or repetition of schema content.

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 read-only tool with a 100%-coverage schema and safety annotations, the definition is nearly complete: purpose, key caveat, and alternative routing are all present. A somewhat richer description could orient agents toward element/fullPage screenshot capabilities, though the schema already documents these.

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%, with detailed documentation for all six parameters including enum semantics (type, scale), defaults, and interaction constraints (fullPage cannot be used with element screenshots). The description adds nothing beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource ('Take a screenshot of the current page') and distinguishes itself from a sibling by noting 'use browser_snapshot for actions.' The action and scope are unambiguous, and the read-only intent matches the title.

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 the agent when NOT to use this tool ('You can't perform actions based on the screenshot') and names the exact alternative ('use browser_snapshot for actions'). This is direct when/when-not routing with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_typeB
Destructive

Type text into editable element

NameRequiredDescriptionDefault
textYesText to type into the element
slowlyNoWhether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once.
submitNoWhether to submit entered text (press Enter after)
targetYesExact target element reference from the page snapshot, or a unique element selector
elementNoHuman-readable element description used to obtain permission to interact with the element

TDQS

B3/5.0
Behavior3/5

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

The annotation destructiveHint=true and readOnlyHint=false already signal that this tool can modify state, so the description does not contradict that. However, the main description adds no additional behavioral context beyond the annotations, such as whether typing overwrites existing content or triggers page events. The parameter descriptions do mention key-handler triggering and Enter submission, but the main description itself stays shallow.

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, focused sentence with no filler or repetition. It front-loads the verb and object, making the tool's primary purpose immediately obvious.

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 tool with several closely related siblings (fill_form, press_key, click), the description is too thin to fully orient an agent. It lacks any mention of when typing is appropriate, how the target is resolved, or what side effects to expect, so the agent must rely on parameter descriptions and external context to make a confident choice.

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 the baseline is 3 because the input schema already documents all five parameters. The main description, 'Type text into editable element,' adds no meaning beyond the schema's parameter descriptions, which already define text, slowly, submit, target, and element clearly enough.

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 states a clear action ('Type text') and a clear target ('editable element'), which distinguishes it from many sibling tools at a high level. It is slightly vague about whether 'editable element' includes textareas, contenteditable regions, or only input fields, but the core purpose is unambiguous.

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

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to prefer this tool over sibling tools such as browser_fill_form or browser_press_key. It does not mention exclusions, prerequisites, or scenarios where typing would be inappropriate, leaving the agent to infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browser_wait_forB
Read-only

Wait for text to appear or disappear or a specified time to pass

NameRequiredDescriptionDefault
textNoThe text to wait for
timeNoThe time to wait in seconds, at most 30
textGoneNoThe text to wait for to disappear

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The word "Wait" adds the blocking semantics that annotations do not convey, which is genuine value. However, the description says nothing about timeout failure behavior, whether the wait polls or blocks, or whether the three conditions may be combined.

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?

One sentence, front-loaded with the verb and covering all three modes without padding. It is efficient, though arguably too terse given the unresolved questions about parameter exclusivity and timeout behavior.

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 three-parameter, zero-required tool with no output schema, the description is minimally viable. The notable gap is that it never states that at least one of text/textGone/time should be supplied, leaving open the possibility of a call with no arguments and no defined behavior.

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 all three parameters are already documented in the schema with their own descriptions. The description maps each clause to a parameter (appear = text, disappear = textGone, time = time), which is mildly helpful but adds no format, range, or interaction detail beyond the schema. Baseline 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 pairs a specific verb ("Wait for") with three concrete conditions: text appearing, text disappearing, or elapsed time. That is enough for an agent to know what the tool does without opening the schema. It does not differentiate itself from any sibling, but no sibling performs a waiting/blocking role, so the risk of confusion is low.

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 versus other tools, no mention that it is typically used to synchronize after clicks/navigation, and no statement about what happens on timeout (error vs. silent return). The agent is left to infer all of this from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 32 tool updatesv0.4.0
    • Changedbrowser_click18 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / button
        Added value: +{
        +  "description": "Button to click, defaults to left",
        +  "enum": [
        +    "left",
        +    "right",
        +    "middle"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / confirm_token
        Removed value: -{
        -  "description": "From a confirmation_required error, after the user approved this action.",
        -  "type": "string"
        -}
      • addedInput schema / properties / doubleClick
        Added value: +{
        +  "description": "Whether to perform a double click instead of a single click",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / element / description
        Previous value: -"Audit-only description of the target."New value: +"Human-readable element description used to obtain permission to interact with the element"
      • removedInput schema / properties / expect
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Outcome to verify after dispatch, exactly one of {\"url\": regex}, {\"url_changed\": true}, {\"new_tab\": true}, {\"selector\": css} (visible; add \"gone\": true, \"value\": str or \"value_changed\": true), {\"text\": str} or {\"text_gone\": str}, plus \"timeout\" ms (default 5000). Unmet: ok=false, code=\"outcome_not_observed\"; the action already ran, so do not blindly repeat it.",
        -  "type": "object"
        -}
      • removedInput schema / properties / first
        Removed value: -{
        -  "default": false,
        -  "description": "A write tool's selector matching several elements fails with ambiguous_target unless true; true acts on the first match.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / modifiers
        Added value: +{
        +  "description": "Modifier keys to press",
        +  "items": {
        +    "enum": [
        +      "Alt",
        +      "Control",
        +      "ControlOrMeta",
        +      "Meta",
        +      "Shift"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / ref
        Removed value: -{
        -  "description": "Prefer a ref from browser_snapshot over a selector.",
        -  "type": "string"
        -}
      • removedInput schema / properties / selector
        Removed value: -{
        -  "description": "e.g. \"#submit\", \".btn-primary\".",
        -  "type": "string"
        -}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Exact target element reference from the page snapshot, or a unique element selector",
        +  "type": "string"
        +}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "default": 10000,
        -  "type": "integer"
        -}
      • removedInput schema / properties / wait
        Removed value: -{
        -  "default": false,
        -  "description": "Wait up to timeout ms for the selector/ref target to exist first (click, double_click, hover, drag: also rendered); on timeout nothing ran (not_found, not_actionable).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / x
        Removed value: -{
        -  "default": 0,
        -  "description": "X coordinate, used without selector/ref.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / y
        Removed value: -{
        -  "default": 0,
        -  "description": "Y coordinate, used without selector/ref.",
        -  "type": "integer"
        -}
      • addedInput schema / required
        Added value: +[
        +  "target"
        +]
    • Addedbrowser_close
    • Addedbrowser_console_messages
    • Removedbrowser_dom
    • Addedbrowser_drag
    • Addedbrowser_drop
    • Addedbrowser_emulate_media
    • Addedbrowser_evaluate
    • Addedbrowser_file_upload
    • Addedbrowser_fill_form
    • Changedbrowser_find8 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "Save results to a file instead of returning them in the response. Relative file names are resolved against the workspace root.",
        +  "type": "string"
        +}
      • removedInput schema / properties / query
        Removed value: -{
        -  "description": "e.g. \"login button\", \"search bar\", \"email input\".",
        -  "type": "string"
        -}
      • addedInput schema / properties / regex
        Added value: +{
        +  "description": "Regular expression to search for in the page snapshot. Matching is case-sensitive by default; wrap the pattern in slashes to add flags, e.g. \"/error/i\" for case-insensitive. Provide either text or regex, not both.",
        +  "type": "string"
        +}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "Plain text to search for in the page snapshot (case-insensitive substring match). Provide either text or regex, not both.",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "query"
        -]
    • Removedbrowser_form_fill
    • Removedbrowser_forms
    • Addedbrowser_handle_dialog
    • Addedbrowser_hover
    • Changedbrowser_navigate7 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / confirm_token
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / expect
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedInput schema / properties / raw
        Removed value: -{
        -  "default": false,
        -  "description": "Open a bare image URL (.jpg/.png/...) raw, not in the scriptable local viewer page (image = #zlimg).",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • changedInput schema / properties / url / description
        Previous value: -"e.g. \"https://example.com\"."New value: +"The URL to navigate to"
    • Addedbrowser_navigate_back
    • Addedbrowser_network_request
    • Addedbrowser_network_requests
    • Removedbrowser_page_info
    • Removedbrowser_page_text
    • Addedbrowser_press_key
    • Addedbrowser_resize
    • Addedbrowser_run_code_unsafe
    • Removedbrowser_screenshot
    • Changedbrowser_select_option16 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / by_text
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • removedInput schema / properties / confirm_token
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / element / description
        Added value: +"Human-readable element description used to obtain permission to interact with the element"
      • removedInput schema / properties / expect
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedInput schema / properties / first
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • removedInput schema / properties / ref
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / selector
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Exact target element reference from the page snapshot, or a unique element selector",
        +  "type": "string"
        +}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "default": 10000,
        -  "type": "integer"
        -}
      • removedInput schema / properties / value
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / values
        Added value: +{
        +  "description": "Array of values to select in the dropdown. This can be a single value or multiple values.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / wait
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • addedInput schema / required
        Added value: +[
        +  "target",
        +  "values"
        +]
    • Changedbrowser_snapshot11 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / boxes
        Added value: +{
        +  "description": "Include each element's bounding box as [box=x,y,width,height] in the snapshot. Coordinates are viewport-relative, in CSS pixels (Element.getBoundingClientRect)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / depth
        Added value: +{
        +  "description": "Limit the depth of the snapshot tree",
        +  "type": "number"
        +}
      • addedInput schema / properties / filename
        Added value: +{
        +  "description": "Save snapshot to a file instead of returning it in the response. Relative file names are resolved against the workspace root.",
        +  "type": "string"
        +}
      • removedInput schema / properties / max_depth
        Removed value: -{
        -  "description": "Depth (>= 0) below the subtree root (body by default); 0 is the root only, omitted all.",
        -  "type": "integer"
        -}
      • removedInput schema / properties / ref
        Removed value: -{
        -  "description": "Subtree root ref, resolved before refs are replaced; wins over selector.",
        -  "type": "string"
        -}
      • removedInput schema / properties / selector
        Removed value: -{
        -  "description": "CSS subtree root (included).",
        -  "type": "string"
        -}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Exact target element reference from the page snapshot, or a unique element selector",
        +  "type": "string"
        +}
      • removedInput schema / properties / text
        Removed value: -{
        -  "default": false,
        -  "description": "Visible text lines (no refs), url, title and tabId, capped at 12,000 chars with a truncation marker.",
        -  "type": "boolean"
        -}
    • Removedbrowser_status
    • Changedbrowser_tabs15 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / action / default
        Removed value: -"list"
      • addedInput schema / properties / action / description
        Added value: +"Operation to perform"
      • removedInput schema / properties / confirm_token
        Removed value: -{
        -  "description": "new/close; see browser_click.",
        -  "type": "string"
        -}
      • removedInput schema / properties / force
        Removed value: -{
        -  "default": false,
        -  "description": "close: disarm beforeunload.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / include_active
        Removed value: -{
        -  "default": false,
        -  "description": "list: add active_page, the active tab's browser_snapshot(text=True).",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / index
        Added value: +{
        +  "description": "Tab index, used for close/select. If omitted for close, current tab is closed.",
        +  "type": "number"
        +}
      • removedInput schema / properties / raw
        Removed value: -{
        -  "default": false,
        -  "description": "new: bypass the image viewer.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "close/select (required).",
        -  "type": "integer"
        -}
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "default": 15000,
        -  "type": "integer"
        -}
      • changedInput schema / properties / url / description
        Previous value: -"new (default about:blank)."New value: +"URL to navigate to in the new tab, used for new."
      • removedInput schema / properties / wait
        Removed value: -{
        -  "default": false,
        -  "description": "new: wait up to timeout ms for the load; returns tabId, final url and status, or on timeout ok=false, timedOut=true with the tab open.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / window_fields
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • addedInput schema / required
        Added value: +[
        +  "action"
        +]
    • Addedbrowser_take_screenshot
    • Changedbrowser_type18 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / clear
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • removedInput schema / properties / confirm_token
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / element / description
        Added value: +"Human-readable element description used to obtain permission to interact with the element"
      • removedInput schema / properties / expect
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedInput schema / properties / first
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • removedInput schema / properties / mode
        Removed value: -{
        -  "default": "type",
        -  "description": "type: typing events, clearing first if clear. fill: replace the value via native setters and input/change events. editable: insert plain text into an editor/input/textarea, appending unless clear. HTML: browser_js.",
        -  "enum": [
        -    "type",
        -    "fill",
        -    "editable"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / ref
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / selector
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / slowly
        Added value: +{
        +  "description": "Whether to type one character at a time. Useful for triggering key handlers in the page. By default entire text is filled in at once.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / submit
        Added value: +{
        +  "description": "Whether to submit entered text (press Enter after)",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / tab_id
        Removed value: -{
        -  "description": "Default: active tab.",
        -  "type": "integer"
        -}
      • addedInput schema / properties / target
        Added value: +{
        +  "description": "Exact target element reference from the page snapshot, or a unique element selector",
        +  "type": "string"
        +}
      • addedInput schema / properties / text / description
        Added value: +"Text to type into the element"
      • removedInput schema / properties / timeout
        Removed value: -{
        -  "default": 10000,
        -  "type": "integer"
        -}
      • removedInput schema / properties / wait
        Removed value: -{
        -  "default": false,
        -  "type": "boolean"
        -}
      • addedInput schema / required
        Added value: +[
        +  "target",
        +  "text"
        +]
    • Addedbrowser_wait_for
  2. 30 tool updatesv0.3.0
    • Removedbrowser_back
    • Removedbrowser_check
    • Changedbrowser_click28 fields changed
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "description": "From a confirmation_required error, after the user approved this action.",
        +  "type": "string"
        +}
      • removedInput schema / properties / element / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / element / default
        Removed value: -null
      • addedInput schema / properties / element / description
        Added value: +"Audit-only description of the target."
      • removedInput schema / properties / element / title
        Removed value: -"Element"
      • addedInput schema / properties / element / type
        Added value: +"string"
      • addedInput schema / properties / expect
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Outcome to verify after dispatch, exactly one of {\"url\": regex}, {\"url_changed\": true}, {\"new_tab\": true}, {\"selector\": css} (visible; add \"gone\": true, \"value\": str or \"value_changed\": true), {\"text\": str} or {\"text_gone\": str}, plus \"timeout\" ms (default 5000). Unmet: ok=false, code=\"outcome_not_observed\"; the action already ran, so do not blindly repeat it.",
        +  "type": "object"
        +}
      • addedInput schema / properties / first
        Added value: +{
        +  "default": false,
        +  "description": "A write tool's selector matching several elements fails with ambiguous_target unless true; true acts on the first match.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / ref / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / ref / default
        Removed value: -null
      • addedInput schema / properties / ref / description
        Added value: +"Prefer a ref from browser_snapshot over a selector."
      • removedInput schema / properties / ref / title
        Removed value: -"Ref"
      • addedInput schema / properties / ref / type
        Added value: +"string"
      • removedInput schema / properties / selector / default
        Removed value: -""
      • addedInput schema / properties / selector / description
        Added value: +"e.g. \"#submit\", \".btn-primary\"."
      • removedInput schema / properties / selector / title
        Removed value: -"Selector"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / wait
        Added value: +{
        +  "default": false,
        +  "description": "Wait up to timeout ms for the selector/ref target to exist first (click, double_click, hover, drag: also rendered); on timeout nothing ran (not_found, not_actionable).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / x / description
        Added value: +"X coordinate, used without selector/ref."
      • removedInput schema / properties / x / title
        Removed value: -"X"
      • addedInput schema / properties / y / description
        Added value: +"Y coordinate, used without selector/ref."
      • removedInput schema / properties / y / title
        Removed value: -"Y"
      • removedInput schema / title
        Removed value: -"browser_clickArguments"
    • Removedbrowser_console_logs
    • Changedbrowser_dom9 fields changed
      • addedInput schema / properties / max_depth
        Added value: +{
        +  "type": "integer"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_domArguments"
    • Changedbrowser_find8 fields changed
      • addedInput schema / properties / query / description
        Added value: +"e.g. \"login button\", \"search bar\", \"email input\"."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_findArguments"
    • Changedbrowser_form_fill11 fields changed
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / expect
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / fields / description
        Added value: +"e.g. {\"email\": \"foo@bar\", \"Password\": \"...\", \"#submit-target\": true}"
      • removedInput schema / properties / fields / title
        Removed value: -"Fields"
      • addedInput schema / properties / first
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_form_fillArguments"
    • Changedbrowser_forms6 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_formsArguments"
    • Removedbrowser_forward
    • Removedbrowser_handle_dialog
    • Removedbrowser_hover
    • Removedbrowser_js
    • Removedbrowser_keypress
    • Removedbrowser_markdown
    • Changedbrowser_navigate12 fields changed
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / expect
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / raw / description
        Added value: +"Open a bare image URL (.jpg/.png/...) raw, not in the scriptable local viewer page (image = #zlimg)."
      • removedInput schema / properties / raw / title
        Removed value: -"Raw"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • addedInput schema / properties / url / description
        Added value: +"e.g. \"https://example.com\"."
      • removedInput schema / properties / url / title
        Removed value: -"Url"
      • removedInput schema / title
        Removed value: -"browser_navigateArguments"
    • Changedbrowser_page_info6 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_page_infoArguments"
    • Changedbrowser_page_text6 fields changed
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab; others are read without focusing."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_page_textArguments"
    • Changedbrowser_screenshot24 fields changed
      • removedInput schema / properties / data_url / title
        Removed value: -"Data Url"
      • removedInput schema / properties / element / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / element / default
        Removed value: -null
      • removedInput schema / properties / element / title
        Removed value: -"Element"
      • addedInput schema / properties / element / type
        Added value: +"string"
      • removedInput schema / properties / full_page / title
        Removed value: -"Full Page"
      • removedInput schema / properties / ref / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / ref / default
        Removed value: -null
      • removedInput schema / properties / ref / title
        Removed value: -"Ref"
      • addedInput schema / properties / ref / type
        Added value: +"string"
      • removedInput schema / properties / save_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / save_to / default
        Removed value: -null
      • removedInput schema / properties / save_to / title
        Removed value: -"Save To"
      • addedInput schema / properties / save_to / type
        Added value: +"string"
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / selector / default
        Removed value: -null
      • removedInput schema / properties / selector / title
        Removed value: -"Selector"
      • addedInput schema / properties / selector / type
        Added value: +"string"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / title
        Removed value: -"browser_screenshotArguments"
    • Removedbrowser_scroll
    • Changedbrowser_select_option24 fields changed
      • removedInput schema / properties / by_text / title
        Removed value: -"By Text"
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / element / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / element / default
        Removed value: -null
      • removedInput schema / properties / element / title
        Removed value: -"Element"
      • addedInput schema / properties / element / type
        Added value: +"string"
      • addedInput schema / properties / expect
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / first
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / properties / ref / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / ref / default
        Removed value: -null
      • removedInput schema / properties / ref / title
        Removed value: -"Ref"
      • addedInput schema / properties / ref / type
        Added value: +"string"
      • removedInput schema / properties / selector / default
        Removed value: -""
      • removedInput schema / properties / selector / title
        Removed value: -"Selector"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10000,
        +  "type": "integer"
        +}
      • removedInput schema / properties / value / default
        Removed value: -""
      • removedInput schema / properties / value / title
        Removed value: -"Value"
      • addedInput schema / properties / wait
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / title
        Removed value: -"browser_select_optionArguments"
    • Changedbrowser_snapshot22 fields changed
      • removedInput schema / properties / max_depth / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / max_depth / default
        Removed value: -null
      • addedInput schema / properties / max_depth / description
        Added value: +"Depth (>= 0) below the subtree root (body by default); 0 is the root only, omitted all."
      • removedInput schema / properties / max_depth / title
        Removed value: -"Max Depth"
      • addedInput schema / properties / max_depth / type
        Added value: +"integer"
      • removedInput schema / properties / ref / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / ref / default
        Removed value: -null
      • addedInput schema / properties / ref / description
        Added value: +"Subtree root ref, resolved before refs are replaced; wins over selector."
      • removedInput schema / properties / ref / title
        Removed value: -"Ref"
      • addedInput schema / properties / ref / type
        Added value: +"string"
      • removedInput schema / properties / selector / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / selector / default
        Removed value: -null
      • addedInput schema / properties / selector / description
        Added value: +"CSS subtree root (included)."
      • removedInput schema / properties / selector / title
        Removed value: -"Selector"
      • addedInput schema / properties / selector / type
        Added value: +"string"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • addedInput schema / properties / text
        Added value: +{
        +  "default": false,
        +  "description": "Visible text lines (no refs), url, title and tabId, capped at 12,000 chars with a truncation marker.",
        +  "type": "boolean"
        +}
      • removedInput schema / title
        Removed value: -"browser_snapshotArguments"
    • Changedbrowser_status1 field changed
      • removedInput schema / title
        Removed value: -"browser_statusArguments"
    • Removedbrowser_submit_form
    • Changedbrowser_tabs21 fields changed
      • removedInput schema / properties / action / title
        Removed value: -"Action"
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "description": "new/close; see browser_click.",
        +  "type": "string"
        +}
      • addedInput schema / properties / force / description
        Added value: +"close: disarm beforeunload."
      • removedInput schema / properties / force / title
        Removed value: -"Force"
      • addedInput schema / properties / include_active
        Added value: +{
        +  "default": false,
        +  "description": "list: add active_page, the active tab's browser_snapshot(text=True).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / raw / description
        Added value: +"new: bypass the image viewer."
      • removedInput schema / properties / raw / title
        Removed value: -"Raw"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"close/select (required)."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 15000,
        +  "type": "integer"
        +}
      • removedInput schema / properties / url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / url / default
        Removed value: -null
      • addedInput schema / properties / url / description
        Added value: +"new (default about:blank)."
      • removedInput schema / properties / url / title
        Removed value: -"Url"
      • addedInput schema / properties / url / type
        Added value: +"string"
      • addedInput schema / properties / wait
        Added value: +{
        +  "default": false,
        +  "description": "new: wait up to timeout ms for the load; returns tabId, final url and status, or on timeout ok=false, timedOut=true with the tab open.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / window_fields
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / title
        Removed value: -"browser_tabsArguments"
    • Changedbrowser_type26 fields changed
      • removedInput schema / properties / clear / title
        Removed value: -"Clear"
      • addedInput schema / properties / confirm_token
        Added value: +{
        +  "type": "string"
        +}
      • removedInput schema / properties / element / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / element / default
        Removed value: -null
      • removedInput schema / properties / element / title
        Removed value: -"Element"
      • addedInput schema / properties / element / type
        Added value: +"string"
      • addedInput schema / properties / expect
        Added value: +{
        +  "additionalProperties": true,
        +  "type": "object"
        +}
      • addedInput schema / properties / first
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / mode / description
        Added value: +"type: typing events, clearing first if clear. fill: replace the value via native setters and input/change events. editable: insert plain text into an editor/input/textarea, appending unless clear. HTML: browser_js."
      • removedInput schema / properties / mode / title
        Removed value: -"Mode"
      • removedInput schema / properties / ref / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / ref / default
        Removed value: -null
      • removedInput schema / properties / ref / title
        Removed value: -"Ref"
      • addedInput schema / properties / ref / type
        Added value: +"string"
      • removedInput schema / properties / selector / default
        Removed value: -""
      • removedInput schema / properties / selector / title
        Removed value: -"Selector"
      • removedInput schema / properties / tab_id / anyOf
        Removed value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / tab_id / default
        Removed value: -null
      • addedInput schema / properties / tab_id / description
        Added value: +"Default: active tab."
      • removedInput schema / properties / tab_id / title
        Removed value: -"Tab Id"
      • addedInput schema / properties / tab_id / type
        Added value: +"integer"
      • removedInput schema / properties / text / default
        Removed value: -""
      • removedInput schema / properties / text / title
        Removed value: -"Text"
      • addedInput schema / properties / timeout
        Added value: +{
        +  "default": 10000,
        +  "type": "integer"
        +}
      • addedInput schema / properties / wait
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • removedInput schema / title
        Removed value: -"browser_typeArguments"
    • Removedbrowser_upload_file
    • Removedbrowser_wait_for
    • Removedbrowser_watch_console
    • Removedbrowser_workflow
    • Removedbrowser_workflows
  3. 93 tool updates
    • Removedbrowser_audit
    • Removedbrowser_batch
    • Removedbrowser_blur
    • Removedbrowser_bounds
    • Removedbrowser_broadcast
    • Removedbrowser_cache
    • Removedbrowser_capture_network
    • Changedbrowser_check4 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / selector / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "selector"
        -]
    • Removedbrowser_clear_browsing_data
    • Changedbrowser_click2 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
    • Removedbrowser_click_and_wait_navigation
    • Removedbrowser_clipboard
    • Removedbrowser_close_tab
    • Removedbrowser_close_window
    • Removedbrowser_computed_style
    • Removedbrowser_cookies
    • Removedbrowser_create_window
    • Removedbrowser_delete_session
    • Removedbrowser_detach_tab
    • Removedbrowser_double_click
    • Removedbrowser_downloads
    • Removedbrowser_drag
    • Removedbrowser_duplicate_tab
    • Removedbrowser_element_screenshot
    • Removedbrowser_explain_selector
    • Removedbrowser_fill
    • Removedbrowser_focus
    • Removedbrowser_focus_window
    • Removedbrowser_full_page_metrics
    • Removedbrowser_full_page_screenshot
    • Removedbrowser_get_policy
    • Removedbrowser_get_zoom
    • Addedbrowser_handle_dialog
    • Removedbrowser_health
    • Removedbrowser_highlight
    • Changedbrowser_hover4 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / selector / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "selector"
        -]
    • Removedbrowser_html
    • Removedbrowser_iframes
    • Removedbrowser_images
    • Removedbrowser_intercept
    • Removedbrowser_keep_alive
    • Removedbrowser_keep_alive_stop
    • Changedbrowser_keypress2 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
    • Removedbrowser_links
    • Removedbrowser_list_sessions
    • Removedbrowser_list_tags
    • Removedbrowser_load_session
    • Removedbrowser_logs
    • Changedbrowser_markdown2 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
    • Removedbrowser_meta
    • Removedbrowser_move_tab
    • Removedbrowser_mute_tab
    • Removedbrowser_new_tab
    • Removedbrowser_page_text_by_tab_id
    • Removedbrowser_parallel
    • Removedbrowser_pin_tab
    • Removedbrowser_pool_acquire
    • Removedbrowser_pool_release
    • Removedbrowser_query
    • Removedbrowser_readability
    • Removedbrowser_reload_extension
    • Removedbrowser_reload_tab
    • Removedbrowser_resolve_tag
    • Removedbrowser_retry
    • Removedbrowser_save_session
    • Removedbrowser_scheduler
    • Changedbrowser_screenshot7 fields changed
      • addedInput schema / properties / data_url
        Added value: +{
        +  "default": false,
        +  "title": "Data Url",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / full_page
        Added value: +{
        +  "default": false,
        +  "title": "Full Page",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / save_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Save To"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Selector"
        +}
      • addedInput schema / properties / tab_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tab Id"
        +}
    • Changedbrowser_scroll3 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / selector
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Selector"
        +}
    • Changedbrowser_select_option5 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / selector / default
        Added value: +""
      • addedInput schema / properties / value / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "selector",
        -  "value"
        -]
    • Removedbrowser_set_editable_content
    • Removedbrowser_set_policy
    • Removedbrowser_set_zoom
    • Addedbrowser_snapshot
    • Removedbrowser_storage
    • Removedbrowser_structured_data
    • Changedbrowser_submit_form2 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
    • Removedbrowser_switch_tab
    • Removedbrowser_sync_barrier
    • Removedbrowser_tab_pool
    • Changedbrowser_tabs5 fields changed
      • addedInput schema / properties / action
        Added value: +{
        +  "default": "list",
        +  "enum": [
        +    "list",
        +    "new",
        +    "close",
        +    "select"
        +  ],
        +  "title": "Action",
        +  "type": "string"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "default": false,
        +  "title": "Force",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / raw
        Added value: +{
        +  "default": false,
        +  "title": "Raw",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / tab_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tab Id"
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Url"
        +}
    • Removedbrowser_tag_tab
    • Removedbrowser_trusted_click
    • Changedbrowser_type6 fields changed
      • addedInput schema / properties / element
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Element"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "type",
        +  "enum": [
        +    "type",
        +    "fill",
        +    "editable"
        +  ],
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Ref"
        +}
      • addedInput schema / properties / selector / default
        Added value: +""
      • addedInput schema / properties / text / default
        Added value: +""
      • removedInput schema / required
        Removed value: -[
        -  "selector",
        -  "text"
        -]
    • Removedbrowser_untag_tab
    • Addedbrowser_wait_for
    • Removedbrowser_wait_for_element
    • Removedbrowser_wait_for_network_idle
    • Removedbrowser_wait_for_result
    • Removedbrowser_wait_for_title
    • Removedbrowser_wait_for_url
    • Removedbrowser_wake_tab
    • Removedbrowser_windows
    • Removedbrowser_wp_html
  4. 106 tool updatesv0.1.0
    • First observedbrowser_audit
    • First observedbrowser_back
    • First observedbrowser_batch
    • First observedbrowser_blur
    • First observedbrowser_bounds
    • First observedbrowser_broadcast
    • First observedbrowser_cache
    • First observedbrowser_capture_network
    • First observedbrowser_check
    • First observedbrowser_clear_browsing_data
    • First observedbrowser_click
    • First observedbrowser_click_and_wait_navigation
    • First observedbrowser_clipboard
    • First observedbrowser_close_tab
    • First observedbrowser_close_window
    • First observedbrowser_computed_style
    • First observedbrowser_console_logs
    • First observedbrowser_cookies
    • First observedbrowser_create_window
    • First observedbrowser_delete_session
    • First observedbrowser_detach_tab
    • First observedbrowser_dom
    • First observedbrowser_double_click
    • First observedbrowser_downloads
    • First observedbrowser_drag
    • First observedbrowser_duplicate_tab
    • First observedbrowser_element_screenshot
    • First observedbrowser_explain_selector
    • First observedbrowser_fill
    • First observedbrowser_find
    • First observedbrowser_focus
    • First observedbrowser_focus_window
    • First observedbrowser_form_fill
    • First observedbrowser_forms
    • First observedbrowser_forward
    • First observedbrowser_full_page_metrics
    • First observedbrowser_full_page_screenshot
    • First observedbrowser_get_policy
    • First observedbrowser_get_zoom
    • First observedbrowser_health
    • First observedbrowser_highlight
    • First observedbrowser_hover
    • First observedbrowser_html
    • First observedbrowser_iframes
    • First observedbrowser_images
    • First observedbrowser_intercept
    • First observedbrowser_js
    • First observedbrowser_keep_alive
    • First observedbrowser_keep_alive_stop
    • First observedbrowser_keypress
    • First observedbrowser_links
    • First observedbrowser_list_sessions
    • First observedbrowser_list_tags
    • First observedbrowser_load_session
    • First observedbrowser_logs
    • First observedbrowser_markdown
    • First observedbrowser_meta
    • First observedbrowser_move_tab
    • First observedbrowser_mute_tab
    • First observedbrowser_navigate
    • First observedbrowser_new_tab
    • First observedbrowser_page_info
    • First observedbrowser_page_text
    • First observedbrowser_page_text_by_tab_id
    • First observedbrowser_parallel
    • First observedbrowser_pin_tab
    • First observedbrowser_pool_acquire
    • First observedbrowser_pool_release
    • First observedbrowser_query
    • First observedbrowser_readability
    • First observedbrowser_reload_extension
    • First observedbrowser_reload_tab
    • First observedbrowser_resolve_tag
    • First observedbrowser_retry
    • First observedbrowser_save_session
    • First observedbrowser_scheduler
    • First observedbrowser_screenshot
    • First observedbrowser_scroll
    • First observedbrowser_select_option
    • First observedbrowser_set_editable_content
    • First observedbrowser_set_policy
    • First observedbrowser_set_zoom
    • First observedbrowser_status
    • First observedbrowser_storage
    • First observedbrowser_structured_data
    • First observedbrowser_submit_form
    • First observedbrowser_switch_tab
    • First observedbrowser_sync_barrier
    • First observedbrowser_tab_pool
    • First observedbrowser_tabs
    • First observedbrowser_tag_tab
    • First observedbrowser_trusted_click
    • First observedbrowser_type
    • First observedbrowser_untag_tab
    • First observedbrowser_upload_file
    • First observedbrowser_wait_for_element
    • First observedbrowser_wait_for_network_idle
    • First observedbrowser_wait_for_result
    • First observedbrowser_wait_for_title
    • First observedbrowser_wait_for_url
    • First observedbrowser_wake_tab
    • First observedbrowser_watch_console
    • First observedbrowser_windows
    • First observedbrowser_workflow
    • First observedbrowser_workflows
    • First observedbrowser_wp_html

TDQS

B3.2/5.0

Scored across 25 tools

Disambiguation4/5

Most tools target clearly distinct actions (click, hover, drag, select_option, wait_for), and paired tools like browser_network_requests vs browser_network_request are explicitly linked in their descriptions. A few boundaries are fuzzy: browser_type vs browser_fill_form vs browser_press_key, browser_drag vs browser_drop, and browser_evaluate vs browser_run_code_unsafe, though descriptions mostly clarify the differences.

Naming Consistency4/5

All tools share a browser_ prefix with snake_case, giving a predictable pattern. Minor deviations exist: some are verb_noun (browser_fill_form), some verb-only (browser_close, browser_hover), and some noun-only (browser_snapshot, browser_tabs), but overall the naming is readable and uniform.

Tool Count3/5

25 tools is at the heavy end of the acceptable range. The surface mirrors Playwright's API reasonably well, so each tool has a purpose, but the set is large enough that an agent may struggle to pick the right low-level tool without guidance.

Completeness4/5

The set covers navigation, interaction, forms, uploads, dialogs, tabs, network inspection, console messages, screenshots/snapshots, and JS evaluation—essentially a full browser automation lifecycle. Minor gaps like cookie/storage management or forward navigation are workable via browser_evaluate.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to drive a user-launched Firefox instance via its native Marionette protocol, providing precise DOM actuation like clicking, typing, uploading files, taking screenshots, and evaluating JavaScript.
    18
    12 npm
    1
    GPL 2.0
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to control existing Chrome and Firefox browser sessions locally, including tab management, navigation, form filling, screenshots, and persistent scripts, without remote relays or debugging ports.
    14 npm
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to operate a real, logged-in Firefox session through an extension, including tab and history management, page reading, screenshots, and clicking, typing, or scrolling on domains the user approves.
    14 npm
    MIT