Android device automation MCP server. Reads the live accessibility tree in-process, acts on nodes instead of coordinates, verifies every action, and enters Unicode text — over adb, or ~10x faster through an on-device agent.
Strong tool naming (all verb_noun pattern), comprehensive parameter descriptions, and clear input schemas across 26 tools. Tool descriptions are well-written (avg ~120 chars) and explain WHAT/WHEN/WHY. However, output schemas are not documented, LLMs cannot predict response structure for downstream chaining. Error handling is present but generic (ActionableError) without recovery guidance. Device parameter is optional with smart defaults, reducing friction. Missing: pagination guidance for list operations, explicit idempotency declarations, and per-tool risk annotations in descriptions.
Check the status of the on-device agent and device capabilities.
Assert that an element exists in the accessibility tree.
Assert that an element does not exist in the accessibility tree.
Assert that an element is not visible on the screen.
Assert that an element is visible on the screen. Fails if the element is not found or not visible.
Clear app data and cache for a package.
Click an element on the screen by its selector. The element must be visible and enabled.
Describe the current screen: the foreground app, window stack, and accessibility tree. Returns a compact text summary and structured element list.
Output schemas not documented. LLMs cannot predict response structure (e.g., what fields does mobile_describe_screen return? Is it text, JSON, or both?). This breaks downstream tool chaining and forces agents to guess field names.
Error handling lacks recovery guidance. ActionableError is thrown but descriptions do not explain what the LLM should do next (e.g., 'No device connected' should suggest 'Boot a device, then retry' or 'Call mobile_list_available_devices to check status').
Destructive operations (mobile_clear_app_data) lack confirmation or dry-run support. Agents can irreversibly delete app data without a safety gate. No idempotency declaration in descriptions.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2025-06-18+ | v2 |
Double-tap an element or location on the screen.
Perform a multi-point gesture (swipe, drag, etc.) on the screen.
Get system information from the device (build properties, memory, etc.).
Launch an app by package name.
List connected Android devices and emulators. This fork is Android-only. Rarely needed: every other tool resolves the device automatically when exactly one is connected.
Long-click an element on the screen by its selector.
Perform a pinch gesture (zoom in or out) on the screen.
Press a hardware key on the device.
Take a screenshot of the current screen. Returns a base64-encoded image.
Scroll an element into view or scroll within a scrollable container.
Set the text of an editable element. Supports Unicode text entry.
Resize the device window to test different screen sizes and orientations.
Start recording the device screen to a video file.
Stop an app by package name.
Stop the current screen recording.
Wait for the device to become idle (no animations or pending operations).
Wait for a specific app package to become the foreground app.
Wait for the screen to stabilize (no layout changes).
Tool descriptions do not declare idempotency. Agents retrying on ambiguous failures risk duplicate side effects (e.g., mobile_click called twice = two clicks). Descriptions should state 'Idempotent: safe to retry' or 'Non-idempotent: may cause duplicate actions'.
Selector parameter format is under-specified. Descriptions say 'e.g., text:"Button" or id:com.example:button_id' but do not formally define the selector grammar, allowed prefixes, or escaping rules. LLMs may generate invalid selectors.