Open-source browser automation powered by any LLM. Delegates browsing tasks to a sub-agent running in the user's real Chrome browser with full authentication and session state.
Hanzi Browse is a STDIO-only MCP server with 25 tools spanning browser automation, form interaction, and monitoring. Critical issues: (1) Tool definitions are inferred from file paths and descriptions rather than explicitly visible in source code, no actual tool registration code shown. (2) Input schemas are not visible in the provided source; only descriptions and parameter names are documented. (3) Many tools lack proper parameter type definitions and constraints. (4) Descriptions vary widely in quality, some are excellent (browser_start: 300+ chars with clear context), others are vague (turn_answer_start: empty input, unclear purpose). (5) No output schemas documented. (6) Error handling guidance is absent. (7) Security concerns: browser_start accepts 'context' parameter that could contain credentials; no indication of secret injection or sanitization. (8) Composition issues: multiple tools (form_input appears twice with different signatures), overlapping responsibilities (computer vs navigate), and unclear tool chains.
Course-correct or extend a browsing sub-agent started by browser_start. Blocks until the sub-agent acts on the message. Use this to steer the sub-agent in natural language instead of starting a new session: Refine: "actually change the quantity to 3", "only the ones from Engineering roles"; Continue: "now click Download", "go to the next page and do the same thing"; Retry after error: "try again using the second address"; Answer a question the sub-agent asks: "yes, proceed with the 2026 plan". The browser window and session state are preserved — the sub-agent resumes exactly where it left off, not from scratch.
Capture a screenshot of the current page in the user's Chrome. Returns a PNG image. Call this when browser_start returns "error" or "timeout" — see what the sub-agent was looking at before deciding whether to retry, course-correct, or give up.
Delegates a browsing task to a sub-agent running in the USER'S REAL Chrome — the browser they have open right now, already signed into everything (Gmail, LinkedIn, GitHub, their bank, admin panels, internal tools, paid subscriptions, localhost, staging). Not a headless Chromium, not a sandboxed test profile, not a fresh instance — the user's literal browser, with every cookie, session, 2FA trust, and saved state already in place. THIS IS NOT a low-level click/type primitive. It's a full browsing agent you delegate to. You give it a task in natural language ("find my 5 most recent LinkedIn DMs and summarize them", "post this reply on the tweet at /status/123", "test whether signup works on localhost:3000 with my real Google account"), and the sub-agent figures out the steps, interacts with the pages, handles async state, takes screenshots, and returns the answer.
Tool definitions inferred from descriptions rather than explicitly visible in source code. No actual tool registration code (e.g., server.tool() calls) shown. Per HARD SCORING RULE, tools without visible definitions capped at 50.
Input schemas not visible in provided source. Only parameter names and descriptions documented; no JSON Schema type definitions, constraints, or enums shown. Per HARD SCORING RULE, schema score must be 0 if not visible.
Duplicate tool: form_input appears twice (tools #8 and #19) with different signatures (one uses 'ref', other uses 'tabId'). Violates single-responsibility principle and confuses LLM tool selection.
Security: browser_start accepts 'context' parameter as free-form string. No indication of sanitization, secret injection, or protection against credential leakage. Credentials in parameters enter logs and traces.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
Monitor a running browsing sub-agent. Returns session ID, status, task description, and the last 5 steps the sub-agent took. Useful for: watching progress on long-running tasks, deciding whether to course-correct with browser_message, or confirming which window to stop.
Stop a browsing sub-agent. The sub-agent halts but the browser window stays open so the user can review the final page state. Without "remove", the session can still be resumed with browser_message. With "remove: true", the browser window closes and the session history is permanently deleted.
Use a mouse and keyboard to interact with a web browser, and take screenshots. Click elements using their ref from read_page or find tools. Take screenshots to see the current page state. Scroll to see more content.
Report a blocker to the planning system for guidance when the browser agent is stuck.
Upload files to file input elements using Chrome DevTools Protocol DOM.setFileInputFiles.
Find elements on the page using natural language. Can search by purpose (e.g., "search bar", "login button") or text content. Returns up to 20 matching elements with references.
Fill form fields with values using Chrome DevTools Protocol.
Set values in ANY form element — text inputs, textareas, dropdowns, checkboxes, radio buttons, date pickers. For dropdowns, just pass the desired option text. ALWAYS prefer form_input over computer clicks for form fields.
Retrieve information from Mem0 semantic memory based on context provided when the task was started via browser_start(context=...).
Extract raw text content from the page, prioritizing article content. Ideal for reading text-heavy pages.
Execute JavaScript in the page context. Returns the result of the last expression. Do NOT use 'return' — just write the expression.
Navigate to a URL, or go forward/back in browser history.
Read browser console messages with optional filtering by pattern or error type.
Read network requests with optional filtering by URL pattern.
Get a rich DOM tree of the page via Chrome DevTools Protocol. Returns interactive elements with numeric backendNodeId references (e.g., [42]<button>Submit</button>). IMPORTANT: Only use element IDs from the CURRENT output — IDs change between calls. Pierces shadow DOM and iframes automatically.
Resize browser window to specified dimensions.
Solve CAPTCHA challenges on the /dropout page using image recognition and API submission.
Close a tab and clean up tracking.
List all tabs managed by the agent, including tabs in the agent session group, agent-opened tabs, and popup windows.
Create a new tab and add it to agent group.
Signal readiness to respond to user.
Submit plan for user approval before proceeding with browser actions.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields. E.g., browser_start returns 'session_id' but no schema shows field types or structure.