MCP server + Chrome extension letting OpenCode/Claude Code drive Luigi's logged-in Chrome. Read-only by default.
Chrome-bridge has clear, action-oriented tool names (chrome_get_*, chrome_read_*, chrome_navigate, etc.) and most tools include descriptions. However, 7 of 9 tools have EMPTY input schemas ({}), violating the critical schema requirement. Descriptions are present but vary in quality, some are detailed (chrome_read_page: 180 chars), others minimal (chrome_get_status: 120 chars). Parameter descriptions exist for tools with inputs (chrome_navigate, chrome_scroll, chrome_exec_js, chrome_get_text_by_selector, chrome_click_selector, chrome_type_into) but are brief. No output schemas are documented. Error handling returns isError=true with text messages, but lacks recovery guidance or error classification. No tool annotations (readOnlyHint, destructiveHint) despite clear read/write risk separation.
Click the first element matching a CSS selector in the active tab. WRITE ACTION — disabled unless CHROME_BRIDGE_ALLOW_WRITE=true.
Run a small piece of JavaScript in the active tab and return its result (stringified). Prefer read_page; use this only for structured extraction a page selector can't capture.
Check whether the Chrome Bridge extension is connected and whether write actions are enabled.
Return the text of all elements matching a CSS selector in the active tab (e.g. 'article', '.post-content'). Useful for grabbing a specific section without the whole page.
List open Chrome tabs (id, title, url, active). Use to find the tab to read.
Open a URL in the active Chrome tab (creates a new tab if the active one is a chrome:// page).
7 of 9 tools have empty input schemas ({}). Per HARD SCORING RULES, tools with no input schema must score 0 for schema. This violates pattern:constrained-input and pattern:tool-description.
No output schemas documented. LLMs cannot plan downstream calls or extract fields without knowing what each tool returns. Baseline: 100% of A+ tools have documented return types.
Error handling returns raw text messages without recovery guidance. Per pattern:recovery-guide, errors must tell the LLM what to do next (e.g., 'extension not connected, ensure Chrome window is open with extension loaded').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Read the visible text of the active Chrome tab. Returns url, title and up to 200KB of text. This is the primary 'read a blocked site' tool (X/Twitter, LinkedIn, etc. work if already logged in).
Scroll the active tab. direction: up|down|top|bottom; amount: pixels for up/down (default 600).
Type a value into the input matching a CSS selector in the active tab (dispatches input+change events). WRITE ACTION — disabled unless CHROME_BRIDGE_ALLOW_WRITE=true.
No tool annotations despite clear risk separation. chrome_click_selector and chrome_type_into are destructive (WRITE); chrome_read_page, chrome_list_tabs, etc. are read-only. Missing destructiveHint and readOnlyHint annotations per current MCP spec.
Parameter descriptions are present but minimal (avg ~40 chars). Baseline for A+ tools: 72 chars. E.g., 'direction' param in chrome_scroll lacks detail on what 'top' and 'bottom' do vs 'up'/'down'.