android-mcp
Provides full control of Android devices and emulators through ADB, enabling screen observation, UI interaction, app management, system controls, and device management for Android.
Click on "Install 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-mcpTake a screenshot of the current screen"
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
An MCP (Model Context Protocol) server that gives AI agents full control of Android devices and emulators through plain ADB — no companion APK, no extra daemon, no telemetry.
With this server, agents like Claude Code, Claude Desktop, or Cursor can see the screen (screenshots + UI hierarchy) and act on it (tap, swipe, type, launch apps, read logs, record video) on any device that adb can reach.
You: "Open Settings, turn on dark mode, and show me a screenshot"
Agent: launches the app, navigates by reading the UI hierarchy,
taps the right elements, and returns a screenshot — hands-free.Why another Android MCP?
This project merges the best ideas of two excellent servers into one dependency-light TypeScript implementation:
Inspiration | What was adopted |
App management, uiautomator-based element listing, screenshots, screen recording, orientation control | |
WiFi ADB + mDNS auto-discovery, selector-based taps, wait-for-element, smart default-device selection |
Differences by design:
ADB only. No uiautomator2 server APK on the device, no
mobileclibinary on the host.Zero telemetry. Nothing is phoned home, ever.
Android-first. No iOS code paths to carry around.
Agent-friendly errors. Failures return actionable messages that tell the agent what to try next.
Related MCP server: Mobile Device MCP
Requirements
Node.js 18+
Android platform-tools (
adb) — auto-detected fromANDROID_HOME,~/Library/Android/sdk(macOS), or%LOCALAPPDATA%\Android\Sdk(Windows), withPATHas fallbackAn Android device with USB debugging or wireless debugging enabled, or a running emulator
Installation
git clone https://github.com/qalvinahmad/android-mcp.git
cd android-mcp
npm install
npm run buildClaude Code
claude mcp add android -- node /path/to/android-mcp/dist/index.jsClaude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"android": {
"command": "node",
"args": ["/path/to/android-mcp/dist/index.js"]
}
}
}Cursor / other MCP clients
Any client that speaks MCP over stdio works the same way: run node /path/to/android-mcp/dist/index.js as the server command.
Environment variables (all optional)
Variable | Purpose |
| Default device id used when a tool call omits |
| Set to |
| Android SDK location, used to locate |
Device selection
Every tool accepts an optional device parameter. When omitted, the server resolves the target in this order:
ANDROID_MCP_DEVICEenvironment variableThe only online device, if exactly one is connected
The first physical device (USB or WiFi preferred over emulators)
android_list_devices also auto-connects wireless-debugging peers advertised via mDNS (adb mdns services) when the device list is empty — devices on the same network appear without any manual adb connect.
Capabilities — 26 tools
Device management
Tool | Description | Key parameters |
| List connected devices with name, Android version, connection type (usb/wifi/emulator), and state. Auto-discovers mDNS wireless peers. | — |
| Connect over WiFi ADB. Port defaults to 5555. |
|
| Model, Android version, SDK level, screen size, orientation, battery level, foreground app. |
|
App management
Tool | Description | Key parameters |
| List installed apps that have a launcher activity. |
|
| Launch an app by package name. |
|
| Force-stop a running app. |
|
| Install an APK, optionally granting all runtime permissions. |
|
| Uninstall an app. |
|
Screen observation
Tool | Description | Key parameters |
| Screenshot returned inline as an image the agent can see. |
|
| Screenshot saved to a local |
|
| UI hierarchy: element type, text, accessibility label, resource id, focus/clickable state, and center tap coordinates. |
|
| Poll until an element appears — use instead of fixed sleeps for dynamic content. | selector, |
Interaction
Tool | Description | Key parameters |
| Tap at pixel coordinates. |
|
| Find an element by selector and tap its center. Waits up to | selector, |
| Double-tap at coordinates. |
|
| Long-press at coordinates. |
|
| Directional swipe from screen center or from given coordinates. |
|
| Drag and drop between two points. |
|
| Type into the focused field (ASCII), optionally clearing it first and/or submitting with ENTER. |
|
| Press a key: |
|
| Open an http(s) URL in the default browser. |
|
| Expand the notification shade. |
|
System
Tool | Description | Key parameters |
| Force portrait/landscape (disables auto-rotate). |
|
| Start background screen recording (max 180 s, Android limit). |
|
| Stop recording, pull the |
|
| Read recent logs with buffer selection ( |
|
Element selectors
android_tap_element and android_wait_for_element accept any combination of:
Selector | Matching |
| Exact visible text |
| Substring of visible text, case-insensitive |
| Full id ( |
| Substring of accessibility label, case-insensitive |
| Full class ( |
Usage examples
Prompts you can give an agent once the server is connected:
"List my devices and take a screenshot of the current screen."
"Open the Settings app and toggle dark mode."
"Install ~/Downloads/app-release.apk with all permissions granted, launch it, and check logcat for errors."
"Fill in the login form: tap the field with resource id
email, typeuser@example.com, then tap the Login button.""Record the screen while you walk through the onboarding flow, then save the video to my desktop."
"My Flutter app crashed — read the crash buffer and tell me why."
How it works (spec)
┌──────────────┐ stdio (JSON-RPC / MCP) ┌─────────────┐ adb CLI ┌─────────────┐
│ MCP client │ ◄────────────────────────► │ android-mcp │ ◄─────────► │ device / │
│ (Claude, ...) │ │ (Node.js) │ │ emulator │
└──────────────┘ └─────────────┘ └─────────────┘Transport: stdio, stateless — one server process per client session.
Screenshots:
adb exec-out screencap -p, returned as PNG (inline base64 image or file).UI hierarchy:
adb exec-out uiautomator dump /dev/tty, parsed withfast-xml-parser, retried up to 10× when the bridge returns a null root. Elements with no size or no useful text/id are filtered out.Input:
adb shell input(tap/swipe/text/keyevent/draganddrop). Text is shell-escaped; only ASCII is supported byinput text, and non-ASCII input returns an actionable error instead of typing garbage.Recording:
adb shell screenrecordspawned in the background; stop sendsSIGINTto the on-device process (killall -2 screenrecord), waits for the file to finalize, thenadb pulls it.Foreground app detection:
dumpsys activity activities(ResumedActivity, covering both pre- and post-Android-13 formats) withdumpsys window(mFocusedApp) as fallback.Safety rails: package names validated against
[a-zA-Z0-9_.], output paths must be absolute with allowed extensions, URLs restricted to http(s) unless explicitly overridden.
Project layout
src/
├── index.ts entry point — stdio transport
├── server.ts MCP server + 26 tool registrations
├── adb.ts adb discovery/execution, device resolution, WiFi + mDNS connect
└── ui.ts uiautomator dump parsing, selector matching, wait-for-elementDevelopment
npm run watch # rebuild on change
npm run inspector # test tools interactively with MCP InspectorTroubleshooting
Symptom | Fix |
| Install Android platform-tools and/or set |
| Enable USB debugging (or wireless debugging), accept the RSA prompt on the device, check |
Screenshot is black | The screen is off — send |
| The foreground screen is secure (password field, DRM). Use |
Non-ASCII text fails |
|
WiFi connect fails | Ensure wireless debugging or |
Contributing
Issues and pull requests are welcome. Keep changes small and focused:
Fork and create a feature branch.
npm run buildmust pass with no TypeScript errors.Verify against a real device or emulator where possible (MCP Inspector makes this easy).
Describe the behavior change in the PR.
License
MIT © Alvin Ahmad (@qalvinahmad)
Available Tools
26 toolsandroid_connect_wifiConnect WiFi DeviceA
Connect to an Android device over WiFi ADB. Accepts HOST or HOST:PORT (port defaults to 5555). The device must have wireless debugging or 'adb tcpip 5555' enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | Device host, e.g. '192.168.1.3' or '192.168.1.3:5555' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior. It specifies the port default and input format but omits details on connection timeout, error handling, or whether the tool blocks until success. This is insufficient for a connection command.
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, no redundant words. Every sentence provides essential information: the purpose, acceptable input formats, and a prerequisite condition. Highly concise.
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 simplicity (single parameter, no output schema), the description covers the core requirements. It could briefly mention typical usage as a prerequisite for other Android commands, but overall it is sufficiently 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?
Schema coverage is 100%, so baseline is 3. The description adds value by explicitly noting the default port (5555) when not provided, which the schema only implies via examples. This clarifies input semantics 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 ('Connect') and the target ('Android device over WiFi ADB'). It distinguishes itself from sibling tools like 'android_list_devices' or 'android_take_screenshot' by specifying the precise network connection task.
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 mentions prerequisites (wireless debugging or 'adb tcpip 5555' enabled) but does not explicitly guide when to use this tool over alternatives (e.g., USB connection). It lacks exclusions or context on when it is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_device_infoDevice InfoARead-only
Get details of a device: model, Android version, SDK level, screen size, orientation, battery level, and the current foreground app.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'Get' action aligns. The description lists output fields but does not add behavioral context beyond reading. No contradiction detected.
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 that front-loads the purpose ('Get details of a device') and efficiently enumerates the data fields. No redundant or unclear 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?
Given the single parameter with full schema coverage, readOnlyHint annotation, and no output schema, the description sufficiently lists all return values. It could mention that it captures a snapshot of current device state, but current completeness is high.
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 has 100% coverage with a detailed description for the 'device' parameter (including fallback logic). The tool description does not add extra parameter semantics beyond what the schema provides, meeting the baseline.
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 details') and specific resource ('device'), listing exactly which details are returned: model, version, SDK, screen, orientation, battery, foreground app. This distinguishes it from sibling tools like android_list_devices (lists devices) or android_take_screenshot (captures image).
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 retrieving device information but does not explicitly state when to use it versus alternatives (e.g., android_list_devices for device IDs, android_logcat for logs). No 'when-not' or prerequisite guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_double_tapDouble TapB
Double-tap the screen at x,y pixel coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in pixels | |
| y | Yes | Y coordinate in pixels | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits but only states the basic action. It does not mention whether there is any delay between taps, whether the gesture triggers app-specific behavior, or any side effects.
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 unnecessary words. It is immediately understandable.
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 tool with good schema coverage, the description is adequate but lacks context about coordinate system origin (default top-left) and device selection fallback. It does not cover all aspects an agent might need.
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% with descriptions for x, y, and device. The description adds no additional semantic value beyond what the schema provides, so 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 ('double-tap') and the target ('screen at x,y pixel coordinates'). It distinctly differentiates from sibling tools like android_tap (single tap), android_long_press, and android_drag.
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 alternatives. For example, there is no mention that this should be used for double-tap gestures instead of single taps or long presses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_dragDrag And DropA
Drag from one point and drop at another (uses a slow swipe that triggers drag behavior).
| Name | Required | Description | Default |
|---|---|---|---|
| toX | Yes | End X coordinate | |
| toY | Yes | End Y coordinate | |
| fromX | Yes | Start X coordinate | |
| fromY | Yes | Start Y coordinate | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| duration | No | Drag duration in milliseconds. Defaults to 1500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so the description carries the burden. It adds context that the tool performs a slow swipe to trigger drag behavior and mentions a default duration. However, it does not disclose safety, side effects, or whether it is destructive.
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 redundant or unnecessary words. It is front-loaded with the essential action and can be quickly understood.
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 6 parameters (4 required) and no output schema, the description is adequate but minimal. It explains the core gesture but does not cover potential side effects, return values, or prerequisites.
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% with all parameters described in the input schema. The description does not add additional parameter information beyond what the schema already provides.
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 explicitly states the verb 'drag' and the resource 'from one point and drop at another', clearly indicating the specific UI gesture. It distinguishes from sibling tools like 'android_swipe' by noting it uses a slow swipe that triggers drag behavior.
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 drag-and-drop actions but does not explicitly state when to use this tool versus alternatives like android_swipe or android_long_press. No specific contextual guidance or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_install_appInstall AppC
Install an APK file on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| apkPath | Yes | Absolute path to the .apk file on this computer | |
| grantPermissions | No | Grant all runtime permissions at install time (useful for testing) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states 'Install an APK file' without disclosing behavioral traits. It does not mention whether the app is launched after installation, whether existing versions are overwritten, or what happens on failure. Since annotations are empty, the description must carry the full burden, and it fails to do so.
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, which is concise but at the expense of important details. It is underspecified rather than efficiently dense. Every sentence should earn its place, and this one only states the obvious.
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 no output schema and no annotations, the description should provide more context about what happens after install (e.g., return value, error codes). It also lacks any mention of device selection behavior or permission handling, leaving an agent with insufficient information.
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%, so the input schema already describes all parameters (device, apkPath, grantPermissions). The description adds no extra meaning beyond the schema. Baseline of 3 is appropriate because the schema does the heavy lifting, leaving little room for the description to add 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 tool installs an APK file on a device. It uses a specific verb ('Install') and specifies the resource ('APK file'). While it could be more precise (e.g., 'on the connected Android device'), it is unambiguous and distinguishes from sibling tools like 'android_launch_app' or 'android_uninstall_app'.
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 alternatives. For example, it does not mention that the device must be connected, that the APK must exist at the specified path, or that permissions might be needed. There is no mention of prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_launch_appLaunch AppA
Launch an app by package name. Use android_list_apps to find package names.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| packageName | Yes | Package name, e.g. 'com.android.settings' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. Description does not disclose effects (e.g., whether app is brought to foreground, what happens if not found, or any 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?
Two sentences, no fluff. Efficiently conveys purpose and a key usage tip.
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?
Adequate for a simple launch action but lacks return value or error behavior. Since no output schema exists, description could provide more context (e.g., success confirmation).
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 covers both parameters (100% coverage). Description adds no additional meaning beyond the schema's own descriptions, meeting baseline but not exceeding.
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 'Launch an app by package name' with a specific verb and resource, and distinguishes from siblings by referencing android_list_apps.
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?
Explicitly recommends using android_list_apps to find package names, providing clear context. Lacks explicit when-not-to-use guidance, but implied by simplicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_list_appsList AppsARead-only
List installed apps that have a launcher activity (package names).
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds that it filters to apps with a launcher activity, providing useful context. No contradictions with 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 concise sentence that immediately conveys the tool's purpose with no unnecessary 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 simple listing tool with no output schema, the description covers the key aspect (what apps are listed) and mentions output is package names. It could mention edge cases like empty lists but is largely 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 description does not mention the 'device' parameter or provide any meaning beyond the input schema. Schema coverage is 100%, but the description adds no param info.
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 lists installed apps that have a launcher activity, specifying it returns package names. This distinguishes it from siblings like android_launch_app or android_terminate_app.
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 by stating what it does, but does not explicitly mention when to use it versus alternatives or provide any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_list_devicesList DevicesARead-only
List connected Android devices and emulators with name, Android version, and connection type. Auto-discovers wireless-debugging devices via mDNS when the list is empty.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating no side effects. The description adds transparency by disclosing auto-discovery behavior via mDNS and what information is returned, which goes beyond the 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?
Two sentences, front-loaded with the main purpose, no filler. Every word is relevant and concise.
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 no output schema, the description adequately explains the output (name, Android version, connection type) and the auto-discovery behavior. For a simple list tool, this is 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?
There are zero parameters, so the description does not need to add parameter semantics. Baseline 4 applies as the schema coverage is 100% and no params exist.
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 'List' and the resource 'connected Android devices and emulators', and specifies the returned fields (name, Android version, connection type). It also mentions auto-discovery, distinguishing it from sibling tools that perform actions or fetch other info.
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 context on auto-discovery when list is empty, implying when the tool is useful. However, it lacks explicit when-not-to-use or alternative tools, though siblings are distinct so alternatives are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_list_elementsList Screen ElementsARead-only
List UI elements on the current screen with text, accessibility labels, resource ids, and pixel coordinates. Use this to find where to tap. Do not cache this result.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavioral details: it returns coordinates and UI attributes, and warns against caching. This complements the annotations well, though it could mention that the list is of visible elements only.
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, no filler. The first sentence conveys the core capability, and the second adds usage guidance and a critical warning. Every word earns its place.
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 list tool with one optional parameter and no output schema, the description fully covers what the tool returns and how to use it. The warning about caching adds important context.
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?
Since schema description coverage is 100% (the only parameter 'device' is fully described in the schema), the baseline is 3. The tool description adds no further parameter meaning beyond what the schema provides.
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 lists UI elements on the current screen with specific attributes like text, accessibility labels, resource ids, and pixel coordinates. This verb+resource combination distinguishes it from sibling tools that perform actions (tap, type, etc.) or query device info.
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 explicitly says 'Use this to find where to tap,' providing clear usage context. It also warns 'Do not cache this result,' which is important for dynamic screens. While it doesn't explicitly exclude scenarios, the guidance is direct and practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_logcatRead LogcatARead-only
Read recent device logs. Useful for debugging apps (Flutter, React Native, native). The 'crash' buffer contains crash reports.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Number of recent lines to fetch. Defaults to 200. | |
| buffer | No | Log buffer to read. Defaults to 'main'. Use 'crash' for crash reports. | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| filter | No | Only return lines containing this text (case-insensitive), e.g. a package name or 'flutter' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds valuable context about the crash buffer and debugging purpose, complementing the annotations without contradicting them.
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, focused sentences. First sentence states purpose, second adds key detail on crash buffer. No unnecessary 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?
The description covers the core purpose and important parameter usage (crash buffer). It lacks details on output format, but with no output schema and simple log-line output, this is acceptable. Slightly less than ideal for a debugging 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?
Schema description coverage is 100%, with each parameter well-documented. The description does not add significant additional meaning beyond the schema, only emphasizing the crash buffer. Baseline score 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?
Title 'Read Logcat' and description explicitly state the action (read) and resource (device logs). Mentions specific use cases (debugging Flutter, React Native, native) and distinguishes from sibling tools, none of which read logs.
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?
Description provides clear context: useful for debugging apps and mentions the crash buffer for crash reports. However, it does not explicitly state when not to use it or list alternatives among siblings, though no direct alternatives exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_long_pressLong PressC
Long-press the screen at x,y pixel coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in pixels | |
| y | Yes | Y coordinate in pixels | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| duration | No | Press duration in milliseconds. Defaults to 500. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavior but only says 'long-press'. It omits critical details: that it is a touch gesture, that duration is configurable, how it differs from tapping, and side effects (e.g., triggering context menus). This is insufficient behavioral coverage.
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 extremely concise—one sentence with no extraneous text. However, the extreme brevity sacrifices necessary information, making it more under-specified than effectively concise.
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 lack of output schema and annotations, the description is incomplete for a tool with 4 parameters. It does not address return values, error conditions, or prerequisites such as device connectivity, making it insufficient for reliable agentic 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?
Schema description coverage is 100%, so baseline is 3. The tool description adds no additional meaning beyond what's in the schema. It does not explain parameter defaults, constraints, or interactions (e.g., what constitutes a valid coordinate).
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 (long-press) and the resource (screen at coordinates). However, it does not differentiate from sibling tools like android_tap or android_double_tap, which have similar but distinct behaviors.
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 over alternatives, no prerequisites, and no indications of appropriate contexts. The single sentence lacks any usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_open_notificationsOpen NotificationsA
Expand the notification shade to inspect notifications. Use android_list_elements or android_take_screenshot afterwards to read them, and BACK key to close.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it opens the shade and that BACK closes it. With no annotations, the description partially covers behavioral traits but lacks details on preconditions (e.g., lock screen behavior) or side effects.
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 efficient sentences, front-loaded with the main action, followed by actionable workflow guidance. 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 simple tool with one optional parameter and no output schema, the description fully covers what the tool does, how to use it in a sequence, and how to close it. No 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?
Schema coverage is 100% with a well-described device parameter. The description does not add any parameter-level meaning beyond what the schema provides, so baseline 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?
Clearly states the tool expands notification shade for inspection. Distinguishes from siblings like android_list_elements and android_take_screenshot by specifying the workflow order.
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?
Provides clear follow-up steps: use other tools to read notifications and BACK key to close. Implicitly suggests when to use this tool (before reading, after opening) but does not explicitly exclude alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_open_urlOpen URLB
Open a URL in the default browser on the device.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The http(s) URL to open | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It only states what the tool does, not behavioral traits such as whether it waits for the page to load, handles errors, or leaves the browser open. This lack of detail could lead to misassumptions.
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 no unnecessary words. It is front-loaded and efficient, perfect for a simple action.
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 simplicity of the tool and full schema coverage, the description is adequate but lacks contextual details like error handling or typical use cases. It meets the minimum bar for a straightforward 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%, so the baseline is 3. The description adds no extra meaning beyond what the schema already provides for the 'url' and 'device' parameters.
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 (Open), the resource (a URL), and the context (in the default browser on the device). It is specific and distinguishes itself from sibling tools, none of which involve opening URLs.
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 or when not to use it. It does not mention prerequisites (e.g., a browser must be installed), alternatives, or context-specific recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_press_keyPress KeyA
Press a hardware or navigation key. Common keys: BACK, HOME, ENTER, MENU, APP_SWITCH, POWER, VOLUME_UP, VOLUME_DOWN, DELETE, TAB, DPAD_UP/DOWN/LEFT/RIGHT/CENTER. Any Android KEYCODE_* name or numeric keycode also works.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key name (e.g. 'BACK', 'KEYCODE_CAMERA') or numeric keycode | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It describes the action as 'press' but does not detail behavior for invalid keys, device selection fallback (beyond schema), or any side effects. This is adequate for a simple action but lacks depth.
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: first states purpose, second provides examples. Extremely concise 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 simple press tool with no output schema, the description covers the key purpose and valid inputs. It is mostly complete, but could mention device selection behavior (though schema covers it) and error handling.
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%, so baseline is 3. The description adds value by listing common key names and explaining that KEYCODE_* or numeric keycodes work, enhancing understanding beyond the schema's generic 'Key name' description.
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 presses hardware or navigation keys, and provides a list of common keys. This distinguishes it from sibling tools that interact with UI elements (tap, long_press, etc.).
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 hardware keys but does not explicitly state when to use this tool versus alternatives like tapping or long-pressing UI elements. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_save_screenshotSave ScreenshotB
Take a screenshot and save it to a PNG file on this computer.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| saveTo | Yes | Absolute path to save the screenshot to, ending with .png |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so the description must carry the full load of behavioral disclosure. It only states the basic action, omitting details about side effects (e.g., overwriting existing files), permission requirements, or whether the tool modifies device state. This is insufficient for a write operation.
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 is neither verbose nor incomplete. Every word is necessary, and it is front-loaded with the main action. Zero wasted text.
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 simplicity (1 required parameter, no output schema), the description is adequate but minimal. It does not explain the return value or what happens if the file already exists. More detail could improve completeness without redundancy.
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 has 100% coverage and already describes both parameters adequately. The description adds no additional meaning beyond what the schema provides, so it meets the baseline but does not enhance understanding.
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 action ('Take a screenshot') and the outcome ('save it to a PNG file on this computer'). The verb 'Take' and resource 'screenshot' are specific, and the mention of saving to a file distinguishes it from the sibling tool 'android_take_screenshot', which likely captures without saving.
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 like android_take_screenshot. It does not specify prerequisites, context, or exclusion criteria, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_set_orientationSet OrientationA
Set the screen orientation (disables auto-rotate).
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| orientation | Yes | Desired orientation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so description carries burden. It mentions disabling auto-rotate, a key side effect, but does not disclose persistence, scope, or error states.
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?
Single sentence with no redundancy, efficiently conveys the core action and a key behavioral note.
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?
Adequate for a simple setter with full schema coverage, but lacks explanation of success/failure, device connection requirement, or return value expectation.
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% with clear descriptions for both parameters. Description adds no extra 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?
Clear verb 'Set' and specific resource 'screen orientation' with added behavioral detail 'disables auto-rotate'. Unique among sibling tools.
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 vs alternatives, no mention of prerequisites or when not to use. Only states what it does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_start_recordingStart Screen RecordingA
Start recording the device screen in the background. Stop it with android_stop_recording. Max duration is 180 seconds (Android limit).
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| timeLimit | No | Auto-stop after this many seconds. Defaults to 180 (maximum). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. Mentions background recording and 180s limit but does not disclose behavior on reaching timeLimit, ability to start multiple recordings, or side effects like resource consumption.
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, front-loaded with main action, 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?
No output schema; tool starts a background process but does not explain what happens to the recording (e.g., saved automatically? retrieval method?). Missing details on completion signals and side effects.
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%, so baseline is 3. Description adds 'Max duration is 180 seconds' which reinforces schema's maximum constraint but offers no new meaning beyond 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 'Start recording the device screen in the background' and differentiates from siblings by mentioning 'Stop it with android_stop_recording'.
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?
Explicitly tells when to use this tool (to start recording) and how to stop it using android_stop_recording. Does not provide explicit when-not-to-use scenarios but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_stop_recordingStop Screen RecordingA
Stop the active screen recording, pull the video from the device, and save it as an .mp4 file on this computer.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| saveTo | No | Absolute path to save the .mp4 to. Defaults to a temporary file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the main actions (stop recording, pull video, save as .mp4), but with no annotations provided, it lacks additional behavioral context such as file size limits, timeouts, or side effects.
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 extraneous information, front-loading the key verb and resource.
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 description does not mention any return value or output format, which is a gap since there is no output schema. However, the tool is simple and the schema covers parameters well.
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 already documents both parameters. The description adds no extra meaning beyond what is in 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 specifies the action (stop, pull, save) and the resource (active screen recording). It distinguishes the tool from its sibling android_start_recording.
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 there is an active screen recording to stop and retrieve, but does not explicitly state when not to use it or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_swipeSwipe ScreenC
Swipe in a direction. Starts from screen center by default, or from given x,y coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | Start X coordinate. Defaults to screen center. | |
| y | No | Start Y coordinate. Defaults to screen center. | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| distance | No | Swipe distance in pixels. Defaults to ~55% of screen for center swipes, 30% for coordinate swipes. | |
| duration | No | Swipe duration in milliseconds. Defaults to 500. | |
| direction | Yes | Swipe direction |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so description must disclose all behavioral traits. It mentions start location defaults but omits effects of duration, distance, or that it is a touch gesture with release. Incomplete for safe agent use.
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?
Single sentence, direct and to the point. No wasted words, but could be expanded without losing conciseness.
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 6 parameters and no output schema, the description is too sparse. It doesn't explain how parameters interact (e.g., distance vs duration) or what the swipe looks like, leaving gaps for effective 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?
Schema description coverage is 100%, so baseline is 3. The description adds minimal new meaning (start location defaults already in schema). No improvement over 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 tool swipes on a screen, starting from center or given coordinates. It distinguishes from siblings like tap or long press by focusing on directional motion, but doesn't explicitly contrast with drag.
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 swipe versus other gesture tools (drag, tap, etc.). The description lacks context for preferred scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_take_screenshotTake ScreenshotARead-only
Take a screenshot of the device screen and return it as an image. Use android_list_elements first when you need coordinates of UI elements. Do not cache this result.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's 'take a screenshot' aligns. It adds behavioral details: 'return as an image' and 'do not cache', which are not covered by annotations. No contradiction.
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, front-loaded with the action. Every sentence adds value with no fluff.
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 no output schema, the description clarifies the return type (image) and provides a usage hint. It does not mention image format or error handling, but is sufficient for a simple 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?
Schema covers 100% of parameters with a comprehensive description of the 'device' parameter. The description does not add further meaning beyond the schema, 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?
The description clearly states it takes a screenshot and returns it as an image. However, it does not explicitly differentiate from the sibling tool 'android_save_screenshot', which likely saves to a file rather than returning the image directly.
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?
Provides some guidance: 'Use android_list_elements first when you need coordinates' and 'Do not cache this result'. But lacks explicit when-to-use vs alternatives (e.g., android_save_screenshot) and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_tapTap ScreenA
Tap the screen at x,y pixel coordinates. Use android_list_elements to find element coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | X coordinate in pixels | |
| y | Yes | Y coordinate in pixels | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey all behavioral traits. It states the basic action but omits details such as bounds checking, device connectivity requirements, or what happens on invalid coordinates. The schema partially covers the device parameter, but the description adds no extra transparency.
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 extremely concise: two sentences that immediately convey the tool's purpose and a critical usage hint. No wasted words or irrelevant details.
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 tap tool with many sibling tools, the description covers the core functionality and cross-references a related tool. It is adequate but could improve by noting coordinate system origin or potential failure modes, though the schema already details device selection.
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 has 100% coverage with descriptions for all three parameters (x, y, device). The description does not add any additional semantic meaning beyond what the schema provides, so the baseline score 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 clearly states the tool's action: tapping the screen at specific pixel coordinates. It distinguishes from sibling tools like 'android_double_tap' and 'android_long_press' by specifying a single tap, and 'android_tap_element' by operating on raw coordinates.
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 advises using 'android_list_elements' to obtain coordinates, providing a clear workflow for correct usage. It does not explicitly state when not to use the tool, but the advice implies this is for direct coordinate-based tapping rather than element selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_tap_elementTap ElementA
Find a UI element by selector and tap its center. More reliable than coordinate taps for dynamic layouts. Waits for the element to appear (default 5s).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Match by exact visible text | |
| index | No | Which match to tap when multiple elements match (0-based). Defaults to 0. | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| timeout | No | Max seconds to wait for the element. Defaults to 5. | |
| className | No | Match by class name, e.g. 'android.widget.Button' or just 'Button' | |
| resourceId | No | Match by resource id. Short ids like 'btn_login' are auto-expanded using the foreground app package | |
| contentDesc | No | Match by accessibility label / content description (substring, case-insensitive) | |
| textContains | No | Match by substring of visible text (case-insensitive) |
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 waiting behavior (default 5s timeout) but does not explain failure behavior (e.g., exception on timeout, whether it scrolls, or if any side effects occur). For a tap action, this is adequate but could be more transparent.
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 sentences long, front-loaded with the core action, and every sentence adds value. No unnecessary words or redundancy.
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 8 parameters but all are well-documented in the schema. The description does not explain selector priority (e.g., text vs resourceId) or return value. For a simple tap action, it is mostly complete but missing some context on selector combination logic.
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% and each parameter has a clear description. The description adds value by mentioning the default timeout, but otherwise does not provide additional parameter semantics beyond the schema. 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?
The description clearly states the tool finds a UI element by selector and taps its center. It distinguishes from coordinate taps, which is a sibling tool (android_tap). The verb 'tap' and resource 'UI element' are specific.
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 notes it is more reliable than coordinate taps for dynamic layouts and mentions waiting behavior (default 5s). It implies when to use, but does not explicitly state when not to use or name alternatives directly. Sibling android_tap exists but is not cross-referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_terminate_appTerminate AppBDestructive
Force-stop a running app by package name.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| packageName | Yes | Package name of the app to stop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true; description adds 'Force-stop' which aligns. However, it does not disclose additional behaviors (e.g., immediate process kill, no graceful shutdown, impact on app state). Minimal extra value beyond 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?
Single sentence, front-loaded with key action, no redundant words. Highly concise and 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?
For a simple two-parameter tool with destructive annotation and no output schema, the description covers the essential purpose. Minor gap: missing mention that force-stopping is immediate and may lose unsaved data, but overall adequate.
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 parameters have descriptions. The tool description does not add any new meaning or context beyond the schema. Baseline 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?
Description uses a specific verb ('Force-stop') and resource ('a running app') with the method ('by package name'). Clearly distinguishes from sibling tools like android_launch_app and android_list_apps.
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 explicit guidance on when to use this tool vs alternatives (e.g., android_uninstall_app). No when-not or prerequisite conditions. Implied usage only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_type_textType TextA
Type text into the currently focused input field. Tap the field first. ASCII only (adb limitation).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to type (ASCII only) | |
| clear | No | Clear the field before typing (select-all + delete) | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| submit | No | Press ENTER after typing |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses the ASCII limitation and prerequisite, but does not mention potential failures or ADB mechanism.
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 no wasted words, front-loaded with the core action and key details.
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 tool with four parameters and no output schema, it covers the basics but lacks details on edge cases like unfocused fields.
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%, so the description adds no extra meaning beyond what the schema provides; 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?
The description clearly states the tool types text into a focused input field, distinguishes from sibling tap/press tools, and specifies the prerequisite to tap first.
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 a prerequisite (tap first) but does not explicitly state when to use versus alternatives or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_uninstall_appUninstall AppADestructive
Uninstall an app from the device by package name.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| packageName | Yes | Package name of the app to uninstall |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
DestructiveHint annotation already indicates destructive behavior. Description adds no additional behavioral details beyond stating the action. No mention of side effects or data removal.
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?
Single, clear sentence with no unnecessary 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 simple destructive tool with no output schema, the description is sufficient to understand the core action. Could mention return value or confirmation, but not essential.
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%; description adds no extra meaning beyond what is in the schema. The schema already describes device and packageName well.
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 'Uninstall', the resource 'app', and the method 'by package name'. It is distinct from sibling tools like android_install_app or android_terminate_app.
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 vs alternatives, such as android_terminate_app for stopping without removing, or prerequisites like requiring the app to be installed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
android_wait_for_elementWait For ElementARead-only
Wait until a UI element appears on screen. Use this instead of a fixed sleep when content loads dynamically. Returns element info and center coordinates when found.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Match by exact visible text | |
| device | No | Device id (serial or host:port). Optional -- when omitted, uses ANDROID_MCP_DEVICE env or auto-selects the connected device (physical devices preferred over emulators). | |
| timeout | No | Max seconds to wait. Defaults to 10. | |
| className | No | Match by class name, e.g. 'android.widget.Button' or just 'Button' | |
| resourceId | No | Match by resource id. Short ids like 'btn_login' are auto-expanded using the foreground app package | |
| contentDesc | No | Match by accessibility label / content description (substring, case-insensitive) | |
| textContains | No | Match by substring of visible text (case-insensitive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's statement about waiting and returning coordinates adds some behavioral context. But it lacks details on timeout behavior or what happens if the element never appears. Given annotations, 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 short, front-loaded sentences with no wasted words. The first sentence defines the purpose; the second provides usage guidance and outcome.
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 7 parameters and no output schema, the description briefly mentions return types ('element info and center coordinates') but is vague about what 'element info' includes. It also doesn't address edge cases like timeout. Adequate but not thorough.
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%, so the description does not need to explain parameters in detail. It adds no extra meaning beyond the schema, earning the baseline of 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 clearly states the tool waits for a UI element to appear, using specific verbs 'Wait' and 'appears'. It distinguishes from sibling tools like android_tap_element or android_list_elements by focusing on the waiting/observation aspect.
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?
Explicitly advises using this instead of a fixed sleep for dynamic content, providing clear context. However, it does not specify when not to use or list alternatives beyond the implied 'fixed sleep'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct action or resource. While tap and tap_element overlap, their descriptions clarify different use cases for coordinate vs. element-based tapping. Other tools like drag and swipe are clearly differentiated.
All tools follow a strict 'android_' prefix with snake_case action-oriented names. There is no mixing of conventions, and the verb-noun structure is consistent throughout.
With 26 tools, the server is comprehensive but not excessively large. Every tool seems justified for Android device automation, though some could be merged (e.g., tap and tap_element). The count is high but still reasonable.
The tool set covers device connection, UI interaction, app management, screenshots, recording, and logs. Missing operations like file transfer or clipboard access are minor gaps, but core workflows for UI automation are supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server that gives AI agents full vision and control over Android devices via ADB and scrcpy. Supports screenshots, input, apps, UI automation, shell, files, and clipboard.3839187MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that lets AI agents control iOS and Android devices (tap, scroll, type, take screenshots, read UI trees, and run code). Works with multiple devices at the same time.12344MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server designed for Android development, enabling AI assistants to directly control Android devices for screenshots, UI analysis, app management, and more.
- AlicenseBqualityBmaintenanceAn MCP server that allows AI agents to drive real Android devices via adb, capturing screenshots, reading the live UI tree, and performing actions like tap, swipe, and type.13151Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/qalvinahmad/android-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server