android-adb-mcp
Enables AI assistants to see and control an Android phone over ADB, including taking screenshots, reading the UI tree, tapping, swiping, typing, pressing keys, and launching apps.
android-adb-mcp: AI phone control and voice calls
A small Model Context Protocol server that lets an AI assistant (Cursor, Claude Desktop, any MCP client) see and control an Android phone over ADB: take screenshots, read the UI tree, tap, swipe, type, press keys and launch apps. An optional Twilio add-on (planned) will give the assistant a voice to make and answer calls for you.
It is a thin TypeScript wrapper around the adb command-line tool and talks to your client over stdio. Two runtime dependencies: @modelcontextprotocol/sdk and zod.
⚠️ Read the Safety section before you connect a phone you care about. An AI with this tool can do anything you could do by tapping on the screen.
Not affiliated with, endorsed by, or sponsored by Google, Android, or Samsung. "Android" is a trademark of Google LLC.
Demo flow
You: "Open YouTube and search for lo-fi beats."
current_app→com.sec.android.app.launcheropen_app { package: "com.google.android.youtube" }ui_dump→#4 ImageView [clickable] desc="Search" center=980,140 …tap_element { text: "Search" }type_text { text: "lo-fi beats" }, thenkey_event { key: "enter" }screenshotso the assistant can check the result
Related MCP server: scrcpy-mcp
Setup
1. Install ADB (Android platform-tools)
macOS:
brew install --cask android-platform-toolsWindows:
winget install Google.PlatformTools, or download platform-tools and add the folder toPATHLinux:
sudo apt install adb(or the platform-tools zip above)
Check it with adb version.
2. Enable Developer options and debugging on the phone
Settings → About phone → Software information (Samsung) or About phone (Pixel/others). Tap Build number 7 times and enter your PIN.
Settings → Developer options → turn on USB debugging, and/or Wireless debugging (Android 11+).
Samsung: if taps are ignored, check that Auto Blocker (Settings → Security and privacy) is off while you use ADB. On some ROMs (e.g. Xiaomi) you also need USB debugging (Security settings) before input injection works.
3. Connect
USB: plug in the phone, accept the "Allow USB debugging?" prompt, then run adb devices.
Wireless (Android 11+): Developer options → Wireless debugging → Pair device with pairing code. That screen shows an IP, a pairing port and a 6-digit code. The main Wireless debugging screen shows a different connect port.
adb pair 192.168.1.23:41234 123456 # pairing port + code
adb connect 192.168.1.23:37099 # connect portOr ask the assistant to call connect_wifi { host, port, pairing_code, pair_port }.
4. Build and run
git clone https://github.com/GhostFaceModz/android-adb-mcp
cd android-adb-mcp
npm install && npm run build
npm test # smoke test with mocked adb, no phone neededConnect to Grok Bot's computer (remote, over Tailscale)
Let Grok Bot control your phone from its own cloud computer:
Install Tailscale on your phone and sign in. Ask Grok Bot to install Tailscale on its computer and join the same account (you approve the login). Check that each can see the other's
100.x.x.xaddress.Android only allows wireless-debugging pairing from the same local Wi-Fi, so do a one-time USB setup from any PC:
adb devices # accept the prompt on the phone adb tcpip 5555Unplug the phone afterwards.
Ask Grok Bot to connect. It runs:
adb connect <phone-tailscale-ip>:5555and then starts this MCP server with
ADB_SERIAL=<phone-tailscale-ip>:5555.Keep the phone awake on Wi-Fi or mobile data with Tailscale connected. Restarting the phone turns TCP mode off, so repeat step 2 after a reboot.
When you're finished, turn off USB/Wireless debugging and disconnect Tailscale on the phone.
MCP client configuration
Cursor (~/.cursor/mcp.json) / Claude Desktop (claude_desktop_config.json) / any client using the generic mcpServers JSON:
{
"mcpServers": {
"android": {
"command": "node",
"args": ["/absolute/path/to/android-adb-mcp/dist/index.js"],
"env": {
"ADB_SERIAL": "R5CT1234ABC",
"RATE_LIMIT_PER_MIN": "120"
}
}
}
}Restart the client after you edit the config. On Windows, use C:\\path\\to\\dist\\index.js. If adb isn't on the client's PATH, set ADB_PATH.
Environment variables
Variable | Default | Meaning |
| (any) | Comma-separated allowlist of device serials ( |
| off |
|
| off |
|
| Extra package names to treat as sensitive (comma-separated). | |
|
| Maximum tool calls per minute. |
|
| Path to the adb binary. |
Tools
Tool | What it does |
| Connected devices (filtered by allowlist) |
|
|
| PNG screenshot returned as an MCP image |
|
|
| Tap at x,y |
| Swipe x1,y1 → x2,y2 over |
| Hold at x,y for |
| Type into the focused field (printable ASCII; safely quoted) |
| home, back, recents, enter, power, volume_up/down, delete, tab, … or a numeric keycode |
| Launch by package name |
| Installed packages (third-party by default, optional filter) |
| Foreground package |
|
|
| Find an element by text/content-desc or resource-id and tap it |
| Raw |
Every tool except list_devices/connect_wifi takes an optional serial.
Optional: AI voice calls with Twilio (planned)
Status: planned add-on, not built yet. This section explains what it is and how to get ready for it.
What it is
ADB can start, answer and hang up calls on your phone, but Android won't let any app speak into, or listen to, a live SIM call unless the phone is rooted. To give Grok Bot a real voice on calls, you use Twilio, a cloud phone service. Twilio gives you a phone number, and Grok Bot can make and receive calls on it.
What you can do with it
Outbound calls: Grok Bot rings a number and speaks for you, for example to book an appointment or check opening hours.
Inbound calls: Grok Bot answers your Twilio number like a receptionist, takes messages and sends you a summary.
Two-way conversation: it speaks with text-to-speech and hears the caller through Twilio Media Streams with live speech-to-text.
Transcripts and summaries of every call, sent to you in chat.
Call forwarding: forward your SIM to the Twilio number when you're busy, and Grok Bot picks up.
Setup
Create a Twilio account and verify your own number.
Buy a voice-capable phone number. It costs roughly £1 to $1.15 a month, and calls are a few pence or cents a minute.
From the Twilio Console, copy your Account SID and Auth Token.
Give them to Grok Bot as secrets (
TWILIO_ACCOUNT_SID,TWILIO_AUTH_TOKEN,TWILIO_NUMBER). Never paste them into a public repo.Grok Bot runs a small voice bridge (a webhook plus a media-stream server) and points your Twilio number's voice webhook at it.
Optionally, set up call forwarding on your phone so missed calls go to the Twilio number.
Rules and safety
Calls come from the Twilio number, not your SIM.
Many countries, including the UK, US and EU, require you to tell people they're talking to an AI or being recorded. The voice bridge will announce this at the start of each call.
Don't use it for spam, robocalls or impersonation. That breaks Twilio's terms and the law.
Set a spending limit in the Twilio Console.
Safety & risks
This gives an AI model remote control of your phone. It could send messages, buy things, change settings, delete data or read anything on screen. Models make mistakes and can be steered by text they see (prompt injection from a web page, email or notification).
Guardrails in v0.1:
Device allowlist: set
ADB_SERIALso only your chosen device can be controlled.Sensitive-app guard: screenshot, ui_dump, tap, swipe, type and most keys are refused while a banking, payment, wallet, messaging or password-manager app is in the foreground.
open_apprefuses to launch those apps. Detection uses a built-in package list plus keyword matching (bank,pay,wallet,messag, …). It is a best-effort heuristic, not a security boundary. Home/back/recents/power always work, so you can get out of a sensitive app. Override withALLOW_SENSITIVE=1.No raw shell by default:
shellexists only whenALLOW_SHELL=1. Other tools validate their inputs and never run a shell on your computer (adb is invoked withexecFile).Rate limiting: default 120 calls/min.
Logging: every tool call is logged to stderr (your MCP client's log). Typed text is logged as a length only.
Local only: the server has no network code of its own. Screenshots and UI dumps go only to the MCP client that requested them. Whatever your client does with them (e.g. sending them to a cloud LLM) is up to the client. Assume screenshots may leave your machine through your AI provider.
Recommendations: use a spare or test device where possible, keep sensitive apps locked, watch the screen while it runs, and turn off Wireless debugging when you're done.
Roadmap
Live screen streaming via scrcpy
Scroll-until-found / wait-for-element helpers
Unicode text input (via an ADB keyboard IME)
Per-tool confirmation prompts (MCP elicitation)
iOS is not supported (and not planned; there is no ADB equivalent)
License
MIT. See LICENSE.
Available Tools
14 toolsconnect_wifiA
Connect to a device over Wi-Fi. For Android 11+ wireless debugging, pass pairing_code and pair_port (from 'Pair device with pairing code') to pair first.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| port | No | ||
| pair_port | No | ||
| pairing_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It does reveal a non-obvious behavioral trait — that supplying pairing_code/pair_port triggers a pairing step before connecting, with the values sourced from a specific device UI screen. However, it says nothing about authentication requirements, timeouts, retry behavior, or whether pairing persists across connections.
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, and the primary action is front-loaded before the conditional pairing detail. Every clause 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?
No annotations and no output schema, so the description must cover safety and result behavior on its own. It handles the complex pairing path well but omits failure modes, whether pairing is one-time, and what a successful or failed connection returns, which leaves an agent under-informed for a network-mutating call.
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 0%, so the description must compensate, and it does explain the two least obvious parameters (pairing_code, pair_port) and their origin. It adds nothing about host format (IP vs hostname), port, or what happens when pairing fields are omitted alongside a non-5555 port, leaving roughly half the parameters thinly specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Connect to a device over Wi-Fi'), which is unambiguous against the sibling set of device-control tools like tap, swipe, and screenshot. It does not explicitly contrast itself with any alternative connection method (e.g., USB), but none exists in the sibling list, so the gap is minor.
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?
Gives a clear conditional: for Android 11+ wireless debugging, pass pairing_code and pair_port to pair first. That is actionable when-to-use guidance tied to a specific platform and flow. No when-not guidance or mention of prerequisites such as same-network reachability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
current_appC
Get the foreground app package
| Name | Required | Description | Default |
|---|---|---|---|
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden and it says nothing beyond the one-line purpose. It does not state that this is a read-only query, what happens when no device is connected, or whether it errors versus returning empty — all relevant for an ADB-backed tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero filler — exactly the right size for a one-parameter query tool. It is terse but not vague, so brevity does not cost it here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with a fully documented parameter, the description is minimally sufficient. With no output schema, though, it should at least characterize the return value (e.g., package name string, null when unknown) and the no-device case, which it omits.
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 the single optional 'serial' parameter is fully documented in the schema, including its default-resolution behavior. The description adds no parameter detail, which is acceptable at this coverage level but earns no bonus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('the foreground app package'), so an agent immediately knows the tool returns the currently-active package. It does not, however, reference related siblings like list_apps or ui_dump to disambiguate in a crowded toolset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus list_apps, ui_dump, or open_app, nor any stated prerequisites (e.g., that a connected device is required). The agent must infer usage entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_screen_sizeC
Get screen resolution in pixels
| Name | Required | Description | Default |
|---|---|---|---|
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether the value is physical vs. usable resolution, how rotation/orientation affects the result, or the shape of the return value, so an agent cannot anticipate the output beyond 'some number in pixels'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, front-loaded with the verb and resource. Nothing is wasted, though there is also nothing beyond the minimum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with 100% parameter coverage and no output schema, the definition is minimally viable. It still leaves open what the return value looks like (e.g., width/height pair) and which resolution (physical, usable, orientation-adjusted) is reported.
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 single 'serial' parameter is fully documented in the schema (100% coverage), including its default behavior when omitted. The description adds nothing about the parameter, but per the baseline rule full schema coverage justifies a 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?
States a specific verb and resource ('Get screen resolution') plus the unit ('in pixels'), so the operation is unambiguous. It does not reference any sibling, but none of the siblings (tap, swipe, screenshot, etc.) overlap with this retrieval, so the risk of misselection is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives such as screenshot or ui_dump, and no prerequisites or context (e.g., before computing tap coordinates). Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
key_eventB
Send a key event. Names: home, back, call, endcall, up, down, left, right, center, volume_up, volume_down, power, camera, tab, enter, delete, menu, search, play_pause, mute, recents, app_switch, wakeup, sleep; or a numeric keycode
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden, and it does disclose the accepted key vocabulary and the numeric-keycode fallback, which is meaningful. It says nothing about error behavior for unknown keys, whether the event is blocking, or device-state requirements, so the disclosure is partial.
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?
Purpose is front-loaded in the first four words, and the long value list that follows is functional rather than filler. The semicolon-heavy enumeration reads slightly like a dump, but every token earns its place as valid input.
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 device command with no output schema, the description plus schema covers what an agent needs to construct a call. The remaining gap is behavioral (invalid-key handling, device prerequisites), which matters somewhat given the absence of annotations.
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 only 50%, and the undocumented parameter is `key` — the description compensates by enumerating 25 valid names plus the numeric keycode option, information absent from the schema (no enum). It does not add anything about `serial`, but the schema already documents that one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Send a key event") and enumerates the accepted key identifiers, which makes the tool's scope unambiguous against siblings like tap, swipe, and type_text. It stops short of explicitly naming or contrasting an alternative, so it is clear rather than sibling-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this tool over tap, type_text, or swipe, and no prerequisites (device connected, active app) are mentioned. The key-name list hints at remote-control navigation, but that is value guidance rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsC
List installed packages (third-party by default)
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) | |
| include_system | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one real behavioral fact — that third-party packages are returned by default, so system apps are excluded unless requested — which is useful and not derivable from the schema. However, it says nothing about the requirement for an ADB-connected device, output format, ordering, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scoping detail is placed immediately after the action. It is efficiently sized, though brevity here edges toward under-specification rather than true 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?
For a three-parameter, zero-annotation, no-output-schema tool, the description is too thin. It omits any explanation of the 'filter' parameter, the ADB device dependency implied by 'serial', and what the listing actually returns.
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 only 33%: 'serial' is documented in the schema, while 'filter' and 'include_system' have no descriptions. The parenthetical '(third-party by default)' does explain include_system's default behavior, but 'filter' remains completely unexplained in both schema and description, so the description only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb+resource ('List installed packages') and clarifies the default scope with '(third-party by default)'. It reads distinctly from siblings like list_devices or current_app, though 'packages' versus the tool name 'apps' is a minor terminology wobble.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of alternatives such as open_app (to launch) or current_app (to inspect the foreground app). The agent must infer the context entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesA
List connected ADB devices (filtered by ADB_SERIAL allowlist if set)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose one non-obvious behavioral trait — results are filtered by the ADB_SERIAL allowlist when that variable is set — but says nothing about return shape, error behavior, or whether device state (offline/unauthorized) is included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with the core action front-loaded and the conditional filtering caveat parenthetically appended. No padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, no-annotation, no-output-schema discovery tool, the description covers what is listed and the one environment-dependent modifier. The only gap is the absence of any hint about returned fields, which is minor for this tool type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify; the baseline for a 0-param schema applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: listing connected ADB devices. No sibling tool (list_apps, current_app, ui_dump, etc.) shares this resource, so an agent can route to it without ambiguity.
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?
Usage is only implied: you call this to discover which devices are targetable before running tap/swipe/open_app. There is no explicit when-to-use statement, no mention of alternatives, and no note about behavior when no devices are connected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
long_pressC
Long-press at coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| ms | No | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses nothing about the default 800ms hold, whether the call blocks until the gesture completes, or what side effects (context menus, drag start, selection) the press triggers.
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 single clause is front-loaded and free of filler, so nothing is wasted. But at four words it is under-specified rather than truly concise, leaving essential context for the caller to infer.
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 4-parameter interaction tool with no annotations and no output schema, the description omits the gesture's effect, duration semantics, and device targeting. An agent has to fall back entirely on the schema and prior knowledge of ADB-style long presses.
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 only 25%: x and y have no descriptions at all. The phrase 'at coordinates' weakly implies x/y are screen coordinates, but the description adds no units, coordinate origin, or range information to compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (long-press) and target (coordinates), so the basic action is identifiable. However, it does little to distinguish itself from the sibling tap or tap_element beyond the word 'long', and gives no indication of what a long-press accomplishes on this device.
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 long_press instead of tap, swipe, or tap_element. There is no mention of prerequisites (e.g., needing a connected device) or of the conditions that make a long press the right gesture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_appC
Launch an app by package name
| Name | Required | Description | Default |
|---|---|---|---|
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) | |
| package | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it says nothing about what 'launch' entails (foregrounding an installed app, waiting for startup, behavior on failure, error returned if the package is missing). Only the surface action is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is appropriate in shape. It is arguably too terse for a tool with unannotated side effects, but there is no 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?
No output schema, no annotations, and an undocumented 'package' parameter leave significant gaps: return value, failure modes, device-selection defaults, and whether the call blocks are all unstated. The one-line description is insufficient for this complexity.
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 50%: 'serial' is documented in the schema while 'package' is not. The description partially compensates by clarifying that 'package' means the Android package identifier rather than a display name, but it adds no format examples or constraints, so it is only baseline-plus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Launch an app') plus the identifier type ('by package name'), which clearly separates it from siblings like list_apps and current_app. It does not explicitly name those alternatives, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus current_app or list_apps, and no stated preconditions such as the app needing to be installed or a device being connected. The agent must infer all usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotC
Take a screenshot (PNG)
| Name | Required | Description | Default |
|---|---|---|---|
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses only the PNG format; it does not say whether the image is returned inline, written to a path, or how large/complex screens are handled, nor whether any permissions or a connected device are required.
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 words plus a parenthetical — front-loaded and free of padding. It is arguably under-specified rather than bloated, but as pure conciseness it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, likely read-only capture tool with one optional well-documented parameter, the description is minimally adequate. The PNG hint is useful, but with no output schema the description should clarify the return shape (inline image vs. file path), which it omits.
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 single optional 'serial' parameter is fully documented in the schema (100% coverage, including the default-resolution behavior), so the baseline of 3 applies. The description adds nothing about parameter 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?
States a specific verb+resource combination ('Take a screenshot') and adds the output format (PNG). No sibling tool covers screenshots, so no explicit differentiation is needed, but the description never mentions the device-targeting dimension the sibling set (serial-based ADB tools) implies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool, no prerequisites (e.g., an active device connection), and no mention of alternatives such as ui_dump for structured UI inspection. The agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swipeC
Swipe from (x1,y1) to (x2,y2) over ms milliseconds
| Name | Required | Description | Default |
|---|---|---|---|
| ms | No | ||
| x1 | Yes | ||
| x2 | Yes | ||
| y1 | Yes | ||
| y2 | Yes | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the gesture takes ms milliseconds, but says nothing about whether the call blocks until completion, how duration influences fling/scroll momentum, what happens with out-of-bounds coordinates, or what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the gesture and parameter mapping with zero filler. It is arguably under-specified rather than verbose, which is not a conciseness failure.
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 6-parameter device-input tool with no annotations and no output schema, the description leaves the coordinate system, timing behavior, error cases, and return behavior entirely to guesswork. Only the most literal parameter mapping is covered.
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 only 17% (just serial), but the description compensates by naming x1,y1 as the start point, x2,y2 as the end point, and ms as the duration. It still omits coordinate units, the valid range for coordinates, and that ms defaults to 300 with a 1-10000 bound.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (swipe) and resource (a gesture between two coordinates) with the duration parameter folded in. It is distinguishable from siblings like tap and long_press, though it never names them, and the coordinate space (pixels vs normalized) is left unstated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to prefer swipe over tap, long_press, or a sequence of taps, nor any prerequisite or context about the target screen state. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tapB
Tap at pixel coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It doesn't disclose whether the tap is synchronous, what happens if coordinates are out of bounds, whether serial selection falls back, or what response is returned. Only the coordinate-based nature is conveyed.
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?
Extremely concise and front-loaded: a single clause that states the action and its operand. 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?
Adequate minimum for a simple 3-param gesture tool with no annotations and no output schema. However, for a device-interaction tool it should mention coordinate space, device targeting, and synchronous behavior.
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 33%; only 'serial' is documented in the schema. The description adds no meaning beyond the schema for x/y, but the schema itself already constrains x/y as integers with minimum 0 and documents serial. Baseline 3 for partial coverage where the schema does most of the work.
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+resource: 'Tap' at 'pixel coordinates'. Distinguishes from sibling tap_element (which likely taps by element selector rather than coordinates), though it doesn't explicitly say so.
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 tap vs tap_element, long_press, or swipe. The sibling tap_element is the obvious alternative and isn't mentioned. Usage is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tap_elementA
Find an element by text/content-desc (substring, case-insensitive) or resource-id and tap its center
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | Which match to tap if several | |
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) | |
| resource_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses matching semantics (substring, case-insensitive) and where the tap lands (element center), but is silent on failure behavior when nothing matches, whether it waits/retries for the element, and whether it scrolls to find off-screen elements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the lookup criteria precede the action, which is the right ordering for an agent deciding whether it can use this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a side-effecting UI interaction tool with no annotations and no output schema, the description covers the happy path only. Missing failure/ambiguity semantics (no match, multiple matches beyond the schema's `index` hint, off-screen elements) leave an agent guessing about edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: `index` (match selector) and `serial` (device routing) are documented in the schema, while `text` and `resource_id` are bare. The description compensates for `text` by specifying substring/case-insensitive matching, but leaves `resource_id` matching semantics (exact vs substring) undefined and never explains that `text` and `resource_id` are alternative selectors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (find + tap), the resource (element), and the two lookup keys (text/content-desc or resource-id), plus the tap target (center). It implicitly separates itself from the coordinate-based `tap` sibling but never names it.
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?
Usage is only implied: an agent can infer this tool is chosen when it knows the element's text or resource-id rather than its coordinates, but the description never says when to prefer `tap`, `long_press`, or `ui_dump` instead, nor any prerequisite like the app already being on screen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textB
Type text into the focused field (printable ASCII)
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and adds one genuine behavioral constraint: '(printable ASCII)'. That usefully caps accepted input beyond the schema. However, it omits failure behavior, whether the field is cleared first, and permission/device requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the actionable resource front-loaded and no wasted words. It is efficient, though slightly under-specified rather than optimally informative.
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 input-mutation tool with no annotations and no output schema, the definition is minimally adequate. It covers what the tool does and an input constraint, but leaves prerequisites (field focus) and error handling unaddressed given the absence of structured safety signals.
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 50% (serial is documented, text is not). The description partly compensates by characterizing the text parameter as printable ASCII, adding meaning beyond the schema, but says nothing about the 1000-char maxLength or the serial parameter's role.
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 specific verb+resource: 'Type text into the focused field'. The 'focused field' scope distinguishes it from tap/tap_element, but it never names those siblings or key_event explicitly, so sibling differentiation is only implied.
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 phrase 'focused field' softly implies a prerequisite (something must already be focused) but the description never states when to use this over key_event or tap_element, nor what to do if no field is focused. Usage is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_dumpB
Dump the UI hierarchy as a compact list of clickable/labelled elements with bounds and center coordinates
| Name | Required | Description | Default |
|---|---|---|---|
| serial | No | Device serial (optional; defaults to first ADB_SERIAL entry or the only connected device) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully describes the return shape (clickable/labelled elements with bounds and center coordinates), which is genuine behavioral information. However, it omits whether this is a read-only operation, any performance/pagination characteristics, or device-selection behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and progressively narrows to the output format. No filler 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?
For a no-annotation, no-output-schema tool, the description covers the essential return content (element names, bounds, center coordinates) that an agent needs to use the result. It leaves gaps on device-selection and read-only semantics, but is largely sufficient for a simple dump 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?
One optional parameter (serial) with 100% schema description coverage, so the schema already documents the default-device fallback behavior. The description adds no parameter meaning beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Dump) and resource (UI hierarchy), then further specifies the output content: clickable/labelled elements with bounds and center coordinates. This clearly distinguishes it from screenshot (visual capture) and the interaction tools like tap_element, though no sibling is named explicitly.
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 when-to-use or when-not-to-use guidance is provided. The description never explains how this relates to alternatives like screenshot or tap_element, nor the workflow context (e.g., inspect-then-act). Usage is only inferable from the purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
connect_wifi - First observed
current_app - First observed
get_screen_size - First observed
key_event - First observed
list_apps - First observed
list_devices - First observed
long_press - First observed
open_app - First observed
screenshot - First observed
swipe - First observed
tap - First observed
tap_element - First observed
type_text - First observed
ui_dump
TDQS
Scored across 14 tools
Each tool has a clearly distinct purpose: device listing, app inspection, input actions, screen capture, and UI element interaction are well separated. tap vs tap_element and open_app vs current_app are unambiguous, so an agent can select correctly without confusion.
All names use snake_case, which is readable, but the verb/noun convention is inconsistent: list_devices and get_screen_size follow verb_noun, while screenshot, current_app, key_event, and ui_dump use noun or mixed forms. The set is understandable but not predictably patterned.
14 tools is well-scoped for an ADB/UI-automation server. Each tool covers a distinct operation, and there is no obvious redundancy or filler.
The surface covers device discovery, app inspection, input gestures, text entry, key events, screenshots, and UI hierarchy dumping. Minor gaps exist for app install/uninstall, file transfer, shell commands, and reboot, but core UI automation workflows are supported.
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server for AI dialogue using various LLM models via AceDataCloud
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- FlicenseAqualityDmaintenanceA MCP server that enables AI assistants to control Android devices via ADB, supporting device info, screen control, input simulation, app management, shell execution, file transfer, and UI parsing.20-
- 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.38254 npm122MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that wraps Android ADB functionality into AI assistant tools, enabling device management, shell execution, file operations, app management, media capture, and log analysis via natural language.20 npm2MIT
- AlicenseAqualityDmaintenanceAn MCP server that gives AI agents full control of Android devices and emulators through plain ADB — no companion APK, no extra daemon, no telemetry.2617 npm4MIT