Lean, LLM-first browser automation MCP server. Gives Claude, OpenCode, or any MCP client a real browser to navigate, interact with, and debug web apps.
Mare Browser MCP demonstrates solid naming conventions (verb_noun pattern: browser_*) and comprehensive parameter schemas with proper types and enums. However, descriptions vary significantly in quality, some are excellent (browser_session: 380+ chars with clear mode explanations), while others are terse (browser_debug, browser_query lack depth). Output schemas are not explicitly documented in the visible code. Error handling guidance is minimal; tools lack recovery hints. The server exposes complex browser state management (tab pinning, handoff protocol) but descriptions don't adequately explain failure modes or retry strategies. 15 of 17 tools have descriptions, but 6 are under 100 chars and lack actionable context for LLM selection.
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. Available actions: click — click an element (supports left/right/middle button). Use button:'right' for context menus. click_mode:'mouse' sends a full mouse down/up/click sequence in existing mode; default preserves the legacy click. Isolated mode already uses Playwright mouse input. Optional delay_ms holds the press; expect verifies a visible selector or URL substring without repeating the click. Results distinguish action_status:'dispatched' from outcome:'observed'. Failed expectations stop the batch; never automatically retry a click. 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. dispatch — fire a DOM event on an element (event + optional detail/bubbles/composed). For web-component apps (LWC/Stencil) that only react to composed CustomEvents, e.g. firing 'change' with a {name,value} detail on a custom input. Defaults bubbles+composed true. 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.
Output schemas not documented. Tools return complex objects (e.g., browser_snapshot returns accessibility tree with refs, browser_video returns recording metadata) but no formal schema definitions visible in code. LLMs cannot plan downstream calls without knowing return structure.
Minimal error recovery guidance. Tools lack descriptions of failure modes (e.g., 'stale ref' in browser_act, tab handoff conflicts in browser_session, network timeouts). Descriptions do not guide LLM on retry strategy or next steps.
Six tools have descriptions under 100 characters (browser_debug, browser_query, browser_restart, browser_frames, browser_scroll, browser_eval). These lack context for LLM selection and do not explain when to use them vs. similar tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 41 | 2026-07-28+ | v2 |
Inspect captured console logs and network requests. Optionally filter by URL pattern, HTTP method, console type, or retrieve the last N entries. Include request/response bodies (may be large).
Execute arbitrary JavaScript in the page context. Returns the result of the last expression. Use for custom logic, data extraction, or DOM manipulation.
Fetch a URL from the browser context. Returns response status, headers, and body. Useful for testing APIs or downloading resources.
List all frames in the current page. Returns frame id, name, URL, and parent-child relationships. Use frame ids in other tools to target specific iframes.
Navigate the browser to a URL. Optionally clear console and network logs before navigating (recommended when starting a new task).
Query the DOM for elements matching a selector. Returns element metadata (role, name, testId, ref) and optional field values. Useful for verifying page state without a full snapshot.
Restart the isolated browser. Clears all state, cookies, and local storage. Useful for starting fresh or recovering from a crashed page.
Save a screenshot to disk. Returns the file path, MIME type, and byte size.
Capture a screenshot of the current page or a specific element. Returns base64-encoded PNG or JPEG. Optionally crop to an element's bounding box.
Scroll the page or a specific element. Supports scrolling by pixel offset, to a specific element, or to the top/bottom.
Inspect or select the browser backend. mode='isolated' uses Mare's own Playwright browser; mode='existing' controls the user's current signed-in Chromium through the bundled extension. Omit mode to inspect status without switching. Tabs are exclusively pinned per LLM session: another session cannot take your tab unless you grant a handoff. If your results include a releaseRequested notice, another session wants your tab — grant it with detach:true and handoff:true, or keep working to decline.
Capture a semantic snapshot of the page DOM. Returns an accessibility tree with interactive elements marked with refs (e.g., 'e9', 'e42'). Use refs in browser_act to target elements reliably. Optionally limit tree depth or compact non-semantic wrappers.
Upload a file to an input[type=file] element. Supports single or multiple file uploads.
Start, stop, or export a video recording of browser activity. Supports WebM and MP4 formats. Requires ffmpeg for MP4 export.
Wait for network requests to complete. Optionally filter by URL pattern or HTTP method. Useful for waiting for API responses or page loads.
Wait for the page URL to match a pattern. Supports exact match or substring match. Useful for waiting for navigation to complete.
browser_act's complex action types (click, hover, drag, fill, select, keypress, dispatch, waitfor, scrollto, wait, clearconsole) are documented in description but parameter schema does not enforce action enum validation or per-action required fields. LLMs may pass invalid action+parameter combinations.
browser_eval and browser_navigate lack warnings about side effects. These tools execute arbitrary code/navigation but descriptions do not flag them as WRITE operations or warn about state mutation. LLMs may not recognize irreversibility.