Model Context Protocol (MCP) server for controlling Chromium/Chrome via Chrome DevTools Protocol. Cross-platform with automatic reconnection. Enables AI assistants like Claude to automate browsers.
Strong tool coverage (32 tools) with consistent naming (verb_noun pattern) and comprehensive descriptions (avg 150-200 chars). All tools have input schemas with type definitions. However, output schemas are not documented, LLMs cannot predict response structure for chaining. Parameter descriptions are present but some lack constraints (enums, ranges). Error handling guidance is minimal. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Missing idempotency guarantees and recovery guidance.
Quick page state check without screenshot (fast health-check for autonomous agents). Returns URL, title, load state, visible errors, form count, and interactive elements count. Response time < 500ms.
Click on an element using a CSS selector. For React SPAs, use ensureInteractive option to trigger synthetic event handlers.
Click an element by its visible text content (semantic alternative to chrome_click). Uses XPath contains() for text matching. Optionally filter by ARIA role. Returns actionable error with suggestions if 0 or >1 matches found. Prefer this over chrome_execute_script for clicking buttons/links.
Close the current tab
Detect SPA framework on the page (React, Vue, Angular, Svelte). Useful for determining if ensureInteractive pattern is needed. Returns detected frameworks and their versions.
Wait for element to be ready for interaction (visible, enabled, stable). Returns ready status and element state. Fast path: <10ms if already ready. Slow path: polls every 50ms until ready or timeout.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting) for downstream tool chaining. E.g., chrome_list_tabs returns tab objects but structure is invisible to the agent.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. LLMs cannot distinguish safe reads from destructive writes without explicit hints. E.g., chrome_navigate is WRITE but unmarked.
Missing error recovery guidance. Tools like chrome_wait_for return timeout as non-error state, but no guidance on what agent should do next. Error responses lack actionable suggestions (e.g., 'Try chrome_extract_interactive to discover available elements').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Execute JavaScript in the current page and return the result. ADVANCED: Use as last resort when chrome_click, chrome_type, or other structured tools cannot accomplish the task. Prefer semantic tools for better reliability.
Extract structured form data without custom scripting. Returns fields (name, type, value, placeholder, required, label, validation rules), submit buttons, and fieldsets. Works with standard forms, React forms, and Shadow DOM forms. Identifies filled vs empty fields.
Extract all interactive elements with their text and metadata. Returns buttons, links, inputs with text, role, selector, visibility, and enabled status. Limited to 100 elements for performance. Use this to discover available interactions before calling chrome_click_text or chrome_type_text.
Get an attribute value from an element. Returns attribute value or null if element/attribute not found. Useful for reading data-* attributes, aria-* attributes, href, src, etc.
Get the HTML content of the current page
Get the current URL of the active tab
Extract all UI messages currently visible on the page (toasts, banners, field errors, modals, console errors). Returns array of messages with type, text, severity, and selector. Useful for detecting form validation errors or success messages after actions.
Get a property value from an element without script injection. Uses CDP APIs for safe property access. Property name must be a valid DOM property (e.g., value, checked, disabled, href, src, className, innerHTML, textContent, offsetWidth, offsetHeight, scrollTop, scrollLeft, etc.). Returns property value or null if element/property not found.
Get the title of the current page
Get the visible text content of the current page
Go back in browser history
Go forward in browser history
Hover over an element using its selector. Dispatches mouseMoved event to trigger hover state. Essential for React SPAs where hover activates synthetic event handlers.
List all open tabs with their titles and URLs
Navigate to a specific URL in Chrome
Open a new tab in Chrome, optionally with a URL
Reload the current page
Remove an attribute from an element. Returns success message.
Take a screenshot of the current page with automatic resizing to fit API limits (returns base64 encoded PNG with metadata)
Scroll the page or a specific element. Supports direction (up/down/top/bottom), distance (pixels), element targeting (selector), and behavior (instant/smooth). Returns scroll position, boundary detection (atTop/atBottom), and dimensions. Useful for infinite scroll detection and pagination.
Set an attribute value on an element. Useful for modifying data-* attributes, aria-* attributes, href, src, etc. Returns success message with new value.
Set a property value on an element without script injection. Uses CDP APIs for safe property modification. Property name must be a valid DOM property (e.g., value, checked, disabled, className, innerHTML, textContent, etc.). Returns success message with new value.
Type text into an input field using a CSS selector
Type text into an input field by its associated label (semantic alternative to chrome_type). Searches for input by: label "for" attribute, parent label, aria-label, placeholder (in order). Returns actionable error with suggestions if input not found or multiple matches. Prefer this over chrome_execute_script for form filling.
Wait for UI state changes after actions. Returns success status, which conditions were met, actual state, and time elapsed. On timeout, returns current state (not error) so agent can decide next action. Can chain multiple conditions.
Wait for a specific UI message to appear (toast, banner, error, modal). Useful after form submission or actions that trigger feedback. Returns found message or null if timeout.
Parameter constraints incomplete. chrome_wait_for.timeout accepts 'number' but lacks min/max bounds (spec says max 30000ms). chrome_scroll.distance lacks min constraint. LLMs may pass invalid values.
No idempotency guarantees documented. Tools like chrome_click, chrome_type, chrome_navigate modify state but do not declare idempotency. Agents retrying on ambiguous failures risk duplicate side effects.