Android MCP
Android-MCP lets LLM agents control Android devices via ADB for app navigation, UI interaction, and automated QA.
List, connect, disconnect, and auto-detect ADB devices over USB or WiFi.
Inspect UI state and optionally capture screenshots with or without annotations.
Tap coordinates or click elements by text, resource ID, class name, or description.
Perform long clicks, swipes, drags, and device button presses.
Type text into fields, with optional clearing.
Wait for fixed durations or dynamically wait for elements to appear.
Open the notification bar.
Work with physical devices or emulators using any LLM/VLM, without OCR or CV pipelines.
Enables interaction with Android devices through ADB and Accessibility API, allowing for app navigation, UI interactions (click, swipe, type), and automated QA testing without requiring computer-vision pipelines.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Android MCP open the settings app and turn on airplane mode"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
android-mcp-beta
Clean-room reimplementation of Android-MCP: an MCP server that lets an AI agent operate an Android device over ADB.
It needs only adb. Nothing is installed on the device, and there is no dependency on
uiautomator2.
Run
Requires Python 3.13 and adb (Android platform-tools).
uv run android-mcp-betaThe server speaks MCP on stdio. In a client's config:
{
"mcpServers": {
"android-mcp-beta": {
"command": "uv",
"args": ["--directory", "D:/Projects/android-mcp-beta", "run", "android-mcp-beta"]
}
}
}The device is connected on the first tool call, so the server starts whether or not one is attached yet.
Related MCP server: android-mcp
Choosing the device
With no options it uses the first physical device, or an emulator when there is none.
Option | Environment | Meaning |
|
| A serial, or |
|
| How to pick when no device is named |
|
| ADB over Wi-Fi; |
| ADB over USB, optionally a specific serial |
Options win over the environment. Other variables:
ANDROID_MCP_ADB_PATHnames theadbbinary. Otherwiseadbis looked for onPATH, then inANDROID_HOME,ANDROID_SDK_ROOTand the default Android Studio SDK folders.SCREENSHOT_QUANTIZED=truereduces screenshots to 256 colours, which makes them smaller.
Tools
Tool | Does |
| List, choose, or disconnect the device |
| The interactive elements, each with a label and tap coordinates. |
| Touch input by coordinates |
| Tap an element found by |
| Type into a field. |
| A button: back, home, recent, volume up, enter, and so on |
| Pull down the notification shade |
| Pause, or wait for an element to appear |
Typing other scripts (optional)
Type uses adb shell input text, so on its own it types printable ASCII and the accented Latin
letters Android can compose (é ñ ü ÿ and 107 others, not ç ß å ø). A newline presses Enter and a
tab presses Tab. For anything else (CJK, Cyrillic, Arabic, emoji, ç), install the
ADBKeyboard app on the device once:
adb install keyboardservice-debug.apkDownload it from the releases page. This project
does not bundle it: ADBKeyboard is GPL-2.0, and it is only ever talked to over broadcasts. I tested
v2.5-dev (SHA-256 41a8a099…46fbbb) on Android 15.
With it installed, text that input text cannot type is sent through it automatically. For about
a second the device's keyboard is switched to ADBKeyboard, which shows no keyboard of its own, and
then the keyboard that was active before is put back (and ADBKeyboard is disabled again if it was
not enabled). A text field must be focused, or the call fails with an error saying so. If a crash
ever leaves the device on ADBKeyboard, adb shell ime reset restores the default. Without the app,
such text is rejected before anything is sent, with these instructions in the error.
Other limits
Busy screens. The element list comes from
uiautomator dump, which gives up when the screen never goes idle (a video, a running timer).Snapshotwithuse_visionthen returns the screenshot alone and says so; click by coordinates still works.Drag needs Android 8 or later. Clearing a field uses
input keycombination, which needs Android 12; older devices fall back to a slower method that clears up to 200 characters.
Development
uv sync
uv run pytest
uv run ruff check . && uv run ruff format --check .The tests need no device. Layers, bottom to top: android_mcp.adb (talks to adb),
android_mcp.tree (reads the screen), android_mcp.mobile (one connected device: state and
actions), android_mcp.server (the MCP tools and the choice of device).
Available Tools
14 toolsClickClickCDestructive
Click on a specific cordinate
Inputs: x (required), y (required).
ClickBySelectorClick By SelectorADestructive
Click on an element by selector (text, resourceId, className, description). More reliable than coordinate clicks — handles dynamic layouts and element reflow. At least one selector must be provided.
Inputs: text, index, timeout, className, +2 more.
ConnectDeviceConnect DeviceB
Connect to an ADB device by serial number
Inputs: serial (required).
DeviceDeviceC
Manage ADB devices (list, connect, or disconnect)
Inputs: action (required), serial.
DragDragCDestructive
Drag from location and drop on another location
Inputs: x1 (required), x2 (required), y1 (required), y2 (required).
ListDevicesList DevicesARead-only
List available ADB devices
Inputs: no named parameters.
LongClickLong ClickCDestructive
Long click on a specific cordinate
Inputs: x (required), y (required).
NotificationNotificationBDestructiveIdempotent
Access the notifications seen on the device
Inputs: no named parameters.
PressPressCDestructive
Press on specific button on the device
Inputs: button (required).
SnapshotSnapshotARead-only
Get the state of the device. Optionally includes visual screenshot when use_vision=True. The use_annotation parameter (default True) can be set to False to get a clean screenshot without bounding boxes.
Inputs: use_vision, use_annotation.
SwipeSwipeDDestructive
Swipe on a specific cordinate
Inputs: x1 (required), x2 (required), y1 (required), y2 (required).
TypeTypeCDestructive
Type on a specific cordinate
Inputs: x (required), y (required), text (required), clear.
WaitWaitBDestructiveIdempotent
Wait for a specific amount of time
Inputs: duration (required).
WaitForElementWait For ElementARead-only
Wait for an element to appear on screen. Use this instead of Wait when content is loading dynamically. Returns element info when found or error on timeout.
Inputs: text, timeout, className, resourceId, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Several tools have overlapping purposes. Coordinate-based actions (Click, LongClick, Type, Swipe, Drag) are all performed at coordinates, making it unclear when to use which. Device management tools (ConnectDevice, Device, ListDevices) also overlap. ClickBySelector and WaitForElement are distinct but the overall set causes confusion.
All tool names use PascalCase, but the naming style is inconsistent. Some are single verbs (Click, Drag, Wait) while others are compound verbs (ClickBySelector, WaitForElement) or nouns (Device, Notification, Snapshot). There is no consistent verb_noun or action_object pattern.
14 tools is well-scoped for an Android device interaction server. It covers device management, UI interactions, and screen capture, without overwhelming the agent. Each tool serves a distinct purpose and the count is appropriate for the domain.
The tool surface covers core Android automation tasks like clicking, typing, swiping, and device management. However, it lacks explicit scroll support, element property inspection, and text input by selector (only coordinate-based typing). These gaps may require workarounds.
Maintenance
Related MCP Connectors
Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park.
Give your AI agent a real cloud Android phone: push APKs, drive it, get screenshots and logs.
Cloud Android phones for AI agents: give phones a task in plain words and get the answer
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to control Android devices and emulators through direct UI interaction, allowing app navigation, automated testing, and real-world task execution via ADB without computer vision or scripts.182MIT
- AlicenseBqualityDmaintenanceEnables AI agents to control Android devices via ADB, supporting gestures, input, screenshots, UI analysis, and app management.1914 npm1ISC
- AlicenseNot gradedqualityCmaintenanceEnables LLM agents to drive real Android devices or emulators by reading the live accessibility tree, acting on UI nodes instead of coordinates, verifying every action, and typing Unicode text.528 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceLets AI agents see and use a real Android phone over Wi-Fi: read the screen, find elements by text or ID, tap, type, swipe, take screenshots and read notifications, without ADB or root.519MIT