A macOS application providing agent monitoring, approval workflows, and browser automation tools for Claude Code, Codex, and Grok agents
Calyx is a Swift-based browser automation MCP server with 25 well-named tools covering tab management, navigation, DOM interaction, and content extraction. All tools have clear verb_noun naming (browser_open, browser_click, etc.) and descriptions (avg ~80 chars). However, critical gaps undermine production readiness: (1) Input schemas are present but lack explicit type declarations and constraints, parameters are documented in descriptions but not formally constrained (no enums for direction/key values, no min/max for numeric params). (2) Output schemas are completely undocumented, no tool describes what it returns, forcing LLMs to guess. (3) Error handling is absent, no guidance on retryability, user-fixable vs fatal errors, or recovery paths. (4) No security annotations despite write-heavy operations (browser_eval executes arbitrary JS). (5) Transport is unknown (likely STDIO based on Swift/local architecture), capping protocol readiness. The tool set is coherent and well-composed (each does one thing, tab_id chains properly), but lacks the rigor expected of production agent tools.
Navigates the browser tab back in history
Checks a checkbox element matching the specified CSS selector
Clicks on an element matching the specified CSS selector
Evaluates arbitrary JavaScript code in the browser tab context
Fills an input field matching the specified CSS selector with text
Navigates the browser tab forward in history
Gets the value of an attribute on an element matching the specified CSS selector
Extracts HTML content from elements matching the specified CSS selector
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., what does browser_list return? tab IDs? URLs? titles?). This violates pattern:tool and forces agents to guess.
Input parameters lack formal constraints. 'direction' in browser_scroll accepts free-form strings instead of enum [up|down|left|right]. 'key' in browser_press has no enum. 'max_length' in browser_get_html has no min/max bounds. LLMs will hallucinate invalid values.
No error handling guidance. Tools do not document retryability, user-fixable errors, or recovery paths. If browser_click fails (element not found, not visible, etc.), the LLM has no guidance on what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | 2026-07-28+ | v2 |
Extracts all input fields from the current page
Extracts all links from the current page
Extracts text content from elements matching the specified CSS selector
Hovers over an element matching the specified CSS selector
Checks if an element matching the specified CSS selector is visible on the page
Lists all open browser tabs with their IDs, URLs, and titles
Navigates the specified browser tab to a new URL
Opens a new browser tab with the specified URL
Presses a keyboard key in the browser context
Reloads the current page in the specified browser tab
Takes a screenshot of the current page and saves it to a temporary file
Scrolls the page or an element in the browser tab
Selects an option in a select element matching the specified CSS selector
Takes a snapshot of the current page state in the browser tab
Types text into an input field matching the specified CSS selector
Unchecks a checkbox element matching the specified CSS selector
Waits for an element matching the specified CSS selector to appear or disappear
browser_eval executes arbitrary JavaScript with no security annotations or warnings. This is a destructive/high-risk operation that should be marked with destructiveHint and require explicit user confirmation or permission gates.
Transport mechanism is unknown (likely STDIO based on Swift architecture and local-only design). STDIO servers are not remotely accessible and cannot integrate with hosted MCP clients, capping protocol readiness at 50.