MCP server for controlling Chrome over the DevTools Protocol (CDP).
Server has 5 tools with clear verb-noun naming (ping, list_tabs, navigate, evaluate, cdp_command). All tools have descriptions (avg 180 chars, within baseline 194). However, parameter descriptions are sparse or missing context. Input schemas are present but lack detail: 'params' in cdp_command is typed as 'object' with no property constraints; tab_id appears in 3 tools but lacks guidance on format or when to omit. Output schemas are documented in docstrings but not formally in JSON Schema. Error handling returns structured dicts with 'error' fields, but lacks recovery guidance (e.g., 'try list_tabs() first'). No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels (ping/list_tabs are READ_ONLY; navigate/evaluate/cdp_command are WRITE). Security: no secrets in params (good), but no permission gates or audit trail patterns.
Send a raw CDP command and return its raw result — escape hatch. Use when the higher-level tools don't cover what you need. ``method`` is any CDP method (e.g. ``"Page.captureScreenshot"``, ``"DOM.getDocument"``, ``"Network.enable"``); ``params`` are its parameters. Runs against the given tab (or the first page tab). Note: this targets a *page* websocket, so page-domain methods work; browser-level domains (``Browser.*``, ``Target.*``) do not. Returns ``{"tab_id", "method", "result"}`` or ``{"error": ...}``.
Evaluate a JavaScript ``expression`` in a Chrome tab. Uses the first page tab when ``tab_id`` is omitted. Awaits promises and returns the value by value. Returns ``{"tab_id", "value", "type"}`` on success, or ``{"error": ...}`` on failure or an uncaught JS exception.
List open Chrome page tabs. Returns ``{"tabs": [{id, title, url, type}, ...]}`` or ``{"error": ...}`` if Chrome is unreachable.
Navigate a Chrome tab to ``url``. Uses the first page tab when ``tab_id`` is omitted. Returns ``{"tab_id", "url", "frameId"}`` on success, ``{"error": ...}`` otherwise.
Check connectivity to Chrome's DevTools endpoint (``CDP_URL``). Returns ``{"connected": True, "cdp_url", "browser", "protocol"}`` when Chrome answers, or ``{"connected": False, "cdp_url", "error": ...}`` when it is unreachable.
Parameter 'params' in cdp_command typed as bare 'object' with no property schema or constraints. LLMs cannot validate CDP method parameters or infer required vs optional fields.
tab_id parameter appears in navigate, evaluate, cdp_command but lacks format guidance (is it a UUID? alphanumeric? opaque string?). Description says 'Optional tab ID; uses first page tab if omitted' but does not explain how to obtain a tab_id or what format list_tabs returns.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk levels. ping and list_tabs are READ_ONLY; navigate, evaluate, cdp_command are WRITE/destructive. Agents cannot distinguish safe from risky tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. E.g., 'cannot reach Chrome at {CDP_URL}: {exc}' tells agent Chrome is down but not what to do next (retry? check CDP_URL env var? call ping first?).
Output schemas documented in docstrings but not formally declared in JSON Schema. LLMs infer response structure from text, which is error-prone. No documented pagination, limits, or field types for list_tabs response.