An embedded, agent-controllable browser inside your editor — co-driven by you (webview) and your AI agent (MCP).
Cobrowser demonstrates solid tool design with 14 well-named, action-verb tools covering browser automation. All tools have descriptions (avg 156 chars, within 10-1024 baseline). Input schemas are present and typed for all tools. However, output schemas are not documented, LLMs cannot predict return structures. Parameter descriptions are present but inconsistent in depth. Error handling guidance is minimal. Tool composition is strong (each does one thing), but missing pagination/limits for list_pages and get_activity, and no confirmation pattern for destructive close_page.
Click an element by uid (from take_snapshot) OR a CSS selector. Uses a TRUSTED CDP input click that frameworks (React etc.) accept as real input — unlike element.click() from evaluate_script, which fires untrusted events sites may ignore.
Close a browser tab by pageId. Refuses to close the last remaining tab.
Escape hatch: evaluate a JS function expression in the active page, e.g. "() => document.title". `args` are plain JSON passed to the function. NOTE: synthetic .click()/dispatchEvent from here is NOT trusted input (React etc. may ignore it) — use click/fill by uid (from take_snapshot) for real interactions.
Set the value of an input/textarea by uid (from take_snapshot) OR a CSS selector, using trusted keystrokes.
Fill multiple fields (by uid or selector) in one call (preferred over repeated fill).
Output schemas not documented. LLMs cannot predict return structures for any tool (list_pages returns what fields? navigate_page returns {url, title} but what type/format?). Breaks downstream tool chaining and forces LLMs to guess.
close_page lacks confirmation/dry-run pattern. Irreversible operation (closes tab) with no recovery guidance. Description does not warn of consequences or suggest undo steps.
list_pages and get_activity lack pagination/limit parameters. No documented result caps. Large result sets could exhaust context window. Baseline pattern requires page/offset + limit + total_count.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Recent browser activity — page navigations and tab open/close/activate — each tagged source "agent" or "human". Call it to catch up on anything the human did MANUALLY since your last action, so you act on the current state instead of a stale view. Pass `since` (a seq from a prior call) to get only newer events.
List open browser pages/tabs.
Navigate the active page. Returns the SETTLED {url,title} after load (not the requested url), so redirects/failures are detectable.
Open a new tab, optionally navigating to a URL. Becomes active unless background.
Make a page active (also becomes the screencast target).
Screenshot the active page (or a single element by uid). Returns an image.
Return an interactive-element text tree of the active page. Each node has a [uid] used by click/fill. uids expire on any DOM change — re-snapshot before reusing them.
Type text into the currently-focused element; optionally press Enter.
Block until all given strings appear in the page text.
Error handling guidance missing. Tools do not document what errors are retryable, user-fixable, or fatal. No recovery hints (e.g., 'navigate_page timeout, try again or check URL').
evaluate_script description warns about untrusted events but does not explain when to use it vs. click/fill. LLMs may misuse it for interactions that should go through trusted CDP paths.