MCP bridge between Claude Code and your browser via shared daemon
11 tools with clear verb-noun naming and consistent descriptions (avg 95 chars). All tools have input schemas with Zod validation and type definitions. However, output schemas are undocumented, responses are JSON stringified without formal structure declarations. Parameter descriptions are present but terse (avg 45 chars), lacking format constraints, ranges, and dependency hints. Error handling is minimal: tools catch exceptions but return generic error messages without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in metadata. Missing idempotency guarantees and confirmation patterns for destructive operations.
Click an element. Most robust: `role`+`name` (accessibility tree — spans shadow DOM/iframes, survives DOM churn on hostile SPAs). Or `id` from observe, or a CSS `selector`.
Close every tab this session opened (its tab group) — call when you're done with the browser
Close one tab by id — use it to tidy up any tab you opened and no longer need (a page you navigated to, a preview, a login flow). Prefer this over leaving tabs behind.
Close Claude tab groups left behind by other sessions. By default closes every group marked '(ended)'; pass title_pattern to match a substring of the group title instead (e.g. a session id)
Get the text or HTML content of a page
Get info about a specific tab (defaults to active tab)
Output schemas undocumented. Tools return JSON.stringify(result) without formal response type declarations. LLMs cannot infer field names, types, or structure for downstream chaining.
No tool annotations despite clear risk metadata. Destructive tools (close_tab, close_session_tabs, close_tab_groups) lack destructiveHint. Read-only tools lack readOnlyHint. Agents cannot distinguish safe from unsafe operations.
Parameter descriptions lack format constraints and ranges. 'tab_id' has no type hint (number vs string ambiguity). 'key' in press_key lists examples but no formal enum. 'format' in get_page_content uses enum but others use free-form strings.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
List open browser tabs (scoped to this session's tab group by default)
Navigate a tab to a URL
Press a keyboard key in the focused element — Enter, Tab, Escape, Backspace, Delete, arrows, Home/End, PageUp/PageDown, or a single character. Supports modifiers (e.g. Control+a to select all).
Take a screenshot of a tab (defaults to active tab). Returns base64 PNG.
Type text into an element (newlines become real Enter presses). Most robust: `role`+`name` (accessibility tree). Or `id` from observe, or a CSS `selector`.
Error handling returns generic catch-all messages ('error: err.message') without recovery guidance. No distinction between retryable (network timeout) vs user-fixable (invalid tab_id) vs fatal errors.
No confirmation or dry-run pattern for destructive operations. close_session_tabs and close_tab_groups execute immediately without agent confirmation, risking accidental tab closure.