Model Context Protocol server exposing the browser to coding agents
Dive Browser MCP has 22 well-named, action-verb tools with consistent descriptions (avg 120 chars). All tools have input schemas with typed parameters and descriptions. Strengths: clear verb_noun naming (page_click, page_type, tabs_list), good parameter descriptions explaining when to use optional tab_id, and comprehensive coverage of browser automation patterns. Weaknesses: output schemas are not documented in the source (cannot verify what fields are returned); error handling guidance is absent (no recovery hints); no tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications; some parameter descriptions could be more prescriptive about constraints (e.g., page_paper enum values not listed in description).
Close a context you opened, and every tab in it.
Make a fresh isolated context and return its id, for work that must not share a session -- a second user, a signed-out view, two flows at once. Pass its id to tab_open; close it with context_close when done.
The isolated contexts open right now, each with its id, name, tab count and whether it has cookies of its own. A context is a separate browsing session: two can be signed in as different people at once.
The files downloaded so far, newest first, each with the path it landed at. Give wait_ms straight after clicking something that saves a file and it waits for the download to finish first.
Click one element.
Drag one element onto another with the pointer held down: reorder a list, move a card, set a slider. Drives pointer events, which is what drag libraries listen for.
Output schemas not documented. Cannot verify what fields tools return, breaking downstream tool chaining and LLM planning. page_inspect, page_text, page_markdown, page_state, page_screenshot, downloads, and others lack documented return types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications. LLMs cannot infer which tools are safe to retry or have side effects. page_click, page_type, context_close marked WRITE/DESTRUCTIVE but lack annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Check several things about the page at once; every check that does not hold is reported, not just the first. A check is one of: visible, hidden, text, no_text, value {locator, equals}, count {locator, equals|at_least|at_most}, url_includes, title_includes. Give timeout_ms to keep re-checking until they hold. A failure says what was actually there.
Fill several fields in one call: fields is a list of {locator, value}, filled in order. Handles text fields, dropdowns and checkboxes; for a checkbox pass "true" or "false". Prefer this over repeated page_type -- one round trip for the whole form.
Move the pointer over an element without clicking: hover menus, tooltips, :hover styles. Same locator, ref or x/y as page_click.
Everything about the page in one call: URL, title, loading state, visible text, every interactive element with the locator that addresses it, recent console warnings and errors, failed requests, and what you have already done to this tab. Start here.
The page as Markdown: headings, absolute link targets, lists, tables and form state. Costs about what page_text costs but keeps the structure, so prefer it when deciding where to click or navigate next.
Render the page to a PDF on disk and return the path. This is the print output rather than a screenshot -- text stays selectable and the page is laid out for paper -- so it is what an invoice, a report or a receipt should be captured with. Takes filename, landscape, paper (a3, a4, a5, letter, legal, tabloid), background and headers.
Press one key: Enter, Escape, Tab, ArrowDown, Backspace, or a single character. Modifiers are Meta, Control, Alt, Shift. Give a locator to focus an editable field first, or omit it to press against the focused element.
Screenshot of the viewport, or of the whole page with full_page. Use only when layout matters.
Scroll the page, or a container named by a locator. Positive delta_y scrolls down. Use this to reach content below the fold.
Choose an option in a <select> dropdown by value or visible label; clicking a native dropdown opens a menu that cannot be seen.
Accessibility tree as indented text. page_inspect is usually the better read; use this when you need the full tree.
Visible text of the page. Cheapest way to read it.
Type into one field. Replaces the current value unless clear is false; submit presses Enter.
Attach files to an <input type="file">, as the picker would. paths are absolute paths on this machine. A picker opened by a click cannot be driven, so go through the input.
Wait until every condition given holds: a locator matches, text appears, the URL contains a fragment, loading finishes. Call this after anything that starts work instead of guessing how long it takes.
List open tabs in the active workspace with ids, URLs and titles. Sleeping tabs are omitted.
No error handling guidance. Tools lack recovery hints (e.g., 'If element not found, try page_wait_for first'). Errors will not guide LLM to self-correct or retry appropriately.
Parameter constraints not fully specified in descriptions. page_pdf accepts 'paper' enum (a3, a4, a5, letter, legal, tabloid) but description does not list valid values. page_press 'key' parameter lacks enumeration of accepted keys.
Legacy 'ref' parameter present alongside 'locator' in page_click, page_type, page_press, page_hover, page_select. Dual parameters create ambiguity; descriptions say 'prefer locator' but LLMs may still use ref, causing confusion.