An MCP server for Android automation using UIAutomator2
The server provides 27 tools with complete naming, descriptions, and input schemas. Tool names follow verb_noun patterns (get_device_status, start_app, click, etc.) and are generally clear. Descriptions range from 100-300 characters and explain what tools do. Input schemas declare parameter types (string, number, boolean, integer) and provide parameter descriptions. However, output schemas are NOT documented, tools return unstructured or minimally-structured data (strings, booleans, dicts) without formal schema declarations. Error handling is minimal; tools catch exceptions but return generic error messages rather than actionable recovery guidance. The server omits several key quality patterns: no input validation constraints (enums for selector_type, key values), no per-tool risk/permission declarations beyond informal risk labels, and no documentation of which tools require what Android permissions. Composition is good, tools chain naturally (connect → get_info → interact) and accept optional device_id parameters. Naming is occasionally ambiguous (press_key accepts arbitrary strings vs. defined key names) and lacks enum constraints that would prevent hallucinated values.
Clear all data and cache for a specific app. This is equivalent to 'Clear Data' in Android app settings and will reset the app to its initial state.
Click on a UI element identified by text, resource ID, or content description. Supports multiple selector types for flexible element targeting.
Connect to an Android device using uiautomator2 and return comprehensive device information. If device_id is not provided, automatically connects to the first available device.
Drag a specific UI element to a target location on the screen. Useful for drag-and-drop operations, reordering items, or custom interactions.
Dump the complete UI hierarchy of the current screen as XML. Essential for understanding screen structure, finding elements, and debugging automation issues.
Get detailed information about the currently active/foreground application including package name, activity, and version information
Output schemas not documented. Tools return unstructured data (dicts, strings, booleans) without formal schema declarations. LLMs cannot predict return structure and must infer from examples or trial-and-error.
press_key parameter 'key' accepts arbitrary strings without constraint. Should declare enum: ['home', 'back', 'menu', 'volume_up', 'volume_down', 'power', 'enter', 'delete'] to prevent LLM hallucination of invalid keys.
click/long_click/wait_for_element selector_type parameter lacks enum constraint. Should be enum: ['text', 'resourceId', 'description'] instead of accepting free-form strings.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 64 | - | v1 |
Get comprehensive device information including serial number, screen resolution, Android version, SDK level, battery status, WiFi IP address, manufacturer, model, and current screen state
Get complete device status including connection, ADB availability, and basic device info. This is the recommended first step to ensure everything is working before performing other operations.
Get detailed information about a UI element including its properties, bounds, text, resource ID, class name, and interaction capabilities.
Get a complete list of all installed applications on your Android device. Automatically connects to the first available device if no device_id is specified. Returns package names for all system and user-installed apps.
Retrieve the text of the last toast message displayed on the device. Useful for verifying notifications, error messages, and user feedback.
Perform a long click (press and hold) on a UI element. Useful for context menus, drag operations, or long press actions.
Simple health check tool to verify MCP server is running
Press a hardware or software key on the device. Common keys include: home, back, menu, volume_up, volume_down, power, enter, delete
Turn the device screen off. Useful for testing how apps behave when device goes to sleep.
Turn the device screen on. Useful when the device has gone to sleep during automated testing.
Capture a screenshot of the device screen and save it to the specified file path. Essential for debugging and visual verification.
Scroll to a specific element on the screen. Automatically finds scrollable containers and scrolls until the target element is visible.
Send text input to the currently focused UI element. Can optionally clear existing text before sending. Perfect for form filling, search boxes, and text fields.
Launch an Android application by its package name with optional wait for the app to appear in foreground
Force stop all running applications on the device to free up memory and start with a clean slate for testing
Force stop an Android application by its package name. Useful for closing apps that are misbehaving or for testing app restart scenarios.
Perform a swipe gesture from one coordinate to another. Useful for scrolling, paging, or custom swipe actions.
Unlock the device screen. This will wake the device if it's asleep and attempt to unlock it using the default method (swipe up or press home button).
Wait for a specific Android activity to appear on the screen. Useful for navigation verification and app state validation.
Wait for a UI element to appear on the screen. Essential for handling loading screens, animations, and dynamic content.
Wait until the device screen is turned on. Useful for asynchronous operations where screen activation is expected.
Error handling is minimal and non-actionable. Most tools catch exceptions and return bare error strings like 'Failed to ...: {str(e)}' rather than guiding LLM on retry, alternatives, or root cause. See tools: press_key, get_toast, wait_activity.
Tool permissions not declared. Server label tools as READ_ONLY, WRITE, DESTRUCTIVE but tools themselves do not include scope declarations (e.g., 'requires: android.permission.INTERNET'). LLM cannot reason about least-privilege scoping.
No confirmation/dry-run pattern for destructive tools. clear_app_data, stop_all_apps irreversibly modify device state. Should support confirmation_required or dry_run parameter to let agent verify before executing.
Timeout parameters in tools like click, wait_for_element default to 10.0 seconds. No explicit documentation of what happens on timeout (exception vs. null return) or whether timeout is retryable.
Batch operations missing. Tools like click and send_text are called sequentially in loops. No batch_click or batch_send_text variant offered, wasting tokens and latency.