DroidPilot
Provides tools to control an Android device via ADB and UIAutomator, enabling AI agents to interact with native apps—tapping, typing, swiping, taking screenshots, and reading UI elements.
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., "@DroidPilotLaunch Clock app, wait for 'Alarm', then screenshot"
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.
DroidPilot
Drive an Android phone over ADB + UIAutomator and expose it to an AI agent over MCP — Playwright-style, for native-app user testing.
The idea: while you build an Android app with Claude Code on your computer, that same Claude can drive your phone to run the user tests — tap, type, read the screen, and assert outcomes — by calling DroidPilot's tools over MCP. DroidPilot is the hands and eyes; Claude is the brain.
Claude Code (your computer, the test agent)
│ MCP (stdio)
▼
DroidPilot MCP server ──► adb / UIAutomator ──► Android phone (USB)
tap · type · swipe · screenshot · dump UI · wait · assertRequirements
Python 3.10+
adb (Android platform-tools) on PATH or under
ANDROID_HOME/the default SDKA phone with USB debugging enabled and authorized (unavoidable for controlling taps — unlike screen mirroring, driving the device needs adb)
Related MCP server: adb-mcp-server
Install
pip install -e . # from a clone
# or: pip install git+https://github.com/LioMatthys/droidpilotUse it three ways
1. With Claude Code (the point) — MCP
Register the server once:
claude mcp add droidpilot -- droidpilot-mcp
# (equivalently: claude mcp add droidpilot -- python -m droidpilot.mcp_server)Then just ask Claude Code, e.g.:
Plug-in check: my phone is connected. Test that Beam (
life.overture.beam) shows a 6-digit code after I start sharing. Launch it, start sharing, accept the capture prompt, and confirm a code appears — screenshot the result.
Claude will call screen / screenshot to see the phone, tap_text / type_text to
act, and assert_text to verify — running the test like a human would.
2. As a CLI (manual / smoke testing)
droidpilot devices
droidpilot launch life.overture.beam
droidpilot screen # list on-screen elements
droidpilot tap-text "Start sharing"
droidpilot screenshot out.png
droidpilot assert-text "Code"3. As a Python library (scripted tests)
from droidpilot import Device
dev = Device(); dev.connect()
dev.launch_app("life.overture.beam")
dev.wait_for_text("Beam", timeout=15)
dev.tap_text("Start sharing")
dev.assert_text("Code")
dev.screenshot("beam.png")See examples/test_beam_flow.py.
MCP tools
Tool | What it does |
| connected devices + state |
| start/stop an app |
| compact text list of on-screen elements (label, tap point, id) |
| PNG of the current screen (visual inspection) |
| tap by coordinates or by element text |
| type into the focused field |
| back / home / enter / … or a raw |
| up / down / left / right |
| wait for an element to appear |
| pass/fail check that text is on screen |
|
|
screen() (cheap text) + screenshot() (image) give the agent both a structured and a
visual view; it usually picks targets from screen() and uses tap_text.
Limits (v0.1)
One device at a time (pass a serial to target a specific one).
System dialogs are localized — "Start now" vs "Démarrer maintenant". The agent reads the screen, so it adapts; scripted tests should match your device locale.
No video recording yet; screenshots only.
type_textescapes spaces/specials foradb shell input; exotic Unicode may not type.
Why not Appium/Maestro?
Both are great, but heavier (a server + drivers, or YAML flows). DroidPilot is a thin, agent-shaped surface: a handful of tools an LLM can call directly, built on the same ADB/UIAutomator primitives Google ships. Use Appium/Maestro for big scripted suites; use DroidPilot when you want Claude to test the app for you.
Available Tools
13 toolsassert_textA
Assert that an element containing text is on screen. Raises if absent.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must bear the burden. It discloses key behavior (raises if absent), which is essential for a mutation-like assertion. However, it doesn't mention return value or side effects, though for an assertion tool this may be sufficient.
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, clear and front-loaded. 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 1-param assertion tool with output schema present (though not shown), the description is largely complete. It covers the core behavior, though it could mention the return type or success 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 0% (no descriptions in schema). The description adds meaning by stating 'element containing text', but lacks details like case sensitivity, exact match vs substring, or whitespace handling. Partially compensates but not fully.
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 clearly states the verb (assert), resource (element containing text on screen), and behavior (raises if absent). It distinguishes from sibling tools like tap_text and wait_for_text by focusing solely on presence check.
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 implies the tool is for checking presence, but lacks explicit guidance on when to use vs alternatives like wait_for_text. No when-not or prerequisites mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_appA
Launch an app by its Android package name (e.g. 'life.overture.beam').
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description discloses the basic behavior (launching an app) but does not detail side effects, error conditions, or permission 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 sentence that front-loads the purpose and provides an example. 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 parameter and no annotations, the description is sufficient for an agent to understand the core function. However, it does not describe the output or error states.
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 adds value by explaining that 'package' is an Android package name and providing an example. This compensates for the lack of schema 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 action ('Launch an app') and the resource ('by its Android package name'), with a concrete example. It distinguishes from sibling tools like 'stop_app' which are about different operations.
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 or when not to use this tool. The usage is implied but no alternatives or exclusions are mentioned.
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 Android devices and their state (device/unauthorized/offline).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must cover behavioral traits. It does not mention whether the tool is read-only, requires permissions, or any performance implications. As a listing operation, it's likely safe, but the lack of explicit disclosure reduces 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 a single sentence with no superfluous words. It is front-loaded with the verb and resource, directly conveying the tool's purpose.
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 has zero parameters and an output schema exists, the description is complete. It specifies the output includes device state with enumerated possibilities, leaving no ambiguity for the agent.
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 no parameters, so the description cannot add meaning beyond the schema. However, the description implicitly covers the tool's scope (all connected devices) which is sufficient. Baseline 4 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 (List), the resource (connected Android devices), and the information provided (state with specific enum values: device/unauthorized/offline). It effectively distinguishes the tool from sibling interaction tools like tap or screenshot.
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 when to use the tool (when needing to know connected devices and their states), but provides no explicit guidance on when not to use it or alternatives. For a simple listing tool, this is adequate but not exceptional.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyA
Press a key: back, home, enter, tab, delete, menu, app_switch, or a raw KEYCODE_*.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It states the action (press) but does not disclose side effects, return behavior, or what happens on invalid input. The behavior is straightforward but not fully 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 a single, concise sentence that front-loads the action and lists examples. 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?
For a simple tool with one parameter and an output schema (exists but not shown), the description provides adequate context. It could mention expected output briefly, but the action is clear enough for an agent to use correctly.
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 one parameter 'key' has no schema description (0% coverage). The description compensates by listing valid values (back, home, etc.) and mentioning raw KEYCODE_*, adding crucial meaning beyond the empty 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's purpose: press a key. It lists specific keys (back, home, etc.) and includes raw KEYCODE_*, distinguishing it from sibling tools like tap or swipe that touch the screen.
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 listing keys but does not explicitly guide when to use this tool versus siblings like tap or type_text. It lacks context on alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenA
Return a compact text list of the on-screen elements (label, tap point, id). Cheaper than a screenshot; use this to choose what to tap.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states it's a compact text list and cheaper than screenshot, which are important behavioral traits. Could mention if it's a live snapshot or requires permissions, but sufficient for a simple read 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?
Two concise sentences, front-loaded with purpose and key benefit. Every word adds value, 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 parameters and an output schema (not detailed), description is fairly complete: it states what it returns and its use. Could add more about output format or integration with sibling tools, but is 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 has zero parameters, baseline score is 4. Description adds no parameter info, but none needed.
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 clearly states it returns a compact text list of on-screen elements with label, tap point, and id. Distinguishes itself from screenshot by noting it's cheaper and used to choose what to tap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'use this to choose what to tap', guiding the agent to use it before tapping. Contrasts with screenshot but does not explicitly mention alternatives like assert_text or tap_text, though context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Capture the current screen as a PNG so you can visually inspect it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It indicates a non-destructive read operation (capturing a screenshot) without modifying device state. However, it could explicitly state that it is read-only or mention any potential side effects like requiring permissions.
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 wasted words. It is front-loaded with the action and format, making it efficient for an AI agent to parse.
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 there are no parameters, no required fields, and no output schema, the description adequately covers what the tool does and why. The agent can correctly infer how to invoke it (no arguments needed) and what to expect.
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 no parameters in the input schema, so the description adds value by specifying the output format (PNG) and the use case. With 0 parameters, baseline is 4, and the description meets that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'capture', the resource 'current screen', the format 'PNG', and the purpose 'so you can visually inspect it'. It distinguishes itself from sibling tools like tap or type_text, which perform different actions.
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 visual inspection of the screen is needed, but does not explicitly state when to use this tool versus alternatives like screen_size or assert_text. No exclusions or when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_sizeA
Return the device screen size as 'WIDTHxHEIGHT'.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the return format but does not disclose any potential side effects, error conditions, or that the tool is read-only. The behavior is minimal enough to be inferred, but transparency is lacking.
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 key information. Every word is necessary, with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and a simple output (with an existing output schema), the description is complete enough. It explains the return format explicitly.
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, and schema coverage is 100%. The description does not need to add parameter information. Baseline 4 is appropriate for no 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 tool returns the device screen size in a specific format 'WIDTHxHEIGHT', which is a specific verb+resource. It distinguishes from siblings like screenshot or screen which have different purposes.
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 does not provide explicit guidance on when to use this tool versus alternatives. Usage is implied as a simple getter, but no context on prerequisites or exclusions is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_appC
Force-stop an app by package name.
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description bears full responsibility. It labels the action as 'force-stop' but does not disclose system effects, permissions required, or side effects on app data.
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 short (one phrase) with no wasted words. While it could be more structured, it is efficient for a single-parameter 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?
Despite having an output schema (not shown), the description does not explain return values or prerequisites. For a destructive action like force-stopping an app, the description lacks necessary contextual completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the parameter 'package' is only described as 'by package name'. No format or example is given, though the hint is minimally helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'force-stop' and resource 'app' with the method 'by package name'. It clearly states the tool's function and distinguishes it from siblings like 'launch_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 versus alternatives, nor any prerequisites or exclusions. The description only states what it does, not when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swipeA
Swipe up, down, left, or right from the center of the screen.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It does not disclose swipe duration, distance, whether it triggers events like scrolling, or any effects. The start point is specified but other behavioral traits are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no extraneous information. Every word is necessary and directly conveys the tool's function.
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 the presence of an output schema (which presumably documents return values), the description is minimally adequate. However, it lacks any mention of use cases, relationships to other tools, or constraints like supported screen contexts.
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 parameter 'direction' has 0% schema description coverage, but the tool description lists the valid values (up, down, left, right), which the schema does not provide as enums. This adds essential meaning beyond the bare property name.
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 action (swipe) and the possible directions (up, down, left, right) with a specific starting point (center of the screen). This clearly distinguishes it from sibling tools like tap or type_text, which involve different gestures.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as tap or scroll gestures. The description does not specify scenarios (e.g., scrolling menus, dismissing cards) or exclude irrelevant contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tapC
Tap at absolute screen coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It fails to mention whether tap is a single click, long press, or other action, nor any prerequisites 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. However, its brevity sacrifices necessary detail, so it scores average for 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?
The tool is simple but the description is incomplete: it does not cover coordinate system, behavior type, or any edge cases. An output schema exists but does not compensate for missing parameter semantics.
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%, yet the description adds no meaning to parameters x and y beyond 'absolute screen coordinates'. No details on units, range, or coordinate origin are provided.
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 'Tap at absolute screen coordinates' clearly states the action (tap) and the target (screen coordinates), distinguishing it from sibling tools like swipe or tap_text.
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 tap versus alternatives like tap_text, swipe, or wait_for_text. The description lacks context for decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tap_textA
Tap the first element whose text/description contains text
(set exact=True to match the whole label).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| exact | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses that tapping is on the first match and supports exact matching, but does not mention error handling, waiting behavior, or what happens if no element is found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no extraneous information. Every word serves a purpose.
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-by-text tool, the description covers the core functionality and parameters. It is mostly complete, though it could mention waiting or scrolling behavior. An output schema exists, so return values don't need description.
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 explains both parameters: 'text' is for substring matching, and 'exact' changes to exact match. This adds valuable meaning beyond the schema, which only provides names and types.
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 (tap) and the target (first element whose text/description contains the given text). It distinguishes from sibling tools like 'tap' (which taps at coordinates) and 'type_text' (which types).
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 tapping based on text content but does not explicitly state when to use this tool over alternatives like 'tap' or 'assert_text'. No when-not or alternative naming is provided.
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 currently focused field.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It discloses operation on 'currently focused field' but does not specify behavior when no field is focused, text overflow, or special character handling. Adequate but minimal.
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 and target. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool and existence of an output schema, the description is minimally complete. It mentions the critical precondition ('focused field') but omits prerequisites, error conditions, or how the text is entered (e.g., character by character). Some gaps remain.
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%. The description does not add meaning beyond the schema: it only implies the parameter is the text to type. No details on format, encoding, or constraints.
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 clearly states the action ('Type text') and the target ('the currently focused field'). It distinguishes from sibling tools like 'tap_text' (tap on text) and 'press_key' (press a key).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like 'assert_text' or 'tap_text'. The description does not explain prerequisites or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_textC
Wait until an element containing text appears (up to timeout seconds).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses waiting up to timeout seconds, but fails to state behavior on timeout (error or return value) or polling frequency. With no annotations, this gap is significant for a blocking 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?
Single 10-word sentence with main action front-loaded and timeout appended in parentheses. Every word is necessary; excellent 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?
Given no annotations and presence of output schema, the description is incomplete: no return value, no timeout error behavior, no polling details. Insufficient for a core waiting tool among 12 siblings.
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 has 0% description coverage; description mentions 'text' and 'timeout' but does not clarify text matching (exact/partial) or timeout units/format. Adds minimal meaning beyond field names.
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 that the tool waits for an element containing text, with a verb-resource structure. It distinguishes from siblings like assert_text (assertion) and tap_text (interaction), but lacks explicit timeout failure 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?
No guidance on when to use versus alternatives (e.g., assert_text) or on prerequisites. The description implies usage for waiting before interaction, but does not specify conditions or exclusions.
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. Dates show when Glama detected each change.
13 tool updates
v0.1.0- First observed
assert_text - First observed
launch_app - First observed
list_devices - First observed
press_key - First observed
screen - First observed
screen_size - First observed
screenshot - First observed
stop_app - First observed
swipe - First observed
tap - First observed
tap_text - First observed
type_text - First observed
wait_for_text
TDQS
Each tool has a distinct, non-overlapping purpose: text assertion, app launch, device listing, key press, element retrieval, screenshot, screen size, app stop, swipe, coordinate tap, text tap, text typing, and wait. No two tools could be confused for the same action.
Most tools follow a verb_noun pattern (assert_text, launch_app, tap_text, etc.). However, 'screen' and 'screenshot' are nouns used as commands, and 'swipe' is a bare verb, introducing minor inconsistency.
13 tools cover the essential operations for Android device automation without being excessive. Each tool addresses a specific need, and the scope aligns well with the server's purpose.
The tool set covers core interactions (launch, stop, tap, type, swipe, screen inspection, waiting, assertion). Missing features like orientation control, clipboard operations, or scroll, but these are not critical for basic automation.
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
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Melaya is a remote MCP server. It gives an assistant hands on your own Android phone and browser: it reads the screen through the accessibility tree, then taps, types and navigates inside the apps and sites you allow-list, with no per-app API. It also builds, schedules and runs agent pipelines across 6k+ connected tools. OAuth 2.1, nothing to install.
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.
Give AI agents real phone numbers, messages, and voice calls via MCP.
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.3839191MIT
- AlicenseNot gradedqualityDmaintenanceEnables MCP-compatible agents to control an Android device over the network via ADB, providing tools for shell commands, screen capture, UI inspection, file operations, and input simulation.13MIT
- AlicenseAqualityCmaintenanceAn MCP server that gives AI agents full control of Android devices and emulators through plain ADB — no companion APK, no extra daemon, no telemetry.2617MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that enables AI agents to control Android and iOS devices via natural language, using platform tools like adb and simctl.6,61346Apache 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/LioMatthys/droidpilot'
If you have feedback or need assistance with the MCP directory API, please join our Discord server