Public Browser is a mature, feature-rich browser automation MCP server with 17 well-defined tools. Most tools have clear names (verb-noun pattern), descriptions (50-150 chars typical), and explicit JSON Schema with typed parameters. However, several tools lack granular parameter descriptions, some output schemas are not explicitly documented in the tool definitions, and error handling guidance is minimal. The server demonstrates solid foundational quality but falls short of A-grade due to incomplete schema documentation and sparse parameter-level guidance.
Tools (17)
capture_imageread only50/100
Capture a screenshot. Use only for CSS layout checks, canvas content, or when user explicitly asks for a screenshot.
clickwritesource verified80/100
Click on an element identified by ref or selector. Returns DOM diff (NEW/REMOVED/CHANGED lines).
dom_snapshotread only50/100
Capture the raw DOM tree as JSON. For debugging, DOM inspection, or feeding to custom JS analysis.
download_filewrite50/100
Download a file from a URL or triggered via click. Returns file path and SHA-256 hash if enabled.
evaluatewritesource verified80/100
Execute JavaScript in the page context. For DOM queries, style mutations, computed values. NOT for CSS reading, element discovery, scrolling, dialogs, or network capture.
fill_formwritesource verified78/100
Fill multiple form fields at once and submit. Returns DOM diff for AJAX updates and validation messages.
handle_dialogwrite50/100
Accept or dismiss browser dialogs (alert, confirm, prompt).
STDIO-only transport severely limits production utility. The server cannot be used with hosted MCP clients, cloud-based LLM platforms, or remote agent environments. This is a hard architectural constraint, not a minor gap.
Output schemas are not explicitly documented in tool definitions. Tools like `view_page`, `dom_snapshot`, `network_monitor`, and `virtual_desk` describe their return format in prose (e.g., 'Returns [tab0, tab1, ...]') but lack formal JSON Schema for outputType. LLMs cannot reliably parse unstructured output descriptions.
Parameter descriptions are present but often lack critical constraints. For example, `press_key` accepts 'key' parameter with description 'Key name (e.g., Enter, Escape, Tab, ArrowDown)' but does not specify valid enum values or what happens if an invalid key name is passed. `scroll` has 'deltaX' and 'deltaY' with no specified ranges or units.
Recommendations
Add explicit JSON Schema definitions for tool outputs. Document the structure (fields, types, cardinality) returned by `view_page`, `dom_snapshot`, `network_monitor`, `virtual_desk`, `capture_image`, and `run_plan`. This allows LLMs to reliably extract nested data without parsing prose.
For `press_key`, enumerate valid key names as an enum in the schema. Alternatively, state in the description: 'Valid keys: Enter, Escape, Tab, ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Backspace, Delete, Home, End, PageUp, PageDown, Insert, [A-Z0-9], F1-F12. Modifiers: Control, Shift, Alt, Meta.'
For `scroll`, add numeric bounds and units. E.g., 'deltaX: horizontal pixels to scroll (negative = left, positive = right; typical range -1000 to +1000)' and similarly for deltaY.
For tools with `ref` and `selector` parameters (click, type, scroll, etc.), add a single clear description: 'Either pass ref (element reference from view_page, e.g., "e5") for fast lookup, OR selector (CSS selector fallback if ref is stale). If both provided, ref is tried first; fallback to selector on lookup failure.'
Add recovery guidance to `navigate`, `click`, `type`, `download_file`, `upload_file`. E.g., for `navigate`: 'If the URL is unreachable, handle_dialog() may appear to handle HTTPS warnings; or the page may timeout, retry with a shorter wait. Use view_page() to confirm the new URL loaded.'
For `evaluate`, clarify delegation: 'For CSS queries, use capture_image() and describe visually. For DOM inspection, use dom_snapshot(). For scrolling, use scroll(). For dialog interaction, use handle_dialog(). This tool is for custom business logic (e.g., extracting deeply nested data, computing properties) that generic tools cannot express.'
Score history
Overall score trend
First recorded score · v2 rubric
52/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
D
52
2026-07-28+
v2
navigate
writesource verified78/100
Navigate to a URL. Resets the accessibility tree cache.
network_monitorread only50/100
Monitor and intercept network requests/responses. Capture API calls, headers, payloads for debugging.
press_keywritesource verified78/100
Press a keyboard key (Enter, Escape, Tab, ArrowDown, etc.).
run_planwrite50/100
Execute N steps in one call: [click → type → view_page] batched as a single MCP invocation. Avoids context bloat and reduces total round-trips.
scrollwritesource verified77/100
Scroll the page by pixels or to an element.
switch_tabwrite50/100
Switch to a different browser tab by index or URL pattern.
typewritesource verified77/100
Type text into a focused input element. Returns DOM diff showing filters/validation results.
upload_filewrite50/100
Upload a file to a file input element via ref or selector.
view_pageread onlysource verified75/100
Read the current page as an accessibility tree. Returns text content with element refs for click/type targets.
virtual_deskread only50/100
List open tabs and their URLs. Returns [tab0, tab1, ...] with current tab highlighted.
Error handling and recovery guidance is sparse. Tools describe what they do but not what errors are retryable, what user action is needed if they fail, or what the agent should do next. E.g., `navigate` does not explain what happens if the URL is invalid or unreachable.
Tool `virtual_desk` name is non-standard. The pattern 'verb_noun' suggests `list_tabs` would be clearer. 'virtual_desk' is a domain-specific metaphor that does not follow agentic tool naming conventions and may confuse LLMs selecting from many tools.
Parameters `ref` and `selector` appear in multiple tools (click, type, scroll, handle_dialog, switch_tab, download_file, upload_file) with similar but inconsistent descriptions. The relationship between them (fallback order, when to use which) is not clearly documented.
`evaluate` tool description warns against use cases ('NOT for CSS reading, element discovery, scrolling, dialogs, or network capture') but does not explain WHY or what dedicated tools should be used instead. This requires the LLM to guess or experiment.
Tool `fill_form` accepts a complex nested array of field objects but does not specify field ordering, what happens if a field is not found, or whether submission is retried on validation errors. This introduces ambiguity for agent planning.
fill_form
For `fill_form`, specify: 'Fields are filled in order. If a field is not found via ref or selector, the tool skips it and continues (returns a per-field status map). If validation fails after submit, the page remains in the failed state; call view_page() to see error messages.'
Rename `virtual_desk` to `list_tabs` to match agentic tool naming conventions. Update description to: 'List all open browser tabs with their current URLs and titles. Returns an array of tab objects with index, url, and title. The current active tab is marked.'
Add explicit parameter type constraints where missing. For `view_page` format parameter, specify enum: ['text', 'tree', 'compact']. For `capture_image` format parameter, specify enum: ['png', 'jpeg'].
Document mutually exclusive parameter relationships. E.g., for `click`: 'Either pass ref (element reference) or selector (CSS selector fallback). If ref stale, automatically try selector. If both fail, raise error suggesting view_page() to re-discover the element.'
Add error classification guidance. For tools that modify state (click, type, navigate, download_file, upload_file), clarify: 'Errors are retryable unless explicitly marked as user-fixable (e.g., validation failure). Check the error message for guidance. If unsure, call view_page() to inspect the current state.'
For `handle_dialog`, clarify timing: 'Call this after an action that triggers a dialog (alert, confirm, prompt). If the dialog has already closed, this is a no-op. If no dialog is present, an error is returned.'
For `switch_tab`, clarify behavior: 'index: 0-based tab index. urlPattern: regex or substring match. If multiple tabs match, switch to the first match. If no tabs match the pattern, error suggests available tabs.'
For `run_plan`, add: 'Each step is executed sequentially. If a step fails, the plan stops and returns partial results with a stop_reason. Use per-step error messages to decide whether to retry, skip, or abort the plan.'
Add to `network_monitor`: 'start: begin recording network requests. stop: end recording. get_requests: return filtered requests with method, URL, status, headers, and response body (truncated if >10KB). Useful for debugging API interactions or confirming data was sent.'
For `dom_snapshot`, clarify use cases: 'Returns raw DOM tree as JSON. pierce=true traverses Shadow DOM (custom elements). Use this for debugging, feeding to custom JavaScript analysis, or exporting the page structure. For most interactive tasks, use view_page() instead (more efficient).'
Ensure all parameters include explicit type in schema. Verify number parameters have minimum/maximum constraints (e.g., clickCount >= 1, delay >= 0, limit 1 - 1000). Verify string parameters have minLength/maxLength or pattern constraints where applicable.