concurrent-playwright-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@concurrent-playwright-mcpCreate a session and navigate to https://example.com"
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.
concurrent-playwright-mcp
An MCP server that runs concurrent, session-isolated Playwright browser contexts, so many agents can each drive their own browser at the same time without colliding.
The problem this solves
The official Playwright MCP server (@playwright/mcp) drives a single shared browser context by default, so concurrent clients share one cookie jar, storage, and set of tabs. That is fine for one agent doing one thing, but it breaks the moment you want parallel work:
Two sub-agents navigating at once stomp on each other's page, cookies, and storage.
A "log in as user A" flow and a "log in as user B" flow share one cookie jar, so the second login clobbers the first.
There is no clean way to give each task its own sandbox and tear it down independently.
This server fixes that. Every session gets its own BrowserContext (an incognito-like profile: isolated cookies, localStorage, cache, and tabs) keyed by a sessionId you choose. Sessions share one browser process for efficiency but never share state. The headline guarantee is verified by a real-browser test and a benchmark that asserts zero cross-session collisions.
| concurrent-playwright-mcp | |
Parallel sessions | Shared context | Isolated context per |
Cookies / storage | Shared | Isolated per session |
Independent teardown | No |
|
Resource bounds | n/a | Session cap + optional idle eviction |
Why not @playwright/mcp --isolated?
The official server can isolate too — its --isolated flag gives each connection its own context. The difference is the model:
Addressable sessions. Here isolation is keyed by a
sessionIdyou choose and pass to every call, so a single client can open and drive many isolated sessions and route each call deliberately. With--isolated, a "session" is just the transport connection — you can't address N parallel contexts from one client.Persistable, not ephemeral.
--isolateddiscards all state when the browser closes. Here you canbrowser_save_storage_stateand restore it (storageStatePathon create) to resume an authenticated profile across sessions. (An upstream request for named/persistent sessions was closed as out of scope.)One lightweight context per session — not a process or container per session — so many sessions share one Chromium.
Use @playwright/mcp for a single browser; use this when many agents or tasks each need their own isolated, addressable session at the same time — especially over HTTP.
Related MCP server: ultimate-playwright-mcp
Architecture
cli.ts entrypoint: load config → pick transport
├─ config.ts parse + validate env into a typed config
├─ transport/stdio.ts run over stdio (default)
├─ transport/http.ts run Streamable HTTP: a session manager per client, one shared browser
├─ browser-provider.ts the shared, lazily-launched, memoized Browser (a port)
└─ server.ts MCP edge: validates input (Zod), enforces policy, maps errors
├─ policy/url-policy.ts navigation allowlist + file:/data: blocking (pure)
├─ policy/path-policy.ts filesystem path confinement (pure)
├─ errors.ts error taxonomy: SessionError base + machine-readable codes
└─ session-manager.ts isolated sessions over a BrowserProvider (the core)
└─ session.ts one isolated context: ref actions, capture, storage stateThis is hexagonal: untrusted input is validated at the edge (server.ts) and passed inward as
typed data, so the domain (SessionManager/BrowserSession) carries no transport or re-validation
concerns and knows nothing about MCP. The browser is a port (BrowserProvider) injected into the
manager, so the isolation guarantee is unit-tested with a fake browser (fast, no Chromium in CI)
while a gated integration test proves it against real Chromium. The provider launches lazily and
memoizes, so a burst of concurrent createSession calls shares one browser; over HTTP, every client
gets its own session namespace while still sharing that one Chromium.
Install
npm install -g concurrent-playwright-mcp
# one-time: download the browser Playwright drives
npx playwright install chromiumInstalling the package does not download Chromium — run
npx playwright install chromiumonce, or the firstbrowser_create_sessioncall will fail with a Playwright hint to do so.
Or run from source:
npm install
npm run setup:browser # playwright install chromium
npm run buildUse it from an MCP client
Over stdio (one client, e.g. Claude Desktop / Claude Code / Cursor)
Point your client at the binary; it launches one server process for that client:
{
"mcpServers": {
"concurrent-playwright": {
"command": "npx",
"args": ["-y", "concurrent-playwright-mcp"],
"env": {
"PW_HEADLESS": "true",
"PW_MAX_SESSIONS": "20",
"PW_IDLE_TIMEOUT_MS": "300000",
},
},
},
}Over HTTP (many remote / independent agents → one server)
Run one long-lived server and let multiple agent clients connect to it. Each client gets its own isolated session namespace (it cannot see or touch another client's sessions), while all clients share a single Chromium process:
PW_TRANSPORT=http PW_PORT=3000 npx -y concurrent-playwright-mcp
# clients connect to the Streamable HTTP endpoint at http://<host>:3000/Most clients accept an HTTP MCP URL directly; e.g.:
{
"mcpServers": {
"concurrent-playwright": { "url": "http://localhost:3000/" },
},
}HTTP mode has no built-in authentication. It binds
127.0.0.1by default and rejects mismatchedHostheaders (DNS-rebinding protection is on), so a local web page can't drive it. To serve real remote clients, setPW_HOSTand add the externally-visible host toPW_ALLOWED_HOSTS(e.g.PW_ALLOWED_HOSTS=mcp.example.com:3000), and put it behind your own authenticating proxy / network controls — anyone who can reach the port can drive a browser.
The session-per-agent pattern
The core idea: each agent or task uses its own sessionId. Create it once, then pass it to every
call; sessions never share cookies, storage, or tabs, so parallel work can't collide. Target elements
by the ref ids returned from browser_snapshot (the accessibility tree), not raw CSS:
browser_create_session { "sessionId": "userA", "viewport": { "width": 1440, "height": 900 } }
browser_create_session { "sessionId": "userB", "viewport": { "width": 375, "height": 812 } } # in parallel, fully isolated
browser_navigate { "sessionId": "userA", "url": "https://example.com" }
browser_snapshot { "sessionId": "userA" } # → YAML with refs like [ref=e7]
browser_click { "sessionId": "userA", "ref": "e7", "element": "Sign in button" }
browser_save_storage_state { "sessionId": "userA", "path": "userA.json" } # reuse the login later
browser_close_session { "sessionId": "userA" }Those
browser_… { … }lines are illustrative, not text you type. The model emits a structured tool call and the client routes it over MCP; you never hand-write tool calls.
How it works (integrating with an agent)
Three actors are involved:
Operator (you): install the package + Chromium and add the config block above. That is the entire human surface — you don't enumerate tools or write tool calls.
MCP client / harness (Claude Code, Claude Desktop, Cursor, …): spawns the server (stdio) or connects to it (HTTP), performs the MCP handshake, calls
tools/listto discover the tools and their schemas automatically, and surfaces them — plus the server's built-ininstructions— to the model.LLM / agent: drives the tools in a loop: allocate a
sessionId→browser_create_session→browser_navigate→browser_snapshot(read the page, getrefs) → act byref→ … →browser_close_session.
Configuration happens at three layers:
Layer | Set by | Where | Examples |
Server policy & limits | operator |
|
|
Per-session | agent |
|
|
Per-call | agent | each tool's args |
|
Security limits live only in the server layer — an agent can't widen them (it can't escape
PW_OUTPUT_DIR or bypass PW_ALLOWED_ORIGINS). Per-call args are validated at the edge with
defaults, so the agent can omit the optional ones.
Tools
The agent discovers these (with full JSON schemas) via tools/list; this reference is for human
integrators. Optional params are marked ?. Every tool takes sessionId except
browser_list_sessions.
Session lifecycle
Tool | Params (besides | Returns |
|
| confirmation |
| — (takes no | JSON array of live session ids |
| — | confirmation |
|
| path to saved cookies+localStorage |
Navigation & inspection
Tool | Params (besides | Returns |
|
| confirmation |
| — | confirmation |
| — | accessibility YAML with |
|
| PNG image (+ saved file if |
|
| JSON-serialized result |
|
| confirmation |
|
| confirmation |
|
| confirmation |
|
| JSON |
| — | JSON |
|
| confirmation |
|
| confirmation / tab list |
Element actions — target by ref + element (a human description) from the latest browser_snapshot:
Tool | Params (besides |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Configuration (env vars)
Invalid values (e.g. a negative PW_MAX_SESSIONS) are rejected with a warning on stderr and the
default is used; the effective config is logged to stderr at startup.
Var | Default | Meaning |
|
|
|
|
| Hard cap on live sessions |
|
| Hard cap on tabs per session |
|
| Max console/network entries retained per session |
|
| Evict a session after this long with no use |
|
| Directory screenshots are written to (paths confined to it) |
| unset (any) | Confine |
| unset (any) | Comma-separated origin allowlist for navigation |
|
| Allow |
|
| Per-action timeout for element interactions |
| unset | Use a specific Chromium build |
|
|
|
|
| Host to bind in |
|
| Port to bind in |
| unset | Extra |
Security model
This server is dual-use: it hands an MCP client real control of a browser. Treat the client as semi-trusted and any page it visits as untrusted (a hostile page can try to steer a credulous agent into calling these tools with attacker-chosen arguments). With that in mind:
Navigation (
browser_navigate) blocksfile:anddata:URLs by default — the sharpest local-file-read / SSRF vector. SetPW_ALLOW_FILE_URLS=trueto allow them. Note the default still permits anyhttp(s)URL, including internal services and cloud metadata (169.254.169.254); setPW_ALLOWED_ORIGINSto restrict navigation to an allowlist of origins for any networked deployment.Screenshots and storage state (
browser_screenshotwith apath,browser_save_storage_state, andstorageStatePathon create) are confined toPW_OUTPUT_DIR; paths that try to escape it (via..or an absolute path) are rejected. Storage-state files contain cookies and may hold auth tokens — treat the output dir accordingly.File uploads (
browser_file_upload) read local files. By default any path is allowed; setPW_UPLOAD_DIRto confine uploads to one directory.browser_evaluateruns arbitrary JavaScript in the page (sandboxed to the page, not Node). It is a privileged capability; the navigation allowlist is the most effective containment.HTTP mode binds
127.0.0.1by default, enables DNS-rebinding protection (rejects unexpectedHostheaders), caps request body size and concurrent sessions, and gives each client an isolated session namespace. It has no authentication — see the warning under "Over HTTP" before exposing it beyond localhost.
Errors are reported in-band (isError) with a stable code prefix (e.g. NAVIGATION_BLOCKED,
PATH_NOT_ALLOWED, SESSION_NOT_FOUND), never thrown across the JSON-RPC channel.
Demo and benchmark
npm run demo # two isolated sessions (desktop + mobile) drive a site in parallel
npm run benchmark # N parallel sessions, reports throughput + asserts 0 collisions
npm run benchmark 25Development
npm run check # typecheck + lint + format + unit tests
npm run test:coverage # unit tests with coverage (no browser needed)
npm run test:integration # gated real-Chromium tests: isolation + deterministic, offline e2e
# journeys through the MCP server (needs Chromium). Add
# PW_HEADLESS=false to watch the parallel, isolated windows.
npm run build # tsup -> dist/ (ESM + d.ts)Test tiers: fast unit tests (the merge gate, no browser) → deterministic real-Chromium integration
and several end-to-end journeys through the MCP server against a local styled app (gated by
RUN_INTEGRATION=1, also run in CI).
See AGENTS.md for the engineering conventions this repo is built to.
License
MIT
Available Tools
23 toolsbrowser_clickClickC
Click an element (by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| element | Yes | Human description of the element (for logs/errors) | |
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the burden of behavioral disclosure. It lacks details on what happens if the element is not found, whether it scrolls into view, waits for visibility, or what the outcome is. Essential behavioral traits are missing.
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. It is concise but could be structured with separate usage notes. Still, it earns its place without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool and no output schema, the description should at least mention what the tool returns (e.g., success indicator) or common error conditions. It is incomplete for an agent to use effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces that ref comes from browser_snapshot, which is already in the schema, adding no new semantic meaning beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it clicks an element by ref from browser_snapshot. The verb 'click' and resource 'element' are specific, distinguishing it from other browser actions like hover or type, though sibling differentiation could be stronger.
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 or not use this tool. The phrase 'by ref from browser_snapshot' implies a prerequisite but does not explicitly state that a snapshot must be taken first or list alternative tools for other interaction patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_close_sessionClose sessionA
Close a session and release its browser context.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description mentions 'release its browser context' which hints at cleanup, but lacks detail on side effects (e.g., does it destroy tabs? handle errors?). No annotations provided to compensate.
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?
Single sentence with no wasted words. Efficiently communicates the core functionality.
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 simplicity of the tool (1 param, no output schema), description is mostly sufficient. However, it could mention error cases or that operation is irreversible.
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 covers 100% of parameters with a clear description for sessionId. Description does not add further meaning beyond what 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?
Description clearly states action: close a session and release its browser context. It uses specific verb and resource, and distinguishes from sibling tools like browser_create_session.
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 when or when-not to use this tool. Context is implied: close a session when done with it, but no guidance on prerequisites or consequences if session has pending actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_console_messagesConsole messagesC
Return console messages captured in the session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Id of the isolated browser session | |
| onlyErrors | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It only states the basic function without disclosing session dependency, message format, or the effect of the onlyErrors flag. Insufficient 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?
Single sentence with no wasted words. However, it is overly brief and could include more detail without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema; description does not mention return format or error handling. With two parameters and no annotations, the description is incomplete for a retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (only sessionId described). The description adds no meaning for onlyErrors or sessionId beyond what the schema provides. Does not compensate for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Return' and resource 'console messages captured in the session', distinguishing it from siblings like browser_network_requests and browser_screenshot.
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 on when to use this tool versus alternatives (e.g., browser_network_requests). The optional onlyErrors parameter is not explained. No context or exclusions provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_create_sessionCreate sessionA
Create an isolated browser session. Each session has its own cookies, storage, and tabs; sessions never share state, so many agents can drive separate sessions at once.
| Name | Required | Description | Default |
|---|---|---|---|
| viewport | No | Viewport size | |
| sessionId | Yes | Id of the isolated browser session | |
| storageStatePath | No | Storage-state JSON (within the output dir) to seed cookies/localStorage from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must cover behavioral traits. It discloses isolation and concurrency, but lacks details on authentication requirements, error handling (e.g., duplicate sessionId), rate limits, or session lifecycle. This is adequate but not comprehensive.
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 efficiently convey the core function and key behavioral trait. Front-loaded with the primary action, no filler, and every word adds 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?
The description covers purpose and isolation behavior, but with no output schema, it omits return value information (e.g., session details). It also does not connect to sibling tools or sequence (e.g., use before browser_navigate). Adequate for a simple tool, but missing context for full agentic use.
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 the schema's descriptions already explain each parameter. The tool description adds no extra semantic value beyond the schema; it only reiterates isolation context. Baseline 3 is appropriate given high 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 clearly states it creates an isolated browser session, distinguishing it from operations within a session. It explicitly mentions separation of cookies, storage, and tabs, and that multiple agents can drive separate sessions, making the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates when to use this tool (when isolation is needed), but does not explicitly state prerequisites (e.g., must create a session before other browser actions) or exclude scenarios. A clear usage context is provided, but alternative or when-not-to-use guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_dragDrag and dropB
Drag one element onto another (both by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Id of the isolated browser session | |
| sourceRef | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| targetRef | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| sourceElement | Yes | Human description of the element (for logs/errors) | |
| targetElement | Yes | Human description of the element (for logs/errors) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It fails to mention key details like whether the action waits for drop completion, how the mouse moves, or if events (e.g., dragstart, drop) are fired. The description is too minimal to inform an agent of the tool's runtime 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, short sentence that conveys the core purpose without unnecessary words. While it could be more informative, it is not verbose and respects the principle of front-loading. It 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?
Given the tool has 5 required parameters, no output schema, and no annotations, the description is insufficient. It does not explain return values, error conditions, or the sequence of actions (e.g., mouse down, move, up). For a complex action like drag-and-drop, more context is needed for an agent to use it effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover all 5 parameters with clear explanations (e.g., sourceRef is 'Element ref from the latest browser_snapshot'). The description adds no new semantic meaning, but since schema coverage is 100%, the baseline of 3 is appropriate. No contradictions or omissions.
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 ('Drag one element onto another') and specifies the resource ('both by ref from browser_snapshot'). It distinguishes from sibling tools like click, hover, and type by explicitly naming drag-and-drop. This is a specific verb-resource pair with no 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 provides no guidance on when to use this tool versus alternatives (e.g., browser_click for clicking or browser_hover for hovering). It does not mention prerequisites, when not to use it, or common pitfalls. The only context is implicit: use it for dragging elements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evaluateEvaluate JavaScriptB
Run a JavaScript expression in the page and return the JSON-serialized result.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must fully convey behavioral traits. It mentions JSON serialization but omits critical details: whether the expression can have side effects, whether it supports async, or any security implications. The description is insufficient for understanding the tool's full 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, concise sentence that front-loads the core action. It avoids unnecessary words but could benefit from slightly more structure for readability. Still, 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?
Given the lack of output schema and annotations, the description leaves many gaps. It does not explain possible errors, return types beyond 'JSON-serialized', or behavior for complex expressions. The tool runs arbitrary code, which demands more completeness for safe usage.
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 50% (sessionId described, script not). The description adds no extra meaning to the script parameter beyond 'JavaScript expression'. It does not specify format, constraints, or how results are returned. Baseline 3 applies, as coverage is not low enough to require heavy compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs JavaScript in a page and returns JSON-serialized results. The verb 'evaluate' combined with 'JavaScript expression' precisely defines the action, distinguishing it from sibling tools like clicks or navigation.
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 usage guidelines provided. The description does not indicate when to use this tool over alternatives, nor does it mention prerequisites or exclusions. Sibling tools cover various actions, but there is no comparison or recommendation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_file_uploadUpload filesB
Set files on a file input (by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| paths | Yes | File paths (confined to the upload dir if configured) | |
| element | Yes | Human description of the element (for logs/errors) | |
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden but does not disclose behavioral traits such as session requirements, file path restrictions, or whether the upload is immediate. It only states what the tool does, not side effects or safety.
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 gets directly to the point. However, it could be slightly more informative without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations and output schema, and 4 required parameters, the description is insufficiently complete. It does not explain the return behavior, error conditions, or workflow context (e.g., need for an existing session).
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 100% coverage with individual parameter descriptions, so the tool description adds minimal extra meaning. The mention of 'by ref from browser_snapshot' is already covered in the ref parameter 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 clearly states the action ('Set files'), the target ('a file input'), and how to reference the element ('by ref from browser_snapshot'). It is specific to file upload and distinguishes it from sibling tools like browser_type or browser_click.
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 vs alternatives, such as browser_type or browser_fill_form. The description does not mention prerequisites or constraints like file path availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fill_formFill formA
Fill several fields in one call (each by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; the description does not disclose side effects, auto-submission, waiting behavior, or error handling, which is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence front-loading the key action and source of refs.
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?
Lacks context on behavior, error handling, and side effects; given no output schema or annotations, the tool needs more explanation for safe usage.
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 50% with descriptions for ref, value, element; the description adds little beyond what's in the schema (refs from snapshot already documented in schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fills several fields in one call using refs from browser_snapshot, distinguishing it from single-field actions like browser_type or browser_click.
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 implies usage for batch filling from snapshot refs but does not explicitly mention when not to use it or alternatives for single fields.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_handle_dialogHandle dialogC
Decide the next dialog (alert/confirm/prompt) instead of auto-dismissing it.
| Name | Required | Description | Default |
|---|---|---|---|
| accept | Yes | ||
| sessionId | Yes | Id of the isolated browser session | |
| promptText | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so full burden on description. It mentions 'instead of auto-dismissing' but doesn't disclose blocking behavior, error conditions, or effects of parameters.
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, very concise. However, it could be restructured for clarity, adding separate statements for purpose and parameter hints.
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?
Tool lacks output schema and annotations; description is too short to cover required parameter roles, side effects, or return behavior. Incomplete for a 3-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only sessionId has description). Description adds no meaning to parameters accept or promptText, which are undocumented.
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?
Description states the verb 'Decide' and resource 'dialog' with types (alert/confirm/prompt), and contrasts with auto-dismissing. However, it could more explicitly say it accepts or dismisses the dialog.
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 on when to use this tool versus sibling tools. It doesn't mention prerequisites like when a dialog is present or how to trigger it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_hoverHoverA
Hover over an element (by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| element | Yes | Human description of the element (for logs/errors) | |
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must convey behavioral traits. It only states the action without side effects, triggers, or error conditions. Missing details like whether it simulates a real hover or just moves cursor.
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?
Single sentence, minimal, front-loaded with purpose. No extraneous content.
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?
Simple tool with full schema coverage; no output schema needed. However, lacks behavioral transparency and usage guidance, leaving gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds minor value by referencing snapshot but doesn't elaborate on parameter formats or constraints beyond 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?
Clear verb 'Hover over an element' with specific source 'by ref from browser_snapshot'. Distinguishes from sibling tools like browser_click and browser_type.
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?
Implies need for prior snapshot but no explicit guidance on when to hover vs other interactions. No alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_list_sessionsList sessionsA
List the ids of all live browser sessions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description accurately implies a read-only operation. It does not disclose potential side effects, but listing is inherently non-destructive.
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, concise sentence that conveys exactly what the tool does with no unnecessary words.
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 simplicity of the tool (no parameters, no output schema), the description is complete and sufficient for an agent to understand its behavior.
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 the description need not add any parameter information. The schema coverage is trivial, and the description is sufficient.
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 'List' and the resource 'ids of all live browser sessions'. It is specific and distinguishes from sibling tools like browser_create_session or browser_close_session.
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. The description is clear but lacks contextual cues for selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_network_requestsNetwork requestsC
Return network responses captured in the session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must disclose behavioral traits. It only states the return behavior but does not mention whether data is cleared, if authorization is needed, or if the tool is read-only. This lack of context is a significant 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 concise with a single sentence. It is front-loaded with the action and result, but could benefit from additional context without being wordy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and simple schema, the description is incomplete. It does not explain what format or content the network responses will have (e.g., list of objects with URL, status, body), nor any limitations like session timeout or number of responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one parameter (sessionId) well-defined in schema. The description adds no extra semantic value beyond the schema, which is acceptable but not helpful.
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 returns network responses, distinguishing it from sibling tools like browser_console_messages. However, it could be more specific about the scope (e.g., all requests, completed vs pending, inclusion of headers/body).
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 usage guidance is provided. The description does not indicate when to use this tool versus others (e.g., browser_snapshot for visual captures) or any prerequisites like having an active session after navigation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_press_keyPress keyB
Press a keyboard key (e.g. "Enter", "ArrowDown").
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears the full burden of behavioral disclosure. It only says 'press a keyboard key' without specifying modifiers, key release behavior, or requirements like an active session.
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?
Single sentence, zero waste, and front-loaded with the action. 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, the description is minimally adequate but lacks details about session requirement, key input constraints, and return behavior. Given the lack of output schema and missing param descriptions, it should provide more 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 50% (sessionId described, key not). The description adds examples for the 'key' parameter, which adds some meaning, but does not specify allowed values or format.
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 it presses a keyboard key with examples like 'Enter' and 'ArrowDown', which differentiates it from sibling tools like browser_click (mouse) and browser_type (typing text).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., browser_type for text input) or prerequisites (e.g., an existing browser session).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_resizeResize viewportC
Resize the session's viewport.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | ||
| height | Yes | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. However, it only states the action without mentioning side effects, permissions, or constraints. For example, it does not specify whether resizing affects page content or requires an active session.
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 sentence with no wasted words, achieving conciseness. However, it is so minimal that it sacrifices necessary detail, which prevents a perfect score.
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 three required parameters and no output schema, the description is incomplete. It does not explain the effect of resizing, the relationship to other browser actions, or any prerequisites, leaving significant gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only sessionId described). The description adds no meaning for width and height beyond the schema's type and bounds. Since coverage is low, the description should compensate but fails to do so.
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 'Resize' and the resource 'session's viewport', which is specific and unambiguous. It distinguishes well from sibling tools like browser_navigate or browser_screenshot, as directly naming the action and target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor any conditions or exclusions. It simply states the action, leaving the agent without context for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_save_storage_stateSave storage stateA
Save the session's cookies + localStorage to a JSON file (within the output dir) for later reuse via browser_create_session.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path within the output dir | |
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses saving cookies+localStorage to a JSON file, but lacks details on overwrite behavior, permissions, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with verb and resource, containing no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema or annotations, the description adequately explains what is saved (cookies+localStorage), where (JSON file in output dir), and purpose (reuse via browser_create_session). It could mention the file path format, but it's 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?
Schema coverage is 100%, so baseline is 3. The description adds meaning by specifying 'cookies + localStorage' as the saved content, which goes beyond the parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Save' and the resource 'session's cookies + localStorage to a JSON file'. It also distinguishes itself from siblings by mentioning 'for later reuse via browser_create_session'.
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 by mentioning it saves state for later reuse via a sibling tool, but it does not explicitly state when to use or provide alternatives beyond that sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotScreenshotB
Capture a PNG of the active page and return it as an image. Optionally also save it to a file within the output dir.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Optional file path within the output dir to also save to | |
| fullPage | No | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions returning a PNG and optional file save, but does not disclose side effects, performance impact, or that it is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action, no redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and no annotations, the description is minimal. It lacks details on return format (PNG is mentioned but not explicit), fullPage parameter behavior, and differentiation from browser_snapshot.
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 description adds meaning for 'path' (optional save) beyond the schema, but does not explain 'fullPage' or clarify 'sessionId' beyond the schema. Schema description coverage is 67%, so additional explanation is moderately helpful.
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 ('Capture'), resource ('active page'), and output ('PNG image'). It distinguishes from siblings like browser_snapshot by specifying the format and behavior.
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 on when to use this tool vs alternatives (e.g., browser_snapshot). No mention of when not to use or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_select_optionSelect optionB
Select one or more options in a (by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| values | Yes | ||
| element | Yes | Human description of the element (for logs/errors) | |
| sessionId | Yes | Id of the isolated browser session |
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 only says 'select options', not disclosing side effects (e.g., page mutation), requirements (element must be <select>), or limitations (only single selections? multiple?). This is insufficient for a UI interaction tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It is front-loaded with the core action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no annotations, and only partial parameter coverage, the description fails to provide sufficient context. It doesn't explain what happens after selection (e.g., page update, event triggers) or error conditions. For a UI interaction tool, this is inadequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds context for the ref parameter (source). However, the values parameter lacks description in both schema and description, and the description does not explain the relationship between parameters or usage patterns beyond ref.
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 selects options in a <select> element using a ref from browser_snapshot. It uses a specific verb and resource, and distinguishes from sibling tools like browser_click or 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?
The description implies usage after browser_snapshot by mentioning 'by ref from browser_snapshot', but gives no when-to-use or when-not-to-use guidance, nor any alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotAccessibility snapshotA
Get the accessibility snapshot (YAML) of the active page, including element refs to target with other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. States it gets snapshot of active page, which is a read-only operation. Does not disclose potential side effects, performance, or permissions needed, but adequate for a simple retrieval.
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?
Single sentence efficiently conveys purpose, format, and usage context. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but description explains return value (YAML snapshot with element refs), sufficient for a simple retrieval tool. Lacks details on snapshot structure but adequate for use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with sessionId described. Description adds no additional meaning to the parameter beyond schema, so baseline 3.
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?
Clearly states it retrieves the accessibility snapshot in YAML format and includes element refs for targeting with other tools. Distinguishes from siblings like browser_screenshot (visual) and browser_evaluate (JS execution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mentions returning element refs for use with other tools, implying the tool is for obtaining targets for subsequent automation. No explicit 'when not to use', but context is clear given sibling diversity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_tabsTabsC
List, open, close, or select a tab within the session.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Tab index for close/select | |
| action | Yes | ||
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description should cover behavioral traits like side effects, session requirement, or zero-based indexing. It only lists actions without revealing how tabs are managed or that 'open' maps to action 'new'.
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?
Single sentence listing all actions, front-loaded and compact. Could improve by aligning 'open' with 'new' but otherwise efficient.
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 22 sibling tools and no output schema, the description lacks critical context about session dependence, action semantics, and when to combine with other tools like browser_create_session.
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 description adds no extra meaning beyond the schema; it even creates ambiguity by using 'open' for action 'new'. The optional index parameter is not clarified in context.
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 explicitly states the tool manages tabs (list, open, close, select) which aligns with the action enum and clearly distinguishes from sibling browser tools like browser_navigate or browser_create_session.
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 on when to use this tool versus alternatives. It does not mention prerequisites (e.g., existing session) or when to prefer other tools like browser_navigate for navigation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_typeTypeA
Fill an input with text (by ref from browser_snapshot).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | Element ref from the latest browser_snapshot (e.g. 'e12') | |
| text | Yes | ||
| element | Yes | Human description of the element (for logs/errors) | |
| sessionId | Yes | Id of the isolated browser session |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It states the core action but omits important details such as whether existing text is cleared, whether events are triggered, or how errors are handled. The description is too sparse for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that efficiently conveys the tool's purpose. Every word adds value, with no redundancy or filler.
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 typing action, the description is minimally adequate but lacks information on return values, error conditions, and behavior with different input types (e.g., textarea vs input). With no output schema, the agent must infer results.
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 provides descriptions for 75% of parameters (ref, element, sessionId). The description adds context that ref comes from a snapshot, but does not elaborate on the 'text' parameter (no schema description) or the 'element' parameter beyond its human-readable purpose. It adds marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Fill an input with text') and specifies the resource (an input) and the source of the element reference ('by ref from browser_snapshot'). This distinguishes it from sibling tools like browser_click or 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?
The description implies usage after taking a snapshot (by mentioning 'from browser_snapshot'), but it does not explicitly state when to use this tool vs alternatives like browser_fill_form or browser_press_key. No usage restrictions or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_forWait for selectorB
Wait until a CSS selector reaches a state.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | visible | |
| timeout | No | Timeout in milliseconds | |
| selector | Yes | CSS selector to wait for | |
| sessionId | Yes | Id of the isolated browser session |
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. It fails to disclose behavioral traits such as timeout behavior, polling interval, or side effects, only restating the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, but it is very short; a bit more detail would improve without adding verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is insufficient. It does not explain return values, error handling, or behavior on timeout, leaving significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% with parameter descriptions, and the tool description adds no extra meaning beyond the basic action. 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 (wait) on a specific resource (CSS selector) to reach a state, distinguishing it from sibling tools like browser_click or browser_navigate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for waiting on selector states but does not explicitly state when to use or avoid this tool, nor does it mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a specific browser automation action (click, type, navigate, etc.) with clear boundaries. The only potential overlap is between browser_type and browser_fill_form, but the latter is explicitly for multiple fields, so no confusion.
All tools follow the exact same `browser_<verb>` pattern in snake_case, providing a predictable and intuitive naming scheme. There are no deviations or mixed conventions.
At 23 tools, the set is comprehensive but on the higher side. However, each tool serves a distinct and necessary browser automation function, so the count is justified and not excessive.
The tool surface covers nearly all essential browser automation tasks: navigation, interaction, evaluation, dialogs, network, console, sessions, storage, tabs, waiting, and screenshots. Minor gaps like scrolling or raw DOM queries exist but are workable.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
MCP server for building and testing AI agents with multi-model experimentation and insights.
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceA Playwright-based MCP server that exposes a live browser as a traceable, inspectable, debuggable and controllable execution environment for AI agents.5,21857
- AlicenseAqualityCmaintenanceMulti-agent Playwright MCP server with tab isolation via targetId, enabling multiple agents to share a single Chrome browser while maintaining isolated tab groups and shared sessions.14143MIT
- FlicenseBqualityBmaintenanceAn MCP server for generic browser automation using Playwright. Enables MCP clients to navigate pages, inspect elements, execute JavaScript, capture screenshots, and monitor console logs and network traffic via a headless Chromium instance.7
- AlicenseAqualityDmaintenanceA tab-aware Playwright MCP server that enables multiple agents to operate on different tabs concurrently while sharing a single browser context and login session.235MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dgutierrez1/concurrent-playwright-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server