Native macOS Safari/WebKit agentic browser CLI and daemon
Agent-Safari provides 39 tools with basic descriptions and parameter schemas, but falls short of production quality. Most tool descriptions are terse (10-40 chars), lacking context on WHEN to use each tool or what happens on failure. Parameter descriptions exist but are minimal. No documented output schemas, error handling guidance, or recovery paths. Tools like 'waitForMedia', 'mediaControl', 'screenshot', 'screenshotElement' have overlapping responsibilities without clear composition guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Parameter naming is inconsistent: 'tab' is optional everywhere but never explained; 'selector' vs 'url' vs 'path' lack type suffixes. Critical tools like 'navigate' and 'click' lack error recovery hints. The smoke test (scripts/smoke_mcp_wrapper.py) validates tool existence but not LLM usability.
Navigate back in browser history
Click an element on the page
List captured console messages
Start capturing console messages
Stop capturing console messages
Export all cookies to a JSON file
Import cookies from a JSON file
List all downloads
Evaluate JavaScript code in the page context
Descriptions are uniformly terse (10-40 chars). LLMs cannot determine WHEN to use each tool or what happens on failure. E.g., 'Get the text content of the page' lacks context on when to prefer text vs html vs snapshot.
No documented output schemas. Tools return data but LLMs cannot plan downstream calls or extract fields. E.g., 'snapshot' returns DOM elements but structure is undocumented; 'networkList' returns events but field names are unknown.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes. E.g., 'navigate', 'click', 'fill', 'reload' modify state but lack destructiveHint; 'text', 'html', 'url' are read-only but lack readOnlyHint.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | 2026-07-28+ | v2 |
Fill an input field with text
Navigate forward in browser history
Get the HTML content of the page
Press a keyboard key
Get information about media elements on the page
Control media playback (play, pause, seek, etc.)
Navigate to a URL
List captured network requests
Start capturing network requests
Stop capturing network requests
Reload the current page
Take a screenshot of the visible viewport
Take a screenshot of a specific element
Take a full-page screenshot
Get a snapshot of the page DOM elements
Get the text content of the page
Get the page title
Type text into the focused element
Upload files to a file input element
Get the current URL
Set the viewport size
Wait for a specified duration
Wait for a download to complete
Wait for the page to become idle (no pending network requests)
Wait for a media element to reach a specific state
Wait for an element matching a selector to appear
Wait for text to appear on the page
Wait for the page title to match a pattern
Wait for the URL to match a pattern
Wait for an element to become visible
Parameter 'tab' is optional everywhere but never explained. LLMs do not know when to pass it, what format it expects, or how to obtain a tab ID. No guidance on multi-tab workflows.
No error handling guidance. Tools like 'navigate', 'click', 'waitForSelector' can fail but descriptions do not explain recovery paths. E.g., 'navigate' does not say what happens if the URL is invalid or unreachable.