MCP server for Dia Browser — control tabs, automate pages, and interact with Dia's built-in AI via Chrome DevTools Protocol
mcp-dia demonstrates solid tool definition fundamentals with 24 well-named, action-verb-prefixed tools and consistent schema structure via Zod. All tools have descriptions (avg ~100 chars) and typed input schemas. However, output schemas are undocumented, LLMs cannot predict return structures for chaining. Error handling is minimal; no recovery guidance or actionable error messages visible. Parameter descriptions are present but often terse (e.g., 'Optional tab ID; defaults to active tab' repeated 15+ times). Missing: per-parameter constraints (min/max for numeric fields), idempotency guidance for destructive ops, and security-focused descriptions for sensitive tools (evaluate_js, set_cookie, intercept_network). Tool composition is sound, each tool has one responsibility, but some could benefit from batch variants (e.g., click_element on multiple selectors).
Click an element by CSS selector (default) or XPath. The clicked element's action is arbitrary and may be irreversible.
Close a tab by its ID.
Retrieve conversation history from Dia's AI chat.
Extract metadata and context from the current or specified tab.
List available Dia Skills.
Query Dia's Search memory for personal browsing context.
Send a message to Dia's built-in AI chat. Optionally wait for response.
Output schemas undocumented. LLMs cannot predict return structures for tool chaining. E.g., list_tabs returns tab objects, but field names (id, url, title) are inferred, not declared. This breaks downstream tool composition and forces agents to guess field names.
No error handling guidance. Tools like evaluate_js, click_element, and intercept_network can fail silently or with generic errors. No recovery hints (e.g., 'If selector not found, try wait_for_selector first'). Agents cannot self-correct.
Security descriptions missing for sensitive tools. evaluate_js warns 'runs arbitrary code' but no guidance on sandboxing, scope, or what globals are available. set_cookie and get_cookies (revealValues) lack warnings about HttpOnly/Secure flags and credential exposure risks.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2025-06-18+ | v2 |
Trigger a Dia Skill on the current page. The triggered skill's effects are arbitrary and may be irreversible.
Execute JavaScript in the page context. Returns JSON-serializable values only. WARNING: runs arbitrary code.
Fill a form field (input, textarea, contenteditable). Use clearBefore to empty first.
Generate a PDF of the page.
Get cookies, optionally filtered by URL. HttpOnly cookie values are redacted unless revealValues is set.
Extract page content as text, HTML, or markdown. Truncated at maxLength (default 100k).
Go to the previous page in browser history.
Go to the next page in browser history.
Log or block network requests matching a URL pattern for a bounded duration.
List all open tabs in Dia (id, url, title).
Navigate to an http(s) URL in the given tab (or active tab).
Open a new tab with the given http(s) URL.
Reload the current or specified tab.
Take a screenshot of the viewport, a specific element, or the full page.
Set a cookie.
Activate (focus) a tab by its ID.
Wait for an element to appear in the DOM.
Repetitive parameter descriptions. 'Optional tab ID; defaults to active tab' appears 15+ times verbatim. This wastes tokens and suggests copy-paste rather than thoughtful design. Consolidate into a single canonical description or use a shared parameter definition.
No pagination or result limits documented. get_page_content defaults to 100k chars but no guidance on truncation behavior. dia_get_chat_history defaults to 20 messages but no total count or next_cursor returned. Large results risk context window exhaustion.