mcp-android
Controls an Android phone over ADB, providing tools to take screenshots, inspect the UI hierarchy, tap, swipe, type text, press keys, launch apps, open URLs, set alarms/timers, and read notifications. Admin capabilities include installing APKs, uninstalling apps, clearing app data, and running shell commands, subject to access controls.
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., "@mcp-androidset an alarm for 6:30am labeled Gym"
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.
mcp-android
A Model Context Protocol server to control an Android phone over ADB — the phone equivalent of the Mac-control servers. Claude can see the screen (screenshots + UI hierarchy) and tap, type, press keys, launch apps, set alarms/timers, and read notifications. Safe-by-default, with the suite's access-mode + flag model.
Runs on your computer and drives a phone connected by USB or wireless debugging (great for the Z Fold 7). It is not installed on the phone and does not need root.
iOS? A stock iPhone can't be controlled this way — Apple's sandbox forbids cross-app/system automation. See the separate mcp-ios repo for the realistic (Appium/WebDriverAgent over USB from a Mac) approach.
Quickstart
brew install android-platform-tools # provides adb
# On the phone: Settings → Developer options → enable USB (or Wireless) debugging, then authorize this computer
adb devices # confirm your device shows "device"Run it straight from npm — no clone or build needed:
npx -y @dockndevai/mcp-androidOr add it to Claude Code in one line (start read-only):
claude mcp add android -e ANDROID_MODE="read-only" -- npx -y @dockndevai/mcp-androidSee docs/CLIENTS.md for Claude Desktop, Cursor, Codex, Windsurf, and VS Code configs.
Related MCP server: Termux MCP Server
Setup from source
brew install android-platform-tools # provides adb
adb devices # confirm your device shows "device"
npm install && npm run buildTools
Read (read-only+): list_devices, device_info, screenshot, ui_dump, current_app, list_apps, get_notifications
Write (read-write+): tap, swipe, input_text, press_key, launch_app, open_url, set_alarm, set_timer
Admin (admin): install_apk, uninstall_app, clear_app_data (need ANDROID_ALLOW_INSTALL), run_shell (needs ANDROID_ALLOW_SHELL; not registered otherwise)
The typical loop for driving the UI: screenshot → ui_dump (find bounds) → tap/input_text.
Security model
Concern | Flag | Default |
What it can do |
|
|
Which packages in scope |
| (all) |
Protected packages (never uninstall/clear) |
| settings, systemui, gms |
Allow install/uninstall/clear |
|
|
Allow raw |
|
|
Interactive confirmation (destructive ops) | MCP elicitation (client-driven) | (on when the client supports it) |
Preview without touching device |
|
|
Audit log (stderr) |
|
|
When the connected client supports MCP elicitation, destructive tools (uninstall_app, clear_app_data, install_apk, run_shell) pause and ask the human to approve the exact action before it runs — the model can't approve on your behalf. When the client can't elicit, the access-mode + flag gates above are the control.
Run with Claude Desktop / Claude Code
{
"mcpServers": {
"android": {
"command": "node",
"args": ["/absolute/path/to/mcp-android/dist/index.js"],
"env": { "ANDROID_MODE": "read-write" }
}
}
}Example prompts
"Take a screenshot of my phone and tell me what's on screen."
"Set an alarm for 6:30am labeled Gym."
"Open the Clock app and start a 10-minute timer."
"What notifications do I have piling up?"
Develop
npm run dev
npm test # security policy
npm run typecheckLicense
MIT
Available Tools
7 toolscurrent_appCurrent appB
The package/activity currently in the foreground.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It indicates the observation target but omits whether the call requires permissions, what happens if no app is in the foreground, and what the response shape looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no wasted words. The key concept, foreground package/activity, appears immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema, the description should clarify return values and edge cases. It identifies the returned subject but not its format or null/no-foreground behavior, leaving a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to explain. The schema is empty and the description appropriately does not invent parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific resource returned: the foreground package/activity. That distinguishes it from siblings like list_apps (all apps) and device_info, though the sentence fragment lacks an explicit verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives no guidance on when to use this tool versus alternatives such as list_apps, ui_dump, or screenshot. The intended use is only implied by the phrase 'currently in the foreground.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_infoDevice infoC
Model, manufacturer, Android version, and screen size.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It never states that this is a read-only, non-destructive operation, nor how the values are returned (single object? string?), leaving the safety and response profile implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single tight fragment with zero filler and the content is front-loaded. Its brevity, however, comes from under-specification rather than economy of expression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-param read tool with no output schema, the field list does useful work in anticipating the return values. It is still incomplete regarding the action verb and the shape/format of the returned data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the exact fields returned (model, manufacturer, Android version, screen size), which is more specific than a bare restatement of the name. However, it is a noun fragment with no verb, so the action (retrieve device metadata) must be inferred. It does distinguish it implicitly from siblings like screenshot and ui_dump.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus list_devices or current_app, and no prerequisites or exclusions stated. The agent must infer that this is the hardware/OS metadata lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_notificationsGet notificationsA
Read current notifications (package + title/text), best-effort. Useful for clearing the pile-up.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. 'Best-effort' is a genuinely useful disclosure of unreliability, but the phrase 'useful for clearing the pile-up' leaves ambiguity about whether calling it dismisses/clears notifications or merely lists them, so side effects are unclear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource and returned fields front-loaded and no padding. Nothing redundant or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does briefly cover what comes back (package + title/text), and the zero-param nature leaves little else to specify. The only gap is the unclear side-effect semantics around clearing notifications.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds return-content detail (package, title, text) that the empty schema does not provide, which is a real value-add for an output-schema-less tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('current notifications') and names the fields surfaced (package + title/text). Sibling tools are unrelated, so differentiation is not needed, but the definition is clear on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Useful for clearing the pile-up' implies a use case but gives no explicit when/when-not or pointer to an alternative. Siblings don't overlap, so the missing exclusions matter less, leaving implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsList appsA
List installed packages. Third-party only by default.
| Name | Required | Description | Default |
|---|---|---|---|
| includeSystem | No | Include system packages |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; 'List' implies a read-only operation and the default filtering behavior is usefully disclosed. However, it does not confirm non-destructiveness, describe result size/pagination, or indicate whether a package list can be large or truncated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and immediately followed by the most important default behavior. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter list tool this is adequate, but with no output schema and no annotations the description could state the return shape (names, versions, identifiers) and confirm read-only behavior. It leaves those gaps for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter (includeSystem) is fully documented in the schema. The description's 'third-party only by default' reinforces its meaning but adds no syntax or edge-case detail beyond what the schema already says, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List installed packages') that is clearly distinct from the sibling tools (device_info, screenshot, ui_dump, current_app). Minor friction: the tool is named list_apps but the description says 'packages', requiring the agent to infer these are the same thing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The default scope ('third-party only by default') implies when the default suffices and when the includeSystem flag is needed, but there is no explicit guidance on when to use this tool versus siblings like current_app or device_info, nor any stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList devicesB
List connected adb devices and their state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds useful scope ('connected' only) and hints at return content ('their state'), implying a read-only enumeration, but never states that 'state' means the adb device status (device/offline/unauthorized) or whether unequipped/emulator devices are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, with zero filler. Nothing in it is redundant with the title in a wasteful way.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial zero-param read tool this covers the essentials, but with no output schema the ambiguous term 'state' is left unexplained — the agent cannot know which status values to expect or how to interpret an 'unauthorized' or 'offline' device before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate against the empty schema; baseline 4 applies. The description correctly refrains from inventing filter arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource: 'List connected adb devices and their state.' An agent immediately knows this is an enumeration of attached devices. It does not, however, distinguish itself from the sibling device_info tool (per-device detail), leaving that inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives (device_info for per-device detail), and no preconditions stated. The agent must infer from the name alone that this is the discovery step before calling device_info or screenshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotScreenshotA
Capture the current screen as a PNG image so you can see what's on the phone before acting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It does convey that the result is a PNG image and implies a read-only capture, but says nothing about device requirements, latency, image scope (e.g., status bar, resolution), or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the output format stated early and a purpose clause that earns its place. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, output-less-schema tool, the description covers what it does and what it returns (PNG). Minor gaps: no mention of needed device context or when to prefer ui_dump.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a 0-param tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Capture the current screen as a PNG image') plus the concrete output format. It does not explicitly contrast with the closest sibling, ui_dump, but an agent can distinguish an image capture from a UI tree dump.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'...so you can see what's on the phone before acting' implies the timing (prior to interactions) but gives no explicit when-not or named alternatives such as ui_dump for structured element data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_dumpUI hierarchyA
Dump the current screen's UI hierarchy (uiautomator XML) with element text and bounds — use it to find exact tap coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the return content (element text and bounds), but it does not explicitly state that the operation is read-only, whether it has side effects, or any device/ADB prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that states the action, output format, and practical use with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description adequately covers what is returned (uiautomator XML with text and bounds) and why to use it. Minor omissions like read-only status or prerequisites keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to explain; the baseline for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Dump the current screen's UI hierarchy') and names the concrete output format (uiautomator XML). It implicitly distinguishes itself from screenshot by focusing on hierarchy and coordinates, but does not explicitly name a sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case ('use it to find exact tap coordinates'), which tells the agent when this tool is appropriate. It does not, however, specify when not to use it or name alternatives such as screenshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
current_app - First observed
device_info - First observed
get_notifications - First observed
list_apps - First observed
list_devices - First observed
screenshot - First observed
ui_dump
TDQS
Scored across 7 tools
Each tool targets a distinct inspection target (device list, device specs, screenshot, UI hierarchy, foreground app, installed packages, notifications). The only mild overlaps are list_devices vs device_info and screenshot vs ui_dump, but the descriptions explicitly differentiate them (visual preview vs. exact tap coordinates).
All names are snake_case, but verb style is mixed: some use verb_noun (list_devices, list_apps, get_notifications) while others are bare nouns (screenshot, ui_dump, device_info, current_app). Still readable, but no single predictable pattern.
Seven tools is a well-scoped size for a device inspection server, and each one covers a distinct piece of information. Slightly thin for a full Android control server, but no tool feels redundant.
The surface is entirely read-only: there is no tap, swipe, text input, app launch/install, or file push. This is especially glaring because screenshot and ui_dump descriptions explicitly frame themselves as preparation for acting ('before acting', 'find exact tap coordinates'), yet no action tool exists — a dead end for the primary workflow.
Maintenance
Related MCP Connectors
Give your AI agent a real cloud Android phone: push APKs, drive it, get screenshots and logs.
Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park.
Let AI agents control Android and iOS devices on Mobilerun Cloud: screen, input, apps, workflows.
Cloud Android phones for AI agents: read the screen, tap, type, install APKs, park and resume.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables text-based control of Android devices through Claude Code using accessibility tree automation. Supports UI interaction, app launching, text input, gestures, and navigation without requiring screenshots.MIT
- FlicenseAqualityFmaintenanceEnables remote control of Android phones via Claude Desktop, offering 45+ tools including UI automation for app interactions.5716-
- AlicenseBqualityCmaintenanceEnables AI assistants to observe, reason about, and control connected Android devices via ADB, providing tools for screenshots, UI hierarchy parsing, semantic element clicking, gestures, text input, and app lifecycle management.13MIT
- AlicenseBqualityBmaintenanceEnables Claude to see and control a real Android phone via MCP, reading the accessibility tree to tap, type, navigate, launch apps, and diagnose connectivity over ADB or cellular.2381Apache 2.0