Android Control MCP Server
Provides tools for observing and controlling Android devices, including screen capture, UI hierarchy parsing, semantic element clicking, gestures, app lifecycle management, and more.
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 Control MCP ServerTake a screenshot and tap the 'Allow' button if visible"
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 Control MCP Server
A production-ready Model Context Protocol (MCP) server built in Node.js that enables AI assistants (such as Claude Desktop, Cursor, and custom agentic workflows) to observe, reason about, and control connected Android devices.
๐ Features
๐ Computer-Use Observation: High-resolution PNG screen capture returned directly as MCP image blocks alongside device metadata.
๐ UIAutomator Hierarchy Parsing: Intelligent XML dump parser that transforms verbose Android UI trees into compact, structured JSON.
๐ฏ Semantic Element Clicking: Click buttons and controls by their visible text, accessibility description, or resource ID without needing manual pixel calculations.
โก Fast Gestures & Input: Pixel-accurate tapping, multi-coordinate swiping, directional scrolling, hardware key emulation, and shell-escaped text typing.
๐ฑ App Lifecycle Management: Launch applications by package name and inspect the currently focused foreground activity.
๐ก๏ธ Safety & Sandboxing: Input coordinate validation against actual screen bounds, strict allowlisted keycodes, argument sanitization, command timeouts, and strict
stderrlogging to guarantee stdio MCP stream integrity.๐ Multi-Device Support: Auto-detects connected devices or targets specific devices via
ANDROID_DEVICE_ID.
Related MCP server: Ultimate Android MCP
๐๏ธ Architecture
AI Client (Claude Desktop, Cursor, Agent)
โ
โ stdio transport (JSON-RPC)
โผ
Node.js MCP Server
โ
โโโ Stderr Structured Logger
โโโ Zod Schema Validation
โ
โโโ ADB Controller Layer
โ โโโ Device Resolver (auto-detect or target serial)
โ โโโ Input Engine (tap, swipe, keyevent, text, scroll)
โ โโโ Screenshot Manager (exec-out binary stream)
โ โโโ App Manager (launch, foreground inspection)
โ
โโโ UIAutomator Engine
โโโ XML Hierarchy Dump & Normalizer
โโโ Bounds & Center Coordinate Extractor
โโโ Semantic Element Finder & Click Resolver
โ
โผ
Android Device / Emulator๐ Prerequisites
Node.js:
v20.0.0or higher (node -v)Android SDK Platform-Tools: ADB (
adb) installed and accessible in your systemPATH(or configured viaADB_PATH).Android Device or Emulator:
Physical Device: Connect via USB, enable Developer Options and USB Debugging.
Emulator: Android Studio AVD, Genymotion, or headless emulator.
Verify Device Connection
adb devices -lYou should see your device listed as device:
List of devices attached
emulator-5554 device product:sdk_gphone64_arm64 model:sdk_gphone64_arm64๐ Installation & Quick Start
# Clone or navigate to the repository
cd c:/Users/Abhishek/Code/mcp
# Install dependencies
npm install
# Run unit tests
npm test
# Start the MCP server
npm startโ๏ธ Configuration
Create a .env file or pass environment variables:
# Target device ID (serial number). If omitted and 1 device is connected, it auto-selects.
ANDROID_DEVICE_ID=
# Custom path to ADB executable if not in PATH
# Windows: C:\Users\<user>\AppData\Local\Android\Sdk\platform-tools\adb.exe
# macOS: /Users/<user>/Library/Android/sdk/platform-tools/adb
ADB_PATH=adb
# Log level: debug | info | warn | error
LOG_LEVEL=info
# Default ADB timeout in milliseconds
ADB_TIMEOUT_MS=15000๐ Connecting to MCP Clients
1. Claude Desktop Configuration
Add the following to your claude_desktop_config.json:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"android-control": {
"command": "node",
"args": ["C:/Users/Abhishek/Code/mcp/src/index.js"],
"env": {
"ANDROID_DEVICE_ID": "",
"ADB_PATH": "adb",
"LOG_LEVEL": "info"
}
}
}
}2. Cursor / Windsurf MCP Configuration
In Cursor's Features > MCP Servers or Windsurf settings:
Name:
android-controlType:
commandCommand:
node C:/Users/Abhishek/Code/mcp/src/index.js
๐ ๏ธ MCP Tools Reference
1. android_device_info
Get comprehensive device hardware and OS metadata.
Parameters:
deviceId(optional string): Target device serial.
Example Response:
{ "deviceId": "emulator-5554", "model": "Pixel 8", "manufacturer": "Google", "androidVersion": "15", "sdk": 35, "resolution": { "width": 1080, "height": 2400 }, "connectionState": "connected" }
2. android_screenshot
Capture the Android screen as an MCP Image Content Block (image/png).
Parameters:
deviceId(optional string): Target device serial.
Returns: PNG base64 image data block + dimension metadata.
3. android_ui_dump
Dumps the current screen UIAutomator hierarchy into a compact, AI-friendly JSON format.
Parameters:
deviceId(optional string): Target device serial.
Example Output:
{ "package": "com.android.settings", "activity": "com.android.settings.Settings", "totalElements": 24, "interactiveElementsCount": 8, "elements": [ { "index": 0, "text": "Network & internet", "resourceId": "android:id/title", "className": "TextView", "clickable": true, "bounds": [196, 340, 1016, 400], "center": [606, 370] } ] }
4. android_find_element
Search for UI elements matching specific criteria on the current screen.
Parameters:
text(optional string): Visible text (exact or partial).contentDescription(optional string): Accessibility label.resourceId(optional string): Resource ID.className(optional string): Widget class name.clickable(optional boolean): Filter by clickability.exactMatch(optional boolean, defaultfalse): Exact string match.
5. android_click_element
Find an element and click its center point in a single step.
Parameters:
text(optional string): Element text.contentDescription(optional string): Element content description.resourceId(optional string): Element resource ID.className(optional string): Element class.
6. android_tap
Tap at exact (x, y) coordinates with screen boundary validation.
Parameters:
x(number): X coordinate.y(number): Y coordinate.
7. android_swipe
Perform a drag / swipe gesture between two points.
Parameters:
x1,y1(numbers): Start coordinates.x2,y2(numbers): End coordinates.duration(optional number, default: 300): Duration in milliseconds.
8. android_type_text
Type text into the currently focused input. Handles space encoding (%s) and shell character escaping.
Parameters:
text(string): Text to type.
9. android_press_key
Press a hardware or navigation key.
Supported Keys:
HOME,BACK,ENTER,TAB,ESC,DELETE,SPACE,VOLUME_UP,VOLUME_DOWN,POWER,APP_SWITCH,CAMERA, etc.Parameters:
key(string): Key name or numeric keycode.
10. android_scroll
Directional scrolling calculated against actual screen dimensions.
Parameters:
direction(string:up|down|left|right)amount(optional number): Scroll distance in pixels.
11. android_launch_app
Launch an application by its package name.
Parameters:
packageName(string): e.g.com.android.settings,com.google.android.youtube.activity(optional string): Specific activity name.
12. android_current_app
Inspect the currently focused foreground package and activity.
13. android_execute_action (Unified Computer-Use Tool)
Single unified action dispatcher supporting all actions: tap, swipe, type, press_key, click_element, scroll, launch_app.
{
"action": "click_element",
"text": "Wi-Fi"
}๐ค Recommended AI Workflow: Observe โ Reason โ Act โ Verify
1. OBSERVE:
AI calls `android_screenshot` and `android_ui_dump`.
2. REASON:
AI inspects visual and UI structure to identify target elements.
3. ACT:
AI calls `android_click_element`, `android_type_text`, or `android_scroll`.
4. VERIFY:
AI captures another screenshot/dump to confirm desired state change.๐งช Testing
Run the automated test suite:
npm testTests use Vitest and mock the ADB execution layer, allowing full unit verification without requiring a physical Android device attached during CI/CD.
๐ Security Best Practices
No Arbitrary Shell Execution: The server does NOT expose raw
adb shellexecution tools.Safe Process Invocation: All commands use
child_process.execFilewith explicit argument arrays to prevent shell injection.Input Sanitization: Package names, keycodes, and coordinate parameters are strictly validated via Zod schemas and bounds checking.
Stderr Isolated Logging: All logs are directed exclusively to
stderrto maintain strict JSON-RPC protocol compliance onstdout.
๐ License
MIT
Available Tools
13 toolsandroid_click_elementB
Find and click a UI element on the current Android screen by its visible text, content description, or resource ID. Computes the center of the element and executes a precise tap.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text of the element to click | |
| deviceId | No | Optional device ID | |
| className | No | Class name of the element to click | |
| exactMatch | No | Whether text matching must be exact | |
| resourceId | No | Resource ID of the element to click | |
| contentDescription | No | Content description of the element to click |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it computes the center and executes a precise tap, which is useful. However, it does not mention failure behavior (e.g., element not found), whether it waits for the screen to stabilize, or that it is a mutating action. Since no annotations are provided, the description carries the full burden and could be more thorough.
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 concise sentences with no fluff. The key action and locator types are front-loaded, and the behavioral detail about center computation follows logically. Very efficient.
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?
The tool has six optional parameters with no required ones, yet the description does not clarify how to choose among them or what happens when multiple are provided. It also lacks details on error handling or return values, and there is no output schema. For a tool with ambiguous parameter usage, this is a significant 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?
Schema description coverage is 100%, so the schema fully documents all six parameters. The description adds minimal value beyond that, only restating that it uses text, content description, or resource ID. It does not explain how parameters combine or take precedence, but the baseline of 3 applies since the schema covers semantics.
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 clear verb ('click') and resource ('UI element'), and lists three locator types. It implies it is element-based, distinguishing it from the coordinate-based android_tap sibling, though it doesn't explicitly name that alternative.
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 tool versus siblings like android_tap or android_find_element. It doesn't state that android_tap is for raw coordinates or that this is preferred for element-based interactions. The context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_current_appA
Get the package name and activity of the currently focused foreground Android application.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | No | Optional device ID |
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 burden of behavioral disclosure. It only states the action ('Get') without mentioning that this is a read-only operation, whether it requires special permissions, or how it behaves when no app is focused. For a tool that queries system state, this lack of behavioral context leaves an agent uncertain about side effects and prerequisites, earning a low score.
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 with no unnecessary words. It efficiently states the verb and resource without redundancy, making it highly concise and structurally sound.
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 getter with one optional parameter and no output schema, the description adequately explains what is returned (package name and activity). It does not elaborate on device selection or error handling, but given the tool's simplicity and the optional nature of the parameter, these omissions are minor. The description is complete enough for an agent to use the tool correctly in most scenarios.
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 schema has 100% description coverage for the single optional parameter deviceId ('Optional device ID'), and the tool description adds no additional meaning about this parameter. The description does not discuss how deviceId is used or its impact on results. With high schema coverage, the baseline is 3, and this description does not elevate it.
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 uses a specific verb 'Get' and names the exact resource: 'package name and activity of the currently focused foreground Android application.' This clearly distinguishes it from siblings like android_screenshot or android_ui_dump, which have different purposes. An agent can immediately understand what this tool does and how it differs.
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 description provides clear context: use when you need the identity of the current foreground app. It does not explicitly list alternatives or when not to use it, but the specificity of the purpose makes the usage scenario obvious. Without exclusions or references to sibling tools, it falls short of a 5, but is above a 3 because the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_device_infoA
Get detailed information about the connected Android device, including device ID, model, manufacturer, Android OS version, SDK level, and screen resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | No | Optional target Android device ID/serial. If omitted, auto-selects the connected device. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the operation is 'get' which clearly implies a read-only action, but it does not explicitly say it is non-destructive or describe behavior on errors (e.g., if no device is connected). While the intent is clear, it lacks explicit safety/error context.
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, focused sentence with no redundant words. It front-loads the purpose and enumerates the returned fields, making it easy to scan.
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 read-only tool with one optional parameter and no output schema, the description covers the returned information and the connection prerequisite. It does not mention error handling or output format, but these are minor for a straightforward info-gathering tool, so slightly above average.
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 schema has 100% parameter coverage, fully describing the optional `deviceId` parameter including its effect when omitted. The description adds no additional meaning beyond what the schema already provides, so the baseline of 3 is appropriate.
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 clearly states the action (get) and resource (detailed information about the Android device), and enumerates the specific fields returned (device ID, model, manufacturer, OS version, SDK level, screen resolution). This distinguishes it from sibling tools, which are all actions or app-specific queries.
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 description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, typical use cases, or situations where it would be inappropriate. Since siblings are all actions, the distinction is implied but not explicit, so below average.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_execute_actionC
Execute a high-level Android action in a single tool call. Supports tap, swipe, type, press_key, click_element, scroll, and launch_app.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate for tap | |
| y | No | Y coordinate for tap | |
| x1 | No | Start X for swipe | |
| x2 | No | End X for swipe | |
| y1 | No | Start Y for swipe | |
| y2 | No | End Y for swipe | |
| key | No | Key name for press_key (HOME, BACK, ENTER, etc.) | |
| text | No | Text to type or element text to search for click_element | |
| action | Yes | The action to perform on the Android device | |
| amount | No | Scroll distance in pixels | |
| activity | No | Activity name for launch_app | |
| deviceId | No | Optional device ID | |
| duration | No | Duration in ms for swipe | |
| direction | No | Scroll direction for scroll action | |
| resourceId | No | Element resource ID for click_element | |
| packageName | No | Package name for launch_app | |
| contentDescription | No | Element content description for click_element |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits, but it offers none. It does not mention that this is a convenience wrapper, any side effects, permission requirements, error behavior, or results of the action. The description simply lists action types without revealing how the underlying device interaction behaves or what happens on failure. This is a significant gap for a tool with no safety annotations.
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 sentence and is front-loaded with the core purpose, so it is concise in wording. However, it is under-specified; the list of actions is useful but lacks the essential usage context that would make the sentence earn its place. It is not overly verbose, but it is minimal to the point of being incomplete, so it is only moderately well-structured.
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?
Given the tool's complexity (17 parameters, 7 possible actions, no output schema), the description is grossly incomplete. It does not explain how to invoke each action, which parameters are required, how coordinates are resolved, or what the response contains. The tool cannot be used correctly without external knowledge. The absence of any param-action mapping is a critical flaw, making this definition inadequate for reliable agent invocation.
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 description coverage is 100%, so each parameter has a basic description (e.g., 'X coordinate for tap'). However, the tool description adds no extra semantic value, and the parameter descriptions themselves are insufficient to clarify which parameters apply to which action. For instance, it is not clear that 'x1','y1','x2','y2' are required for swipe, or that 'text' is needed for type and click_element. The description fails to link parameters to actions, leaving the agent to infer the mapping from the schema alone, which is ambiguous.
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 clearly states the tool performs a high-level Android action and enumerates the supported actions (tap, swipe, type, press_key, click_element, scroll, launch_app). The verb 'execute' and resource 'Android action' are specific. However, it does not distinguish itself from its many sibling tools (e.g., android_tap, android_swipe) that accomplish the same individual actions, leaving the agent uncertain whether to use this unified tool or a specific counterpart.
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 guidance on when to use this tool versus the dedicated sibling tools. The description does not mention any advantages (e.g., convenience, single-call aggregation), prerequisites, or scenarios where it is preferred. The agent is left with no context to decide between calling android_execute_action and a specific tool like android_tap, making this dimension essentially missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_find_elementA
Search for UI elements on the current Android screen by visible text, content description, resource ID, or class name. Returns matching elements with their computed center tap coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Visible text to search for | |
| deviceId | No | Optional device ID | |
| className | No | Widget class name (e.g. "android.widget.Button", "TextView") | |
| clickable | No | Filter by clickable state | |
| exactMatch | No | Whether to require exact string match instead of substring match | |
| resourceId | No | Android resource ID (e.g. "com.android.settings:id/switch_widget") | |
| contentDescription | No | Accessibility content description |
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 discloses that it searches the current screen and returns elements with computed center tap coordinates, implying a non-destructive read operation. However, it does not describe failure behavior when no match is found, how multiple matches are handled, or any permissions/limitations.
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 sentences with zero fluff. Purpose is front-loaded in the first sentence, and the return value (center tap coordinates) is stated in the second. No redundant or vague wording.
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 7-parameter optional tool with no output schema, the description explains the search scope and the return type (matching elements with center coordinates). However, it omits details on how multiple criteria combine (AND/OR), whether all matches or only the first are returned, and the exact return structure โ a gap since there is no output schema to clarify this.
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 description coverage is 100% โ every parameter has an individual description. The tool description's list of search criteria (text, content description, resource ID, class name) maps directly to schema fields, adding no new semantics beyond the schema. Baseline of 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 'Search' and resource 'UI elements on current Android screen', lists four search criteria (text, content description, resource ID, class name), and notes it returns elements with computed center tap coordinates. This clearly distinguishes it from siblings like android_ui_dump (hierarchy dump) and android_click_element (action).
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 mention of when to use this tool versus alternatives. Sibling tools such as android_ui_dump or android_click_element are not referenced, leaving the agent to infer that targeted searching should precede clicking. No conditions, exclusions, or guidance on selecting between find and dump actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_launch_appB
Launch an Android application by its package name (e.g. "com.android.settings", "com.google.android.youtube", "com.android.chrome").
| Name | Required | Description | Default |
|---|---|---|---|
| activity | No | Optional specific Activity name to launch | |
| deviceId | No | Optional device ID | |
| packageName | Yes | Android package name to launch (e.g. com.android.settings) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action (launch) but does not explain side effects such as bringing the app to the foreground, what happens if the package is not installed, whether it waits for launch completion, or how non-optional parameters like activity and deviceId affect behavior. The description is minimal and relies on the name for implicit meaning.
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 sentence that opens with the core verb and resource. It is direct, front-loaded, and contains no filler. It efficiently conveys the essential information without unnecessary elaboration.
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 tool with three parameters, no output schema, and no annotations, the description is under-specified. It does not clarify whether optional parameters are truly optional or how they affect behavior, nor does it mention any prerequisite (e.g., device must be connected) or post-launch state. The tool is relatively simple, but the description could be more complete about observable results and edge cases.
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 description coverage is 100% โ all parameters (packageName, activity, deviceId) have descriptions in the schema. The description adds examples of package names, which reinforces the format but does not add new meaning beyond what the schema already states. Since the schema already documents parameters, the description provides marginal added value, so a baseline of 3 is appropriate.
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 clearly states the tool's purpose: 'Launch an Android application by its package name.' It specifies the verb (launch), the resource (Android application), and the identifying parameter (package name). It is distinct from siblings like android_tap or android_swipe, which handle interaction rather than launching.
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 description provides no guidance on when to use this tool versus alternatives. It does not mention that launching an app is a prerequisite for other actions, nor does it advise against using it for already-running apps. Given the sibling list includes many interaction tools, some contextual advice would help, but none is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_press_keyC
Press an Android hardware or navigation key. Supported keys include: HOME, BACK, CALL, ENDCALL, VOLUME_UP, VOLUME_DOWN, POWER, CAMERA, CLEAR, COMMA, PERIOD, TAB, SPACE, ENTER, DELETE, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key name (e.g. HOME, BACK, ENTER, TAB, ESC, DELETE, SPACE, VOLUME_UP, VOLUME_DOWN, POWER) or valid keycode | |
| deviceId | No | Optional device ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states it will 'press' a key but does not disclose potential side effects (e.g., navigating away from the current screen), whether the call blocks, error conditions, or the role of deviceId. The list of supported keys is helpful but does not address behavioral consequences. The description is too sparse for a tool that directly manipulates device state.
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 sentence with a list of examples, which is concise and to the point. It front-loads the core action and then lists specifics. No wasted words, but it could be slightly better structured by separating the enumeration from the action. Still, it is appropriately short and scannable.
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 tool with only two parameters and no output schema, the description covers the essential input expectations. However, it lacks usage context (when to choose this over tap/swipe), behavioral outcomes, and any edge-case handling. Given the absence of annotations, more explanatory depth (e.g., deviceId semantics, or that pressing navigation keys may alter the app state) would be warranted. It is minimally complete but leaves gaps.
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 input schema already covers both parameters (key and deviceId) with clear descriptions, and the schema description coverage is 100%. The description adds examples of supported keys (HOME, BACK, etc.) which are partially redundant but confirm the 'valid keycode' allowance. This matches the baseline of 3 where the schema does the heavy lifting; the description does not introduce novel semantic meaning beyond the schema.
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 clearly states the action ('Press an Android hardware or navigation key') and enumerates supported keys, making it distinct from sibling tools like android_tap (screen touches) and android_type_text (text entry). However, it does not explicitly contrast with siblings, so a slight deduction. It is specific and unambiguous.
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 description provides no guidance on when to use this tool versus alternatives such as android_tap or android_swipe. It does not mention prerequisites, context, or exclusions. An agent would need to infer that this is for physical/navigation keys rather than on-screen interactions. Lacks any 'when to use' or 'when not to use' statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_screenshotA
Capture the current screen of the Android device as a PNG image for visual inspection and AI computer-use reasoning.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | No | Optional target Android device ID. If omitted, auto-selects. |
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 states the action (capture screen) and output format (PNG) but does not explicitly mention that this is a read-only, non-destructive operation, nor does it disclose potential issues like device availability or permissions. However, the action is intuitively non-mutating, so the lack of detail is a minor gap.
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, direct sentence with no filler. The main action and purpose are front-loaded, and every word contributes value. Appropriate for a simple tool.
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?
Given the low complexity (no output schema, one optional parameter), the description is nearly complete. It explains the output format and purpose, and the parameter is documented in the schema. The only gap is the lack of usage guidance against sibling tools, which slightly reduces completeness but is not critical for such a simple operation.
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% for the single parameter (deviceId), which already describes it as optional with auto-selection. The description adds no extra meaning about the parameter, so it meets the baseline for high coverage without adding value.
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 clearly states the verb 'Capture', the resource 'screen of the Android device', and the output as a PNG image. It also adds purpose ('visual inspection and AI computer-use reasoning'), which distinguishes it from sibling tools like android_ui_dump (which likely returns a structural dump) or action tools like android_tap.
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 description implies usage for visual inspection but does not explicitly state when to prefer this over alternatives such as android_ui_dump or android_device_info. No exclusions or alternative routing are provided, so an agent must infer usage from the stated purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_scrollB
Scroll the screen in a specified direction (up, down, left, right).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Scroll distance in pixels. If omitted, scrolls approx 40% of screen dimension. | |
| deviceId | No | Optional device ID | |
| direction | Yes | Scroll direction. "down" reveals content below; "up" reveals content above. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It adds the direction semantics ('down' reveals content below; 'up' reveals content above), which is helpful and beyond the schema. However, it does not disclose any other behavioral traits such as animation, failure modes, or interactions with the amount parameter, though these may be less critical for a scroll action.
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, clear sentence with no wasted words. It focuses on the direction parameter, which is the core input, and is appropriately front-loaded.
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?
Considering the tool's simplicity, the description covers the basic action and direction semantics. However, it omits any differentiation from android_swipe and does not mention how the scroll relates to the current screen position (e.g., relative vs absolute). Given the tool has multiple siblings, this is a notable gap that affects completeness.
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 schema already documents all three parameters with 100% coverage, so the description's role is minimal. It mentions 'direction' and repeats its meaning, but adds no extra detail about 'amount' or 'deviceId' beyond what the schema provides. This meets the baseline expectation, but does not elevate it.
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 clearly states the action: 'Scroll the screen in a specified direction (up, down, left, right).' It identifies the resource (screen) and the direction parameter, making the purpose evident. However, it does not differentiate from the sibling tool 'android_swipe,' so an agent might not know when to pick one over the other.
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 is provided about when to use this tool versus alternatives like android_swipe or when scroll is appropriate. The description only states what it does, not the context or exclusions, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_swipeA
Perform a swipe / drag gesture between two points (x1, y1) and (x2, y2) with a configurable duration.
| Name | Required | Description | Default |
|---|---|---|---|
| x1 | Yes | Start X coordinate | |
| x2 | Yes | End X coordinate | |
| y1 | Yes | Start Y coordinate | |
| y2 | Yes | End Y coordinate | |
| deviceId | No | Optional device ID | |
| duration | No | Swipe duration in milliseconds (default: 300ms) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of explaining behavior. It states the gesture type and the configurable duration, but does not disclose any side effects, failure conditions, coordinate system assumptions, or whether the gesture is relative to the screen. The description is not misleading, but it adds little beyond what the name and schema already convey.
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, compact sentence that leads with the action and key parameters. It avoids any unnecessary filler or repetition, making it efficient and easily parsed by an agent.
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 gesture tool with no output schema and fully documented parameters, the description explains the core action and duration. However, it omits any mention of coordinate system relative to the screen, potential prerequisites (e.g., device must be unlocked), or behavior when the gesture is out of bounds. These are minor gaps, but the tool is simple enough that this is mostly 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 input schema provides 100% coverage, with all six parameters having descriptive text. The description mentions 'configurable duration' but this repeats the schema's duration field. It does not add extra meaning about coordinate units, origins, or any interaction between parameters. Since schema coverage is complete, a baseline of 3 is appropriate.
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 clearly states the verb 'perform a swipe / drag gesture' and specifies the resource as 'between two points (x1, y1) and (x2, y2)'. This is distinct from sibling tools like android_tap (a tap) and android_scroll (a scroll), so an agent can immediately tell this is for arbitrary two-point gestures.
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 description implies usageโit is obviously for swipes/dragsโbut does not explicitly state when to use this tool over alternatives (e.g., 'use android_tap for single taps', 'use android_scroll for scrollable areas'). No exclusions or alternative routing is provided, so the agent must infer applicability from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_tapB
Tap at specific (x, y) pixel coordinates on the Android device screen.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in pixels | |
| y | Yes | Y coordinate in pixels | |
| deviceId | No | Optional device ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the core action and does not reveal any side effects, prerequisites (e.g., screen on, app foreground), or whether the tap is synchronous or asynchronous. The agent has no information about what happens after the tap or how success is indicated.
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 concise sentence with no filler or redundant words. It is front-loaded with the action verb and delivers the purpose directly, which is ideal for a simple tool. Nothing needs to be cut.
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?
The tool is simple, but the description omits important context for correct usage, such as the coordinate system origin (top-left corner is assumed), behavior on invalid coordinates, and the role of deviceId when multiple devices are connected. It also does not distinguish from android_click_element for element-based interactions. Given the rich sibling set, the description is incomplete for an agent that must choose the right interaction tool.
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 input schema already describes all three parameters (x, y, deviceId) with clear definitions and 100% coverage. The description adds nothing beyond restating that the tap is at 'specific (x, y) pixel coordinates', which is essentially redundant with the schema. Baseline 3 is appropriate because the schema handles the semantic load.
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 action verb 'Tap' and the resource 'specific (x, y) pixel coordinates on the Android device screen', making the tool's purpose clear and unambiguous. It is distinct from sibling tools like android_click_element (element-based) and android_swipe (gesture-based), so an agent can tell it apart without further explanation.
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 is provided on when to use this tool versus its alternatives. The description does not mention that it is for coordinate-based taps rather than element-based clicks, nor does it clarify when deviceId is needed. An agent would have to infer usage context from the schema alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_type_textA
Type text into the currently focused Android input field. Handles escaping for spaces and special characters.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text string to type into focused input | |
| deviceId | No | Optional device ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a valuable behavioral trait โ escaping spaces and special characters โ which tells the agent it can safely pass arbitrary text. However, it does not mention failure modes (e.g., no focused field, invalid characters) or whether it waits for the field to be ready. This is partial but not silent, so a 3 is appropriate.
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 sentences, zero filler. The core purpose is in the first sentence, with the behavioral nuance (escaping) in the second. Every word earns its place, and it front-loads the most important information.
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 action tool with one required parameter and no output schema, the description covers the essential aspects: what it does, where it acts (focused field), and its escaping behavior. It could mention error conditions or whether it clears existing text, but these are minor for the scope. Overall, it gives an agent enough to call it correctly in most scenarios.
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 description coverage is 100% โ both 'text' and 'deviceId' have clear descriptions. The description adds extra meaning for the 'text' parameter by explicitly stating that escaping is handled, which informs the agent that special characters are acceptable. This goes beyond the schema's simple 'Text string to type' and justifies a 4, slightly above the baseline 3.
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 ('Type text'), a specific resource ('currently focused Android input field'), and a key detail ('handles escaping for spaces and special characters'). This distinguishes it from sibling tools like android_tap or android_press_key, which serve different actions. The purpose is unambiguous and immediately clear.
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 description implies usage (when you need to type into a focused field) but does not explicitly mention when not to use it or name alternatives. It lacks the directiveness of the top-tier example that names a sibling tool. However, the context of 'currently focused' and the sibling names (e.g., android_press_key) make the scenario understandable, so it earns a 3 rather than lower.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_ui_dumpA
Dump the current Android screen UI hierarchy using UIAutomator. Returns a structured, compact list of visible and interactive UI elements with their text, resource IDs, and screen bounds.
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | No | Optional device ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool returns a structured, compact list of visible and interactive elements, including text, resource IDs, and screen bounds. This tells the agent what to expect and implies it is read-only (no side effects mentioned). It doesn't mention prerequisites like accessibility service permission or failure modes, but for a 'dump' operation, the core behavior is transparent. Slight gap: does not say whether it blocks or returns immediately, but that is minor given the nature of the tool.
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 two clear sentences, starting with the verb 'Dump' and the resource. It front-loads the core action, then specifies output details in a single compact second sentence. No extraneous words or repetitionโevery phrase adds value.
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?
The tool is simple (one optional param, no output schema), and the description covers the essential information an agent needs: what it returns and limits the results to visible and interactive elements. This is adequate for an agent to decide whether to call it and what to expect. It could be more explicit about whether the list is flat or hierarchical, and whether it includes scrollable/element hierarchy beyond visible ones, but the given detail is sufficient for typical use.
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 schema has only one optional parameter (deviceId) and its description coverage is 100%, so the schema already tells the agent what the parameter does. The tool description does not add any extra semantics about deviceId (e.g., default behavior, format, or when it's needed). Since coverage is complete, the description doesn't need to compensate, and a baseline of 3 is appropriate.
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 clearly states the verb 'dump' and the resource 'Android screen UI hierarchy', and specifies the output: a structured list of visible, interactive elements with text, resource IDs, and bounds. This distinguishes it from siblings like android_find_element (which searches for specific elements) and android_click_element (which interacts), so an agent can tell them apart.
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 description implies a use case (inspecting the current UI hierarchy) but does not explicitly state when to prefer this over alternatives, nor does it mention exclusion criteria. For example, it doesn't say 'use android_find_element to locate a single element' or 'use when you need an overview of all visible elements vs. screenshot'. The context is clear but guidance is implicit rather than explicit.
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.
13 tool updates
v1.0.0- First observed
android_click_element - First observed
android_current_app - First observed
android_device_info - First observed
android_execute_action - First observed
android_find_element - First observed
android_launch_app - First observed
android_press_key - First observed
android_screenshot - First observed
android_scroll - First observed
android_swipe - First observed
android_tap - First observed
android_type_text - First observed
android_ui_dump
TDQS
Scored across 13 tools
Most tools have clearly distinct purposes, but android_tap, android_click_element, and android_execute_action overlap in interaction, differing only by abstraction level (raw coordinates, element-based, and high-level bundling). Descriptions help disambiguate these, so the overlap is minor.
All tools share the 'android_' prefix, which is good, but the naming pattern is inconsistent: some are bare nouns (screenshot, scroll), some are verb phrases (type_text, launch_app), and some are noun phrases (current_app, device_info). This mix of conventions is still readable but not fully predictable.
With 13 tools, the server is well-scoped for a mobile automation domain, offering both low-level gestures and high-level actions without redundancy. This count is appropriate and each tool earns its place.
The tool surface covers core UI automation: screen capture, interaction (tap, swipe, type, press, scroll), element discovery (ui_dump, find_element, click_element), and app control (launch_app, current_app). Missing advanced gestures like pinch or long-press, but these are not essential for typical agent tasks.
Maintenance
Related MCP Connectors
Control real Android and iOS devices with LLM agents โ tap, swipe, type, automate flows.
Disposable cloud Android emulators for coding agents: run an APK or PR build, tap, type, screenshot.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth โ get a token at robotactions.com โ Profile โ API Tokens.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables AI agents to interact with Android devices through UI manipulation, screen capture, touch gestures, text input, and app management via ADB. Provides comprehensive mobile automation capabilities including element detection, navigation, and application control for Android device testing and interaction.94-
- AlicenseBqualityDmaintenanceEnables LLMs to control and manage Android devices via ADB, including app installation, UI interaction, and device monitoring.3512GPL 3.0
- AlicenseBqualityBmaintenanceEnables AI assistants to interact with Android devices and emulators via ADB, providing tools for screenshots, UI inspection, touch and text input, app management, and device control.4282 npm19MIT
- AlicenseAqualityDmaintenanceEnables AI models to control Android devices via ADB through natural language commands, supporting screen analysis and automated actions.318 npmMIT