Web client SDK for remote debugging of web pages via AI — provides tools for UI traversal, element interaction, input simulation, screenshots, and device state inspection
18 tools with mostly complete schemas and descriptions, but significant gaps in parameter documentation and error handling guidance. Tool names follow verb_noun convention well (echo, ping, screenshot, swipe, input_text, ui_click, tap_screen). Descriptions range 50-250 chars, meeting baseline (194 avg). However, 8 tools lack parameter descriptions for key inputs (e.g., swipe lacks durationMs description detail; send_key lacks key enum documentation in description). No output schemas documented. Error handling is minimal, tools return success/failure but lack recovery guidance. Risk annotations present (READ_ONLY, WRITE) but not formalized as toolAnnotations in protocol.
Echoes back the provided text. Payload: { text: string } (default "pong").
Finds elements by tag/id/class/data-testid/text substring. Returns up to 50 matches with center coords.
Returns performance metrics: navigation timing, named performance marks, resource count.
Returns browser/device state: URL, viewport size, navigator info, performance timing.
Returns basic connection stats (lib version, platform, online status).
Types text into an input/textarea or contenteditable element. Sets native value via HTMLInputElement.prototype setter (bypasses React _valueTracker so onChange fires). Returns { inputted, length, value }.
No output schemas documented for any tool. LLMs cannot predict response structure, forcing them to guess at field names and types for downstream tool chaining.
Error handling lacks recovery guidance. Tools return success/failure but do not tell LLMs what to do on failure (retry, ask user, try alternative tool).
Risk annotations (READ_ONLY, WRITE) are informal labels, not formalized as MCP toolAnnotations (readOnlyHint, destructiveHint, idempotentHint). Protocol does not expose these to clients.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | <=2025-11-25 | v2 |
Long-presses at normalized coords (0-1, top-left) for holdMs (default 1000). Uses PointerEvents.
Pings the device, returns server timestamp. Used for latency checks.
Reads/writes localStorage items. Actions: get/set/delete/list. Supports valueType int/float/bool for set.
Returns captured console logs from the circular buffer (500 entries). Logs are only captured after SDK start (no history). Filter by level/contains/limit/sinceMs.
Captures a PNG screenshot via __odl_file envelope. Default: current viewport (matches find_objects/tap_screen coordinates). fullPage:true captures the whole document. Returns real image dimensions.
Sends a keyboard event (keydown/keypress/keyup) to the focused element; scroll keys also scroll the page.
Swipes from (x1,y1) to (x2,y2) over durationMs (0-1 normalized, top-left). PointerEvents + native compensation: scrolls nearest scrollable ancestor, drags range sliders by x position.
Taps at normalized screen coordinates (0-1, top-left). Resolves the element at that point and dispatches a click event.
Clicks an element by selector or text. Physical delivery via elementFromPoint (overlays receive click). Returns { executed, via, ... }.
Traverses the DOM tree (incl. shadow roots) from body or selector, returns flat list of nodes with path, tag, id, className, text, rect, attrs. Max 3000 nodes.
Returns detailed info about a single element: rect, computed styles, attributes.
Polls every 200ms until selector appears or text is found. Returns { found: true/false } within timeoutMs.
get_stats, get_state, get_perf lack detailed parameter descriptions. Schemas present but sparse documentation of what fields are returned.
No pagination support for tools returning lists (read_logs, ui_traverse, find_objects). Large result sets could exhaust context window.