MCP server that reads browser tab content and controls the browser via a browser extension
Strong tool naming (verb-first, clear intent) and comprehensive descriptions (avg 180 chars, well above 34-char baseline). All 12 tools have input schemas with typed parameters. However, output schemas are not documented in the source code, LLMs cannot predict return structures. Parameter descriptions are present but inconsistent in depth; some lack format/constraint details. Error handling is minimal; no recovery guidance or actionable error messages visible. Security-sensitive tools (execute_script, debugger_send_command) lack permission gates or audit trail documentation.
Detach the Chrome DevTools Protocol debugger from a tab. Call this after completing all CDP commands to release the debugging session.
Send a Chrome DevTools Protocol (CDP) command to a tab. The debugging session attaches automatically. Use this only when dedicated tools and page/background scripts cannot provide the required lower-level data, such as network response bodies or protocol diagnostics. Complete follow-up CDP commands before calling debugger_detach.
Run custom JavaScript code inside a tab and return its result. The function receives the elements of args as its parameters and supports async operations.
Run custom JavaScript code in the extension's background service worker and return its result. Supports async operations. Use this only for one-shot browser-level operations such as tabs, windows, and downloads. It does not access page DOM, support event-listener callbacks, or keep work alive after the function returns.
Execute a page tool discovered via read_active_tab or read_tab. Pass the toolsetId and tool name from the tools[] array, along with arguments matching the tool's inputSchema.
Output schemas not documented. LLMs cannot predict return structures for read_tab, read_active_tab, execute_script, execute_tab_tool, or debugger_send_command. This forces agents to guess field names and types, increasing errors and wasting tokens on exploratory calls.
execute_script and execute_script_in_background accept arbitrary JavaScript with no validation, sanitization, or permission gates. No audit trail or confirmation step documented. Agents can inject malicious code or cause unintended side effects without safeguards.
No error handling guidance. Tools lack recovery hints (e.g., 'If tab not found, call list_tabs first'). No error classification (retryable vs fatal). Agents cannot self-correct on failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Fetch the browser's cookies for the given URL's domain. Use this to access login-protected pages that aren't currently open in the browser: grab the cookies, then issue a plain HTTP request with them.
Fetch page errors from the given tab: JS exceptions, unhandled promise rejections, and CSP violations. Use this for debugging.
Fetch localStorage data from the given tab. Returns key-value pairs; values longer than 1024 characters are truncated with a length indicator.
List every open tab in the browser. Returns each tab's id, title, active flag, last-accessed time, and URL. Use this only when the target tab is unknown; for the current page use read_active_tab directly.
Read a condensed HTML snapshot of the active tab in the current window. Returns tabId, title, URL, content, and page tools. Each tools[] item contains toolsetId, name, description, and inputSchema for use with execute_tab_tool. Use this when the user asks about "the current page" — no list_tabs or follow-up read_tab is needed first.
Read a condensed HTML snapshot of the given tab. Also returns the page tools available on this tab. Each tools[] item contains toolsetId, name, description, and inputSchema for use with execute_tab_tool. Use list_tabs first only when the target tab ID is unknown.
Take a screenshot of the given tab and return it as a base64-encoded PNG image.
Parameter descriptions lack format/constraint details. 'tab_id' is described as 'Target tab ID' but no range, type validation, or error behavior specified. 'func_str' in execute_script lacks syntax/safety constraints. LLMs cannot validate inputs before calling.
No pagination or result-limiting documented for list_tabs. If browser has hundreds of tabs, response could exhaust context window. No limit parameter or cursor guidance visible.