mare-browser-mcp
This server gives an LLM a real Chromium browser to automate, inspect, and debug web apps through Playwright-backed MCP tools.
Navigate & control the browser – go to URLs, restart the browser, wait for URL changes, and emulate mobile/tablet/desktop devices (presets or custom).
Perform page actions – click, right-click, hover, drag, fill inputs, select dropdowns, press keys, click by visible text, wait for elements, scroll, and upload files.
Read the page efficiently – query DOM elements by CSS selector (text, value, visibility, class, href, HTML, counts), grab the accessibility tree with stable refs, and evaluate arbitrary JavaScript for anything else.
Debug with rich context – get current URL/title, console logs, dialog history, and detailed network request metadata (method, URL, headers, status, timing) with filters; wait for specific network responses.
Capture evidence – take screenshots (base64 or saved artifact) or record screencast videos (start/stop/one-shot click capture) for QA and documentation.
Authenticated fetching – run fetch() inside the page context, inheriting cookies/session, and see it in the network log.
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., "@mare-browser-mcpgo to example.com and get the page title"
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.
mare-browser-mcp
A lean, LLM-first browser automation MCP server. Gives Claude (or any MCP client) a real Chromium browser to navigate, interact with, and debug web apps — without the overhead of raw Playwright APIs.
Built with Playwright + MCP SDK. One server = one browser session = one LLM.
Free to use. If it saves you time, buy me a coffee ☕
Install (recommended)
Prerequisites: Node.js 18+, pnpm
git clone https://github.com/emadklenka/mare_browser_mcp
cd mare_browser_mcp
pnpm install
npx playwright install chromiumThis is the fastest way to run the server — starts instantly with no registry lookups.
Related MCP server: Glance
Alternative installs
Global install — no cloning, still fast:
pnpm add -g mare-browser-mcp
npx playwright install chromiumRegister with Claude Code
If you cloned the repo, the setup script does it for you:
pnpm run setupThat's it. The script detects the correct path automatically and registers the MCP with Claude Code. Restart Claude Code and the browser tools are ready.
Manual config — add to ~/.claude.json under mcpServers:
{
"mcpServers": {
"mare-browser": {
"command": "node",
"args": ["/absolute/path/to/mare_browser_mcp/src/index.js"],
"env": { "HEADLESS": "false" }
}
}
}If installed globally:
{
"mcpServers": {
"mare-browser": {
"command": "mare-browser-mcp",
"env": { "HEADLESS": "false" }
}
}
}Register with OpenCode
Add this to ~/.config/opencode/opencode.json (global) or opencode.json (project root):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mare_browser_mcp": {
"type": "local",
"command": [
"node",
"/absolute/path/to/mare_browser_mcp/src/index.js"
]
}
}
}If installed globally:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mare_browser_mcp": {
"type": "local",
"command": ["mare-browser-mcp"]
}
}
}Tools
browser_navigate(url, clear_logs?)
Navigate to a URL. Pass clear_logs: true when starting a new task to wipe stale console/network/dialog history.
browser_act(commands[])
Run a sequence of actions in one call. Supported actions:
action | required params | optional params | what it does |
|
|
| Click an element. Use |
|
| Hover over an element — triggers tooltips, dropdown menus, hover states | |
|
|
| Drag an element to another element ( |
|
| Click a link/button by its visible text | |
|
| Type into an input (clears first) | |
|
| Select a dropdown option | |
|
| Press a key (e.g. | |
|
|
| Wait until element appears |
|
| Scroll element into view | |
|
| Pause for N milliseconds | |
| — | Clear console log buffer |
browser_debug()
Start here when something goes wrong. Returns in one call:
Current URL and page title
Console logs (filterable by type:
error,warning,log,pageerror)Network request metadata with: method, URL, redacted query params, request headers (auth masked), status code, and
duration_mstimingDialog history (alert/confirm/prompt — auto-accepted, text captured)
Filter with url_filter, method_filter, console_types, or last_n.
Request and response bodies are omitted by default. Set include_bodies: true only when necessary; credential-like keys are recursively redacted in requests, responses, and query parameters.
browser_query(selector, all?, fields?, visible_only?, limit?, count_only?)
Read the DOM without a screenshot. Query any element by CSS selector.
param | what it does |
| Return all matching elements (default: first only) |
| Pick fields: |
| Filter to visible elements only — recommended for broad selectors |
| Cap the number of results (e.g. |
| Just return the count — fast way to check "how many rows?" without fetching data |
browser_eval(code)
Escape hatch for anything the other tools don't cover:
Read computed styles:
getComputedStyle(el).backgroundColorAppend text to inputs without clearing
Type character-by-character for autocomplete
Drag-and-drop via manual DOM events
Call
fetch()to hit APIs directlyRead JS app state (
window.__store__, etc.)Check CSS visibility (
display,opacity,visibility)
browser_scroll(direction?, pixels?, selector?, container?)
Three modes:
Page scroll:
direction: "down", pixels: 500Scroll into view:
selector: ".my-element"Scroll within a container:
container: ".ag-body-viewport", direction: "down", pixels: 300— for scrollable divs, grid viewports, chat panels
browser_wait_for_network(url_pattern?, method?, timeout?)
Wait for a specific network response after triggering an action — smarter than guessing with wait.
browser_screenshot()
Returns a PNG screenshot. Use as a last resort — prefer browser_debug and browser_query first.
browser_save_screenshot(filename?, full_page?, format?, hide_recording_pointer?)
Save a screenshot as an artifact under the OS temp directory and return its absolute path, MIME type, byte size, physical pixel dimensions, CSS viewport, device-pixel ratio, URL, and page title. This is the preferred screenshot tool for QA evidence, documentation, and marketing assets because it avoids returning a large base64 payload.
Mare hides its recording pointer before saved screenshots by default, preventing a completed action clip from contaminating later clean or target stills. Set hide_recording_pointer: false only when intentionally documenting the pointer itself.
browser_save_screenshot({ filename: "candidate-grid", full_page: true, format: "png" })
// -> { ok: true, path: "/tmp/mare-browser-mcp/candidate-grid.png", ... }Set CAPTURE_DIR to override the default temp artifact directory.
browser_video(action, filename?, format?, ...)
Record a precise Playwright screencast. action is start, stop, status, or capture_click; format is webm (default) or mp4. Screencast start and stop operate on the live page without recreating the browser context, so in-memory application state is preserved. While recording, click actions show a translucent yellow pointer and pulse. Mare now hides that pointer automatically after every stop.
The default capture_scale: "device" records at device-pixel dimensions so video and ordinary viewport PNGs share the same native canvas on high-DPI displays. Use capture_scale: "css" for a smaller CSS-pixel recording. Start/status/stop responses report the Mare version, CSS viewport, device-pixel ratio, capture scale, and output size.
browser_video({ action: "start", filename: "candidate-walkthrough", format: "mp4" })
// perform browser actions
browser_video({ action: "stop" })
// -> { ok: true, path: "/tmp/mare-browser-mcp/candidate-walkthrough.mp4", mode: "screencast", ... }For short product-storyboard actions, prefer the atomic form. It performs the start, one click, optional URL wait, short click-pulse tail, and stop inside one MCP call, avoiding static padding caused by model/tool round trips:
browser_video({
action: "capture_click",
filename: "open-candidate",
format: "mp4",
selector: "[data-testid='candidate-link']",
wait_for_url: "/cnd/",
timeout: 2500,
post_click_ms: 450
})capture_click returns the source and destination URLs, action success, URL-match result, finalized artifact metadata, and pointer-cleanup result. MP4 output is automatically transcoded to high-quality H.264 and requires ffmpeg on PATH.
On Playwright versions older than 1.59, Mare retains the previous context-level WebM recorder as a compatibility fallback. Stop an active recording before calling browser_restart.
browser_upload(selector, files[])
Upload files to a file input element.
browser_restart(url?)
Kill the browser and start fresh. Clears all logs. Optionally navigate to a URL after restart.
browser_emulate_device(device, orientation?, custom?)
Switch the browser into a device profile for responsive QA. Emulation persists across navigations until you swap devices or call browser_restart.
Presets (natural portrait viewport):
iphone-15-pro-max(430×932),iphone-15-pro(393×852),iphone-15(393×852),iphone-se(375×667)galaxy-s24(360×800)ipad-pro-13(1024×1366),ipad-pro-11(834×1194),ipad-mini(768×1024)galaxy-tab-s9(800×1280)desktop-chrome(1280×800) — resets to desktopcustom— requirescustom.userAgent+custom.viewport.{width, height}
Swapping devices recreates the browser context, so cookies and localStorage are lost and auth'd pages may land on login. innerWidth: 980 on a mobile emulation viewing a page without <meta name="viewport"> is Chrome's legacy fallback, not a bug — pointer_coarse, hasTouch, and userAgent are the authoritative signals. browser_debug surfaces the active emulation under an emulation field.
Example workflow
1. browser_navigate("https://myapp.com", clear_logs: true)
2. browser_act([
{ action: "fill", selector: "#email", value: "user@example.com" },
{ action: "fill", selector: "#password", value: "secret" },
{ action: "click", selector: "button[type=submit]" }
])
3. browser_wait_for_network({ url_pattern: "/api/session", method: "POST" })
4. browser_debug({ console_types: ["error"] }) <- check for login errors
5. browser_query(".dashboard-title") <- confirm we're logged inHover + tooltip example
1. browser_act([{ action: "hover", selector: ".info-icon" }])
2. browser_query(".tooltip", { fields: ["text", "visible"] })Drag-and-drop example
// Reorder columns
browser_act([{ action: "drag", selector: ".col-name", target: ".col-age" }])
// Resize a column by 100px
browser_act([{ action: "drag", selector: ".resize-handle", offsetX: 100, offsetY: 0 }])Right-click context menu
1. browser_act([{ action: "click", selector: ".grid-row", button: "right" }])
2. browser_query(".context-menu-item", { all: true, fields: ["text"] })Scroll inside a container
browser_scroll({ container: ".ag-body-viewport", direction: "down", pixels: 500 })Count elements quickly
browser_query({ selector: ".ag-row", count_only: true })
// -> { selector: ".ag-row", count: 47 }Emulate a mobile device
1. browser_emulate_device({ device: "iphone-15-pro-max" })
2. browser_navigate({ url: "https://www.youtube.com" })
// redirects to m.youtube.com because of the iPhone UA
3. browser_screenshot() // mobile layout
4. browser_emulate_device({ device: "ipad-pro-13", orientation: "landscape" })
5. browser_emulate_device({ device: "desktop-chrome" }) // resetEnvironment
Variable | Default | Description |
|
| Run browser headless ( |
|
| Use your installed Chrome instead of Playwright's Chromium |
|
| Chrome profile name (when |
| OS temp + | Screenshot and video artifact directory |
The browser launches lazily — it won't open until the first tool call.
License
MIT — free to use, modify, and distribute.
If this project helps you, buy me a coffee ☕
Available Tools
14 toolsbrowser_actA
Perform one or more browser actions in sequence. Batch multiple steps into one call.
Two ways to target an element — use whichever is more stable: • ref — accessibility ref from browser_snapshot (preferred). LLM-friendly: no selector guessing, survives CSS class churn, resistant to obfuscated build output. Each ref is pinned to the exact element captured in the snapshot, so it never silently drifts to a different element when the page reflows. If that element is removed or re-rendered, the action fails loudly ("stale ref" / element not found) — re-snapshot rather than retrying. Call browser_snapshot first to get refs like "e9", "e42", then pass them to actions: { action: "click", ref: "e9" }. • selector — raw CSS selector. Use when you already know it, or for elements not in the a11y tree.
Example ref flow:
browser_snapshot() → { snapshot, refs: [{ref: "e9", role: "button", name: "Sign in"}] }
browser_act({ commands: [{ action: "click", ref: "e9" }] })
Available actions: • click — click an element (supports left/right/middle button). Use button:'right' for context menus • hover — hover over an element for tooltips, dropdown menus, hover states • drag — drag an element to a target selector (column reorder, kanban) OR by pixel offset (column resize, sliders). Use target for element-to-element, offsetX/offsetY for precise pixel drag • clicklink — click a link/button by visible text (text-based; does not use ref/selector) • fill — fill an input field (clears first) • select — select a dropdown option • keypress — press a key (Enter, Tab, Escape, etc.) — keyboard action, no ref/selector needed • waitfor — wait for an element to appear • scrollto — scroll an element into view • wait — pause for N milliseconds (no target) • clearconsole — clear captured console logs (no target)
click, hover, drag, fill, select, waitfor, scrollto all accept either 'ref' or 'selector'. If both are provided, 'ref' wins. Refs are invalidated on navigation — re-snapshot if the page has changed.
| Name | Required | Description | Default |
|---|---|---|---|
| commands | Yes | Ordered list of actions to execute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses critical behavioral traits: refs are pinned to snapshot elements, stale refs cause loud failures, refs invalidate on navigation, ref takes precedence over selector, fill clears first, and drag supports both element and pixel targets. This goes far beyond any structured metadata.
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 well-organized into sections: purpose, targeting methods, example flow, and action list. Every sentence earns its place, with clear bullet points and examples. It is long but appropriately so 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's 11 actions, no output schema, and no annotations, the description is remarkably complete. It covers targeting, all action nuances, failure modes, and the snapshot workflow, leaving no essential guidance for the 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?
The schema lists fields with minimal descriptions, but the tool description adds rich semantics for each action: click's button options, drag's target vs offset modes, clicklink's text-based targeting, waitfor's timeout, and the 'ref wins' rule. This is far beyond schema basics.
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 performs browser actions in sequence and batches multiple steps. It distinguishes itself from sibling tools by focusing on interactions like click, fill, drag, and keyboard presses, and explicitly references browser_snapshot for refs.
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 explicitly instructs to call browser_snapshot first to obtain refs and explains when to use selector vs ref. It also gives guidance on when to re-snapshot, though it does not explicitly contrast with alternative navigation/eval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_debugA
PREFERRED DEBUGGING TOOL. Returns current URL, page title, console logs, dialogs (alert/confirm/prompt), and rich network requests in one call. Always call this before browser_screenshot. Network entries include: method, URL, query params (parsed), request body (JSON/form), request headers (auth masked), status code, response body (JSON), and duration_ms for performance analysis. Use url_filter and method_filter to focus on specific API calls. Use console_types to filter log levels.
| Name | Required | Description | Default |
|---|---|---|---|
| last_n | No | Return last N entries (default 50) | |
| url_filter | No | Filter network requests by URL substring | |
| console_types | No | Filter console by type: error, warning, log, pageerror | |
| method_filter | No | Filter network requests by method e.g. POST, GET |
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 detailed network entry structure, including auth-masked headers and duration_ms, which goes beyond a generic 'get debug info' description. However, it does not mention potential state impacts or whether console logs are cumulative, leaving minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact at about five sentences, with essential information front-loaded: it opens with 'PREFERRED DEBUGGING TOOL' and the rule to call before browser_screenshot. Each sentence adds value, and there is no redundancy or 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?
Despite the lack of an output schema, the description sufficiently explains the return values: URL, title, console logs, dialogs, and network request fields (method, URL, query params, headers, status, response body, duration). It also covers filter usage, making it complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all four parameters with 100% coverage, so the baseline is 3. The description adds contextual purpose for filters ('focus on specific API calls') and clarifies console_types usage, providing value beyond the schema without duplicating 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 explicitly identifies the tool as the 'PREFERRED DEBUGGING TOOL' and enumerates its return payload: current URL, page title, console logs, dialogs, and network requests. This distinguishes it from siblings like browser_screenshot and browser_navigate, making its purpose and scope clear.
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 states 'PREFERRED DEBUGGING TOOL' and 'Always call this before browser_screenshot,' providing explicit when-to-use and sequencing guidance. It also advises using specific filters to focus API calls, which is clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_emulate_deviceA
Switch the browser session into a device emulation profile (iPhone / iPad / Android tablet / desktop reset / custom). Emulation lives on the browser context — it persists across browser_navigate calls until you swap to another device or call browser_restart.
IMPORTANT behaviors: • Swapping devices recreates the browser context but cookies + localStorage are PRESERVED (via persistent storageState). Pages behind auth stay logged in across swaps. The tool auto-navigates back to the URL you were on. IndexedDB is not preserved — PWAs that store auth tokens there may require re-login. • innerWidth: 980 on a mobile emulation is NOT a bug. It means the current page has no and is using Chrome's legacy fallback. Check verified.layout_mode — it will be "legacy-980-fallback" in this case. The authoritative signals that emulation is working are: userAgent, pointer_coarse, hasTouch, devicePixelRatio. • browser_restart always clears emulation (back to desktop). • Not supported in REAL_CHROME mode (returns an error).
Presets and natural viewports (portrait): • iphone-15-pro-max (430×932), iphone-15-pro (393×852), iphone-15 (393×852), iphone-se (375×667) • galaxy-s24 (360×800) • ipad-pro-13 (1024×1366), ipad-pro-11 (834×1194), ipad-mini (768×1024) • galaxy-tab-s9 (800×1280) • desktop-chrome (1280×800, DPR 1, no touch — use this to reset) • custom — requires custom.userAgent + custom.viewport.{width,height}
Returns { ok, active, previous_url, previous_url_restored, verified, checks, warnings? }. ok: true as long as the essential fields (UA substring + devicePixelRatio) match; soft drift in hasTouch or pointer_coarse surfaces as warnings[] without flipping ok. On hard failure: { ok: false, error, verified, checks }.
| Name | Required | Description | Default |
|---|---|---|---|
| custom | No | Required iff device === 'custom'. Must include userAgent and viewport.{width,height}. | |
| device | Yes | Device preset key, or 'custom' to supply your own options. | |
| orientation | No | Optional. Defaults to the device's natural orientation. Swaps viewport + screen width/height. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and exceeds it: it details context recreation, cookie/localStorage preservation, IndexedDB loss, auto-navigation back, the innerWidth:980 fallback, and authoritative verification signals. Return value behavior and warnings are thoroughly explained.
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?
Though long, the description is well-structured with clear bullets and sections. The opening sentence is concise, and every bullet adds necessary behavioral or preset information. No 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?
No output schema exists, but the description explains return fields and verification semantics. No annotations exist, but the description covers all important edge cases (auth persistence, viewport fallback, error conditions). For a complex tool with nested custom parameters, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond the schema by listing concrete viewport dimensions for each preset and reiterating custom requirements, making parameter selection easier.
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 and resource: 'Switch the browser session into a device emulation profile' and enumerates exact presets (iPhone, iPad, Android tablet, desktop reset, custom). It clearly distinguishes from siblings by noting persistence across browser_navigate and that browser_restart clears emulation.
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?
Explicit use cases are given: when to use device emulation, which preset to use for reset (desktop-chrome), and an exclusion ('Not supported in REAL_CHROME mode'). The persistence and auth behavior also inform when to use this tool versus browser_restart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_evalA
Execute JavaScript in the page context and return the result. This is your ESCAPE HATCH for anything the other tools don't cover. Common use cases: • Read computed styles: getComputedStyle(el).backgroundColor • Append text to inputs without clearing: el.value += '...'; el.dispatchEvent(new Event('input', {bubbles:true})) • Type character-by-character for autocomplete: use dispatchEvent with input events per character • Drag-and-drop: create and dispatch mousedown/mousemove/mouseup or dragstart/drop events • Read JS app state: window.store, React devtools, etc. • Check visibility via CSS: getComputedStyle(el).display, opacity, visibility • Scroll inside a container: document.querySelector('.container').scrollTop += 500 The code is evaluated as an expression — use an IIFE for multi-statement code.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | JavaScript code to evaluate in the page. For async code use: (async () => { ... })(). Return value is serialized as JSON. |
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 that code is evaluated as an expression and recommends IIFE for multi-statement code, which is a valuable behavioral detail. It also provides examples showing side-effecting operations (dispatching events, appending text) but doesn't warn about potential page crashes or persistent state changes.
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 well-structured with a concise opening sentence followed by focused bulleted examples and a crucial closing note about IIFE usage. Every sentence and bullet contributes actionable information without unnecessary 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?
For a one-parameter tool with no output schema, the description is remarkably complete. It covers what the tool does, when to use it, provides many usage examples, and explains evaluation semantics. The only minor gap is error handling, but the given context 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%, but the description adds enormous value by giving example code snippets that directly inform how to fill the 'code' parameter. It goes beyond the schema's basic description, making the parameter's possibilities and constraints much clearer.
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 'Execute JavaScript in the page context and return the result,' which is a specific verb+resource definition. It further differentiates itself from siblings by calling itself the 'ESCAPE HATCH for anything the other tools don't cover,' making its unique role explicit.
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 explicitly says to use this tool when other tools don't cover a need, and provides a rich set of concrete use cases (computed styles, app state, drag-and-drop, etc.) that illustrate when it's appropriate. The guidance is clear even though alternatives aren't named individually.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_fetchA
Execute an authenticated fetch() request inside the page context. Inherits the page's cookies and session — same-origin requests work automatically, cross-origin requires CORS. Returns status, headers, and parsed body. Appears in browser_debug network log.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch (relative or absolute) | |
| body | No | Request body — auto-JSON-encoded if object | |
| parse | No | Response parse mode (default: json, falls back to text on parse error) | |
| method | No | HTTP method (default: GET) | |
| headers | No | Additional request headers (merged over defaults) |
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 discloses that the request inherits session/cookies, CORS constraints, the return contents (status, headers, parsed body), and that it appears in the browser_debug network log. This is substantial context, though it does not cover error handling, timeout behavior, or side effects of non-GET methods.
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 three sentences, front-loaded with the primary purpose, followed by key behavioral details. Every sentence adds value: purpose, session/CORS behavior, and return/logging info. No redundant words or repetition of schema 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?
Given the tool has 5 parameters, no output schema, and no annotations, the description covers the essential usage context: authentication, CORS, return value, and integration with the debug log. It does not elaborate on error conditions or partial success, but the schema fills in parameter defaults. Overall, it is sufficiently complete for selection and 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 covers 100% of parameters with descriptive field descriptions (e.g., 'auto-JSON-encoded if object', 'Response parse mode'). The tool description does not add meaning beyond the schema's parameter descriptions, so it earns the baseline score of 3 for this dimension.
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 'Execute an authenticated fetch() request inside the page context,' which clearly states the action and target. It distinguishes itself from sibling tools like browser_navigate (navigation) and browser_eval (script evaluation) by specifying it is a fetch request, not a navigation or UI interaction.
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 clear context for usage: it inherits the page's cookies and session, making it appropriate for authenticated requests. It also notes same-origin works automatically and cross-origin requires CORS, giving a practical condition. However, it does not explicitly name alternative tools or state when not to use it, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_queryA
Query DOM elements by CSS selector. Use to check element state, text, visibility, or values without taking a screenshot. Use visible_only and limit to avoid huge result sets on broad selectors.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Return all matching elements (default false = first only) | |
| limit | No | Max number of elements to return when using all:true (e.g. 10, 20). Prevents huge payloads on broad selectors. | |
| fields | No | Fields to extract: text, value, visible, disabled, className, href, innerHTML. Default: tag + text + visible | |
| selector | Yes | CSS selector | |
| count_only | No | Just return the count of matching elements — no element data. Fast way to check 'how many rows?', 'how many errors?'. Combines with visible_only. | |
| visible_only | No | Only return/count visible elements — filters out hidden/offscreen elements (default false). Recommended for broad selectors. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses the risk of large result sets and suggests mitigation, which is useful. However, it doesn't explicitly state that it's a read-only operation or describe the exact return structure, though the schema covers defaults.
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 purpose, no filler. 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?
The description covers purpose, usage, and a key tip, while the schema fully describes all parameters. Without an output schema, the description gives a sense of what to expect ('element state, text, visibility, values'). It's adequate for a 6-param tool with a detailed schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds brief context for visible_only and limit (avoid huge result sets), but doesn't add much 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 clearly states the tool queries DOM elements by CSS selector, which is a specific verb+resource. It also explains use cases (check state, text, visibility, values) and contrasts with screenshots, though it doesn't explicitly name alternative tools like browser_eval or browser_snapshot.
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 clear context: use to check element state/text/visibility/values when a screenshot isn't needed. It also recommends using visible_only and limit for broad selectors, which is actionable guidance. However, it doesn't explicitly state when not to use it or name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_restartA
Close and reopen the browser session. Use when the page is dead, crashed, or stuck after navigating to an external site. Optionally navigate to a URL immediately after restart.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | URL to navigate to after restart (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the core behavior of closing and reopening the browser session and adds context about when that is appropriate. It does not detail side effects like session state loss, but the action is unmistakable and the use case is described.
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 three short, purposeful sentences with no filler. It front-loads the core action, then adds usage guidance and parameter context, earning a top score for efficiency.
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 optional parameter and no output schema, the description is largely complete: it explains the purpose, when to use it, and the optional URL behavior. A slight ambiguity remains around what happens after restart if no URL is given, but this is minor.
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 documents the single optional url parameter with a clear description. The tool description reinforces it ('Optionally navigate to a URL immediately after restart') but does not add new semantic detail beyond what the schema 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 uses a specific verb-resource pair ('Close and reopen the browser session'), which clearly identifies the action and object. It also distinguishes itself from siblings by focusing on recovery from dead, crashed, or stuck pages rather than navigation or inspection.
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 explicitly states when to use the tool ('when the page is dead, crashed, or stuck after navigating to an external site') and mentions the optional navigation after restart. It does not explicitly list alternatives or when-not-to-use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_screenshotA
LAST RESORT. Returns a screenshot as base64. Expensive and unstructured. Only use when the problem is purely visual (layout, rendering glitch). Always try browser_debug and browser_query first.
| Name | Required | Description | Default |
|---|---|---|---|
| quality | No | thumbnail: ~400px JPEG, small/fast. normal: full viewport PNG (default). fullres: full-page PNG. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits itself. It does: 'Expensive and unstructured' warns about cost and output format. It could further note that it captures the current viewport (though the schema covers this via quality options), so a slight gap remains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, all essential: a warning, the core function, a usage condition, and an alternative directive. Front-loaded with 'LAST RESORT' to prevent misuse. No wasted 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?
The tool is simple (one optional param, no output schema), and the description covers its purpose, usage constraints, cost, and output format. The qualitative alternatives are explicitly named. This is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the single 'quality' parameter 100% with detailed enum descriptions. The description adds no information about parameters, so 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 tool's function: 'Returns a screenshot as base64.' This is a specific verb and resource, and the explicit 'LAST RESORT' framing distinguishes it from sibling tools like browser_debug or browser_query.
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 provides explicit when-to-use guidance ('Only use when the problem is purely visual') and when-not-to-use by naming alternatives ('Always try browser_debug and browser_query first'). This is exactly the kind of exclusionary context needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_scrollA
Scroll the page, scroll within a specific container element (e.g. AG-Grid viewport, chat panel, sidebar), or scroll an element into view. Use 'container' to scroll inside scrollable divs instead of the page.
| Name | Required | Description | Default |
|---|---|---|---|
| pixels | No | Pixels to scroll (default: 500). Use large values like 99999 to scroll to top/bottom. | |
| selector | No | CSS selector to scroll into view (overrides direction/pixels) | |
| container | No | CSS selector of a scrollable container to scroll within (e.g. '.ag-body-viewport', '.chat-messages') | |
| direction | No | Scroll direction (default: down) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It adds useful context about scrolling within containers versus the page, and mentions scrolling elements into view. However, it does not disclose potential side effects (e.g., whether scrolling is instant or smooth), precedence if multiple parameters are provided, or any limitations. The description is functional but not deeply transparent about edge-case 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 two sentences long and front-loaded with the primary action. Each sentence serves a purpose: the first enumerates the three scroll modes, the second explains when to use the container parameter. There is no wasted or redundant 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?
Given 4 optional parameters and no output schema, the description covers the three main use cases (page, container, element) well. It does not explain interactions between parameters (e.g., what happens if selector and container are both set), but the schema already describes individual parameter overrides. The description is sufficient for a browser scrolling tool, though a note about parameter precedence would make it more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying the intended use of the 'container' parameter ('scroll inside scrollable divs instead of the page') and contextualizing the 'selector' parameter as 'scroll an element into view'. This enriches the schema's descriptions with real-world scenarios, particularly for container scrolling.
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 function with a specific verb ('scroll') and resource distinctions: page, container element (with examples), and element into view. It differentiates from sibling tools like browser_navigate and browser_act by focusing solely on scrolling behaviors. The scope is unambiguous and well-defined.
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 explicitly says 'Use 'container' to scroll inside scrollable divs instead of the page,' giving clear guidance on when to use the container parameter. It does not explicitly name alternative tools like browser_eval for scrolling, but as the dedicated scroll tool, the appropriate context is implied. There is no exclusionary guidance, but the container-vs-page distinction provides actionable usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_snapshotA
Return the accessibility tree of the current page with refs attached to interactive elements (buttons, links, textboxes, checkboxes, etc.). Use this INSTEAD of guessing CSS selectors from a screenshot — selectors break on class-name churn, refs don't.
Returns { url, snapshot: [...tree], refs: [{ref, selector, role, name, testId}, ...] }.
Each ref like "e9" maps internally to a stable selector. Pass refs to browser_act: browser_act({ commands: [ { action: "fill", ref: "e42", value: "user@example.com" }, { action: "click", ref: "e9" } ]})
Every node includes testId when the element has data-testid, data-test, or data-qa — use these as additional stability anchors. Refs are invalidated automatically on navigation — re-snapshot after any browser_navigate or URL change.
Use compact: true to drop pure layout wrappers (divs/spans with no role, no testId) and return a flatter tree focused on interactive content. Recommended for noisy apps with deeply-nested div soup.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No | Drop non-semantic wrapper elements (divs/spans without role or testId). Flattens noisy trees. | |
| max_depth | No | Max tree depth (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers. It discloses the return format, that refs map internally to stable selectors, that they invalidate on navigation, and that testId is included when present. It also explains the effect of compact:true on the tree. This is rich 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 structured with a clear purpose, return type, usage example, and edge-case notes (ref invalidation, compact). It is front-loaded with the key action and uses concise bullet-like prose; every sentence adds distinct 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?
As there is no output schema, the description must and does explain the return shape, ref semantics, and the recommended companion tool (browser_act). It also covers navigation invalidation and parameter behavior, making it complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both compact and max_depth described. The description adds practical guidance for compact—'to drop pure layout wrappers (divs/spans with no role, no testId)' and 'Recommended for noisy apps with deeply-nested div soup'—extending beyond the schema's descriptor. max_depth remains schema-only, but the additional compact context justifies a score above 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 opens with 'Return the accessibility tree of the current page with refs attached to interactive elements,' a specific verb+resource that clearly states what the tool does. It also differentiates from siblings by explicitly advising to use it INSTEAD of guessing CSS selectors from a screenshot, distinguishing it from 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?
Explicitly states 'Use this INSTEAD of guessing CSS selectors from a screenshot' and explains that refs are stable while selectors break on class-name churn. It also instructs to pass refs to browser_act and notes that refs invalidate after navigation, providing clear when-to-use context. This is explicit guidance beyond simple purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_uploadA
Upload one or more files to a file input element. Use the CSS selector to target the input and provide absolute file paths.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Absolute path(s) to the file(s) to upload | |
| selector | Yes | CSS selector for the file input element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It mentions multiple file support and absolute path requirements, adding useful context. However, it does not discuss side effects, error behavior, or whether the upload replaces existing files, leaving gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main action and clear instructions. 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 two-parameter tool with no output schema, the description covers the essential usage. It could mention expected return values or asynchronous behavior, but it is generally complete for the tool's purpose.
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 both parameters with descriptions, and the description reinforces the selector and file paths. It adds the 'absolute file paths' requirement and 'one or more files' context, which goes slightly beyond the schema. This provides added semantic value.
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 uploads files to a file input element, using a CSS selector and absolute file paths. This distinguishes it from sibling tools like browser_navigate and browser_act, as it specifically targets file uploads.
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 clear context: use when you need to upload files to a file input element. It instructs to use a CSS selector and provide absolute paths, but does not explicitly mention when not to use it or alternatives. This is solid but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_for_networkA
Wait for a specific network response matching URL pattern and/or method. Returns the response with status and JSON body. Use after triggering an action to wait for its API call to complete instead of guessing with wait times. url_pattern accepts a single substring OR an array of substrings (any-of match — resolves on the first matching response).
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | HTTP method to match e.g. GET, POST | |
| timeout | No | Max wait time in ms (default: 10000) | |
| url_pattern | No | URL substring to match (e.g. '/api/documents'), or an array of substrings for any-of matching (e.g. ['/api/users', '/api/session']) |
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 any-of matching behavior for url_pattern, timeout default, and the return value (status and JSON body). It doesn't mention timeout error behavior, but the disclosed details are sufficient for a read-like wait 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?
The description is two sentences, front-loaded with the main purpose, then elaborates usage and parameter behavior. Every sentence earns its place with no redundancy or 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 three simple parameters, no output schema, and no annotations, the description covers purpose, usage, return value, and parameter semantics. It could mention error behavior on timeout, but for a straightforward wait tool, the coverage is solid.
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 adds value beyond the schema by explaining the any-of match semantics for url_pattern arrays and confirming the timeout default, which the schema only lists without these nuances.
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 waits for a network response matching URL pattern and/or method, and returns the response with status and JSON body. This specific verb+resource distinguishes it from sibling tools like browser_wait_for_url, which waits for URL 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?
It explicitly says to use after triggering an action 'instead of guessing with wait times', providing clear use context. It doesn't name alternative sibling tools explicitly, but the guidance is actionable and distinguishes from generic waiting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
browser_wait_for_urlA
Wait for the page URL to change and match a substring pattern. Use after actions that trigger redirects (JS redirects, auth redirects, SPA route changes). Returns current URL on timeout. Optionally chain a readiness gate via wait_for so you don't have to follow up with setTimeout/wait.
| Name | Required | Description | Default |
|---|---|---|---|
| exact | No | If true, match pattern as exact URL equality instead of substring (default false) | |
| pattern | Yes | URL substring to match (or exact string if exact:true) | |
| timeout | No | Max wait time in ms (default: 10000) | |
| wait_for | No | Optional readiness signal to wait for after the URL matches. 'load' = full load event, 'domcontentloaded' = DOM parsed, 'networkidle' = no network for 500ms. Omit for just the URL match. |
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 key behaviors: waits for URL change, matches substring, returns current URL on timeout (non-throwing), and optionally chains a readiness gate. It could be more explicit about whether it succeeds immediately if the URL already matches, but this is a minor gap given the usage 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?
Four sentences, no redundant wording. Front-loaded with the core action, then usage context, timeout behavior, and optional chaining. Every sentence adds value, making it concise and well-structured.
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 the essential aspects for correct usage: what it does, when to use it, timeout behavior, and optional chaining. No output schema exists, so it doesn't need to explain return values, but it does mention the timeout return. It doesn't explicitly explain what happens on success (likely no return value), but that is a minor omission for a wait operation.
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% for all 4 parameters, so the baseline is 3. The description adds some contextual meaning to wait_for (readiness gate, avoiding follow-up), but doesn't add syntax or details beyond what the schema already provides for pattern, exact, timeout, and wait_for.
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 ('Wait') and resource ('page URL'), and clearly states the action: 'wait for the page URL to change and match a substring pattern.' It distinguishes itself from sibling tools like browser_wait_for_network by focusing on URL changes rather than network idle.
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 states when to use: 'Use after actions that trigger redirects (JS redirects, auth redirects, SPA route changes).' This provides clear context and indicates it is a follow-up wait operation. It also suggests an alternative pattern ('so you don't have to follow up with setTimeout/wait') for chaining with wait_for, showing awareness of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
14 tool updates
v1.5.2- First observed
browser_act - First observed
browser_debug - First observed
browser_emulate_device - First observed
browser_eval - First observed
browser_fetch - First observed
browser_navigate - First observed
browser_query - First observed
browser_restart - First observed
browser_screenshot - First observed
browser_scroll - First observed
browser_snapshot - First observed
browser_upload - First observed
browser_wait_for_network - First observed
browser_wait_for_url
TDQS
Each tool has a clearly distinct purpose: navigation, action execution, debugging, DOM querying, snapshotting, waiting, screenshotting, JS eval, scrolling, restarting, uploading, network waiting, and device emulation. Even the inspection tools (debug, query, snapshot, eval) are well separated by what they return and when to use them.
All 14 tools follow the consistent pattern of 'browser_' prefix followed by a lowercase verb (navigate, act, debug, query, fetch, snapshot, wait_for_url, screenshot, eval, scroll, restart, upload, wait_for_network, emulate_device). No mixing of camelCase or inconsistent verb styles.
14 tools is within the ideal 3-15 range and each tool serves a distinct aspect of browser automation—navigation, interaction, inspection, waiting, debugging, device emulation, and file upload. The count is well-scoped for a comprehensive browser control server without being bloated.
The server covers the full lifecycle of browser interaction: navigate, act, inspect, wait, debug, screenshot, and emulate. Minor gaps exist such as no explicit dialog acceptance (alert/confirm/prompt) or tab management, but agents can work around these with browser_eval in most cases, so they are not critical dead ends.
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
Live browser debugging for AI assistants — DOM, console, network via MCP.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
- RampifyOAuthdev.rampify
SEO MCP server: crawl your site, find AI-visibility gaps, and ship the fix from your coding agent.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP Server for Chrome DevTools, following the Chrome DevTools Protocol. Integrates with Claude Desktop and Claude Code.307MIT
- AlicenseCqualityDmaintenanceAn MCP server that gives Claude Code real browser control for web automation, testing, and screenshots.3255151MIT
- AlicenseAqualityDmaintenanceSelf-hosted MCP server for AI browser automation. Connects to your own Chromium instance via CDP, providing tools for browser control, navigation, interaction, and content extraction.191MIT
- AlicenseNot gradedqualityCmaintenanceLocal browser automation MCP server for Claude Code, enabling navigation, clicking, typing, and inspecting real web pages via Google Chrome.151MIT
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/emadklenka/mare_browser_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server