Android client library for OmniDebugLink remote debugging platform. Provides WebSocket-based task execution for UI inspection, input simulation, performance monitoring, and device state inspection.
Strong tool set with comprehensive Android debugging capabilities. All 20 tools have descriptions (avg 156 chars) and input schemas with typed parameters. Naming is verb-forward and action-clear (screenshot, tap_screen, ui_traverse). However, parameter descriptions are sparse or missing entirely, most params lack explanatory text beyond the name. Output schemas are not documented. Error handling guidance is absent. No tool annotations (readOnlyHint/destructiveHint). Composition is sound: tools chain well (ui_traverse → find_objects → ui_click). Security posture is reasonable for a local debugging library (no secrets exposed as params). Baseline: 549 production tools average 194-char descriptions and 72-char param annotations; this server averages ~156-char tool descriptions but ~20-char param annotations (many params have no description at all).
Returns the payload unchanged. Useful for smoke-testing the relay loop.
Searches the current UI tree by substring match (case-insensitive) on any of text/id/desc/testTag/cls, returning matching nodes' path + summary. Cheaper than ui_traverse for locating one control.
Performance snapshot: Java/native heap, PSS, battery, thread count, and optionally an fps sample (frames: number of Choreographer frames to sample, default 60, skipped when 0).
Snapshot of app state: foreground Activity, activity history, current Intent, declared permissions, granted permissions, SharedPreferences (all files, all keys).
Basic runtime stats: lib/app version, device info, uptime, task count, connection state.
Launches an Intent by action/category/data/extras (same as adb shell am start). Returns success=true/false plus error details if applicable.
Parameter descriptions are sparse or missing. Most params (e.g., 'scale', 'quality', 'frames', 'x', 'y', 'durationMs') lack explanatory text. LLMs cannot infer parameter meaning from names alone, a 'scale' param could mean resolution, font size, or coordinate scaling.
Output schemas are not documented. Tools return structured data (e.g., screenshot returns 'image envelope plus dimensions', read_logs returns filtered lines, ui_traverse returns nested JSON), but the response schema is not formally specified. LLMs cannot plan downstream calls without knowing what fields to expect.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Presses and holds at normalized 0..1 coordinates (origin top-left) for durationMs (default 800) then releases; triggers long-click without firing a plain click.
Round-trip liveness probe; returns pong=true with the local uptime.
Reads the app's own logcat buffer (all historical lines the buffer still holds, unlike a subscription model). Filters: level (V|D|I|W|E, minimum severity), contains (substring), limit (default 200, most recent), sinceMs (epoch millis cutoff).
Reads a single SharedPreferences file by name, returning all key-value pairs. Returns empty object if the file does not exist.
Captures the current Activity's window as JPEG (rendered from the view tree) and returns it as an image envelope plus dimensions. scale caps the longest edge in pixels (default 1080); quality is JPEG quality 1-100 (default 70). Screenshots of other apps are not possible.
Sends a key event to the app: back|home|recents|menu|volume_up|volume_down|dpad_up|dpad_down|dpad_left|dpad_right|dpad_center|enter|del|tab. back works via activity dispatch; home/recents need system-level injection and may be rejected by the OS.
Sets the text of a TextView-like control by path or by text/id/desc/testTag search. Clears the field first, then types the new text character-by-character (respects input filters, IME, etc.). Returns the final text value.
Swipes from (from) to (to) over durationMs (default 400), normalized 0..1 coordinates, origin top-left. Keep both endpoints near the CENTER of the target control, not its edges. Intermediate move events are dispatched every ~16ms so scroll/fling inertia works.
Taps at normalized screen coordinates (x,y in 0..1, origin TOP-LEFT of the window). Events are dispatched through the real touch pipeline on the decorView.
Clicks a control, delivered physically: a full touch sequence at the view's center, dispatched on its own window root — overlays (guide masks, intercept layers) receive the click exactly like a real tap. Locate either by path, or directly by text/id/desc/testTag (+index) with the same matching as find_objects — locating and clicking happen atomically in one snapshot. Falls back to performClick() when the view has no usable size; Compose nodes go through the accessibility action channel.
Dumps the current Activity's UI tree as nested JSON: classic Views plus Compose semantics nodes (kind=view|compose). Each node carries path (for other tasks), class, text, id, bounds, visibility, clickability. Caps at maxNodes with truncated=true.
Inspects a single node by path (from ui_traverse/find_objects): full props plus children paths. For View nodes also includes reflection-scanned readable fields (text-related getters).
Polls every 200ms until a node matching text/id/desc/testTag appears (or timeoutMs elapses), returning found=true/false plus the matched path(s) — timeouts are a result, not an error.
Writes key-value pairs to a SharedPreferences file (creates if missing). Supports string, int, long, float, boolean, and null (delete key). Returns the updated file contents.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). The Risk field in the spec indicates READ_ONLY vs WRITE, but these are not exposed as tool annotations in the MCP protocol. LLMs cannot distinguish safe tools from destructive ones without explicit hints.
No error handling guidance. Tools do not document what errors can occur, how to recover, or what the LLM should do next. E.g., 'launch_intent' returns 'success=true/false plus error details' but does not specify what error details look like or how to retry.
Transport unknown. Repository does not show MCP server registration, transport binding, or protocol implementation. Cannot verify if this is HTTP, SSE, STDIO, or a custom transport. Without transport clarity, protocol readiness cannot be assessed.