laya-browser-mcp
Provides browser automation for Firefox, allowing navigation, clicking, typing, form filling, snapshotting, and other Playwright-based browser actions through the server's core tools.
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., "@laya-browser-mcpOpen news.ycombinator.com and summarize the top 3 stories."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
laya-browser-mcp
A superset of Playwright MCP with a local,
sub-100ms Laya on-device decision engine. It exposes the familiar ref-based Playwright
browser tools (Assist mode) and adds an Autopilot loop (laya_run_goal) that resolves each
step's element/action choice on-device with a local Laya "System 1" model, so the client
LLM is invoked far less often. When the local model is not confident, Autopilot escalates the
single step to the client's own LLM via MCP sampling.
What it is and honest positioning
laya-browser-mcp is a drop-in superset of Playwright MCP plus a fast local decision layer with an LLM fallback. It is not a magic autonomous agent. Please read this before deciding whether it fits your use case:
Playwright-MCP superset. Every core browser tool uses the same ref-based contract (
browser_snapshotgives[ref=eN]markers; you pass a ref astargettobrowser_click/browser_type/ ...). Migrating from Playwright MCP is a config change.Strong on clean, structured forms. The web-agent checkpoint scores roughly 97.7% per-step on clean synthetic forms (search boxes, filters, logins, checkouts).
Weak on arbitrary real sites. On real-world Mind2Web pages it is only right about 1 step in 5 end to end. Autopilot leans on deterministic rules and LLM escalation to cover the gap, and it still may fail on messy sites.
The reference model is not web-tuned. The bundled reference/stub decision layer is deterministic rules, not a web-tuned model. Treat Autopilot numbers here as the rule layer's behaviour, not a model benchmark.
NOT a fully autonomous general web agent. Do not deploy it unattended against sites where a wrong click matters.
DONEis never trusted on its own: every run ends with an independent final-page verification.Works with no weights. Assist mode is fully standalone (no model needed). Autopilot degrades gracefully to an Assist-mode hint when weights are absent.
Related MCP server: Cloudflare Playwright MCP
Quick start (easy setup)
Requires Node.js 22+ and pnpm.
# 1. Install dependencies
pnpm install
# 2. Install the Chromium browser Playwright drives
pnpm exec playwright install chromium
# 3. Build the server (emits dist/index.js)
pnpm run buildThat is enough to run Assist mode with no model weights.
MCP client configuration (stdio)
Point your MCP client at the built entry with a stdio server block:
{
"mcpServers": {
"laya-browser": {
"command": "node",
"args": ["/absolute/path/to/laya-browser-mcp/dist/index.js"],
"env": {
// Optional: enable extra tool groups (default is core-only, like Playwright MCP)
"LAYA_CAPS": "network,storage,testing,devtools,pdf,vision,config",
// Optional: pick a browser engine (chromium | firefox | webkit)
"LAYA_BROWSER": "chromium",
// Optional (Autopilot): use local weights when present, else the stub
"LAYA_ENGINE": "auto",
"LAYA_MODEL_DIR": "/absolute/path/to/laya-onnx-bundle"
}
}
}
}Enable extra tools with
LAYA_CAPS(comma or space separated). Unset means core-only, matching Playwright MCP. See capability groups.Cross-browser with
LAYA_BROWSER. Chromium is preinstalled; Firefox / WebKit needpnpm exec playwright install firefox webkitfirst.Clients that intend to use Autopilot should advertise the
samplingcapability so the low-confidence escalation path is available. Autopilot still runs without it (it degrades toBLOCKEDon low confidence).
Tools
The full toolset is a capability-gating registry (src/tools/index.ts): a tool with no
capability is CORE and always registered; a tool tagged with a capability is registered
only when that capability is enabled via LAYA_CAPS. Core-only exposes 25 tools; enabling
every group exposes 72 tools. The tables below list every tool grouped by capability.
Capability groups (LAYA_CAPS)
Like Playwright MCP, the server exposes only its core toolset by default. Extra groups are
opt-in through LAYA_CAPS, a comma or space separated list. An unset or empty LAYA_CAPS
registers core-only; unknown names are ignored.
Group | What it adds |
| Request route-mocking (fulfill/abort) and an offline/online toggle. |
| Cookies, |
| Playwright locator generation and |
| Real tracing + element highlight; honest no-ops for the headed-only codegen/video features. |
| Save the page as a PDF (Chromium-only). |
| Coordinate-based mouse primitives (move/click/drag/down/up/wheel). |
| Report the resolved configuration. |
# enable every group at once
LAYA_CAPS=network,storage,testing,devtools,pdf,vision,configOnly the core tools plus the groups you list are registered; everything else is neither listed nor callable.
CORE tools (always registered)
Tool | Description |
| Navigate to a URL and return a snapshot of the resulting page (subject to the domain allow-list). |
| Navigate back to the previous page and return a snapshot. |
| Resize the viewport to a given width and height, then return a snapshot. |
| Capture a compact accessibility snapshot; interactive elements carry stable |
| Click an element identified by a snapshot ref ( |
| Type text into an editable element (ref |
| Hover over an element (ref |
| Search the current snapshot for controls whose name/value/role matches a substring or regexp, returning each match's ref. |
| Drag one element and drop it onto another. |
| Drop files ( |
| Fill multiple form fields (textbox/checkbox/radio/combobox/slider) in a single call, then return one snapshot. |
| Evaluate a JavaScript function on the page or on an element, returning the JSON result. |
| Select one or more options in a dropdown (ref |
| Press a keyboard key or combination (e.g. |
| Wait for text to appear, text to disappear, or a fixed number of seconds. |
| Close the browser session and release all resources. |
| Manage tabs: list, create (optionally at a URL), close by index, or select by index. |
| Register how the NEXT JS dialog (alert/confirm/prompt/beforeunload) is handled; call before the triggering action. |
| Upload files by setting them on a file input (ref/selector; defaults to the first file input). |
| Capture a screenshot of the page (or one element) as a PNG/JPEG/WebP image block. |
| Return console messages and uncaught page errors captured since session start; optionally errors only. |
| List captured network requests, one per line (index, method, status, URL). |
| Return the full detail of one captured request, selected by |
| DANGEROUS: run a raw Playwright snippet against the page. Disabled unless |
element (where present) is a human-readable description; target is either a snapshot ref
(e5) or a unique Playwright selector (CSS / text=).
STORAGE tools (LAYA_CAPS=storage)
Tool | Description |
| List all cookies in the current context. |
| Get the cookie(s) with a given name. |
| Set or overwrite a cookie (omit domain to scope it to the active page). |
| Delete the cookie(s) with a given name. |
| Remove all cookies from the context. |
| List all |
| Get a |
| Set a |
| Delete a |
| Clear all |
| List all |
| Get a |
| Set a |
| Delete a |
| Clear all |
| Save the context's cookies and per-origin |
| Restore cookies and per-origin |
NETWORK tools (LAYA_CAPS=network)
Tool | Description |
| Mock a request: fulfill matching requests with a canned response, or abort them, by URL pattern. |
| List the active route-mocking rules. |
| Remove a route-mocking rule by its URL pattern. |
| Set network connectivity: offline ( |
TESTING tools (LAYA_CAPS=testing)
Tool | Description |
| Generate a stable Playwright locator ( |
| Assert the element is visible. Returns PASS or FAIL. |
| Assert the given text is visible somewhere on the page. Returns PASS or FAIL. |
| Assert a list container is visible and, optionally, that each expected item text is visible. Returns PASS or FAIL. |
| Assert a form field has an exact value. Returns PASS or FAIL. |
PDF tools (LAYA_CAPS=pdf)
Tool | Description |
| Save the current page as a PDF (Chromium-only; print-to-PDF path). Returns the output path and byte size. |
VISION tools (LAYA_CAPS=vision)
Tool | Description |
| Move the mouse to absolute page coordinates. |
| Move to absolute coordinates and click; returns a fresh snapshot. |
| Drag the mouse from a start coordinate to an end coordinate; returns a fresh snapshot. |
| Press and hold a mouse button at the current cursor position. |
| Release a mouse button at the current cursor position. |
| Scroll the page by a wheel delta. |
CONFIG tools (LAYA_CAPS=config)
Tool | Description |
| Return the resolved configuration (capabilities, engine, headless, viewport, thresholds, allow-list) as JSON. |
DEVTOOLS tools (LAYA_CAPS=devtools)
Tool | Description |
| Start Playwright context tracing (screenshots + snapshots + sources). |
| Stop tracing and write the trace zip (open with |
| Draw a visible outline around an element via an injected style. |
| Remove any outlines added by |
| Honest no-op: video capture needs |
| Honest no-op: no headless video recording is active (see divergence notes). |
| Honest no-op: video chapters are a live trace-viewer feature (see divergence notes). |
| Honest no-op: action overlays are rendered by the interactive trace viewer (see divergence notes). |
| Honest no-op: action overlays are rendered by the interactive trace viewer (see divergence notes). |
| Honest no-op: codegen recording needs the headed inspector (see divergence notes). |
| Honest no-op: codegen recording needs the headed inspector (see divergence notes). |
| Honest no-op: annotations are a live inspector feature (see divergence notes). |
| Honest no-op: there is no paused inspector to resume headless (see divergence notes). |
Divergence notes (where behaviour differs from Playwright)
These tools are exposed for parity but behave differently in this headless server. Rather than faking success, each is deliberate and documented:
browser_pdf_saveis Chromium-only. Print-to-PDF is a Chromium capability; on Firefox or WebKit the tool reports that it is unsupported instead of producing a bogus file.browser_run_code_unsafeis gated by a flag. It is always listed, but refuses with a clear message unlessLAYA_ALLOW_UNSAFE_CODE=true. Running arbitrary Playwright code against the live page is a deliberate, risky opt-in.The DEVTOOLS video / recording / annotate / resume tools are honest no-ops. Tracing (
browser_start_tracing/browser_stop_tracing) and element highlight (browser_highlight/browser_hide_highlight) are real. The video, codegen recording, video chapter/action-overlay, annotate, and resume tools correspond to Playwright's headed codegen/inspector features that have no faithful headless analogue, so they return an honest text result explaining what the real interactive feature would do rather than pretending to succeed.
Benchmark results
A fair, honest comparison against the real Playwright MCP (@playwright/mcp, the
baseline), driving both servers over MCP stdio through the identical task scripts (the arg
shapes match, so one script is fair to both) against identical local loopback HTML fixtures
(no live sites, so no bot-detection or network-latency skew). Every success check re-probes the
real DOM. N=5 runs per task, first discarded as warm-up, median reported. Full detail and the
reproduce steps live in benchmark/RESULTS.md.
Headline
Metric | laya-browser-mcp (Assist) | Playwright MCP |
Tasks applicable | 16 | 13 |
Tasks passed | 16 | 13 |
Success rate | 100% | 100% |
Median latency (applicable tasks) | 211 ms | 919 ms |
Tools exposed | 25 core / 72 all-caps | 24 core |
Per-task results
Task | Category | laya | laya ms | laya calls | Playwright | PW ms | PW calls |
nav-basic | navigation | PASS | 152 | 2 | PASS | 405 | 2 |
search-type-submit | forms | PASS | 198 | 4 | PASS | 976 | 4 |
login-fill-form | multi-field-form | PASS | 311 | 9 | PASS | 1102 | 9 |
select-option | selection | PASS | 196 | 4 | PASS | 482 | 4 |
click-button | click | PASS | 211 | 4 | PASS | 962 | 4 |
hover-reveal | hover | PASS | 218 | 4 | PASS | 484 | 4 |
wait-for-dynamic | wait-for | PASS | 966 | 3 | PASS | 1225 | 3 |
tabs-open | tabs | PASS | 235 | 5 | PASS | 1040 | 5 |
dialog-confirm | dialogs | PASS | 228 | 6 | PASS | 1001 | 6 |
console-capture | console | PASS | 149 | 3 | PASS | 450 | 3 |
network-capture | network | PASS | 157 | 3 | PASS | 415 | 3 |
screenshot | screenshot | PASS | 190 | 2 | PASS | 508 | 2 |
storage-cookies | storage | PASS | 218 | 5 | N/A | N/A | N/A |
storage-localstorage | storage | PASS | 225 | 5 | N/A | N/A | N/A |
evaluate | evaluate | PASS | 155 | 2 | PASS | 950 | 2 |
verify-text | verify | PASS | 208 | 5 | N/A | N/A | N/A |
(Absolute milliseconds are environment-specific; only the relative comparison is meaningful. Numbers above are one recorded run; re-running regenerates them.)
Charts
What each side won and lost (honest)
Both track tab popups. Like Playwright MCP, laya-browser-mcp now subscribes to the browser context's
pageevent, so awindow.openpopup the page opens itself is tracked as a listable, selectable tab (focus stays on the opener until you select it). Both passtabs-open.laya wins on latency here. Against local fixtures laya's median per-task time is well under Playwright MCP's. This is an in-process advantage on local pages, not a claim about live-web robustness.
N/A is honest, not a loss. Cookie, localStorage, and verify/assert tasks are N/A for Playwright MCP core because its core toolset has no such tools; laya offers them under its
storage/testingcapabilities. Neither side is penalised for a capability the other simply does not offer.Both pass all shared basics (navigation, search, multi-field form, select, click, hover, wait-for-dynamic, tabs, dialogs, console, network, screenshot, evaluate).
Limitations of this benchmark
Local fixtures, not live sites. Removes bot-detection and network-latency skew for a deterministic, fair comparison; it is NOT a live-web robustness claim.
Single machine, headless. Latency includes per-task process spin-up, amortised by discarding the warm-up run. Absolute milliseconds are environment-specific.
Autopilot uses the reference stub (no weights), so its success reflects the deterministic rule layer, not a web-tuned model (see the Autopilot section).
Reproduce
pnpm install
pnpm run build
pnpm run bench:compare # writes benchmark/results.json, benchmark/RESULTS.md, benchmark/charts/pnpm run bench:compare starts the local fixture server, launches both MCP servers, runs the
full matrix, and regenerates the results table, results.json, and the SVG charts. It installs
the benchmark's own dev deps (@playwright/mcp + the MCP SDK) on first run.
Autopilot
Give laya_run_goal a natural-language goal and it drives the current (or a given) page,
resolving each step on-device and escalating only low-confidence steps to the client LLM.
Tool | Input schema | Description |
|
| Pursue a natural-language goal using the local Laya engine + deterministic rules + LLM escalation. Returns a per-step transcript (operation / target / confidences / source), the final snapshot, and an independent final-page verification. Degrades to an Assist-mode hint if no weights are present. |
Goal grammar (small and explicit, matching the structured-form domain the model is strong
on): field assignments email is "a@b.com" / keyword: laptop / search for "laptops", and
success markers expect "Signed in" / see "Order placed" / until "Results".
Operation set (broadened to drive the richer toolset faster)
The base operation set mirrors abedinia/laya-web-agent
(CLICK, TYPE_TEXT, SELECT, SCROLL_DOWN, WAIT, DONE, BLOCKED). Autopilot broadens
it so a single step can do more of the work, modelled as a discriminated union so illegal
(operation, payload) combinations are unrepresentable (src/types.ts):
Operation | Shape | What it does |
| targeted ( | Move the pointer over a control. |
| targetless | Go back in history. |
| carries | Press a keyboard key such as |
| carries | Fill SEVERAL fields in ONE batch step. |
| terminal | Capture the page as a verification/terminal step. |
| terminal, carries a marker | Check an expected marker against the live page. |
So a FILL_FORM can never carry a lone target, a PRESS_KEY can never lack a key, and a
targetless operation can never carry field payloads.
Faster automation: fewer round-trips (measured)
The concrete speed-up is fewer client<->server round-trips on multi-step goals. A single
laya_run_goal call runs the whole goal on-device/server-side; Playwright MCP has no
single-call goal runner, so the same outcome needs a multi-call Assist script. This is a real
architectural difference, not a defect on either side. From the benchmark
(benchmark/RESULTS.md):
Task | laya Assist calls | Playwright calls | laya Autopilot calls | Autopilot result |
search-type-submit | 4 | 4 | 2 | PASS |
login-fill-form | 9 | 9 | 3 | FAIL |
On the search goal Autopilot completes in 2 round-trips vs 4 for the Assist script. On the
multi-field login goal, the reference stub batch-fills the text fields and submits without
choosing the role option, so it does not satisfy the stricter Assist-mode verify: it is shown
honestly as FAIL. This reflects the deterministic rule layer with no model weights, not
a web-tuned model. DONE is never trusted on its own: after the loop, the independent
final-page verification runs regardless of how the loop ended.
How it works
Assist mode (standalone, no weights)
A ref-based superset of Playwright MCP. You call browser_snapshot (or any navigating /
mutating tool, which returns a fresh snapshot) to get stable [ref=eN] element references,
then drive the page by passing a ref (or a raw Playwright selector) as the target of
browser_click / browser_type / browser_select_option.
We own the ref boundary ourselves: an in-page DOM walk stamps stable data-laya-ref="eN"
attributes on interactive/landmark elements. Stable playwright-core@1.63.0 does not
expose a public _snapshotForAI/snapshotForAI, so nothing here depends on a Playwright
private API.
Autopilot decision pipeline
snapshot -> compact typed PageState -> DECISION -> execute (Playwright) -> repeatThe decision stage follows the authoritative laya-ultrafast design lesson — Laya answers narrow questions reliably but not the open "what next?" — as a three-stage pipeline:
Deterministic-rule seed (
src/autopilot/policy.ts). High-confidence, transparent rules: (1) fill the values the goal states, mapping each to a field (when two or more fields are unfilled, batch them into ONEFILL_FORMstep rather than N separate type steps); (2) after typing into or opening a control, prefer choosing from the options that just appeared; (3) once every goal-stated field is filled, submit — then open/verify the named item.Narrow Laya decision (
src/laya/engine.ts). When no rule fires, the local model answers two narrowchoicequestions in one pass: which operation? and which control?Confidence check + escalation (
src/autopilot/escalation.ts). If the operation or target confidence is below the configured threshold, or the model returnsBLOCKED, the step is escalated to the client's LLM through the MCPsampling/createMessagerequest; the structured answer is parsed back into a decision (source: "llm"). If the client does not support sampling, escalation degrades to a clearBLOCKED(it never throws).
Every step in the returned transcript records its source (rule / laya / llm /
stub) and confidences. After the loop, the independent final-page verification runs
regardless of how the loop ended.
Safety guards (src/safety.ts)
Domain allow-list. When
LAYA_ALLOWED_DOMAINSis set,browser_navigateand every Autopilot navigation are restricted to those hosts and their subdomains; off-list navigation is rejected with a reason (fail-closed).Destructive-form guard. This guard covers the Autopilot auto-submit (
CLICK) path only — the human-driven Assist tools (browser_click,browser_type, …) apply no destructive check by design. Before Autopilot auto-submits, it inspects a scoped set of signals for a destructive keyword (delete/remove/pay/purchase/confirm order/transfer/deactivate): the target control's own accessible name, current value, and option labels; and the names of the other actionable controls (buttons/links) on the page. It also flags a form that combines a password field with a payment-like field. It deliberately does not scan the whole page's visible body text, so prose that merely mentions "delete" elsewhere on the page does not trip it. When a signal is present the auto-submit is refused and the reason is surfaced, so a human can confirm explicitly. The check errs toward refusing (fail-safe). Disable withLAYA_DESTRUCTIVE_GUARD=false.
Configuration reference
All configuration is parsed once (src/config.ts) from environment + tool args +
constructor options, then handed inward as typed config.
Variable | Default | Meaning |
|
|
|
| — | Chromium channel (e.g. |
|
| Viewport |
|
|
|
| — | Local ONNX bundle directory (skips download). |
| — | Hugging Face source coordinates. |
|
| Download cache root. |
|
| onnxruntime execution providers (comma-separated). |
|
| Escalate below this operation/target confidence. |
|
| Autopilot step budget. |
| — (allow all) | Comma-separated navigation allow-list. |
|
|
|
| (core-only) | Comma/space-separated tool capability groups to enable. |
|
| Browser engine: |
|
|
|
Cross-browser (LAYA_BROWSER)
The browser engine is selected once from LAYA_BROWSER (chromium by default). Chromium is
preinstalled; Firefox and WebKit must be installed first:
pnpm exec playwright install firefox webkitThe Chromium channel option (e.g. chrome, msedge) is applied only for the chromium
engine; Firefox and WebKit have no channel. Everything else (viewport, timeouts, multi-tab,
console / network / dialog listeners, routing, storage, the ref boundary) is identical across
engines because engine selection is confined to src/browser.ts.
Tested engines. Chromium is the default and is exercised by the whole suite. Firefox was
smoke-tested here: it really launches and drives the sign-in fixture to its literal
signed-in outcome. WebKit is gated in this sandbox: the binary downloads, but launch fails
on this host for lack of system shared libraries, so the WebKit smoke test probes real
launchability once and describe.skipIfs itself rather than faking a pass. It runs
automatically in an environment where WebKit can launch.
Development
pnpm run typecheck # tsc --noEmit
pnpm run build # tsc
pnpm run test # vitest (offline: stubbed Laya + local HTML fixtures)
pnpm run bench # offline goal benchmark over local fixtures with the stub engine
pnpm run bench:compare # full comparison vs the real Playwright MCP (writes benchmark/ artifacts)The offline goal benchmark (pnpm run bench) runs laya_run_goal with the StubEngine over the
local structured-form fixtures under test/fixtures/, and prints a summary with two columns:
end-to-end success (via the independent final-page check — the trustworthy signal) and
expected-ops coverage (ops-cov). The coverage column is a subsequence match — the fraction
of each fixture's expected operations that appear, in order, in the transcript — so it does
not penalize extra or wrong steps and should not be read as precision/accuracy. When
LAYA_MODEL_DIR is set, it also benchmarks the real engine.
Weights
The Laya ONNX bundle is not bundled with this package. It is roughly 1.7 GB (needs
~2 GB RAM loaded) and is downloaded/exported at runtime, cached under
~/.cache/receptron-laya (LAYA_CACHE) or pointed at via LAYA_MODEL_DIR. The bundle is
loaded through Laya.load({ modelDir, repo, subfolder, revision, cacheDir, executionProviders }).
Web-agent export spike (VERIFIED)
We verified that the browser-agent checkpoint abedinia/laya-web-agent (mmBERT-derived,
ModernBERT-shaped, max_len 2048 / head_max_len 512, jev_ultrafast I/O) can be exported to
an ONNX bundle usable by @receptron/laya's modelDir path with no Python at runtime.
The reference export_onnx.py exported it cleanly (logit parity max |dlogits| = 2.48e-05).
Loading it in Node initially failed because @receptron/laya@0.1.2 hardcodes the ModernBERT
special-token names [CLS] [SEP] [MASK] [PAD], while the web-agent tokenizer names them
<bos>/<eos>/<mask>/<pad>.
Prepare step (one-line tokenizer rename). Before writing the bundle, rename those four
special-token contents in tokenizer/tokenizer.json to the [CLS]-style names (same token
IDs). Laya.load({ modelDir }) then loads and runs. This is a data rename, not a code
change to @receptron/laya, and the ONNX graph needs no modification.
Fallback (not needed, documented for completeness). If a future checkpoint's graph does
not export cleanly, a thin local Python sidecar using the laya pip package can serve
decisions over a local socket. This loses the no-Python-at-runtime property and is a last
resort. Independent of either path, the product and its whole test suite run without any
weights (Assist mode standalone, Autopilot degrades gracefully, tests use a stubbed engine).
License and attribution
Project code: MIT. See LICENSE.
Laya weights: Apache-2.0, © Convai Innovations. Not redistributed by this project.
Mind2Web-derived material: CC BY 4.0. Attribute Deng et al., Mind2Web: Towards a Generalist Agent for the Web, NeurIPS 2023. The Mind2Web test set is not redistributed here.
Available Tools
25 toolsbrowser_clickB
Click an element identified by a snapshot ref (eN) or a Playwright selector.
| Name | Required | Description | Default |
|---|---|---|---|
| button | No | Mouse button to use for the click. Defaults to left. | |
| target | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| element | No | Human-readable element description used to obtain permission to interact with the element. | |
| doubleClick | No | Whether to perform a double click instead of a single click. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Click an element' without mentioning waiting behavior, visibility requirements, side effects, or failure modes. This is a minimal disclosure that does not inform the agent about what happens when the click is performed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. It front-loads the action and includes the key detail about target identification. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for a simple click action, but it lacks context on when to use this tool versus siblings like browser_hover or browser_type. It also does not mention what the tool returns or how errors are handled. Given the moderate complexity and the availability of many sibling tools, the description is minimally adequate but 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 description coverage is 100%, so all four parameters are already documented in the schema. The description itself does not add any additional meaning beyond what the schema provides. Since the schema covers everything, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Click') and resource ('an element') and explains how to identify it via snapshot ref or Playwright selector. This clearly distinguishes it from sibling tools like browser_hover or browser_type, so an agent can understand its purpose without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives (e.g., hover, type, drag). It does not mention any conditions, exclusions, or prerequisites. An agent must infer that clicking is the intended action, but there is no explicit routing to this tool over others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_closeA
Close the browser session and release all resources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly states the core side effect: closing the browser session and releasing all resources, which signals finality and cleanup. It could explicitly mention irreversibility or that subsequent browser tools may fail, but the main behavior is transparent enough.
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 filler. Both clauses earn their place: 'close the browser session' states the action, and 'release all resources' adds a useful behavioral outcome.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter lifecycle tool with no output schema, the description covers the essential purpose and behavioral effect. It would be slightly more complete if it noted that the session cannot be reused afterward, but the simplicity of the tool makes the current description largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics burden for the description to carry. The baseline of 4 applies because there is nothing for the description to add beyond the empty input 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 uses a specific verb, 'Close', and an explicit resource, 'browser session', then adds the clarifying outcome 'release all resources.' This makes the tool's purpose unmistakable and distinguishes it from the navigation, input, and inspection sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to call this tool, such as 'use when done with the browser' or 'do not use to close an individual tab.' It relies entirely on the name and generic context, with no explicit when-to-use or when-not-to-use framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_console_messagesA
Return the console messages (and uncaught page errors) captured since the session started; optionally filter to errors only.
| Name | Required | Description | Default |
|---|---|---|---|
| onlyErrors | No | When true, return only error-level messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It conveys a read-only operation ('Return'), defines the data source and scope ('captured since the session started'), and mentions the optional filtering behavior. It does not detail the exact return structure, but for a simple read tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It states the main action, additional content, session scope, and the optional filter in a compact and readable way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional boolean parameter, no output schema) and the description covers its purpose, scope, and main behavior. A brief note about the return format would improve completeness, but the current description is sufficient for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the only parameter (onlyErrors) has a clear description in the schema. The tool description's phrase 'optionally filter to errors only' restates the schema semantics without adding new meaning, so it does not elevate beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') with a clear resource ('console messages') and additional scope ('captured since the session started'), making it easy to distinguish from siblings like browser_network_requests. It also usefully includes 'uncaught page errors' as part of the result set.
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 clearly indicates when to use the tool — when console messages or uncaught page errors are needed — and specifies the session scope. It does not explicitly contrast with alternatives, but the resource and context are unambiguous enough that an agent can select it correctly without extra guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dragB
Drag one element (ref eN or selector) and drop it onto another element.
| Name | Required | Description | Default |
|---|---|---|---|
| endTarget | Yes | ||
| endElement | No | ||
| startTarget | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| startElement | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the basic action without revealing whether the drag simulates mouse events, whether it waits for the drop to complete, any permission requirements, or potential side effects. The distinction from browser_drop is also unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core action. There is no redundant phrasing or filler, making it efficient for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, the description is too minimal. It does not clarify the return value, prerequisites like obtaining a snapshot, or the behavioral differences from sibling browser_drop. This leaves gaps that could lead to incorrect 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?
The input schema already provides descriptions for startTarget and startElement, and the $ref properties endTarget and endElement inherit those descriptions, effectively covering all parameters. The description adds no extra parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'drag' and the resource 'element', and specifies the action 'drop it onto another element'. It is distinct from sibling tools like browser_drop, which likely handles a different gesture. The mention of ref eN or selector makes the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as browser_drop, browser_click, or browser_hover. The description does not mention prerequisites, typical scenarios, or when not to use it, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dropA
Drop files (via paths) or MIME data (via data) onto an element identified by a ref (eN) or selector.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | MIME data items to drop onto the target via a synthetic drop event. | |
| paths | No | Absolute file paths to drop onto the target (e.g. onto a file input). | |
| target | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| element | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description alone must disclose side effects and execution traits. It states only the mechanical action and gives no indication that the drop is synthesized, whether it can trigger navigation or file-handling side effects, or whether permissions are required. This is a meaningful transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that packs the action, payload alternatives, and targeting mechanism without filler. It is appropriately concise for a well-schematized tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich 100% parameter schema, the description covers the essential invocation path: it names payload modes and the target. It still leaves behavioral details such as synthetic-event semantics and post-drop effects to inference, but this is not fatal for a simple drop action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The prose echoes `paths`, `data`, and `ref`/selector targeting but adds no meaning beyond the schema; the schema itself documents the payload formats. No deduction needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (`Drop`), the two accepted payload kinds (`paths` for files, `data` for MIME data), and how to target an element (`ref` or selector). This is sufficiently distinct from sibling actions like `browser_click`, `browser_type`, and `browser_drag`.
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 clearly conveys the intended use case — dropping local files or in-memory MIME data onto a page element — and how to address the target. It does not explicitly name alternative tools or exclusion cases, but the context is specific enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateC
Evaluate a JavaScript function on the page, or on an element (ref eN or selector), and return the JSON result.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Optional ref (eN) or selector to evaluate against. | |
| element | No | Human-readable element description used to obtain permission to interact with the element. | |
| function | Yes | A JavaScript function to evaluate, e.g. '() => document.title' or, when a target is given, '(element) => element.textContent'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states that a function is evaluated and JSON is returned, but does not mention that the function can modify the page, require permissions, or have side effects. It also omits any note about the safety implications of running arbitrary code, which is critical for a tool that executes JavaScript.
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, well-structured sentence that states the core action, the optional scope (page vs element), and the return format. No wasted words, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that executes arbitrary JavaScript, the description is incomplete. It lacks safety warnings, an explanation of what constitutes a valid function or how results are serialized, and any mention of when to use this instead of browser_run_code_unsafe. The absence of an output schema and annotations increases the need for more thorough documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage with descriptions for all three parameters, including examples for the function parameter. The description adds the context that the function runs against the page or a target element (ref or selector), which clarifies the 'target' parameter. This is helpful but not essential beyond what the schema already implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool evaluates a JavaScript function on the page or a specific element and returns a JSON result. It uses a specific verb ('evaluate') and resource ('page or element'), and the return type is clear. While it doesn't explicitly contrast with the sibling browser_run_code_unsafe, the name and description already differentiate it from click/type/hover tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, particularly browser_run_code_unsafe, which also executes JavaScript. The description does not mention when to prefer this over other browser tools, nor does it note any limitations or prerequisites (e.g., page load state).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_file_uploadA
Upload one or more files by setting them on a file input identified by a ref (eN) or selector (defaults to the first file input on the page).
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Absolute file paths to upload. | |
| target | No | Optional file input ref (eN) or selector to set the files on. | |
| element | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It states the mechanism (setting files on an input) but does not mention side effects such as triggering change events, requiring permission, or handling validation. For a mutation tool, this is incomplete.
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, efficient sentence that front-loads the core purpose ('Upload one or more files') and then clarifies the target identification. There is no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and no output schema, the description covers the essential action, target specification, and default behavior. It does not explain return values or error handling, but these are likely not critical for this tool type. Overall it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented. The description adds the default behavior for the target parameter (defaults to first file input), which is helpful, but it does not add substantial meaning beyond the schema – baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (upload files), the target (file input), and the identification method (ref or selector). It is specific enough to distinguish from siblings like browser_click or browser_fill_form, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when uploading files via a file input, but it does not explicitly state when to use this tool versus alternatives, nor does it mention when not to use it (e.g., for other input types). The default behavior is noted, but there is no explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fill_formA
Fill multiple form fields (textbox/checkbox/radio/combobox/slider) in a single call, then return one snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | The fields to fill, applied in order in a single call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose a key behavior beyond the schema: the tool returns one snapshot after filling. However, it does not mention side effects, permissions, page changes, or whether field filling can trigger navigation or dialogs, so the behavior is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that communicates the action, scope, field types, batching behavior, and result with no filler. Every clause 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?
The schema is rich and fully documents the nested fields, while the description covers the core invocation context and explicitly states the return behavior (one snapshot). The main gap is the lack of explicit sibling guidance and annotation-style safety/behavior notes, but the essential operational information is present.
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 describes all parameters and their value semantics in detail, including type-specific behavior for checkbox, radio, combobox, and slider. The description adds no parameter-level value beyond restating the supported field kinds, so the baseline of 3 applies given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Fill multiple form fields'), lists the supported field kinds, and mentions the single-call behavior with one snapshot returned. It is clearly differentiated from sibling tools like browser_type and browser_select_option by the 'multiple' and 'single call' phrasing, though it does not explicitly name those 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?
The description implies when to use the tool: when multiple form fields need to be filled together in one call. It does not explicitly say when NOT to use it or when to prefer siblings like browser_type or browser_select_option, leaving the routing decision mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_findA
Search the current page snapshot for controls whose name/value/role matches a text substring or a regexp, returning each match's ref (eN).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Case-insensitive substring to match against a control's name/value/role. | |
| regexp | No | A JavaScript regular expression source to match against a control's name/value/role. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It clearly discloses that the operation is a read-only search over the current page snapshot and that it returns refs for matches. It does not address edge cases like no snapshot or both parameters being supplied, but the core behavior is visible despite having no annotations.
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 filler. Every phrase contributes information about the search target, match criteria, or return value.
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?
Basic invocation is clear: provide text or regexp and receive refs. However, with no required parameters stated and no guidance on what happens if both or neither are provided, an agent could make an ambiguous call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter descriptions already explain the text and regexp arguments. The description adds only that they are alternative match modes; it does not clarify exclusivity, precedence, or whether at least one 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 names a specific action ('Search'), a resource ('current page snapshot'), and a result ('returning each match's ref'), and scopes the search to controls' name/value/role. This clearly distinguishes it from siblings like browser_snapshot and browser_evaluate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when locating controls in the current snapshot by text or regexp, but it never states when not to use it or points to an alternative. It also omits prerequisites such as ensuring a snapshot exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_handle_dialogA
Register how the NEXT JavaScript dialog (alert/confirm/prompt/beforeunload) is handled: accept or dismiss, with optional prompt text. Call this before the action that triggers the dialog.
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | Whether to accept (true) or dismiss (false) the next dialog. | |
| promptText | No | Text to enter for a `prompt` dialog when accepting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It clearly discloses that this is a one-shot registration for the NEXT dialog and explains the two modes (accept/dismiss) with optional prompt text. It does not cover edge cases like multiple dialogs or no dialog appearing, but the core behavior is explicit and unambiguous.
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 with no wasted words. The core action is front-loaded, and the usage instruction is placed immediately after, making the description easy to parse and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description plus the exhaustive schema cover the essential context: what it does and when to call it. Minor edge cases are not addressed, but they are not critical 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 description coverage is 100% and both parameters are already well-documented. The description only paraphrases accept and promptText without adding extra semantic value beyond what the schema already provides.
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 ('Register') and resource (JavaScript dialog handling), enumerates the dialog types (alert/confirm/prompt/beforeunload), and clearly distinguishes this from all sibling browser tools, none of which target dialog handling.
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 an explicit timing instruction: 'Call this before the action that triggers the dialog.' This clarifies when to use the tool. It does not name alternatives, but no sibling tool serves the same purpose, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverB
Hover over an element identified by a snapshot ref (eN) or a Playwright selector.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| element | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention any side effects (e.g., tooltips), visibility requirements, permission implications (despite the schema hint about the 'element' parameter being used for permission), or potential failure modes. The description is purely functional without behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no superfluous words. It front-loads the core action ('Hover over an element') and immediately follows with identification details, achieving maximum conciseness without sacrificing 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?
Given the tool's simplicity and the complete schema, the description is adequate for executing the action, but it lacks usage context (when to prefer this over alternatives) and behavioral caveats. It also does not explain the purpose of the 'element' parameter (for permission), leaving some guidance to 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?
The schema already fully describes both parameters (100% coverage), including the exact meaning of 'target' and 'element'. The description adds no new semantic value beyond restating the identification methods, so it meets the baseline for high schema coverage but does not enrich understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'hover' and the resource 'element' precisely, and specifies the two identification methods (snapshot ref or Playwright selector). This clearly distinguishes it from sibling interaction tools like browser_click or browser_drag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus the many browser_* alternatives (e.g., browser_click, browser_type). The only hint is the verb 'hover' itself, which implies the intended interaction but provides no explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_requestA
Return the full detail (method, URL, resource type, status, headers) of one captured network request, selected by index or by a url substring.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Select the most recent captured request whose URL contains this substring. | |
| index | No | 0-based index of the request in the captured list (from browser_network_requests). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden of behavioral disclosure. It does disclose the return payload (method, URL, resource type, status, headers) and that it operates on captured requests (implying a non-destructive read). However, it omits behavior when both `index` and `url` are provided, or when neither is provided (since both are optional in the schema). It also does not state what happens if no matching request is found. These are meaningful gaps in a tool with no safety annotations.
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, well-structured sentence that front-loads the action and return fields, then states the selection mechanism. Every word contributes value; there is no redundancy or filler. The description is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has two optional parameters, no output schema, and no annotations, the description should clarify how parameters interact and what happens in edge cases. It explains what is returned and how to select a request, but leaves a key ambiguity: if both `index` and `url` are provided, which takes precedence? Also, it does not specify behavior when no selector is given (though both optional). These omissions make it incomplete for an agent that needs to call it reliably, though the core functionality is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly: `url` selects the most recent request containing the substring, and `index` is a 0-based index from browser_network_requests. The description adds only the phrase 'selected by index or by url substring', which restates the schema without new meaning. Since the schema handles parameter semantics, a baseline score of 3 is appropriate, with no additional value added by the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and a clear resource ('full detail of one captured network request'), enumerating the exact fields returned (method, URL, resource type, status, headers). It also specifies the two selection mechanisms (index or url substring), distinguishing it from the sibling browser_network_requests which lists all requests. No ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: you need details of a single request rather than a list. It names selection by index (which comes from browser_network_requests) or url substring, so an agent understands when to call it. However, it does not explicitly state 'use this instead of browser_network_requests' or mention any alternatives or when not to use it, leaving the differentiation implicit 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_network_requestsA
List the network requests captured since the session started, one per line (index, method, status, URL).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden itself. It discloses that this is a read-only listing operation, scoped to the session, and exactly what each output line contains. It does not discuss the empty-list case, but that is a minor gap for such a simple 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?
One sentence, front-loaded with the action verb, and every clause earns its place by specifying the resource, the temporal scope, and the exact output format. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema read-only listing, the description covers the essential invocation details: what is listed, from what period, and in what format. It leaves the agent to infer the relationship to browser_network_request, but that is not necessary to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is no parameter behavior for the description to clarify. Per the rubric, this is a baseline 4 because the description is not expected to document nonexistent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact verb 'List' and the resource 'network requests captured since the session started', then defines the output as one line per request with index, method, status, and URL. This clearly differentiates it from the sibling browser_network_request by emphasizing the plural, session-scoped listing.
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 temporal scope 'since the session started' implies when the data is availableients the agent some context for use. However, it does not explicitly name alternatives or state when to prefer browser_network_request (singular) for detailed request inspection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyA
Press a keyboard key (or combination) on the current page.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key to press, e.g. 'Enter', 'ArrowDown', 'a', or a combination like 'Control+A'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the action without revealing side effects (e.g., whether it triggers keyboard events, requires page focus, or works on any element). The agent gets no information about prerequisites or outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no filler, front-loading the core action. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is minimally adequate, but it lacks usage context and behavioral transparency. It does not tell the agent when to prefer this over browser_type, nor does it disclose any side effects, leaving gaps in decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the 'key' parameter with examples, so the description adds no additional meaning beyond what the schema already provides. Baseline score of 3 is appropriate since schema coverage is 100%.
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 ('press') and resource ('keyboard key') on the current page, and explicitly mentions combinations like 'Control+A', making it distinct from siblings such as browser_click and browser_type. It clearly conveys what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like browser_type. The implication is that it is for key presses rather than typing text, but there is no mention of exclusions or when it should not be used (e.g., for text input or dialog handling).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_resizeA
Resize the browser viewport to the given width and height, then return a snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Viewport width in pixels. | |
| height | Yes | Viewport height in pixels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does state the core behavior and that a snapshot is returned, but it does not mention side effects, whether the resize persists, or what the snapshot contains. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. The primary action is front-loaded, and the return behavior is included efficiently. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two fully documented parameters and no output schema, the description is mostly complete: it states the action and that a snapshot is returned. It could clarify what 'snapshot' means, but this is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents width and height as pixel values. The description only refers to them as 'given width and height' and adds no additional semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Resize'), a clear resource ('browser viewport'), and the exact inputs ('given width and height'). It also adds a secondary behavior ('return a snapshot'), which distinguishes it from other browser tools that do not resize the viewport.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as browser_snapshot or browser_take_screenshot. The description explains what it does but not the conditions under which an agent should choose it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_run_code_unsafeA
DANGEROUS: run a raw Playwright JavaScript snippet (async function body with page in scope) against the active page and return its JSON result. Disabled unless LAYA_ALLOW_UNSAFE_CODE=true.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | A JavaScript snippet run as an async function body with the Playwright `page` in scope, e.g. 'return await page.title();'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It reveals that the tool executes arbitrary async code with `page` in scope, targets the active page, returns JSON, is dangerous, and requires an environment variable. It stops short of detailing failure modes or side effects beyond the generic danger warning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff, front-loading the critical 'DANGEROUS' warning before the technical details. Each clause conveys essential information: danger, execution model, target, return type, and activation requirement.
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 single-parameter code execution tool with no output schema, the description covers the execution environment, the active-page scope, the JSON result, and the required environment flag. It omits explicit error-handling or serialization caveats, but these are not essential given the simple signature and the strong overall context provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the `code` parameter with a clear example and notes the async function body and `page` scope. The description adds little beyond repeating that same execution model, so it does not meaningfully supplement the schema. Baseline 3 is appropriate since coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool runs a raw Playwright JavaScript snippet against the active page and returns its JSON result. It gives a specific verb ('run') and resource ('active page'), but it does not explicitly differentiate this from the sibling browser_evaluate tool. This is clear but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context through the 'DANGEROUS' warning and the operational gate 'Disabled unless LAYA_ALLOW_UNSAFE_CODE=true.' However, it does not explicitly state when to use this tool instead of safer alternatives like browser_evaluate, nor does it give exclusion criteria. The usage context is implied but not fully directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionA
Select one or more options in a dropdown identified by a snapshot ref (eN) or selector.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| values | Yes | Option value(s) or label(s) to select. Multiple for a multi-select. | |
| element | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It identifies how to target the element but does not disclose behavioral traits such as side effects (e.g., firing change events), prerequisites (e.g., dropdown must be open or visible), or permission requirements. For a mutation operation, this is a significant gap, potentially leading the agent to attempt selection without ensuring the dropdown is interactable.
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, well-structured sentence that front-loads the core action and includes the targeting method. No filler or redundancy; every word contributes to functional 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?
The tool is simple and the schema covers parameters well, but the description omits behavioral context like side effects, required interaction state, or error handling. With no output schema or annotations, an agent might not know if the selection triggers navigation or requires permission. While not catastrophic, it leaves gaps in scenarios where dropdown interaction has prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the schema's target info ('snapshot ref (eN) or selector') and adds 'one or more options' for values, but this adds marginal new meaning beyond what the schema already specifies. It does not introduce format details or examples, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('select') and resource ('options in a dropdown') and specifies the two identification methods (snapshot ref or selector). This distinguishes it from sibling tools like browser_click (clicking an element) and browser_fill_form (filling forms), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it: when selecting options in a dropdown, including multi-select for multiple values. It provides clear context but does not explicitly mention alternatives or exclusion criteria. Sibling names are present, but no direct comparison is made. This is adequate but could be improved with a note on when browser_fill_form might be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotA
Capture a compact accessibility snapshot of the current page. Interactive elements carry stable [ref=eN] markers used as targets for other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the output is a 'compact' snapshot (not full DOM), that refs are 'stable' (persist across interactions), and that it provides the targets for other tools. It implies a non-destructive read operation. It does not mention errors or performance, but for a simple snapshot tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy. The core action is front-loaded, and the second sentence delivers the key detail about ref markers that drives usage. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description must convey the return value. It states it returns a compact accessibility snapshot with stable ref markers, which is sufficient for an agent to know how to consume it and pass refs to other tools. It omits a precise structure, but given the tool's simplicity, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is trivially 100%. Per the rubric, a baseline of 4 is appropriate because there is nothing to clarify about parameters. The description does not need to add parameter 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 description states a specific action ('Capture'), a clear resource ('compact accessibility snapshot of the current page'), and uniquely identifies its output (ref markers) that serve as targets for sibling tools. This distinguishes it from browser_take_screenshot (visual) and browser_console_messages (logs), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While it does not explicitly name alternative tools, the sentence 'Interactive elements carry stable [ref=eN] markers used as targets for other tools' implies the workflow: capture a snapshot first to obtain refs, then use those refs with tools like browser_click or browser_type. This is strong implicit guidance, though it lacks an explicit 'when not to use' or a direct comparison to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsA
Manage browser tabs: list open tabs, create a new tab (optionally at a URL), close a tab by index, or select a tab by index.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional URL to open in the new tab for 'create'. | |
| index | No | 0-based tab index for 'close' and 'select'. | |
| action | Yes | The tab operation: list all tabs, create a new one, close one, or select one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does state the direct effects of each operation ('create', 'close', 'select'), but it omits important behavioral detail such as return values for 'list', what happens if the active tab is closed, or how selection affects the active tab. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly packed sentence with a clear noun phrase ('Manage browser tabs') followed by a colon-delimited list of operations. There is no fluff or redundant restatement; every clause 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?
The tool is simple, but with no output schema and no annotations, the description should ideally mention what 'list' returns and note that 'index' is effectively required for 'close' and 'select' despite not being in the schema's required list. The current text is minimally viable but leaves these operational details implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds 'optionally at a URL' for create, but this mirrors the schema. It does not add new semantic information beyond describing the operations that use 'index' and 'url'.
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 clear resource ('browser tabs') and specific operations ('list', 'create', 'close', 'select'), each with concrete behavior. This separates it from sibling tools like browser_navigate and browser_close, which target page navigation or the browser itself.
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 opening 'Manage browser tabs' plus the enumerated operations clearly signal when to use this tool: whenever a tab-level action is needed. It does not explicitly name alternatives or exclusions, but the context is unambiguous and provides enough guidance for an agent to route tab operations here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_take_screenshotB
Capture a screenshot of the page (or a single element via a ref/selector) as a PNG, JPEG, or WebP image content block.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Image format for the screenshot. Defaults to png. | |
| target | No | Optional element ref (eN) or selector to screenshot instead of the page. | |
| element | No | Human-readable element description used to obtain permission to interact with the element. | |
| filename | No | Optional file name hint for the client to save the image under. | |
| fullPage | No | Capture the full scrollable page instead of just the viewport (ignored for element shots). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries most of the behavioral disclosure burden. It does disclose the output format ('PNG, JPEG, or WebP image content block') and page/element scope, but it does not mention side effects, permissions, or limitations 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?
A single, front-loaded sentence with no filler. It communicates the action, target scope, and output format efficiently without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With all parameters documented in the schema and the output type stated in the description, an agent has enough to invoke this tool correctly. The main gap is routing guidance versus browser_snapshot, but that is a usage concern rather than a missing calling 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 description coverage is 100%, so the parameters are already fully documented. The description adds no new parameter-level meaning beyond framing the tool, which matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Capture') and clear resource ('the page or a single element'), with output formats spelled out. It is clear and actionable, but it does not explicitly differentiate from sibling tools like browser_snapshot, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states only what the tool does ('Capture a screenshot...') and gives no guidance on when to prefer it over alternatives such as browser_snapshot. There are no exclusions, prerequisites, or when-not-to-use signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeB
Type text into an editable element identified by a snapshot ref (eN) or selector.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to type into the element. | |
| slowly | No | Type one character at a time (fires key events) instead of filling at once. | |
| submit | No | Whether to press Enter after typing. | |
| target | Yes | Exact target reference from a snapshot (e.g. 'e5'), or a unique Playwright selector (CSS/text). | |
| element | No | Human-readable element description used to obtain permission to interact with the element. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention whether typing replaces existing content, whether the element is auto-focused, what happens on non-editable elements, or how the 'slowly' and 'submit' options affect behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It efficiently communicates the core action and target specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is too sparse to be fully actionable. It omits side effects, prerequisites, and return behavior, which an agent would need to invoke the tool correctly in a browser automation context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds no extra meaning beyond what the schema provides, such as clarifying the 'element' parameter's role in permission handling.
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 ('Type') and resource ('editable element'), and clarifies the target format ('snapshot ref (eN) or selector'). This clearly distinguishes it from siblings like browser_click, browser_press_key, and browser_fill_form.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as browser_fill_form or browser_press_key. The description only states what it does, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_forA
Wait for text to appear, text to disappear, or a fixed number of seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Wait until this text appears on the page. | |
| time | No | Wait for this many seconds. | |
| textGone | No | Wait until this text is no longer on the page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It states the core wait behavior and the three termination conditions, but it does not disclose timeout behavior, what happens on failure, whether the options are mutually exclusive, or what a no-argument call does.
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, tightly packed sentence with no filler or repetition. The main behavior is front-loaded and every clause adds useful information about a distinct wait mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity and the primary behavior is described, but important contextual details are missing: timeout/error behavior, interaction between the optional parameters, and the effect of calling with no arguments. Since there are no annotations or output schema, these gaps are meaningful for an agent deciding how to call the 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?
The input schema already fully describes all three parameters with 100% coverage, so the description adds no new parameter-level detail. It merely rephrases the schema's semantics in natural language, which keeps it at the baseline for well-covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the operation: waiting on the browser page state. It enumerates the three supported conditions (text appears, text disappears, or a fixed delay), making the tool's purpose unambiguous and distinct from the sibling browser tools, none of which are wait operations.
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 does not explicitly state when to use this tool versus alternatives, nor does it provide exclusions. However, the three modes imply the usage context: wait for text with text, wait for text removal with textGone, and wait for a fixed duration with time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laya_run_goalA
Autopilot: pursue a natural-language goal on the current (or given) page using the local Laya decision engine. Returns a step-by-step transcript, the final snapshot, and an independent final-page verification. If model weights are absent, returns a message directing you to the Assist-mode tools.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional URL to navigate to before starting the run. | |
| goal | Yes | The natural-language goal to accomplish on the page. | |
| maxSteps | No | Maximum decision steps before giving up. Defaults to 15. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return payload (transcript, snapshot, verification) and the fallback behavior, which is helpful. However, it does not reveal whether the tool may perform mutating actions on the page, any safety considerations, or how the decision engine behaves. The disclosure is partial.
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 with zero waste. The purpose is front-loaded, the return items are listed succinctly, and the fallback is mentioned briefly. 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?
This is a complex tool (autopilot with a decision engine) with no annotations and no output schema. The description is sparse: it does not explain what the Laya engine is, what kinds of goals are appropriate, any performance expectations, or how the agent should interpret the verification result. Given the complexity, the description is under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds minimal extra meaning—only the mention of 'current (or given) page' for the url parameter. It does not enrich the goal or maxSteps parameters beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('pursue') and a clear resource ('a natural-language goal on the current (or given) page'), and distinguishes itself from the low-level browser_* siblings by framing it as an autopilot that delegates to the Laya decision engine. This clearly separates it from the granular operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for natural-language goals and mentions the fallback to Assist-mode tools when weights are absent, but it does not explicitly state when to use this versus the low-level browser tools or when not to use it. The 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
25 tool updates
v0.1.0- First observed
browser_click - First observed
browser_close - First observed
browser_console_messages - First observed
browser_drag - First observed
browser_drop - First observed
browser_evaluate - First observed
browser_file_upload - First observed
browser_fill_form - First observed
browser_find - First observed
browser_handle_dialog - First observed
browser_hover - First observed
browser_navigate - First observed
browser_navigate_back - First observed
browser_network_request - First observed
browser_network_requests - First observed
browser_press_key - First observed
browser_resize - First observed
browser_run_code_unsafe - First observed
browser_select_option - First observed
browser_snapshot - First observed
browser_tabs - First observed
browser_take_screenshot - First observed
browser_type - First observed
browser_wait_for - First observed
laya_run_goal
TDQS
Scored across 25 tools
Every tool has a clearly distinct purpose, even close ones like browser_drop vs browser_file_upload are differentiated by operation type (drag-and-drop vs input setting). The safe browser_evaluate and unsafe browser_run_code_unsafe are explicitly separated by danger level, eliminating ambiguity.
All 24 browser_* tools follow a consistent verb_noun pattern (browser_click, browser_find, browser_take_screenshot), with clear action-first naming. The single exception, laya_run_goal, breaks the pattern but is logically distinguished as an autopilot feature, which is a minor deviation.
25 tools is on the upper end of the ideal range but justified for a full-featured browser automation server. Each tool covers a distinct interaction or inspection capability, and the count is not excessive enough to overwhelm an agent given the breadth of the domain.
The tool surface covers navigation, full interaction (click, type, drag, drop, form fill, selection, key press), element finding, waiting, dialogs, tabs, screenshots, file handling, console/network inspection, and evaluation. Minor gaps exist like explicit scroll or session management, but these can be worked around via evaluate or existing tools.
Maintenance
Related MCP Connectors
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
- openhelmOAuthai.openhelm
Autonomous cloud agent tasks: real browser + your tools, structured evidence-backed results.
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
AI-powered web automation. Navigate websites using AI agents for one page or a thousand
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.-
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to control a browser through a set of tools, allowing them to perform web automation tasks like navigation, typing, clicking, and taking screenshots.-