MCP server for Android device control via ADB and scrcpy — gives AI agents vision and control over Android devices
Server has 7 tools with mostly complete schemas and descriptions. Naming follows verb_noun convention (app_start, app_stop, clipboard_get). Descriptions are present and contextual (avg ~120 chars), exceeding the 10-char minimum but below the 194-char production baseline. Input schemas use Zod with type definitions and descriptions. However, output schemas are defined in code but not formally exposed in tool registration (only visible in return statements). Error handling returns structured JSON with error flags and messages, but lacks recovery guidance (e.g., 'try search_users first'). Tool composition is sound, each tool has one responsibility. Parameter descriptions are adequate but some lack format constraints (e.g., 'serial' accepts any string without validation hints). No pagination support for list_apps despite potentially large result sets.
Install an APK file on the device from the host machine.
List installed packages on the device. Optionally filter by name or restrict to system/third-party apps. Use to find package names for app_start.
Launch an app by package name. PREFERRED over swiping the app drawer / manual UI navigation. Uses scrcpy START_APP (fast) when session is active, falls back to ADB `am start`. Supports force-stop prefix (+).
Force-stop an app on the device.
Uninstall an app from the device.
Get the current clipboard content from the device. Uses scrcpy GET_CLIPBOARD when a session is active (works on Android 10+), falls back to ADB clipboard commands.
Output schemas not formally registered in tool definitions. Schemas are defined in code (outputSchema in registerEnvTool) but not exposed to the MCP protocol layer, preventing clients from knowing what fields to expect.
app_list lacks pagination support. No limit, offset, or cursor parameters despite potentially returning hundreds of packages. Large result sets will bloat context and degrade LLM reasoning.
Error messages lack recovery guidance. Errors return structured JSON with message field but do not suggest next steps (e.g., 'Invalid package name. Try app_list to find valid packages').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2025-06-18+ | v2 |
Set the clipboard content on the device. Uses scrcpy SET_CLIPBOARD when a session is active (with optional paste flag), falls back to ADB clipboard commands.
Parameter 'serial' lacks format constraints. Descriptions do not specify expected format (e.g., 'Device serial number (alphanumeric, 1-32 chars)') or validation rules.
Destructive operations (app_uninstall) lack confirmation/dry-run support. No mechanism to preview or confirm before irreversible deletion.