android-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ANDROID_HOME | No | Path to the Android SDK; used to locate the SDK (platform-tools/adb and the emulator) along with ANDROID_SDK_ROOT, ~/Android/Sdk, ~/Library/Android/sdk or PATH. | |
| ANDROID_SDK_ROOT | No | Path to the Android SDK; used to locate the SDK (platform-tools/adb and the emulator) along with ANDROID_HOME, ~/Android/Sdk, ~/Library/Android/sdk or PATH. | |
| ANDROID_MCP_AGENT | No | Set ANDROID_MCP_AGENT=0 in the server's environment to always use `uiautomator dump` instead of the on-device Appium UiAutomator2 agent (used when the agent can't be started). | 1 |
| ANDROID_MCP_KEEP_ANIMATIONS | No | Set ANDROID_MCP_KEEP_ANIMATIONS=1 to leave the device's window, transition and animator duration scales alone (by default they are set to 0 and restored when the server exits). | 0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_devicesA | List connected adb devices (emulators and physical) and available AVDs. |
| start_emulatorA | Start an Android emulator (AVD) and wait until it has booted. Returns immediately if it is already running. |
| get_screen_infoC | Screen size, density, coordinate scale and the app in the foreground. |
| set_orientationA | Lock the screen to portrait or landscape, or re-enable auto-rotation. |
| list_dev_appsA | List the apps this server may use. Only debug builds installed from Android Studio (Run) are allowed: debuggable + testOnly + installed via adb. |
| current_appC | Package and activity currently in the foreground. |
| launch_appC | Launch an allowed dev app by package (its launcher activity), or a specific activity of it. |
| stop_appC | Force-stop an app. |
| clear_app_dataA | Delete all data of an app (like a fresh install). Also stops it. |
| open_urlB | Open a URL / deep link in an allowed dev app with an ACTION_VIEW intent. |
| screenshotA | Take a screenshot (costs far more tokens than get_ui; use it for visuals the tree lacks). Its pixel coordinates are the screen coordinates every other tool uses. With region, returns a sharper crop for reading small text; a crop's pixels are NOT screen coordinates. |
| get_uiA | The visible UI as a list of elements: [ref] (stable across calls), text, desc, id, centre, size, flags. Target elements by ref (index), text or id. Falls back to a screenshot when no tree is available. |
| wait_forC | Wait until an element with the given text/id appears (or, with gone=true, disappears). |
| logcatA | Read the log of an allowed dev app (including lines of crashed earlier processes). By default returns only lines that are new since the previous call with the same filters. |
| list_crashesB | List recorded crashes, ANRs and native crashes of a dev app, newest first, with exception and top frame. Reports survive the process and logcat rotation. |
| get_crashB | Full report of one crash from list_crashes: header (process, version, time) and the complete stack trace. |
| tapC | Tap an element (by index, text or id) or a screen point (x, y). |
| long_pressB | Long-press an element (by index, text or id) or a screen point (x, y). |
| swipeA | Swipe/drag from one screen point to another. A slow swipe (duration >= 1000) acts like a drag. |
| read_allA | Read a whole scrollable list or form in one call: scrolls it to the end and returns every entry it contains, in order. Much cheaper than scrolling step by step. Afterwards the list stays at the end. |
| scrollA | Scroll the content in a direction (down = reveal content below). Scrolls the given element (index), otherwise the largest scrollable element on screen (the screen centre only when no UI tree is available). |
| type_textA | Type text into the focused field. Optionally tap a target first to focus it, clear it, and press enter afterwards. |
| press_keyB | Press a key: back, home, enter, del, backspace, forward_del, tab, escape, app_switch, menu, search, power, wakeup, volume_up, volume_down, dpad_up, dpad_down, dpad_left, dpad_right, dpad_center, move_home, move_end, any KEYCODE_* name, or a key code number. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 23 tools
Tools are well separated by resource and action: interaction (tap/long_press/swipe/scroll/type_text/press_key), capture (screenshot/get_ui), and diagnostics (logcat/list_crashes/get_crash) are clearly differentiated, and descriptions explicitly resolve the screenshot-vs-get_ui and read_all-vs-scroll boundaries. The only mild overlap is get_screen_info vs current_app, both of which report the foreground app, and get_ui vs read_all for reading content.
Most tools follow a predictable verb_noun pattern (open_url, get_ui, list_devices, start_emulator, launch_app, clear_app_data, press_key). A few deviate to bare nouns/actions (screenshot, logcat, tap, swipe, current_app), which is readable but not fully uniform.
At 23 tools it sits at the high end, but the surface is cleanly partitioned across device lifecycle, app lifecycle, UI interaction, capture and diagnostics, so each tool earns its place. It is slightly heavy but not bloated or redundant.
The set covers a full Android automation lifecycle: device/emulator management, app listing/launch/stop/clear-data, rich UI interaction, capture, and crash/log diagnostics, with sensible helpers like wait_for and read_all. Minor gaps remain (no install/uninstall or file push-pull, no multi-touch/pinch or double-tap gestures), but they are workaroundable.