BrowserAttach
BrowserAttach is a stdio MCP server for driving existing Chrome/Edge tabs and profiles through a locally paired extension while preserving sign-in state.
Discover connected browser profiles and tabs, claim a tab exclusively, and open/activate/release/close tabs.
Read accessibility trees, page text, control state, field values, frames, and console/network/navigation logs.
Click, hover, drag, type, fill, press keys, select options, scroll, wait for conditions, and run ordered batches.
Navigate and go back/forward, handle JS dialogs, upload files, and capture viewport/full-page/element screenshots.
Evaluate JavaScript in pages, fetch HTTP(S) URLs in a temporary background tab using the profile’s sign-in, and opt in to bounded redacted network details.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BrowserAttachclick the Approve button on my open pull request tab and confirm the dialog"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BrowserAttach
Drive the Chrome / Edge tabs you already have open and already signed in from an MCP client. BrowserAttach connects to the browser through a locally paired extension, keeps your existing sign-in state, and needs neither a remote debugging port nor a separate automation browser.
npm · Usage guide · Architecture · Agent integration · Test report · Issues · Contributing
What it does
Discover multiple browser profiles, pick one precisely, claim a tab exclusively, and release it when done.
Control existing ordinary
file://tabs after enabling BrowserAttach's Allow access to file URLs setting in the browser's extension details; use the same discovery, claim, observation and input tools.Read the accessibility tree, query names/values/nearby field context, inspect field values and supported editor models; click, fill and type through refs or strict CSS/XPath, HTML label, placeholder and AX role/name locators. Type can also target the currently focused field explicitly.
Native pointer hover, stepped drags and conditional waits; select HTML options without opening a native popup.
Navigate and go back/forward, open or close tabs, handle JavaScript dialogs, upload local files, and capture the whole page or a single element.
Evaluate JavaScript expressions in the main page; read console, page-error, network and navigation logs captured after claiming, with bounded available stacks and request initiators; opt in to bounded, redacted request/response details when XHR/fetch needs verification.
Read one HTTP(S) URL in a temporary background tab with the profile's sign-in, returning rendered text, current DOM, or complete JSON with the main-document HTTP status when observed.
Standard stdio MCP with 24 tools. The Hub listens on loopback only and pairs with the extension through a random key.
Related MCP server: byob
Requirements
Node.js 22 or newer, plus npm.
Chrome / Edge 125 or newer with permission to load unpacked extensions. Latest stable is recommended.
An MCP client that speaks stdio MCP and can find Node/npm on
PATH.
Quick start
1. Install and pair
npm install --global @evan_zhong/browser-attach
browser-attach setupsetup prints a stable extension directory and starts the local Hub. The directory is usually:
Windows:
%USERPROFILE%\.browser-attach\extensionmacOS / Linux:
~/.local/share/browser-attach/extension
Open chrome://extensions or edge://extensions, enable developer mode, choose "Load unpacked" and load that directory. Load it once for every browser profile you want to expose; the extension options page lets you set a recognizable profile name.
Or without a global install:
npx --yes --package=@evan_zhong/browser-attach@latest browser-attach setup2. Configure the MCP client
Merge the following into your client's MCP configuration, or see mcp-config.json:
{
"mcpServers": {
"browser_attach": {
"command": "npx",
"args": ["--yes", "--package=@evan_zhong/browser-attach@latest", "browser-attach", "mcp"]
}
}
}On Windows clients that require a full command extension, use npx.cmd. With a global install you can also configure "command": "browser-attach", "args": ["mcp"]. Restart the MCP client to discover the tools.
@latest selects the package at launch; upgrading an existing pair is coordinated at startup. The first extension load, and pairs still on an older protocol, need one manual extension reload — see local data and upgrades.
Host entry points are collected in agent integration, and the connection parameters, JSON/TOML examples and verification steps are in the setup reference; other clients use the stdio entry above.
The npm package includes an optional browser-attach skill with setup, recovery and cross-site recipes. Copy the whole skills/browser-attach directory to your host's skill location if desired; npm installation does not register it with the host.
3. Start driving
browser_discover(kind="browsers")→browser_discover(kind="tabs")to confirm the browser, tab title and URL.browser_claim_tabwith thetab_idfromdiscover(kind="tabs")(optionalexpected_url/expected_titleexact guards) to take control and receive this connection'stab_handle.browser_snapshotto get elementrefs, then click, fill or run other actions.Observe when the next decision needs new state, and finish with
browser_tab_control(action="release"). Usesnapshot(diff_since="latest")or actionobserve:{diff_since:"latest"}for page changes; inspectmode/reset_reasonand finish pagination. A full-page refresh is not required after every action.
When titles change often, omit expected_title and check the identity returned by claim instead. Elements may be addressed by ref or by a selector re-resolved on every call; design trade-offs: architecture notes.
Claiming and ordinary input never activate a tab or window; call browser_tab_control(action="activate") explicitly when foreground rendering is needed. When an outcome is unknown, observe again first and avoid duplicate submissions. Full parameters, pagination, uploads and input semantics: usage guide.
Tools
Tool | Purpose |
|
|
| Exclusively claim a discovered tab |
| Create a tab, optionally claim it with |
| Read one HTTP(S) URL in a temporary background tab using the profile's sign-in; |
| AX snapshot, literal name/value query with actionable refs, and page text |
| Control state, related popups and active/selected options; preserves existing refs |
| Read-only checks with uniform expected/actual, pass/fail/unavailable and safe read retry; one top-level condition or |
| Native/DOM input, pointer hover and drag, option selection, character typing and scrolling |
| Run 1–30 click/fill/type/press_key/hover/scroll/select_option/wait steps in one queue; stops on the first failure and returns partial results |
| HTTP(S)/file navigation, back/forward and load waiting; local destinations require file access |
| alert, confirm, prompt |
| Native file input or an intercepted file chooser |
| Viewport or full-page PNG with coordinate mapping |
| Main-page JS evaluation, promise awaiting, bounded results |
| Read |
Local data and upgrades
Platform | Default data directory |
Windows |
|
macOS / Linux |
|
Override it explicitly with the absolute path BROWSER_ATTACH_HOME. The Windows default avoids AppData, which packaged hosts may virtualize; no other host's private cache is searched or merged automatically. The directory holds the pairing configuration, Hub logs and the stable extension copy, and depends on neither the clone location, the client working directory nor the npm cache. If you already use a custom directory, keep using the same environment variable or --config instead of accidentally creating a second pairing under the new default.
A host assembly step that writes the client entry pins the absolute paths of the current Node, CLI and the actual pairing file and sets BROWSER_ATTACH_HOME; it works together with a custom --config. When the MCP launches the Hub it passes the same absolute pairing path and directory, so different launch environments cannot derive a second configuration. See agent integration.
To upgrade, install again with the command from step 1 and reconnect the MCP client. With @latest and a pair on 0.17 or newer the restart is enough; a pair still on an older protocol needs browser-attach stop, a restart and one manual extension reload. Custom pairing paths, ports and extension directories are retained, closed browser profiles update when they next connect, and an older MCP package cannot downgrade a newer Hub or installed extension.
An upgrade waits for extension cleanup and confirms the new version after reload; cleanup or reload failures are reported instead of replaying page actions. Manual reload remains available on the extension options page for recovery, and Hub and extension versions must match for page control. The default port is 47831; choose another port with setup --port when creating a pairing.
Architecture and boundaries
MCP client → Node.js stdio MCP → 127.0.0.1 Hub
↕ local pairing
Chrome / Edge MV3 extension
↓ chrome.debugger / CDP
existing HTTP(S) / authorized file:// tabsEach MCP connection holds its own control and handles cannot be used across connections. Disconnecting or stopping debugging releases control. The client endpoint requires a Bearer key and rejects web page Origins; the extension verifies a fixed Origin, key and version. browser_evaluate can read and write data with the page's existing sign-in state; a timeout or error may already have had an effect and must not be replayed automatically. No generic CDP tool is exposed.
Logs are collected from claim time, survive navigation and are cleared on release, with bounded buffers that report data_loss on eviction. Buffered reads use the existing claim without requiring a supported or responsive current page; capture changes still require page access. Network logs store lifecycle metadata and available initiators by default; an explicit capture reads bounded, redacted headers/bodies of subsequent XHR/fetch requests without changing caches or intercepting traffic. Navigation requests and commits remain separate observations. Buffer limits and parameters: usage guide.
The extension holds debugger permission and client actions can use existing site sign-in state; only connect clients you trust. Web page content must not be treated as user authorization. The pairing key and the generated config.generated.js must not be committed or published; the packaging check rejects packages that contain that file.
Chrome / Edge HTTP(S) pages and existing ordinary file:// tabs with extension file access enabled are supported, and file access is checked during discovery, claim, operations and navigation. open_tab and fetch still accept HTTP(S) only. Browser internal pages, arbitrary extension pages, download management, network interception and Firefox / WebKit remain outside scope, and built-in PDF viewer content is browser-dependent. Native pointer input requires an unsuspended tab in a non-minimized window; an unmodified left single click may target an inactive tab, while hover, drag and other click variants require an active tab. Full limits and failure modes: usage guide.
Local development
git clone https://github.com/EvannZhongg/BrowserAttach.git
cd BrowserAttach
npm ci
npm test
npm run test:packageRun the source directly and pair the extension in the repository:
node bin/browser-attach.mjs setup --extension-dir ./extension
node bin/browser-attach.mjs mcpDevelopment mode deliberately uses the repository extension path. For normal installs, use setup without --extension-dir so it keeps working after the repository moves.
Real-browser tests need a Chromium / Edge executable that allows loading extensions from the command line; the path is supplied by the developer:
npm run test:live -- --executable /path/to/chromium --family chromium
npm run test:interaction -- --executable /path/to/chromium --family chromium
npm run test:interaction -- --tab-indicators --executable /path/to/chromium --family chromium
npm run test:upgrade -- --executable /path/to/chromiumThese tests use temporary profiles and local fixtures. Coverage and limits: test report; implementation and design trade-offs: architecture.
Contributing
Reproducible issues via Issues, or Pull Requests. Please include Node, OS, browser and extension versions, and remove pairing keys and private page data. See CONTRIBUTING.md for the process.
Released under the MIT License.
Available Tools
24 toolsbrowser_batchA
Run ordered steps in one tab queue under a shared deadline; per-step timeouts cap remaining time. Prevalidates all steps, including skipped ones. Stops on failure with failed_step/prior results and isError; no rollback or automatic replay.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Element steps require selector; type uses selector XOR focused=true; press_key optionally guards focus with selector; scroll may omit target, wait follows condition. Step observe uses a fresh selector; batch observe reads at the end. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector="link", name="Claim" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. ["#frame"]). Steps may override dialog_policy. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| start_at | No | Explicitly skip a reviewed completed prefix. | |
| tab_handle | Yes | ||
| timeout_ms | No | ||
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does so well: shared deadline semantics, per-step timeouts capping remaining budget, prevalidation of all steps, stop-on-failure returning failed_step/prior results with isError, and explicit 'no rollback or automatic replay'. It omits that steps mutate live page state and says nothing about step-count limits (maxItems 30).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, execution model stated first followed by validation and failure semantics. Every clause carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param tool taking a polymorphic array of up to 30 steps with no output schema, the description covers the failure-mode return shape (failed_step/prior results/isError) and execution budget model. Gaps remain around success-path return values and how tab_handle is obtained, which matter for first-time invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage the description adds real value on timeout_ms ('shared deadline; per-step timeouts cap remaining time') and start_at ('prevalidates all steps, including skipped ones'), which the schema does not explain. However it says nothing about tab_handle (presumably from browser_claim_tab/browser_open_tab) or dialog_policy, leaving two parameters to the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
'Run ordered steps in one tab queue' states a specific verb and resource, and the batching nature implicitly distinguishes it from the single-action siblings (browser_click, browser_type, etc.). It never names those siblings explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Behavioral rules (shared deadline, prevalidation, stop-on-failure) imply batch use for multi-step flows, but there is no explicit 'use this instead of N separate calls' or 'when not to batch'. The start_at skip path is only hinted at via 'including skipped ones'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_claim_tabB
Exclusively claim a tab_id from this connection's latest tab discovery; optional expected_url/title must match exactly.
| Name | Required | Description | Default |
|---|---|---|---|
| tab_id | Yes | ||
| browser_id | Yes | ||
| expected_url | No | ||
| expected_title | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose two real traits — that claiming is exclusive (implying a lock/ownership state change) and that expected_url/expected_title must match exactly. It omits what happens on mismatch (error vs. no-op), whether another connection's claim blocks this one, and whether the claim is released.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single densely packed sentence with the core constraint (latest discovery) and the validation rule front-loaded. No filler, though 'Exclusively claim' is compact to the point of ambiguity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation-ish tool with no annotations, no output schema, and no schema descriptions, the definition is thin. It leaves unaddressed what the claim returns, what error a mismatched URL yields, and how browser_id relates to 'this connection'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across four parameters, so the description must compensate: it explains tab_id's origin and that expected_url/expected_title are exact-match guards. browser_id is required yet never explained, and no format or value examples are given for any parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('claim') on a specific resource ('tab_id') and pins the source to 'this connection's latest tab discovery', which separates it from browser_discover (finds tabs) and browser_open_tab (creates one). The word 'exclusively' hints at an ownership/locking semantic that is not quite nailed down.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from this connection's latest tab discovery' implies a prerequisite call to browser_discover before this tool can be used, which is useful routing. It never states when not to use it or contrasts it with browser_open_tab / browser_tab_control, and no failure preconditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_clickB
Click exactly one ref/selector/x+y; elements auto-scroll and may recenter once before dispatch, with hit checks. Unmodified left single clicks may target inactive tabs. Native target_verified requires an element; coordinates return null and verify trusted delivery to the hit only. Native select requires select_option.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| mode | No | DOM: ref/selector, left single click, no modifiers. | native |
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| button | No | left | |
| offset | No | Native element only: ratios within its content quad; hit checks still apply. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| modifiers | No | ||
| settle_ms | No | After preparation, before dispatch: ms or uniform [min,max]; min<=max. | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| click_count | No | ||
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. | |
| coordinate_space | No | x+y only; document scrolls the top-level page first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully describes auto-scrolling, recentering once before dispatch, hit checks, inactive-tab targeting, and trusted-delivery verification for coordinates. But it omits behavior for many of the 20 parameters, such as `dialog_policy`, `observe`, `modifiers`, `click_count`, and `settle_ms`, leaving substantial behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core action and target selection. Sentences are dense but most earn their place; however, the 'target_verified' sentence is jargon-heavy and could be clearer, slightly reducing readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex 20-parameter tool with no annotations and no output schema. The description covers some important behaviors but leaves major gaps around return values, dialog handling, observation semantics, modifier behavior, click_count, and frame targeting, which are needed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 65%, in the middle range. The description adds meaningful constraints: exactly one of ref/selector/x+y, coordinates return null verification, and native select must use `select_option`. It does not explain the semantics of most other parameters (modifiers, click_count, dialog_policy, settle_ms, observe, frame nesting, coordinate_space), so it only partially compensates for the schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Click') and the three accepted target forms ('ref/selector/x+y'), and explicitly routes native select interactions to the sibling `browser_select_option`. It does not clearly differentiate from other sibling actions like `browser_hover` or `browser_drag`, so sibling differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives some usage constraints (exactly one target, unmodified left single clicks may target inactive tabs, native select requires `select_option`), implying when this tool is appropriate. However, it never states when to prefer hover, drag, double-click, or other alternatives, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_discoverB
List connected profiles/capabilities or tabs with URL/title and control status. Tab discovery records this connection's latest observation for claim_tab.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| browser_id | No | Required for kind=tabs; omit for kind=browsers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a valuable non-obvious side effect — that kind=tabs writes this connection's latest observation for later claim_tab use — and lists return fields, but it omits whether the listing is scoped per connection, pagination/limits, and failure behavior when no browser is connected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core listing behavior, with the claim_tab side effect placed second. Slight compression cost in the 'profiles/capabilities' phrase, but no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter discovery tool with no output schema and no annotations, the description covers the essentials (what is listed, what fields come back, the claim_tab linkage) but leaves connection scoping, listing limits, and the mandatory browser_id for kind=tabs unstated — details an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: browser_id is documented in-schema, but kind's enum has no schema description. The description partially compensates by mapping 'profiles/capabilities' to browsers and 'tabs' to tabs, but it does not state that browser_id becomes mandatory for kind=tabs or what browser_id values look like.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (List) and two distinct resources (connected profiles/capabilities or tabs), plus the key fields returned (URL/title, control status). It also relates itself to browser_claim_tab, giving partial sibling differentiation, though it never contrasts itself with other read siblings like browser_snapshot or browser_logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention that tab discovery records the latest observation 'for claim_tab' hints at a discover-then-claim workflow, but the description never says when to choose this over alternatives or what preconditions apply (e.g. must a browser already be connected).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dragB
Drag between endpoints, each exactly one ref/selector/x+y; destination auto-scrolls while held.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | pointer for mouse-driven dragging; html5 for HTML drag-and-drop. | pointer |
| steps | No | ||
| source | Yes | ||
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| settle_ms | No | After preparation, before dispatch: ms or uniform [min,max]; min<=max. | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| trajectory | No | Opt-in curved, variable-speed steps/intervals; curve_px is signed CSS-pixel offset. Duration covers interpolation waits only. | |
| destination | Yes | ||
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add one genuinely useful trait: the destination auto-scrolls while the drag is held. It says nothing about drop verification, hit-check failures, dialog handling during the drag, or what a failed drag returns, which matters for a stateful pointer operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with no filler, and the core operation is front-loaded. It is terse to the point of under-specification, but that cost is accounted for elsewhere rather than being padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, nested-object tool with no annotations and no output schema, one sentence is not enough. An agent gets no guidance on mode selection, the timeout/preparation budget, the optional post-action observation, or dialog behavior during the drag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The phrase 'each exactly one ref/selector/x+y' encodes a mutual-exclusivity rule the schema does not express (the nested objects have no oneOf constraint), which is real added value. But it leaves 'mode', 'steps', 'trajectory', 'settle_ms', 'observe', 'dialog_policy' and 'coordinate_space' to the schema, several of which have no description at all (60% coverage).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Drag between endpoints'), and the 'source'/'destination' framing makes the operation unambiguous. No sibling is named, but no other sibling tool performs a drag, so confusion risk is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to choose a drag over browser_click/browser_hover, nor when to pick the 'pointer' mode versus 'html5' drag-and-drop (the schema documents what each mode means but not which situation calls for it). Only the endpoint-shape constraint is given as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateB
Evaluate expression once; call a returned function once and await its Promise, without user activation. Use an async IIFE for statements. capture_truncated marks capture loss; required_chars/next_item signal page-budget needs. cursor reads cache without re-execution.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| cursor | No | Exactly one of expression/cursor. Cursor reads cached JSON; omit frame/frame_id and result_type=element. | |
| frame_id | No | ||
| max_chars | No | Per-page JSON value budget, excluding metadata; capture cap 1M chars / 50000 nodes / depth 8. | |
| expression | No | ||
| tab_handle | Yes | ||
| timeout_ms | No | ||
| result_type | No | element: return one connected DOM element as a ref. | json |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it does disclose real behavior: it runs without user activation, awaits a returned Promise, and reports capture loss via capture_truncated. It does not say whether the expression can mutate page state or whether the tool is read-only, which is the most important unknown for an arbitrary-code tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core execution contract is front-loaded in the first sentence, and the following sentences each add a distinct fact (IIFE pattern, truncation signals, cursor reuse). It is dense but no sentence is pure filler; the jargon terms are only lightly defined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no annotations and no output schema, the description helpfully names three return-side fields (capture_truncated, required_chars, next_item) that would otherwise be invisible. But it omits dialog_policy behavior, result_type=element semantics, and frame targeting that the schema only partly documents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 56% across 9 parameters. The description adds meaning for expression, cursor (cache read, no re-execution) and the page-budget mechanic that governs max_chars, but leaves tab_handle, frame/frame_id, timeout_ms, result_type, and dialog_policy unaddressed. Partial compensation, not full.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Evaluate expression once' names a specific verb (evaluate) and resource (a page expression), which no sibling tool duplicates. It also states the execution contract (call a returned function once, await its Promise). It stops short of naming when to prefer it over browser_snapshot or browser_read_text, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use an async IIFE for statements' and 'cursor reads cache without re-execution' give concrete usage hints for two scenarios. However, there is no guidance on when to reach for this tool instead of the sibling read tools (browser_read_text, browser_snapshot), and no statement of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fetchA
Read a URL's main document using the profile's sign-in in a temporary background tab, then close it. Site scripts run and may affect other tabs. status/ok describe HTTP only (unknown=null); readiness/degradation are separate. body is a string. next_cursor reads immutable cache without revisiting; up to 4 captures per connection/profile.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTP(S), no URL credentials; required unless cursor is supplied. | |
| cursor | No | Continuation accepts only browser_id, cursor and max_chars. | |
| format | No | Default rendered text; html=current DOM (dom=rendered); json=validated JSON. | |
| max_chars | No | Text/HTML page budget; capture_truncated marks source loss. JSON returns whole, ignores this budget, errors above 1M chars. | |
| browser_id | Yes | ||
| timeout_ms | No | Default 15000; total including creation/cleanup, reserving capture time after unmet waits. | |
| wait_until | No | Default load; network_idle waits for load then 500ms without observed requests. Unmet waits return a degraded capture if readable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the temporary tab that is closed, the side effect that site scripts may affect other tabs, the distinction between HTTP status and readiness/degradation, and the capture limit. It omits auth-failure or error behavior detail, so it is not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and every subsequent sentence carries distinct information. The telegraphic style ('status/ok describe HTTP only') is dense but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must explain returns; it covers status/ok, readiness/degradation, body-as-string, and cursor semantics but does not describe the overall response shape or error outcomes. Adequate but with clear gaps for a 7-parameter fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 86%, so the baseline is 3; the description earns a bump by explaining that next_cursor reads an immutable cache without revisiting and that body is a string, adding meaning beyond the schema's cursor and max_chars descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Read a URL's main document') and adds the mechanism ('temporary background tab') plus profile sign-in, which distinguishes it from a plain navigation tool. It stops short of naming a sibling such as browser_navigate or browser_read_text for contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the mechanics: it fetches a main document with the profile's credentials and returns text/html/json, and the cursor sentence implies pagination continuation. There is no explicit when-to-use/when-not guidance and no named alternative among the many browser_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fillA
Replace one ref/selector input/textarea/contenteditable and verify retained text. Known Monaco/CM5 proxy textareas are rejected before focus/writes. verification_basis identifies the expectation; verification_source identifies DOM value, selected text or innerText. Native contenteditable readback temporarily selects/reads plain text, then restores selection. CR/CRLF count as LF; requested spaces may retain NBSP. No editor model write, paste, blur or dropdown commit.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| mode | No | native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change. | native |
| name | No | role only: exact AX name; empty allowed. | |
| text | Yes | ||
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. | |
| expected_value | No | Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers substantial behavioral detail: proxy textareas are rejected before focus, native contenteditable readback temporarily selects and restores selection (a real side effect), CR/CRLF collapse to LF, and spaces may retain NBSP. The scoring drag is that it references 'verification_basis' and 'verification_source' as concepts the caller supposedly sets, yet no such parameters exist in the schema, which is a mild misleading signal about how the write is configured.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action is correctly front-loaded in the first sentence, but the passage is dense with unexplained jargon (Monaco/CM5, NBSP, ref) and one sentence is spent on verification_basis/verification_source, which map to no schema property. That sentence does not earn its place and inflates the description's cognitive load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with nested objects, no annotations, and no output schema, the description covers the core write-and-verify contract plus normalization edge cases, which is a reasonable foundation. It leaves the observe block, dialog_policy, frame targeting, and time budgeting entirely undocumented at the description level, and its dangling verification_* references create an inconsistency an agent must resolve by reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 79%, just below the high-coverage baseline, so the description should compensate somewhat and mostly does not. It adds normalization semantics relevant to text/expected_value (CR/LF collapse, NBSP retention, default expectation) but says nothing about mode, observe, dialog_policy, frame/frame_id, timeout_ms, or nth — all left entirely to the schema. Worse, the verification_basis/verification_source sentence describes behavior for parameters that do not exist in the input schema, adding confusion rather than meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause states a specific verb and resource set: 'Replace one ref/selector input/textarea/contenteditable and verify retained text.' An agent can tell this writes text into a form control and verifies it, which implicitly separates it from browser_type (key-by-key) and browser_select_option. However, it never names a sibling or explicitly scopes the difference, leaving the distinction (insert without character keydown) to be inferred from the trailing negation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through negatives: 'No editor model write, paste, blur or dropdown commit' and rejection of Monaco/CM5 proxy textareas tell the agent what this tool does NOT cover, but there is no positive statement of when to choose browser_fill over browser_type, browser_select_option, or browser_press_key. The reader must reconstruct the decision boundary from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_handle_dialogC
Accept/dismiss a JS dialog and return its original details and accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | ||
| tab_handle | Yes | ||
| prompt_text | No | Response sent to the website for a prompt dialog. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral-disclosure burden. It says the tool accepts/dismisses and returns original details, but does not explain side effects, blocking behavior, failure modes, or interaction with prompt dialogs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted text. However, the phrase 'return its original details and accepted' is slightly awkward and could be clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated browser-automation mutation tool with three parameters, no output schema, and low schema coverage, the description is too thin. It does not describe return shape, tab targeting, prompt handling, or expected dialog states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description does little to compensate. It implies the accept/dismiss choice but does not explain tab_handle or clarify when prompt_text is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: accept/dismiss a JS dialog. It is clear enough to distinguish the tool from most browser siblings, though it does not explicitly contrast with alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to call this tool, what prerequisite state must exist, or how it relates to sibling tools. The agent must infer that a JS dialog must already be open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverA
Move to exactly one ref/selector/x+y, verify trusted mousemove, and leave the pointer there without clicking.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| offset | No | Native element only: ratios within its content quad; hit checks still apply. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. | |
| coordinate_space | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that it verifies a trusted mousemove and leaves the pointer in place without clicking, but it says nothing about scrolling into view, hit-test failures, dialog handling, or what the 'observe' option does behaviorally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every clause adds a distinct fact: target mode, verification, pointer final state, and no click.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with nested objects, no annotations, and no output schema, the description is thin. The schema documents many individual parameters, but the description leaves important features like observe, dialog_policy, timeout behavior, and frame targeting entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 67% of parameters, but the description adds a crucial semantic the schema does not express: exactly one of ref, selector, or x+y must identify the target. That mutual-exclusion rule is high-value parameter guidance beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: move the pointer to one target, verify a trusted mousemove, and leave it there without clicking. This distinguishes it from browser_click and browser_drag by the explicit 'without clicking' clause, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'exactly one ref/selector/x+y' constraint gives targeting guidance, and 'without clicking' implies the tool is for hover-state inspection rather than activation. However, it never states when to use this instead of browser_click or browser_drag, nor any prerequisite or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_logsA
Read buffered console, network or navigation events since claim, even if the page is blank or unresponsive. Capture changes require a supported page. Continue next_seq as after_seq for the same claim/kind; restart at 0 when changing filters. data_loss reports eviction.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| level | No | Only valid for kind=console. | |
| limit | No | ||
| capture | No | Network only: opt in before XHR/fetch for bounded headers/bodies, with credential headers and named secrets redacted; unavailable bodies are explicit. | |
| after_seq | No | ||
| max_chars | No | ||
| tab_handle | Yes | ||
| url_contains | No | Only valid for kind=network. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does substantive work: it discloses that reads succeed on blank/unresponsive pages, that capture requires a supported page, that credential headers and named secrets are redacted, and that eviction is surfaced via data_loss. It never explicitly states the call is side-effect-free or describes rate/size limits beyond the schema's bounds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what the tool reads and its key robustness property. The main cost is over-compression: 'Capture changes require a supported page' is too terse to be actionable without defining 'supported page'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with a nested object, no annotations, and no output schema, the description covers pagination and data-loss signaling but omits what the response contains (how next_seq and data_loss are returned) and leaves several filter parameters unexplained. It is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 38%, the description must compensate, and it partially does by explaining after_seq continuation semantics and capture's page-support prerequisite. But level, limit, max_chars, url_contains (already in schema), and tab_handle get no added meaning, and the interaction between limit and max_chars/eviction is unstated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (Read) and a precise resource (buffered console, network or navigation events) with an explicit temporal scope (since claim). It is clearly distinct from mutation siblings like browser_click or browser_navigate, though it doesn't name an alternative read tool such as browser_read_text or browser_snapshot to sharpen the line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Even if the page is blank or unresponsive' gives a useful condition for when this tool still works, and the after_seq/restart-at-0 sentence tells the agent how to continue vs. re-filter. However, there is no guidance on when NOT to use it or which sibling (browser_read_text, browser_snapshot, browser_evaluate) to prefer for other read needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_open_tabB
Create a new HTTP(S) tab in the selected profile even if the URL is already open. claim=true also acquires a tab_handle without tab discovery; it does not wait for page load. A claim failure leaves the tab open and reports its identity in error.open_tab; never automatically repeat creation.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| claim | No | ||
| active | No | ||
| browser_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and delivers real behavioral facts: it does not wait for page load, a failed claim leaves the tab open, the tab identity is surfaced in error.open_tab, and creation must not be auto-retried. It omits what a successful call returns (handle vs id) and any auth/permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core behavior and then the claim semantics and failure caveat. Every clause carries information; the density is high but the ordering is sensible rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations mean the description is the only source of truth, and it does well on side effects and failure modes. It is still incomplete for a 4-parameter tool: 'active' is unexplained and the successful return value/handle semantics are never stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 4 parameters, so the description must compensate and only covers one: 'claim'. It never explains 'active' (activation/foreground semantics), 'browser_id' (profile selection), or the URL format beyond HTTP(S). Three of four parameters remain semantically opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Create a new HTTP(S) tab in the selected profile') and adds a distinguishing scope note ('even if the URL is already open'), which separates it from a plain navigate. It never names the sibling it replaces (browser_navigate, browser_claim_tab, browser_tab_control), so full differentiation still requires the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Guidance is implied through behavior: 'claim=true also acquires a tab_handle without tab discovery' implicitly points at browser_discover/browser_claim_tab as the alternative path, and 'never automatically repeat creation' constrains retry behavior. There is no explicit statement of when to prefer this over browser_navigate or browser_tab_control, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyA
Send a native key/chord to current focus and report its trusted keydown target. Optional ref/selector guards focus without focusing it; a mismatch before dispatch sends no key. Supports F1–F12, navigation/editing keys and US ASCII punctuation.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose useful behavior — trusted native events, reporting the keydown target, and the fail-safe of sending no key on a pre-dispatch guard mismatch. However, it omits the chord syntax (how modifiers are expressed), what happens on failure (error vs silent), and how dialog_policy interacts with the dispatch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact clauses with the core action front-loaded and the guard semantics second. Dense but every sentence contributes; only mild jargon ('trusted keydown target') costs a little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with a nested observe object and no output schema, the description covers the primary key dispatch and guard behavior but says nothing about the observe block, timeout budget, or dialog handling. The return value is only loosely gestured at ('report its trusted keydown target').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the baseline is 3, but the description adds real value: the `key` parameter has no schema description, yet the text specifies supported ranges (F1–F12, navigation/editing keys, US ASCII punctuation), and it explains the semantics of the otherwise-undescribed ref/selector guard. The nested observe/timeout/dialog_policy parameters remain unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Send a native key/chord to current focus' and adds that it reports the trusted keydown target. This clearly separates it from text-entry siblings like browser_type/browser_fill, though it never names those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'Optional ref/selector guards focus without focusing it; a mismatch before dispatch sends no key' explains how the guards behave but not when an agent should reach for this tool instead of browser_type or browser_click. There is no explicit when-to-use/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_read_controlA
Read one explicit control: separate native DOM/AX values, rendered text and state; related popups, active descendant and currently exposed options in AX order. Bounded refs preserve the existing snapshot. No library-specific inference, complete virtual list, application commit or atomic DOM/AX view.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| max_chars | No | ||
| tab_handle | Yes | ||
| timeout_ms | No | ||
| max_options | No | ||
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. | |
| popup_selector | No | Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does substantial work: it discloses that DOM and AX values are reported separately (i.e., non-atomic), that refs are bounded to preserve an existing snapshot, and it explicitly disclaims library-specific inference, complete virtual lists, application commit and atomic DOM/AX views. It stops short of stating read-only safety, permissions, or error behavior, but the limitation disclosure is genuinely informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and resource, and most clauses carry information. However, the trailing negation string ('No library-specific inference, complete virtual list, application commit or atomic DOM/AX view') is a compressed list whose meaning is hard to parse and partly ambiguous, costing clarity for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with nested frame objects and no output schema, the description does explain the shape of what comes back (DOM/AX values, text, state, popups, options), which is necessary. But with no annotations and only 58% schema coverage, the remaining parameters and any error/timeout semantics go unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 58%, so several parameters (ref, tab_handle, max_chars, timeout_ms, frame_id) are undocumented in either place. The description only obliquely maps to parameters — 'bounded refs' to ref, 'currently exposed options' to max_options, 'related popups' to popup_selector, 'AX order' to nth — so it adds marginal semantics rather than compensating for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read one explicit control') and enumerates what is returned: native DOM/AX values, rendered text, state, related popups, active descendant and exposed options. The closing clause implicitly contrasts it with broader reads (full snapshots, atomic DOM/AX views), so it is distinguishable from siblings, though the AX/DOM jargon makes the scope harder to grasp than it needs to be.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Bounded refs preserve the existing snapshot' hints at when this is preferable to a full snapshot, and the negation list implies when not to rely on it. But no sibling is named (browser_snapshot, browser_read_text) and there is no explicit 'use this when…' statement, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_read_textA
Read page/frame text. Visible text excludes input/textarea values; use value for one field or snapshot profile=fields for forms. complete_source is source coverage, not pagination; next_offset continues live text, which may change.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| mode | No | value: DOM field text; editor: exposed Monaco/CM5 model, otherwise error with evaluate guidance. Both require selector. Virtualized editor DOM/proxy values are not model text. | visible |
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| offset | No | ||
| frame_id | No | ||
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| max_chars | No | ||
| tab_handle | Yes | ||
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full load and does disclose non-obvious behavior: visible text excludes input/textarea values, and continued reads return 'live text, which may change' rather than a stable snapshot. It omits access/auth expectations and error behavior for the editor/value modes beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the core action before the caveats. Slightly dense: 'complete_source' and 'next_offset' are introduced without ever being identified as return fields, which costs a little clarity for the space they occupy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 10-parameter tool with a nested frame object, no output schema, and no annotations needs the description to do more. It never explains the offset/max_chars pagination contract, how selector_type interacts with mode, or what the response contains, leaving the highest-complexity parts of the definition undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so several parameters (offset, max_chars, tab_handle, frame_id, nth) rely on the schema alone. The description reinforces mode='value' and mentions complete_source/next_offset, but neither appears in the input schema, so the added parameter meaning is partial rather than compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read page/frame text) and scopes it to the visible-text mode by default, which tells an agent what kind of extraction this is. It does not name a sibling to disambiguate against, so an agent still has to infer why it should not use browser_snapshot or browser_evaluate instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is real routing guidance — 'use value for one field or snapshot profile=fields for forms' points at a mode and a different tool. However, there is no explicit when-not-to-use statement versus the other read surfaces (browser_snapshot, browser_evaluate, browser_fetch), and the pagination advice is phrased in terms an agent cannot map to a parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotA
Capture viewport, full_page or one ref/selector element as PNG with image-to-viewport CSS mapping. Element/full_page are exclusive; locator options need selector. Full-page points may need scrolling before input. If background rendering stalls, explicitly activate or use AX/text.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| full_page | No | ||
| tab_handle | Yes | ||
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. | |
| include_indicators | No | Include transient click feedback. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does disclose non-obvious behavior: output is a PNG with image-to-viewport CSS coordinate mapping, full-page capture may require scrolling before further input, and background rendering can stall. It omits whether the image is returned inline or as a handle/resource, which matters for a no-output-schema tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, mode and constraint information front-loaded, with no filler. Some phrasing is telegraphic ('image-to-viewport CSS mapping', 'Full-page points') and costs a re-read, which keeps it below top marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with a nested frame object, no annotations and no output schema, the description covers modes and constraints but leaves major gaps: where 'ref' values originate, what the nested frame selector does versus frame_id, and how the PNG is delivered. An agent could still invoke it, but not confidently in frame or element-targeting scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 70% schema coverage the description contributes real semantics that the schema cannot express: the mutual exclusivity of full_page and element capture, and the rule that locator options (ref/name/nth/frame_id) require selector. Undocumented parameters such as ref and tab_handle are not explained, and the meaning of 'ref' (presumably from browser_snapshot) is left to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture ... as PNG') and enumerates the three capture modes (viewport, full_page, single ref/selector element), which is far more than a restatement of the name. It only implicitly separates itself from visual/text siblings via the 'use AX/text' fallback, and never names browser_snapshot or browser_read_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection rules: element vs full_page are exclusive, locator options require selector, and stalled background rendering should be handled by activating the tab or switching to AX/text. It lacks an explicit 'use this when you need visual confirmation' framing, but the exclusions and fallback path are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollA
Scroll one ref/selector container or viewport x/y (default center). DOM emits no wheel events; wheel sends native wheel input. until returns a fresh ref. Stopped searches report stop_reason, scroll_pending and confirmed progress; a boundary/miss does not prove end of data.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| mode | No | dom | |
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| until | No | DOM-only search of visible elements' textContent; selector is a CSS filter within the container. | |
| delta_x | No | ||
| delta_y | No | Vertical delta, positive down; required without until. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| max_steps | No | ||
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses several non-obvious traits: DOM mode emits no wheel events, wheel mode sends native wheel input, stopped searches report stop_reason/scroll_pending/progress, and a boundary/miss does not prove end of data. It does not cover permission requirements or side effects such as lazy-loading triggered by scrolling, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core operation, then adds mode and search behavior without filler. Every sentence provides actionable information, even though the semicolon-heavy style is dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with nested objects, no annotations, and no output schema, the description covers the central scroll action, mode distinction, until/search behavior, and partial return reporting. It omits important context for parameters like observe, frame, selector_type, dialog_policy, max_steps, and timeout_ms, so it is adequate but incomplete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 61%, so the schema already documents a substantial portion of the 18 parameters. The description adds meaning for core behavior: x/y default to center, mode affects whether events are emitted, and until returns a fresh ref. It does not explain many other parameters such as observe, frame, selector_type, max_steps, timeout_ms, or delta handling, leaving a significant parameter-semantics gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and target: 'Scroll one ref/selector container or viewport x/y (default center).' It also distinguishes DOM versus wheel scrolling behavior. It does not explicitly differentiate this tool from sibling alternatives such as browser_press_key or browser_wait, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful implied guidance by explaining the two mode behaviors ('DOM emits no wheel events; wheel sends native wheel input') and that 'until returns a fresh ref.' However, it does not explicitly say when to use browser_scroll rather than browser_press_key, browser_wait, or other siblings, nor does it state exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionA
Set an option on one ref/selector HTML select, including hidden selects, via synthetic input/change (events_trusted=false). Disabled/inert targets fail. Verifies retained selection only.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| index | No | ||
| label | No | ||
| value | No | Exactly one value/label/index; strings match exactly, index is zero-based. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load and does disclose key traits: events are synthetic and untrusted (events_trusted=false), hidden selects are supported, disabled/inert targets fail, and it verifies only retained selection rather than an expected value. It omits what is returned and how failures are surfaced, but the disclosed behavior is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and target, followed by constraints. No filler. Slightly terse in the verification clause, which is ambiguous, but the size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A 14-parameter tool with nested objects, no output schema, and no annotations needs more than this. The rich schema covers targeting, but the description does not say what the tool returns, whether an expected option can be asserted, or how the observe parameter relates to the result, leaving an agent to infer the outcome contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71%, so the schema documents most parameters. The description adds that the target is 'one' select addressed by ref or selector, but says nothing about how the option is identified (value/label/index) or how observe/timeout/dialog_policy interact with delivery — those are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: set an option on one ref/selector HTML select. It adds scope detail (hidden selects supported, synthetic input/change) that makes the operation concrete. It does not name a sibling to distinguish from, e.g. browser_fill/browser_click, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides useful preconditions (disabled/inert targets fail) and notes hidden selects are handled, which implies 'use this when a <select> exists'. However, there is no explicit guidance on when to prefer this over browser_click or browser_fill, or on what to do if selection fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotB
Read AX with refs, or profile=fields for DOM/AX field facts, labels, context and native values. Popup/controls/owns facts are browser-observed, not inferred ownership. New observations replace refs and retry one document/context race within 30s; next_cursor continues the captured view.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Default true; false hides prose, preserving control names and values. | |
| query | No | Case-insensitive literal substring of names, values or nearby context. fields also searches HTML labels, DOM id/name/placeholder and selected options. Zero matches is not an error. | |
| cursor | No | ||
| profile | No | Default full; interactive keeps controls/ancestors; fields returns separate DOM/AX values in a fields array. | |
| verbose | No | Include viewport and snapshot_id. | |
| max_chars | No | ||
| max_nodes | No | ||
| tab_handle | Yes | ||
| text_limit | No | Prose preview length, marked with …; control names/values stay complete. Default 80 for interactive, unlimited for full. | |
| include_hidden | No | fields only, default false: include native fields omitted from AX; ref may be null. Password values omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses that new observations REPLACE existing refs (a critical staleness/invalidations warning), that it retries exactly one document/context race within 30s, that next_cursor resumes the captured view, and that popup/controls/owns facts are browser-observed rather than inferred. It stops short of describing the response envelope or how truncation via max_chars/max_nodes affects the ref set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the primary purpose front-loaded and no filler; the replacement/retry sentence in particular earns its place. Density tips into jargon-heavy shorthand ('AX', 'owns facts'), which slightly reduces first-read legibility, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, annotation-free tool with no output schema, the description covers the behavioral semantics well but leaves gaps an agent needs: what a returned 'ref' looks like, what happens to refs when max_nodes truncates the tree, and how tab_handle is obtained. Adequate, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the baseline is 3. The description reinforces profile=fields semantics and adds the next_cursor continuation behavior and the 30s race retry, but max_chars, max_nodes, cursor, tab_handle and include_hidden receive no treatment beyond the schema, and the interplay of truncation with ref validity is unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb and resource ("Read AX with refs") and distinguishes two output modes via profile=fields, so an agent can tell it is a page-structure snapshot rather than a text dump. However, 'AX' is never expanded and nothing separates it from siblings like browser_read_text, browser_discover or browser_screenshot, so the agent must already know the domain vocabulary to place it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what each mode returns but never says when to choose this tool over browser_read_text, browser_discover, browser_screenshot or browser_evaluate — the most likely alternatives in a 23-tool set. There are no preconditions, no exclusions, and no decision rule beyond the mode labels already present in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tab_controlA
Release control and leave the page open, activate the tab, or close it (may discard unsaved state). Release/close invalidate tab_handle.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| tab_handle | Yes | ||
| focus_window | No | activate only; default true. False selects the tab without focusing its window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does disclose two real behavioral traits: close 'may discard unsaved state' and both release and close 'invalidate tab_handle'. That is meaningful side-effect and lifecycle disclosure. It stops short of saying whether the handle stays valid after activate or what the call returns, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the action set and appends the two critical caveats (data loss and handle invalidation). No filler, no restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, annotation-free, no-output-schema tool, the description covers the action semantics and the two hazardous side effects that an agent most needs before calling. Minor gaps remain around what activate returns and whether errors occur on a stale handle, but nothing critical to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, with focus_window the only documented parameter, so the description must compensate — and it largely does by defining the three action enum values and their consequences (release leaves the page open, close may discard state, release/close invalidate the handle). tab_handle is only implicitly characterized via the invalidation note, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the browser tab handle's control state) and enumerates the three operations it performs: release, activate, close. It is clearly distinguishable from siblings like browser_click or browser_snapshot, though it never explicitly contrasts itself with browser_claim_tab or browser_open_tab, which are the nearest neighbors.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Release control and leave the page open' implies this is the counterpart to claiming a tab, giving an implied when-to-use for one of the three actions. However, there is no explicit guidance on when to prefer release over close, nor on how this relates to browser_claim_tab or browser_open_tab, leaving selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeA
Type printable characters with trusted keys without clearing. Choose exactly one ref/selector/focused=true; stop on focus loss/detachment. Enter/Tab use press_key; ordinary multiline replacement uses fill.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| text | Yes | ||
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| focused | No | Pin current editable focus without refocusing; exclusive with ref/selector and locator options. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| delay_ms | No | Between characters: ms or independent uniform [min,max]; min<=max. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose non-obvious traits: it appends rather than replacing text, uses trusted key events (not synthetic value assignment), and stops on focus loss or detachment — i.e. partial input is possible. It stops short of saying what constitutes success/failure or how much text landed when aborted, which matters for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with essentially zero waste: scope, target selection, then sibling routing. It is compressed to the edge of cryptic ("focused=true" as a clause fragment) and would benefit from one clause on outcome, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with nested objects, no annotations, and no output schema, the description covers only targeting and sibling selection. It says nothing about the return value, how timeout_ms/delay_ms affect the write, or how dialog_policy interacts with typing — an agent must infer all of that from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 79%, so the baseline is 3; the description adds a genuine constraint the schema does not encode — the exclusive-one-of rule across ref/selector/focused. It adds nothing for frame, delay_ms, observe, or dialog_policy, but those already carry schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (type) plus the precise semantics: printable characters, trusted key events, no clearing of existing content. It explicitly distinguishes itself from two siblings, press_key and fill, by naming the exact cases those handle. An agent can identify this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both competing alternatives with selecting conditions (Enter/Tab -> press_key; ordinary multiline replacement -> fill) and states the mutual-exclusion rule for the target options (exactly one of ref/selector/focused=true). Nothing about tool choice or target specification is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_upload_fileA
Set browser-host absolute file paths on one file-input/label ref/selector, or omit target for the pending chooser. [] clears/cancels; multiple files need a multiple input; directories unsupported. assignment_acknowledged confirms the command, not event delivery/upload. count_verified compares retained FileList count (null if unreadable); mismatch is not assignment failure. Observe before uploading again.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| ref | No | ||
| name | No | role only: exact AX name; empty allowed. | |
| files | Yes | ||
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| observe | No | Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay. | |
| frame_id | No | Selector frame; default main. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| tab_handle | Yes | ||
| timeout_ms | No | Total preparation/dispatch/verification and optional observation budget. | |
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it distinguishes assignment_acknowledged from event delivery and from actual upload, and explains that count_verified compares the retained FileList and that a mismatch is not an assignment failure. Still missing: whether paths must exist/be readable by the host, and what happens on timeout or failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then the target-omission case, then constraints and result-interpretation. Every clause carries information, but the ack/count_verified sentences are compressed into telegraphic fragments that take a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, nested-object mutation tool with no annotations and no output schema, the description covers the essential semantics: targeting, clearing, multi-file eligibility, and how to interpret the acknowledgement and verification fields. Remaining gaps (error/timeout behavior, path validity preconditions) are secondary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds semantics the schema does not: files must be host-absolute paths, [] means clear/cancel, >1 file needs a multiple input, directories are rejected, and the target trio (ref/selector/omit) maps to specific behaviors. It says nothing about nth, name, frame/frame_id, timeout_ms or dialog_policy, leaving those to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: set browser-host absolute file paths on one file-input/label ref/selector, or on the pending chooser. That is unambiguous and clearly distinct from browser_click/browser_fill/browser_type siblings, though it never names those siblings to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete situational rules: omit target for the pending chooser, pass [] to clear/cancel, multiple files require a multiple input, directories unsupported, and 'observe before uploading again'. It stops short of stating the upstream trigger (e.g. that the chooser must first be opened by a click) or naming an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_waitA
Read-only wait for condition. State uses native properties/ARIA; missing state is unavailable, not false. Role absence need not mean DOM removal. Prefer a result/status container for text; compares full text, reports a bounded preview with length/truncation. Timeout reports last state; field values are omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| nth | No | Selector only: zero-based DOM index, AX tree order for role. | |
| name | No | role only: exact AX name; empty allowed. | |
| frame | No | Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. ["#frame"]); exclusive with frame_id. | |
| idle_ms | No | network_idle quiet interval. | |
| expected | No | Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also "mixed"). text: expected substring XOR previous. Omit otherwise. | |
| frame_id | No | ||
| previous | No | text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion. | |
| selector | No | Query by selector_type; role example: selector="link", name="Claim". | |
| condition | Yes | Element conditions require selector; url/network_idle forbid locator fields. | |
| tab_handle | Yes | ||
| timeout_ms | No | ||
| dialog_policy | No | accept/dismiss auto-handle dialogs and return their messages. | ask |
| selector_type | No | Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden well: it declares read-only behavior, explains missing state semantics, warns about role absence not implying DOM removal, and describes text comparison, preview truncation, and timeout reporting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by dense but relevant behavioral caveats. Every sentence contributes to correct invocation or interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter tool with no output schema and no annotations, the description covers important caveats but still leaves gaps around normal success return values and how different condition outcomes are reported. It is adequate but not fully complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 77%, so the schema already documents most parameters. The description adds useful behavioral context around text comparison and timeout results, but does not significantly enrich parameter usage beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read-only wait for condition.' This clearly distinguishes browser_wait from action-oriented siblings such as browser_click or browser_fill, though it does not explicitly mention alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful implied guidance, such as preferring a result/status container for text, but does not explicitly state when to use browser_wait instead of browser_read_text, browser_snapshot, or polling via browser_evaluate.
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.
12 tool updates
v0.28.2- Changed
browser_batch5 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / start_at / maximumPrevious value: -19New value: +29 - changed
Input schema / properties / steps / descriptionPrevious value: -"Element steps require selector; type uses selector XOR focused=true; scroll may omit target, wait follows condition. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy."New value: +"Element steps require selector; type uses selector XOR focused=true; press_key optionally guards focus with selector; scroll may omit target, wait follows condition. Step observe uses a fresh selector; batch observe reads at the end. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy." - changed
Input schema / properties / steps / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "click", - "type": "string" - }, - "button": { - "default": "left", - "enum": [ - "left", - "middle", - "right" - ], - "type": "string" - }, - "click_count": { - "anyOf": [ - { - "const": 1, - "type": "number" - }, - { - "const": 2, - "type": "number" - } - ], - "default": 1 - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "description": "DOM: left single click, no modifiers.", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "modifiers": { - "default": [], - "items": { - "enum": [ - "Alt", - "Control", - "Meta", - "Shift" - ], - "type": "string" - }, - "type": "array" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; hit checks still apply.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "settle_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max." - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "fill", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected_value": { - "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.", - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "type", - "type": "string" - }, - "delay_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "default": 0, - "description": "Between characters: ms or independent uniform [min,max]; min<=max." - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "focused": { - "const": true, - "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.", - "type": "boolean" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.", - "maxLength": 10000, - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "hover", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; hit checks still apply.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "select_option", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "label": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "value": { - "description": "Exactly one value/label/index; strings match exactly, index is zero-based.", - "type": "string" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "scroll", - "type": "string" - }, - "delta_x": { - "default": 0, - "type": "number" - }, - "delta_y": { - "description": "Vertical delta, positive down; required without until.", - "type": "number" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "max_steps": { - "default": 100, - "maximum": 500, - "minimum": 1, - "type": "integer" - }, - "mode": { - "default": "dom", - "enum": [ - "dom", - "wheel" - ], - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "until": { - "additionalProperties": false, - "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.", - "properties": { - "selector": { - "minLength": 1, - "type": "string" - }, - "text": { - "maxLength": 2000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "action" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "wait", - "type": "string" - }, - "condition": { - "description": "Element conditions require selector; url/network_idle forbid locator fields.", - "enum": [ - "attached", - "absent", - "visible", - "actionable", - "text", - "value", - "checked", - "selected", - "expanded", - "url", - "network_idle" - ], - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected": { - "anyOf": [ - { - "maxLength": 100000, - "type": "string" - }, - { - "type": "boolean" - } - ], - "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "idle_ms": { - "default": 500, - "description": "network_idle quiet interval.", - "maximum": 10000, - "minimum": 100, - "type": "integer" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "previous": { - "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.", - "maxLength": 100000, - "type": "string" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "condition" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "press_key", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "key": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "key" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "click", + "type": "string" + }, + "button": { + "default": "left", + "enum": [ + "left", + "middle", + "right" + ], + "type": "string" + }, + "click_count": { + "anyOf": [ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "default": 1 + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "DOM: left single click, no modifiers.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "modifiers": { + "default": [], + "items": { + "enum": [ + "Alt", + "Control", + "Meta", + "Shift" + ], + "type": "string" + }, + "type": "array" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "settle_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max." + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "fill", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected_value": { + "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.", + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "type", + "type": "string" + }, + "delay_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "default": 0, + "description": "Between characters: ms or independent uniform [min,max]; min<=max." + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "focused": { + "const": true, + "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.", + "type": "boolean" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.", + "maxLength": 10000, + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "hover", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "select_option", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "label": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "value": { + "description": "Exactly one value/label/index; strings match exactly, index is zero-based.", + "type": "string" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "scroll", + "type": "string" + }, + "delta_x": { + "default": 0, + "type": "number" + }, + "delta_y": { + "description": "Vertical delta, positive down; required without until.", + "type": "number" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_steps": { + "default": 100, + "maximum": 500, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "dom", + "enum": [ + "dom", + "wheel" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "until": { + "additionalProperties": false, + "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.", + "properties": { + "selector": { + "minLength": 1, + "type": "string" + }, + "text": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "action" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "wait", + "type": "string" + }, + "condition": { + "description": "Element conditions require selector; url/network_idle forbid locator fields.", + "enum": [ + "attached", + "absent", + "visible", + "actionable", + "text", + "value", + "checked", + "selected", + "expanded", + "url", + "network_idle" + ], + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected": { + "anyOf": [ + { + "maxLength": 100000, + "type": "string" + }, + { + "type": "boolean" + } + ], + "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "idle_ms": { + "default": 500, + "description": "network_idle quiet interval.", + "maximum": 10000, + "minimum": 100, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "previous": { + "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.", + "maxLength": 100000, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "condition" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "press_key", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "observe": { + "additionalProperties": false, + "properties": { + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "key" + ], + "type": "object" + } +] - changed
Input schema / properties / steps / maxItemsPrevious value: -20New value: +30
- Changed
browser_click2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_drag2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_fill2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_hover2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_logs1 field changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "console", - "network" -]New value: +[ + "console", + "network", + "navigation" +]
- Changed
browser_press_key9 fields changed- added
Input schema / properties / frameAdded value: +{ + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / frame_idAdded value: +{ + "description": "Selector frame; default main.", + "type": "string" +} - added
Input schema / properties / nameAdded value: +{ + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" +} - added
Input schema / properties / nthAdded value: +{ + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / refAdded value: +{ + "type": "string" +} - added
Input schema / properties / selectorAdded value: +{ + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / selector_typeAdded value: +{ + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Added
browser_read_control - Changed
browser_scroll2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_select_option2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_type2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
- Changed
browser_upload_file2 fields changed- added
Input schema / properties / observeAdded value: +{ + "additionalProperties": false, + "description": "Read this explicit control after the action within its remaining budget; observation is separate from delivery. No assertion or automatic replay.", + "properties": { + "frame": { + "additionalProperties": false, + "description": "Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "description": "Selector frame; default main.", + "type": "string" + }, + "max_chars": { + "default": 16000, + "maximum": 64000, + "minimum": 1000, + "type": "integer" + }, + "max_options": { + "default": 30, + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "name": { + "description": "role only: exact AX name; empty allowed.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Selector only: zero-based DOM index, AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "popup_selector": { + "description": "Optional unique CSS popup in the control frame; otherwise use browser-resolved controls/owns relations and control descendants.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "ref": { + "type": "string" + }, + "selector": { + "description": "Query by selector_type; role example: selector=\"link\", name=\"Claim\".", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "default": 1000, + "maximum": 5000, + "minimum": 100, + "type": "integer" + } + }, + "type": "object" +} - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Total preparation/dispatch/verification budget."New value: +"Total preparation/dispatch/verification and optional observation budget."
3 tool updates
v0.25.2- Changed
browser_batch1 field changed- changed
Input schema / properties / steps / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "click", - "type": "string" - }, - "button": { - "default": "left", - "enum": [ - "left", - "middle", - "right" - ], - "type": "string" - }, - "click_count": { - "anyOf": [ - { - "const": 1, - "type": "number" - }, - { - "const": 2, - "type": "number" - } - ], - "default": 1 - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "description": "DOM: left single click, no modifiers.", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "modifiers": { - "default": [], - "items": { - "enum": [ - "Alt", - "Control", - "Meta", - "Shift" - ], - "type": "string" - }, - "type": "array" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; hit checks still apply.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "settle_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max." - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "fill", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected_value": { - "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.", - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "type", - "type": "string" - }, - "delay_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "default": 0, - "description": "Between characters: ms or independent uniform [min,max]; min<=max." - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "focused": { - "const": true, - "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.", - "type": "boolean" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.", - "maxLength": 10000, - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "hover", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; hit checks still apply.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "select_option", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "label": { - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "value": { - "description": "Exactly one value/label/index; strings match exactly, index is zero-based.", - "type": "string" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "scroll", - "type": "string" - }, - "delta_x": { - "default": 0, - "type": "number" - }, - "delta_y": { - "description": "Vertical delta, positive down; required without until.", - "type": "number" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "max_steps": { - "default": 100, - "maximum": 500, - "minimum": 1, - "type": "integer" - }, - "mode": { - "default": "dom", - "enum": [ - "dom", - "wheel" - ], - "type": "string" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "until": { - "additionalProperties": false, - "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.", - "properties": { - "selector": { - "minLength": 1, - "type": "string" - }, - "text": { - "maxLength": 2000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "action" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "wait", - "type": "string" - }, - "condition": { - "description": "Element conditions require selector; url/network_idle forbid locator fields.", - "enum": [ - "attached", - "absent", - "visible", - "actionable", - "text", - "value", - "checked", - "selected", - "expanded", - "url", - "network_idle" - ], - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected": { - "anyOf": [ - { - "maxLength": 100000, - "type": "string" - }, - { - "type": "boolean" - } - ], - "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." - }, - "frame": { - "additionalProperties": false, - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "idle_ms": { - "default": 500, - "description": "network_idle quiet interval.", - "maximum": 10000, - "minimum": 100, - "type": "integer" - }, - "name": { - "maxLength": 10000, - "type": "string" - }, - "nth": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "previous": { - "description": "text only: wait for full rendered innerText to change; exclusive with expected.", - "maxLength": 100000, - "type": "string" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "condition" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "press_key", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "key": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "key" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "click", + "type": "string" + }, + "button": { + "default": "left", + "enum": [ + "left", + "middle", + "right" + ], + "type": "string" + }, + "click_count": { + "anyOf": [ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "default": 1 + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "DOM: left single click, no modifiers.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "modifiers": { + "default": [], + "items": { + "enum": [ + "Alt", + "Control", + "Meta", + "Shift" + ], + "type": "string" + }, + "type": "array" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "settle_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max." + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "fill", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected_value": { + "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.", + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "type", + "type": "string" + }, + "delay_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "default": 0, + "description": "Between characters: ms or independent uniform [min,max]; min<=max." + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "focused": { + "const": true, + "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.", + "type": "boolean" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.", + "maxLength": 10000, + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "hover", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "select_option", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "label": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "value": { + "description": "Exactly one value/label/index; strings match exactly, index is zero-based.", + "type": "string" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "scroll", + "type": "string" + }, + "delta_x": { + "default": 0, + "type": "number" + }, + "delta_y": { + "description": "Vertical delta, positive down; required without until.", + "type": "number" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_steps": { + "default": 100, + "maximum": 500, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "dom", + "enum": [ + "dom", + "wheel" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "until": { + "additionalProperties": false, + "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.", + "properties": { + "selector": { + "minLength": 1, + "type": "string" + }, + "text": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "action" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "wait", + "type": "string" + }, + "condition": { + "description": "Element conditions require selector; url/network_idle forbid locator fields.", + "enum": [ + "attached", + "absent", + "visible", + "actionable", + "text", + "value", + "checked", + "selected", + "expanded", + "url", + "network_idle" + ], + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected": { + "anyOf": [ + { + "maxLength": 100000, + "type": "string" + }, + { + "type": "boolean" + } + ], + "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "idle_ms": { + "default": 500, + "description": "network_idle quiet interval.", + "maximum": 10000, + "minimum": 100, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "previous": { + "description": "text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion.", + "maxLength": 100000, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "condition" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "press_key", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "key": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "key" + ], + "type": "object" + } +]
- Changed
browser_read_text1 field changed- changed
Input schema / properties / mode / descriptionPrevious value: -"value: input/textarea/contenteditable; editor: exposed Monaco/CM5 model. Both require selector."New value: +"value: DOM field text; editor: exposed Monaco/CM5 model, otherwise error with evaluate guidance. Both require selector. Virtualized editor DOM/proxy values are not model text."
- Changed
browser_wait1 field changed- changed
Input schema / properties / previous / descriptionPrevious value: -"text only: wait for full rendered innerText to change; exclusive with expected."New value: +"text only: complete prior innerText, not a truncated preview; exclusive with expected. Change does not establish new-run completion."
1 tool update
v0.25.0- Changed
browser_open_tab1 field changed- added
Input schema / properties / claimAdded value: +{ + "default": false, + "type": "boolean" +}
17 tool updates
v0.24.2- Changed
browser_batch3 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - added
Input schema / properties / steps / descriptionAdded value: +"Element steps require selector; type uses selector XOR focused=true; scroll may omit target, wait follows condition. No refs; coordinates only for scroll x/y. Common locators: selector_type defaults css; label=exact associated HTML label with normalized whitespace; placeholder=exact attribute; role uses selector=\"link\", name=\"Claim\" (exact AX name, empty allowed). nth=zero-based DOM/AX-role order. Locator options need selector; frame/frame_id exclusive. frame needs at least one of exact url/title or nested CSS iframe path (each step unique, e.g. [\"#frame\"]). Steps may override dialog_policy." - changed
Input schema / properties / steps / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "click", - "type": "string" - }, - "button": { - "default": "left", - "enum": [ - "left", - "middle", - "right" - ], - "type": "string" - }, - "click_count": { - "anyOf": [ - { - "const": 1, - "type": "number" - }, - { - "const": 2, - "type": "number" - } - ], - "default": 1 - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "modifiers": { - "default": [], - "items": { - "enum": [ - "Alt", - "Control", - "Meta", - "Shift" - ], - "type": "string" - }, - "type": "array" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "settle_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]." - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "fill", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected_value": { - "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.", - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "type", - "type": "string" - }, - "delay_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "default": 0, - "description": "Between characters: fixed ms or independently sampled uniform [min, max]." - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "focused": { - "const": true, - "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.", - "type": "boolean" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "maxLength": 10000, - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "hover", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "select_option", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "label": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "value": { - "type": "string" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "scroll", - "type": "string" - }, - "delta_x": { - "default": 0, - "type": "number" - }, - "delta_y": { - "description": "Positive scrolls down.", - "type": "number" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "max_steps": { - "default": 100, - "maximum": 500, - "minimum": 1, - "type": "integer" - }, - "mode": { - "default": "dom", - "enum": [ - "dom", - "wheel" - ], - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "until": { - "additionalProperties": false, - "properties": { - "selector": { - "minLength": 1, - "type": "string" - }, - "text": { - "maxLength": 2000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "action" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "wait", - "type": "string" - }, - "condition": { - "enum": [ - "attached", - "absent", - "visible", - "actionable", - "text", - "value", - "checked", - "selected", - "expanded", - "url", - "network_idle" - ], - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected": { - "anyOf": [ - { - "maxLength": 100000, - "type": "string" - }, - { - "type": "boolean" - } - ], - "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")." - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "idle_ms": { - "default": 500, - "maximum": 10000, - "minimum": 100, - "type": "integer" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "previous": { - "description": "Text only: wait for full rendered innerText to differ; alternative to expected.", - "maxLength": 100000, - "type": "string" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "condition" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "press_key", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "key": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "key" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "click", + "type": "string" + }, + "button": { + "default": "left", + "enum": [ + "left", + "middle", + "right" + ], + "type": "string" + }, + "click_count": { + "anyOf": [ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "default": 1 + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "DOM: left single click, no modifiers.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "modifiers": { + "default": [], + "items": { + "enum": [ + "Alt", + "Control", + "Meta", + "Shift" + ], + "type": "string" + }, + "type": "array" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "settle_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "description": "After preparation, before dispatch: ms or uniform [min,max]; min<=max." + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "fill", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected_value": { + "description": "Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait.", + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "description": "native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change.", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "type", + "type": "string" + }, + "delay_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "default": 0, + "description": "Between characters: ms or independent uniform [min,max]; min<=max." + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "focused": { + "const": true, + "description": "Pin current editable focus without refocusing; exclusive with ref/selector and locator options.", + "type": "boolean" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "description": "Printable trusted keys; Enter/Tab use press_key. Stops on target focus loss/detachment.", + "maxLength": 10000, + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "hover", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; hit checks still apply.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "select_option", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "label": { + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "value": { + "description": "Exactly one value/label/index; strings match exactly, index is zero-based.", + "type": "string" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "scroll", + "type": "string" + }, + "delta_x": { + "default": 0, + "type": "number" + }, + "delta_y": { + "description": "Vertical delta, positive down; required without until.", + "type": "number" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_steps": { + "default": 100, + "maximum": 500, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "dom", + "enum": [ + "dom", + "wheel" + ], + "type": "string" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "until": { + "additionalProperties": false, + "description": "DOM-only search of visible elements' textContent; selector is a CSS filter within the container.", + "properties": { + "selector": { + "minLength": 1, + "type": "string" + }, + "text": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "action" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "wait", + "type": "string" + }, + "condition": { + "description": "Element conditions require selector; url/network_idle forbid locator fields.", + "enum": [ + "attached", + "absent", + "visible", + "actionable", + "text", + "value", + "checked", + "selected", + "expanded", + "url", + "network_idle" + ], + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected": { + "anyOf": [ + { + "maxLength": 100000, + "type": "string" + }, + { + "type": "boolean" + } + ], + "description": "Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." + }, + "frame": { + "additionalProperties": false, + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "idle_ms": { + "default": 500, + "description": "network_idle quiet interval.", + "maximum": 10000, + "minimum": 100, + "type": "integer" + }, + "name": { + "maxLength": 10000, + "type": "string" + }, + "nth": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "previous": { + "description": "text only: wait for full rendered innerText to change; exclusive with expected.", + "maxLength": 100000, + "type": "string" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "condition" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "press_key", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "key": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "key" + ], + "type": "object" + } +]
- Changed
browser_click12 fields changed- changed
Input schema / properties / coordinate_space / descriptionPrevious value: -"Coordinates only; document scrolls the top-level page first."New value: +"x+y only; document scrolls the top-level page first." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / mode / descriptionPrevious value: -"DOM click requires an element target and a left single click without modifiers."New value: +"DOM: ref/selector, left single click, no modifiers." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / offset / descriptionPrevious value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / settle_ms / descriptionPrevious value: -"Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."New value: +"After preparation, before dispatch: ms or uniform [min,max]; min<=max." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_drag18 fields changed- changed
Input schema / properties / destination / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / destination / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / destination / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / destination / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / destination / properties / offset / descriptionPrevious value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply." - changed
Input schema / properties / destination / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / destination / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / settle_ms / descriptionPrevious value: -"Pause after target preparation, before dispatch: fixed ms or uniform [min, max]."New value: +"After preparation, before dispatch: ms or uniform [min,max]; min<=max." - changed
Input schema / properties / source / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / source / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / source / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / source / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / source / properties / offset / descriptionPrevious value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply." - changed
Input schema / properties / source / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / source / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget." - changed
Input schema / properties / trajectory / descriptionPrevious value: -"Opt in to curved, variable-speed steps and varied intervals. Signed curve control-point offset in CSS px; duration covers interpolation waits only."New value: +"Opt-in curved, variable-speed steps/intervals; curve_px is signed CSS-pixel offset. Duration covers interpolation waits only."
- Changed
browser_evaluate4 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Cached JSON instead of expression; omit frame, frame_id and result_type=element."New value: +"Exactly one of expression/cursor. Cursor reads cached JSON; omit frame/frame_id and result_type=element." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - added
Input schema / properties / result_type / descriptionAdded value: +"element: return one connected DOM element as a ref."
- Changed
browser_fetch3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Default text (rendered); html=current DOM with dom=rendered; json=complete validated JSON."New value: +"Default rendered text; html=current DOM (dom=rendered); json=validated JSON." - changed
Input schema / properties / max_chars / descriptionPrevious value: -"Text/HTML page budget; JSON ignores this and returns whole, up to 1M chars. capture_truncated means text/HTML loss; oversized JSON errors."New value: +"Text/HTML page budget; capture_truncated marks source loss. JSON returns whole, ignores this budget, errors above 1M chars." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Default 15000; total deadline including creation/cleanup, with time reserved for capture after an unmet wait."New value: +"Default 15000; total including creation/cleanup, reserving capture time after unmet waits."
- Changed
browser_fill10 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / expected_value / descriptionPrevious value: -"Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting."New value: +"Expected retained text, default text. Verification only; insertion unchanged. No normalization or blur/async wait." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - added
Input schema / properties / mode / descriptionAdded value: +"native: focus/select and insert without character keydown. dom: write visible line breaks without focus, emit synthetic input/change." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_hover9 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / offset / descriptionPrevious value: -"Native element only: ratios within its content quad; offscreen/covered points fail."New value: +"Native element only: ratios within its content quad; hit checks still apply." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_navigate1 field changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages."
- Changed
browser_press_key2 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_read_text6 fields changed- changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - added
Input schema / properties / mode / descriptionAdded value: +"value: input/textarea/contenteditable; editor: exposed Monaco/CM5 model. Both require selector." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
- Changed
browser_screenshot6 fields changed- changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
- Changed
browser_scroll10 fields changed- changed
Input schema / properties / delta_y / descriptionPrevious value: -"Positive scrolls down."New value: +"Vertical delta, positive down; required without until." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget." - added
Input schema / properties / until / descriptionAdded value: +"DOM-only search of visible elements' textContent; selector is a CSS filter within the container."
- Changed
browser_select_option9 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget." - changed
Input schema / properties / value / descriptionPrevious value: -"Choose exactly one of value, label or zero-based index; value/label match exactly."New value: +"Exactly one value/label/index; strings match exactly, index is zero-based."
- Changed
browser_snapshot2 fields changed- changed
Input schema / properties / include_hidden / descriptionPrevious value: -"fields only, default false: also include native fields omitted from AX, such as hidden inputs. These may have ref=null. Password values are omitted."New value: +"fields only, default false: include native fields omitted from AX; ref may be null. Password values omitted." - changed
Input schema / properties / profile / descriptionPrevious value: -"Default full; interactive keeps controls and ancestors; fields returns a fields array instead of AX text."New value: +"Default full; interactive keeps controls/ancestors; fields returns separate DOM/AX values in a fields array."
- Changed
browser_type10 fields changed- changed
Input schema / properties / delay_ms / descriptionPrevious value: -"Between characters: fixed ms or independently sampled uniform [min, max]."New value: +"Between characters: ms or independent uniform [min,max]; min<=max." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / focused / descriptionPrevious value: -"Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes."New value: +"Pin current editable focus without refocusing; exclusive with ref/selector and locator options." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_upload_file8 fields changed- changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - changed
Input schema / properties / frame_id / descriptionPrevious value: -"Selector scope; defaults to main frame."New value: +"Selector frame; default main." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute." - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Covers preparation, dispatch and verification."New value: +"Total preparation/dispatch/verification budget."
- Changed
browser_wait10 fields changed- added
Input schema / properties / condition / descriptionAdded value: +"Element conditions require selector; url/network_idle forbid locator fields." - changed
Input schema / properties / dialog_policy / descriptionPrevious value: -"accept/dismiss returns handled dialog messages."New value: +"accept/dismiss auto-handle dialogs and return their messages." - changed
Input schema / properties / expected / descriptionPrevious value: -"text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")."New value: +"Required for url (substring), value (exact), checked/selected/expanded (boolean; checked also \"mixed\"). text: expected substring XOR previous. Omit otherwise." - changed
Input schema / properties / frame / descriptionPrevious value: -"Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document."New value: +"Child frame: at least one of url/title/path. url/title exact; path=unique nested CSS iframe steps (e.g. [\"#frame\"]); exclusive with frame_id." - added
Input schema / properties / idle_ms / descriptionAdded value: +"network_idle quiet interval." - changed
Input schema / properties / name / descriptionPrevious value: -"role only: exact accessible name; may be empty."New value: +"role only: exact AX name; empty allowed." - changed
Input schema / properties / nth / descriptionPrevious value: -"Zero-based match index: DOM order, or AX tree order for role."New value: +"Selector only: zero-based DOM index, AX tree order for role." - changed
Input schema / properties / previous / descriptionPrevious value: -"Text only: wait for full rendered innerText to differ; alternative to expected."New value: +"text only: wait for full rendered innerText to change; exclusive with expected." - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."New value: +"Query by selector_type; role example: selector=\"link\", name=\"Claim\"." - changed
Input schema / properties / selector_type / descriptionPrevious value: -"Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics."New value: +"Default css. label: exact associated HTML label, whitespace normalized. placeholder: exact attribute."
12 tool updates
v0.24.1- Changed
browser_batch1 field changed- changed
Input schema / properties / steps / items / oneOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "action": { - "const": "click", - "type": "string" - }, - "button": { - "default": "left", - "enum": [ - "left", - "middle", - "right" - ], - "type": "string" - }, - "click_count": { - "anyOf": [ - { - "const": 1, - "type": "number" - }, - { - "const": 2, - "type": "number" - } - ], - "default": 1 - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "modifiers": { - "default": [], - "items": { - "enum": [ - "Alt", - "Control", - "Meta", - "Shift" - ], - "type": "string" - }, - "type": "array" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "settle_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]." - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "fill", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected_value": { - "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.", - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "mode": { - "default": "native", - "enum": [ - "native", - "dom" - ], - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "type", - "type": "string" - }, - "delay_ms": { - "anyOf": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "additionalItems": false, - "items": [ - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - }, - { - "maximum": 1000, - "minimum": 0, - "type": "integer" - } - ], - "maxItems": 2, - "minItems": 2, - "type": "array" - } - ], - "default": 0, - "description": "Between characters: fixed ms or independently sampled uniform [min, max]." - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "focused": { - "const": true, - "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.", - "type": "boolean" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "text": { - "maxLength": 10000, - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "text" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "hover", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "offset": { - "additionalProperties": false, - "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", - "properties": { - "x_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y_ratio": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "x_ratio", - "y_ratio" - ], - "type": "object" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "select_option", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "index": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "label": { - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "value": { - "type": "string" - } - }, - "required": [ - "action", - "selector" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "scroll", - "type": "string" - }, - "delta_x": { - "default": 0, - "type": "number" - }, - "delta_y": { - "description": "Positive scrolls down.", - "type": "number" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "max_steps": { - "default": 100, - "maximum": 500, - "minimum": 1, - "type": "integer" - }, - "mode": { - "default": "dom", - "enum": [ - "dom", - "wheel" - ], - "type": "string" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - }, - "until": { - "additionalProperties": false, - "properties": { - "selector": { - "minLength": 1, - "type": "string" - }, - "text": { - "maxLength": 2000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "text" - ], - "type": "object" - }, - "x": { - "type": "number" - }, - "y": { - "type": "number" - } - }, - "required": [ - "action" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "wait", - "type": "string" - }, - "condition": { - "enum": [ - "attached", - "absent", - "visible", - "actionable", - "text", - "value", - "checked", - "selected", - "expanded", - "url", - "network_idle" - ], - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "expected": { - "anyOf": [ - { - "maxLength": 100000, - "type": "string" - }, - { - "type": "boolean" - } - ], - "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")." - }, - "frame": { - "additionalProperties": false, - "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", - "properties": { - "path": { - "items": { - "minLength": 1, - "type": "string" - }, - "maxItems": 16, - "minItems": 1, - "type": "array" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "url": { - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "frame_id": { - "type": "string" - }, - "idle_ms": { - "default": 500, - "maximum": 10000, - "minimum": 100, - "type": "integer" - }, - "name": { - "description": "role only: exact accessible name; may be empty.", - "maxLength": 10000, - "type": "string" - }, - "nth": { - "description": "Zero-based match index: DOM order, or AX tree order for role.", - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "previous": { - "description": "Text only: wait for full rendered innerText to differ; alternative to expected.", - "maxLength": 100000, - "type": "string" - }, - "selector": { - "description": "CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type.", - "maxLength": 10000, - "minLength": 1, - "type": "string" - }, - "selector_type": { - "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", - "enum": [ - "css", - "xpath", - "label", - "placeholder", - "role" - ], - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "condition" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "action": { - "const": "press_key", - "type": "string" - }, - "dialog_policy": { - "enum": [ - "ask", - "accept", - "dismiss" - ], - "type": "string" - }, - "key": { - "type": "string" - }, - "timeout_ms": { - "maximum": 30000, - "minimum": 100, - "type": "integer" - } - }, - "required": [ - "action", - "key" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "action": { + "const": "click", + "type": "string" + }, + "button": { + "default": "left", + "enum": [ + "left", + "middle", + "right" + ], + "type": "string" + }, + "click_count": { + "anyOf": [ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + } + ], + "default": 1 + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "modifiers": { + "default": [], + "items": { + "enum": [ + "Alt", + "Control", + "Meta", + "Shift" + ], + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "settle_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "description": "Pause after target preparation, before dispatch: fixed ms or uniform [min, max]." + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "fill", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected_value": { + "description": "Explicit expected retained text after page formatting; default is text. Changes verification only, never the inserted text. No automatic numeric/date normalization or waiting for blur/async formatting.", + "type": "string" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "mode": { + "default": "native", + "enum": [ + "native", + "dom" + ], + "type": "string" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "type", + "type": "string" + }, + "delay_ms": { + "anyOf": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "additionalItems": false, + "items": [ + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + }, + { + "maximum": 1000, + "minimum": 0, + "type": "integer" + } + ], + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ], + "default": 0, + "description": "Between characters: fixed ms or independently sampled uniform [min, max]." + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "focused": { + "const": true, + "description": "Alternative to ref/selector: pin the currently focused editable element without refocusing it. Stops if focus changes.", + "type": "boolean" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "text": { + "maxLength": 10000, + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "text" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "hover", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "offset": { + "additionalProperties": false, + "description": "Native element only: ratios within its content quad; offscreen/covered points fail.", + "properties": { + "x_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x_ratio", + "y_ratio" + ], + "type": "object" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "select_option", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "index": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "label": { + "type": "string" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "required": [ + "action", + "selector" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "scroll", + "type": "string" + }, + "delta_x": { + "default": 0, + "type": "number" + }, + "delta_y": { + "description": "Positive scrolls down.", + "type": "number" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "max_steps": { + "default": 100, + "maximum": 500, + "minimum": 1, + "type": "integer" + }, + "mode": { + "default": "dom", + "enum": [ + "dom", + "wheel" + ], + "type": "string" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "selector": { + "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + }, + "until": { + "additionalProperties": false, + "properties": { + "selector": { + "minLength": 1, + "type": "string" + }, + "text": { + "maxLength": 2000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "text" + ], + "type": "object" + }, + "x": { + "type": "number" + }, + "y": { + "type": "number" + } + }, + "required": [ + "action" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "wait", + "type": "string" + }, + "condition": { + "enum": [ + "attached", + "absent", + "visible", + "actionable", + "text", + "value", + "checked", + "selected", + "expanded", + "url", + "network_idle" + ], + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "expected": { + "anyOf": [ + { + "maxLength": 100000, + "type": "string" + }, + { + "type": "boolean" + } + ], + "description": "text/url: substring; value: exact string; checked/selected/expanded: boolean (checked also accepts \"mixed\")." + }, + "frame": { + "additionalProperties": false, + "description": "Exact child-frame URL/title or CSS iframe path (e.g. [\"#content_iframe\"]); alternative to frame_id. Each path entry uniquely selects an iframe in the preceding document.", + "properties": { + "path": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "url": { + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "frame_id": { + "type": "string" + }, + "idle_ms": { + "default": 500, + "maximum": 10000, + "minimum": 100, + "type": "integer" + }, + "name": { + "description": "role only: exact accessible name; may be empty.", + "maxLength": 10000, + "type": "string" + }, + "nth": { + "description": "Zero-based match index: DOM order, or AX tree order for role.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "previous": { + "description": "Text only: wait for full rendered innerText to differ; alternative to expected.", + "maxLength": 100000, + "type": "string" + }, + "selector": { + "description": "CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type.", + "maxLength": 10000, + "minLength": 1, + "type": "string" + }, + "selector_type": { + "description": "Default css. label matches associated HTML labels with whitespace normalized; role uses browser AX semantics.", + "enum": [ + "css", + "xpath", + "label", + "placeholder", + "role" + ], + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "condition" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "action": { + "const": "press_key", + "type": "string" + }, + "dialog_policy": { + "enum": [ + "ask", + "accept", + "dismiss" + ], + "type": "string" + }, + "key": { + "type": "string" + }, + "timeout_ms": { + "maximum": 30000, + "minimum": 100, + "type": "integer" + } + }, + "required": [ + "action", + "key" + ], + "type": "object" + } +]
- Changed
browser_click1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_drag2 fields changed- changed
Input schema / properties / destination / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type." - changed
Input schema / properties / source / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_fill1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_hover1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_read_text1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_screenshot1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_scroll1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_select_option1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_type1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_upload_file1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
- Changed
browser_wait1 field changed- changed
Input schema / properties / selector / descriptionPrevious value: -"CSS/XPath query, HTML label text, exact placeholder or AX role, according to selector_type."New value: +"CSS/XPath query, HTML label text, exact placeholder or AX role (e.g. selector=\"link\", name=\"Claim\"), according to selector_type."
23 tool updates
v0.24.0- First observed
browser_batch - First observed
browser_claim_tab - First observed
browser_click - First observed
browser_discover - First observed
browser_drag - First observed
browser_evaluate - First observed
browser_fetch - First observed
browser_fill - First observed
browser_handle_dialog - First observed
browser_hover - First observed
browser_logs - First observed
browser_navigate - First observed
browser_open_tab - First observed
browser_press_key - First observed
browser_read_text - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_select_option - First observed
browser_snapshot - First observed
browser_tab_control - First observed
browser_type - First observed
browser_upload_file - First observed
browser_wait
TDQS
Scored across 24 tools
Most tools target a clearly distinct action (click, hover, drag, scroll, press_key, screenshot, upload, dialog), and the tab-lifecycle group (discover, claim_tab, open_tab, tab_control) is well separated. The main ambiguity is in the read/input clusters: browser_type vs browser_fill, and browser_read_text vs browser_snapshot vs browser_read_control overlap in purpose, though descriptions do draw explicit boundaries (fill replaces, type appends; snapshot=AX refs, read_text=visible text, read_control=single control).
All 24 tools use a uniform browser_ prefix with snake_case, which is highly predictable. The pattern is verb-first (browser_click, browser_fill, browser_navigate, browser_read_text) with one structural outlier, browser_tab_control, which reads as noun_verb and slightly breaks the convention.
At 24 tools this sits at the top of the reasonable band, and it is on the heavy side. However, browser automation genuinely spans input primitives, reading modes, tab lifecycle, dialogs, uploads, logs, batch and evaluate, so nearly every tool covers a real capability rather than padding.
Coverage is broad and lifecycle-complete: discover/claim/open/navigate/tab_control for tabs, a full input set, multiple read modes, screenshots, dialogs, uploads, logs and batch orchestration. Gaps are minor — no download handling, cookie/storage or network interception tools, and no dedicated frame-switching tool (frames are only implied in read_text), which agents must work around via evaluate.
Maintenance
Related MCP Connectors
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
Official Browserless MCP server: browser automation, scraping, screenshots and PDFs for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables any MCP client to drive the user's real Chrome profile through a Chrome extension bridge, with tools for navigation, accessibility snapshots, ref-based interactions, console/network reading, screenshots, tab management, and restricted script evaluation.1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding tools to drive your real, already-logged-in Chrome browser through an extension-based local MCP bridge, with no debugging port or headless setup required. It provides tools for navigating pages, reading content, clicking, typing, screenshots, tabs, cookies, network inspection, and more.1 npmISC
- AlicenseNot gradedqualityAmaintenanceEnables AI coding tools to drive the user's real, already-logged-in Chrome through an MCP stdio interface, exposing 25 tools for navigating, clicking, typing, reading pages, taking screenshots, capturing network traffic, and accessing cookies and storage. The bundled Chrome extension talks to a local bridge instead of an open remote-debugging port, so logged-in sessions and bot-detection-proof human browsing work without extra setup.1 npmISC

byobofficial
AlicenseNot gradedqualityAmaintenanceEnables MCP-compatible AI assistants to drive the user's real, already-logged-in Chrome browser locally, so they can read and summarize pages, click, type, fill and submit forms, navigate tabs, and capture screenshots with full access to existing sessions. It also exposes cookies, storage, console, network capture, and emulation capabilities without opening a remote-debugging port or sending data off the machine.1 npmISC