MCP server for Android development via ADB — device management, screen interaction, logs, crash diagnostics, and React Native helpers.
The Android Development MCP server demonstrates solid tool definition quality with consistent naming patterns, comprehensive parameter descriptions, and proper Zod-based schema validation. All 27 tools follow a clear verb_noun naming convention (device_list, app_install, screen_capture, etc.) and include detailed descriptions explaining WHAT, WHEN, and HOW. However, there are notable gaps: (1) output schemas are not documented, only input schemas via Zod are visible; (2) error handling guidance is minimal (no recovery hints or actionable next steps in most tools); (3) no explicit tool annotations (readOnlyHint/destructiveHint) despite risk classifications being known; (4) parameters like 'device_id' are repeated across 20+ tools without a composition strategy to avoid repetition. The tool set is well-organized by domain (device-management, screen-interaction, logs, crash, metro, react-native) and each tool has a single, clear responsibility. Descriptions average ~120 chars and exceed the 10-char minimum. Parameter descriptions are present for most inputs, though some could be more prescriptive about constraints (e.g., no regex patterns, min/max lengths, or format hints in descriptions despite being needed for safe LLM usage).
Restarts the ADB server by running 'adb kill-server' followed by 'adb start-server'. This can fix connection issues with devices.
Installs an APK file on the connected Android device or emulator.
Launches an app on the connected Android device by its package name. Uses 'monkey' to start the app's default launcher activity.
Captures a full Android bugreport from the connected device. A bugreport contains comprehensive device state: logcat, system logs, memory info, running processes, ANR traces, battery stats, and more. This is a heavyweight operation that can take 1-3 minutes to complete. The output is a zip file that can be opened with Android Studio's bugreport viewer.
Connects to an Android device over TCP/IP using 'adb connect'. The device must have TCP/IP debugging enabled (e.g. via device_enable_tcpip).
Disconnects an Android device or emulator from ADB.
Output schemas not documented. Tool descriptions explain inputs and behavior, but return types and structure are not formally defined. LLMs cannot reliably predict what fields are returned, forcing them to reason through examples. Missing return schemas risks context loss between chained tool calls.
No error handling guidance. Tools document what they do but not what errors they may return, whether errors are retryable, or what the LLM should do next. E.g., device_connect may fail if IP is invalid or device is offline, but tool description provides no recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 47 | - | v1 |
Switches a USB-connected Android device to TCP/IP mode by running 'adb tcpip <port>'. After this, the device can be connected wirelessly using device_connect with the device's IP address.
Lists all connected Android devices/emulators and their connection state. Returns a list of devices with their serial number and state (device/offline/unauthorized). Use this to discover available devices before targeting a specific one.
Boots an Android Studio emulator by AVD name. The emulator launches in the background. Use device_list to check when it's ready.
Lists all available Android Virtual Devices (AVDs) configured in Android Studio. Use this to discover which emulators can be booted with emulator_boot.
Sends a key event to the connected Android device. Useful for pressing Enter, Back, Home, Volume, or other key codes.
Swipes on the screen of the connected Android device from one coordinate to another. This tool can be used to scroll, navigate, or perform other swipe gestures.
Taps on the screen of the connected Android device at the given coordinates. This tool is useful also to give the focus to edit boxes that accept text input.
Types text into the focused input field on the connected Android device. Use input_tap to focus an edit box first.
Pulls ANR (Application Not Responding) trace files from the connected Android device. ANR traces contain thread dumps captured when an app becomes unresponsive. Use this to investigate ANR issues reported by Crashlytics or users.
Retrieves the crash log buffer from the connected Android device using 'adb logcat -b crash'. This returns only fatal exceptions and native crashes, which is much cleaner than filtering general logcat. Use this after reproducing a crash to get the exact crash stack trace.
Retrieves crash logs filtered to a specific app package from the crash log buffer. This combines the crash buffer with PID-based filtering to show only crashes from the target app. Also includes recent 'FATAL EXCEPTION' entries from the main log.
Reads logcat logs from the connected Android device. Use this tool instead of running 'adb logcat' via the shell. Can return all device logs or filter to a specific app package. Returns the most recent log lines (default 200, configurable via 'lines' parameter).
Start a Metro bundler instance on a specified port for a React Native project directory. Useful for running multiple emulators in parallel, each on its own Metro port.
List all running Metro bundler instances with their ports and PIDs.
Stop a running Metro bundler instance by port number.
Opens the React Native developer menu on the connected Android device by sending keyevent 82 (KEYCODE_MENU).
Starts the ADB reverse port for react-native projects.
Gets a screenshot of the connected Android device. Use this tool when you need to check the visual appearance of the UI. Prefer using the screen_ui_dump tool to identify the UI elements on the screen and their position.
Describes accessibility information for all visible UI elements on the Android device screen. Returns a list of elements with their class, text, content description, resource ID, bounds, and interactive states. Use this to understand what's on the screen in a human-readable format.
Returns accessibility information for the UI element at the given screen coordinates. Finds the most specific (smallest) element whose bounds contain the point.
Gets the UI hierarchy dump from the connected Android device using an XML format. This is useful to understand the components currently visible on the screen. For each node in the XML, only the attributes specified in the 'returned_attributes' argument are returned.
No tool annotations for risk classification. Tools are internally marked as READ_ONLY or WRITE, but this is not exposed via MCP tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot infer whether a tool is safe to retry or has side effects without explicit annotations.
Repeated 'device_id' parameter across 20+ tools without composition strategy. While descriptions are consistent, this pattern increases surface area for bugs (typos, misunderstandings) and wastes tokens repeating the same parameter documentation. Consider a shared resource or common pattern.
Parameter constraint descriptions lack prescriptive detail. Examples: log_logcat's 'lines' parameter has min/max in schema (1 - 5000) but description says 'default 200, max 5000', why max 5000? screen_ui_dump's 'returned_attributes' lists possible values in description but not as enum. input_swipe's 'duration' has no range hint. Format hints and constraint rationale should appear in description text for LLM clarity.
Ambiguous parameter names create potential for misuse. 'returned_attributes' in screen_ui_dump is comma-separated string rather than array, description says 'comma-separated list' but no example format shown. 'project_dir' in metro_start expects absolute path but description doesn't specify absolute vs relative.