A fast, AI-first web browser exposed through the Model Context Protocol.
haden-browser demonstrates solid tool design with clear naming, comprehensive schemas, and good descriptions. All 5 tools follow verb_noun patterns (haden_open, haden_read, haden_interact, haden_image, haden_status). Input schemas are well-defined with Zod validation, enums for modes, and regex patterns for refs. Descriptions are substantive (100-200 chars) and explain WHEN to use each tool. Tool annotations (readOnlyHint, destructiveHint, openWorldHint) are present. However, output schemas are not formally documented, responses are formatted as text strings rather than structured objects, forcing LLMs to parse unstructured snapshots. Error handling returns plain text errors without recovery guidance or categorization. Parameter descriptions could be more explicit about constraints (e.g., maxChars range is in schema but not restated in description text for LLM clarity).
Return the actual pixels for one img ref from the latest snapshot. Use only after alt text/placeholders are insufficient for the goal.
Perform one browser action and immediately return the updated snapshot, avoiding an extra read call. click/fill/select need a current e ref; press can target a ref or the page.
Open an HTTP(S) URL and return an AI-optimized snapshot. text is fastest; dom returns sanitized HTML; visual adds computed layout/CSS.
Read the current page again, optionally limited to a CSS selector. Returns stable e refs for actions and img refs for optional image retrieval.
Report whether the browser is running and which page is active.
Output schemas not formally documented. Tools return formatted text strings (formatSnapshot) rather than structured JSON objects. LLMs must parse unstructured text to extract snapshot fields (title, url, mode, interactiveCount, imageCount, truncated, content), increasing token waste and reasoning errors.
Error handling returns plain text error messages without recovery guidance or error categorization. Errors like 'Invalid URL' or 'Element not found' do not tell the LLM whether to retry, ask the user, or try a different tool.
Parameter descriptions in code do not restate schema constraints. maxChars has min/max in Zod schema (1000 - 100000) but description text does not mention the range, forcing LLMs to infer from schema alone rather than reading natural language.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
haden_status returns raw JSON (session.status()) without documented structure. LLMs do not know what fields to expect (e.g., is_running, current_url, page_title?) and cannot plan downstream calls reliably.
No confirmation or dry-run pattern for destructive operations. haden_interact with action='reload' or 'back' modifies browser state irreversibly. Agents cannot preview consequences before committing.