Skip to main content
Glama

droidpilot

An MCP server for driving an Android emulator from an LLM agent, built to be fast and to not mislead the agent about what is on screen.

  • UI tree from uiautomator2 (on-device server, ~30 ms per dump), compressed into a short numbered element list (~20x smaller than the raw XML).

  • Frames and touch through the Android Emulator's own gRPC endpoint: a 108 px frame in ~2 ms, a 540 px screenshot in ~8 ms, and multi-touch gestures (pinch, drag).

  • Waits like a person: every action waits until the screen has responded and stopped changing (and until page-load bars are gone), then returns the new element list. One round trip per step.

Real devices work too (everything falls back to uiautomator2); the gRPC fast paths are emulator-only.

Setup

git clone https://github.com/WaziXuan/droidpilot && cd droidpilot
python -m venv .venv && .venv/bin/pip install -e .      # Windows: .venv\Scripts\pip install -e .

Start the emulator with the gRPC endpoint enabled:

emulator -avd <your_avd> -grpc 8554

Register the server with your MCP client, e.g. Claude Code:

claude mcp add droidpilot -- /path/to/droidpilot/.venv/bin/python -m droidpilot

Options (flags or environment variables):

Flag

Env

Default

--serial

DROIDPILOT_SERIAL

only connected device

adb serial

--grpc

DROIDPILOT_GRPC

127.0.0.1:8554

emulator gRPC address, '' to disable

--min-interval-ms

DROIDPILOT_MIN_INTERVAL_MS

300

minimum gap between actions

--transport / --port

stdio / 8765

streamable-http keeps one server (and its handles) alive across clients

Related MCP server: mobile-use-mcp

What the agent sees

package: com.android.settings  elements: 12  keyboard: shown (covers y>=1517)
[e1] ImageButton "Back" @(63,219) 126x147 click
[e2] EditText "dark" #open_search_view_edit_text @(529,220) 807x126 click,long,edit,focused
[e5] LinearLayout "Dark theme | Display" @(540,414) 1080x214 click
[e6] Switch #switch_widget @(944,414) 188x214 click,unchecked
[e11] LinearLayout "Bedtime mode" @(540,1549) 1080x214 click,under-keyboard
[e12] Key "Search" @(994,2196) 161x156 click,ime-action

[handle] Class "label" #resource-id @(center) WxH flags. Handles are valid for the latest list only. The list leaves out status-bar icons, keyboard keys (except the action key), items scrolled under a toolbar or out of their container, slivers too thin to tap, page-sized click targets, and wrappers that repeat their child. The header adds loading while a spinner or page-load bar is visible.

Tools

Tool

observe(screenshot=False)

element list, optionally with a screenshot

screenshot(width=540)

JPEG of the screen

tap(target) / long_press(target)

target is a handle (e7) or x,y device pixels

tap_text(text, exact=False)

tap the best element whose label matches

swipe(start, end, duration_ms, hold_ms)

hold_ms > 0 makes it a drag

scroll(direction, target, distance=0.6, fling=False)

pages overlap by default

pinch(zoom, target)

two-finger zoom in/out (gRPC)

type_text(text, clear=False)

into the focused field; any Unicode

press_key(key)

back, home, recent, ...; enter taps the keyboard's action key

rotate(orientation)

portrait / landscape / reverse_*, by turning the device

wait_for(text, resource_id) / wait_idle()

wait for an element / for loading to finish

app_launch, app_stop, app_current, app_list

app management

status()

backends in use

Action tools return the settled element list (observe_after=True), with how long settling took.

Design notes

Measured on an x86_64 Android 14 emulator (software rendering) on a Ryzen 7 7800X3D:

Operation

Median

gRPC frame, 540 px wide

8 ms

gRPC frame, full size

32 ms

uiautomator2 hierarchy dump

30 ms

adb exec-out uiautomator dump

136 ms

adb exec-out screencap

238 ms

type_text (accessibility set-text)

~300 ms

uiautomator2 send_keys (clipboard paste)

~2.8 s

uiautomator2 app_current() vs dumpsys

5.1 s vs 35 ms

  • Settling. Dumping the hierarchy blocks while an app animates (~0.5 s per dump mid-transition), so settling polls tiny frames and dumps once at the end. A tap's ripple happens inside the tapped element and is not the response: a cold-started screen can sit still for ~0.4 s between ripple and transition, so only changes outside the touched element count. Settling continues while a progress bar is indeterminate or advancing (browser page loads), and stops for static gauges.

  • Typing uses the accessibility set-text action: no clipboard (which raises the Android 13+ clipboard overlay), no switching the user's input method, and the app's text watchers still fire.

  • Submitting. Search boxes often ignore KEYCODE_ENTER; press_key enter taps the keyboard's action key, found in the keyboard's accessibility tree. KEYCODE_SEARCH is not used: it opens the Google app.

  • Scrolling pauses the finger before lifting so lists move by the requested distance instead of flinging past items.

  • Rotation. uiautomator reports coordinates for the current display rotation. On the emulator, touch events always use natural (unrotated) coordinates, while gRPC frames come in the orientation of the emulator's body, i.e. its window. Frames are turned by (display − body) quarter turns, which matched uiautomator2's own screenshots in all nine combinations tried, and touch points are mapped to natural coordinates. The rotation comes from each hierarchy dump at no extra cost.

  • The window stays upright for whoever is watching. When the display rotates without the body (an app locking landscape, or a forced rotation setting), the content would show sideways in the emulator window. droidpilot then turns the emulator's body to match, as a person turns the phone to watch a landscape video. rotate likewise turns the body instead of forcing a system setting; if the app refuses the new orientation, the body is turned back. Disable with --no-follow-rotation.

  • Loading bars are waited out for at most 2 s once the picture is still (pages often keep a bar up for a resource that never arrives); the element list still says loading, and wait_idle waits for as long as you allow.

  • Pacing. A minimum gap between actions (300 ms) keeps taps from landing on half-drawn screens.

Limitations

  • Content without accessibility information (games, canvas, some WebViews) needs screenshot.

  • The gRPC endpoint is unauthenticated on localhost; don't expose it.

Development

pip install -e .[dev]
pytest                                         # offline tests for the element list
python scripts/bench.py                        # latency of each backend
python scripts/settle_trace.py "540,1355"      # frame-by-frame response to a tap
python scripts/mcp_call.py observe             # call tools like an MCP client
python scripts/gen_proto.py                    # regenerate gRPC stubs from proto/

License

MIT. proto/droidpilot/_proto/emulator_controller.proto and the generated stubs come from the Android Emulator and are Apache-2.0; see LICENSE.

Available Tools

18 tools
app_currentC

Foreground package and activity.

NameRequiredDescriptionDefault

No parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations and no output schema, the description carries the full disclosure burden, yet four words do not say what format the result takes (package string, activity string, object), what happens on the home screen or when no app is foreground, or whether any permission is needed. It adds only minimal behavioral information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is certainly terse and front-loads the key noun phrase, but the terseness crosses into under-specification: it is a fragment rather than a complete sentence stating what the tool does or returns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-arg query tool with no annotations and no output schema, the description should at minimum state that it returns the current foreground package and activity and what the shape of that result is. It gestures at the content but leaves the return format and edge cases entirely unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is trivially complete, so there is nothing for the description to clarify here. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The phrase 'Foreground package and activity' names the exact resource and implies a read of the currently active app, but it is a noun fragment with no verb, so the agent must infer that the tool returns the current foreground package/activity rather than setting it. It is distinguishable from siblings like app_list or app_launch by implication only, not by any explicit statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives such as app_list (installed apps) or observe (screen state), and no stated preconditions. The agent gets only a topic, not a routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_launchB

Launch an app by package name (see app_list).

NameRequiredDescriptionDefault
packageYes
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

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, yet it says nothing about what 'launch' means (cold start vs bring-to-front), what happens if the app is already running, whether it blocks, permissions, or failure modes. Only the 'by package name' detail adds anything actionable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler and an inline pointer to the helper tool. It is efficient, though the brevity comes at the cost of the behavioral and parameter detail noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the required parameter is identified. However, for a three-parameter action tool with zero annotation coverage and zero schema descriptions, the definition leaves two parameters and the launch semantics entirely undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters. The description clarifies only that 'package' is a package name discoverable via app_list; 'max_wait_ms' (default 6000) and 'observe_after' (default true) are given no meaning in either the schema or the description, leaving an agent to guess what is waited on and whether observation output is returned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Launch an app') with the key discriminator 'by package name', which separates it from gesture/screenshot siblings. It does not differentiate from the closely related app_stop/app_current lifecycle tools, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(see app_list)' implies you should resolve a package name first, which is useful implied workflow guidance. But there is no statement of when to use this versus app_stop or app_current, no precondition (already running? foregrounded?), and no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_listC

Installed packages, optionally filtered by substring.

NameRequiredDescriptionDefault
containsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full disclosure burden. It implies a read-only enumeration but never states that it is non-mutating, whether system/preinstalled packages are included, whether results are ordered, or whether package-visibility permissions are required - all material for an agent on a device.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the resource comes first and the optional filter second. It is terse to the point of leaving gaps, but nothing in it is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and the tool is simple with one optional parameter. Still, an agent cannot tell from this text whether the listing includes system apps or how results are ordered, which are the remaining things it would need before relying on the output.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, with the single 'contains' parameter left undocumented in the schema, but the description compensates by explaining that it is a substring filter. It does not say what the substring is matched against (package name vs. label) or whether matching is case-sensitive, so the meaning is only partially added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource ('Installed packages') and the operation (listing, carried by the tool name app_list), which is enough to separate it from app_launch, app_stop and app_current. It stops short of explicitly contrasting itself with those siblings, so it is clear but not maximally differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is 'optionally filtered by substring', which describes a parameter rather than when to choose this tool over app_current or app_launch. There is no statement of preconditions, no when-not-to-use case, and no named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_stopC

Force-stop an app.

NameRequiredDescriptionDefault
packageYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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 discloses nothing beyond "force-stop": not whether unsaved state is discarded, whether the app is removed from recents, whether an error is raised for a non-running package, or whether special permissions are needed. The "force" wording hints at an abrupt kill, but that is the only signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded sentence with no filler. It is efficiently written, though the brevity edges toward under-specification rather than optimal concision for a tool with an undocumented parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, but the definition still leaves too much unsaid for a destructive-feeling operation: the package format, failure behavior, and effect on running state are all absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 not. The single required parameter `package` is never explained – an agent gets no hint that it expects a package identifier such as com.example.app rather than an app display name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Force-stop an app" pairs a specific verb (force-stop, not merely stop) with a clear resource (app), so the action is unambiguous. It does not differentiate itself from siblings like app_launch or app_current, leaving the agent to infer that this is the inverse of launching.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 app_launch or a graceful stop, no preconditions (must the app be running?), and no stated consequences. Usage is only implied by the verb itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

long_pressC

Press and hold an element handle or "x,y".

NameRequiredDescriptionDefault
targetYes
hold_msNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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 and adds almost nothing. It doesn't say whether the call blocks, what 'observe_after' triggers, whether the hold is interruptible, or what side effects a long press produces (context menus, drag initiation).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no waste and the essential resource front-loaded. The brevity is efficient but leans into under-specification rather than earned concision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, but for a 4-parameter interaction tool with zero annotation coverage the definition leaves timing, waiting, and post-action observation behavior unexplained. An agent cannot confidently set hold_ms or observe_after from this text.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 only clarifies the 'target' format ('element handle or "x,y"'). The three optional parameters (hold_ms, max_wait_ms, observe_after) remain entirely undocumented in both schema and description, leaving their semantics to guesswork.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb ('press and hold') and the accepted target forms ('an element handle or "x,y"'), which is more specific than the bare name. It doesn't explicitly contrast with the sibling 'tap', which is the key ambiguity, so it stops short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose long_press over tap, tap_text, or swipe, and no preconditions stated. The agent must infer that this is the 'hold' variant purely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

observeB

List interactive and labelled elements on screen with handles. Optionally attach a screenshot.

NameRequiredDescriptionDefault
widthNo
screenshotNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description must carry the full behavioral burden. It does disclose the payload content (interactive and labelled elements plus handles), which is meaningful, but omits that this is a read-only/non-mutating operation, anything about cost or latency, and whether the returned handles remain valid across subsequent calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with the purpose front-loaded and the optional behavior second. No filler, no repetition of the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema the description does need to describe return content, and it does in brief (elements with handles). But the role of handles, the meaning of width, and whether this is a safe read are all absent, leaving the definition only partly sufficient for a tool that sits at the core of an automation loop.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 for both parameters. It only accounts for 'screenshot'; the 'width' parameter (with its non-obvious 540 default) is never mentioned, leaving an agent unable to judge what width affects in the captured image or in the coordinate space.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: 'List interactive and labelled elements on screen with handles', which is distinct from the sibling 'screenshot' that returns an image. It never names a sibling explicitly, so differentiation is inferable rather than stated, keeping it below 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Optionally attach a screenshot' implies the common pattern of inspecting and capturing in one call, and the mention of handles implies this precedes tap/tap_text. However, it gives no explicit when-to-use-vs-screenshot rule and no prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pinchA

Two-finger pinch: zoom "in" or "out", centred on a handle/"x,y" or the screen centre. Emulator gRPC only.

NameRequiredDescriptionDefault
zoomYes
targetNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the burden; it does disclose the emulator-only constraint and the centering behavior (handle, "x,y", or screen centre), which is meaningful context beyond structured fields. It stays silent on timing/observation behavior such as max_wait_ms and observe_after, leaving a gap for a gesture tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that front-loads the gesture and effect, followed by the constraint. Every clause contributes information; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the gesture semantics plus target formats are covered. But for a 4-parameter gesture tool with no annotations, the unexplained timing/observation parameters leave it short of fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate: it usefully clarifies that zoom takes 'in'/'out' and that target accepts a handle or "x,y" with screen-centre fallback. The remaining two parameters (max_wait_ms, observe_after) receive no explanation, so compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific gesture (two-finger pinch) and its effect (zoom 'in' or 'out'), which clearly differentiates it from single-finger siblings like swipe, scroll, and tap. It lacks an explicit contrast statement to those siblings, keeping it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Emulator gRPC only' note is a useful precondition, and the zoom framing implies when to reach for it versus swipe/scroll. However, it never explicitly says when not to use it or names alternatives for zooming, leaving usage to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

press_keyB

Press a key: back, home, recent, delete, tab, volume_up, volume_down, power, or any KEYCODE_ name. "enter" (also "search"/"go"/"send"/"done") presses the on-screen keyboard's action key when the keyboard is shown, which is what submits most search boxes and chat inputs.

NameRequiredDescriptionDefault
keyYes
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, yet it says nothing about side effects, whether pressing power/delete is disruptive, or what the observable result is. The only behavioral insight is the keyboard-action-key explanation, leaving the mutation/safety profile and the effect of the wait/observe parameters undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core key list front-loaded and the special-case explanation following. The parenthetical alternatives are slightly dense but each adds real disambiguation value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Key value semantics are covered thoroughly and an output schema exists so return values needn't be described. But with no annotations and two unexplained optional parameters, the definition doesn't fully arm an agent to invoke it with non-default wait/observe behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across three parameters, and the description only adds meaning for 'key'. The optional max_wait_ms and observe_after parameters are completely undocumented in both schema and description, so an agent must guess at their units and effect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Press a key') and enumerates the accepted key names, including the special 'enter'/'search'/'go' family, so an agent knows exactly what the tool targets. It stops short of differentiating from siblings like type_text or tap, which is why it falls short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a useful conditional rule for the 'enter' variant ('when the keyboard is shown, which submits most search boxes and chat inputs'), which is genuine when-to-use guidance. However, it gives no guidance on when to choose press_key over type_text, tap, or tap_text, nor any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rotateA

Turn the device to "portrait", "landscape", "reverse_portrait" or "reverse_landscape", like a person turning the phone. The display only follows if auto-rotate is on and the app allows it; check the orientation in the returned header.

NameRequiredDescriptionDefault
max_wait_msNo
orientationYes
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does useful work: it discloses that rotation is a request that may silently not take effect, and tells the agent to confirm by reading the `orientation` header. It does not explain what max_wait_ms or observe_after do behaviorally, which limits it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and its values, then the one behavioral caveat that matters. The "like a person turning the phone" analogy is slightly decorative but clarifies direction semantics rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the description still notes the header field worth checking. However, for a 3-parameter tool with 0% schema coverage, the two timing/observation parameters are left undefined, which an agent needs to set sensibly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% with three parameters, so the description must compensate. It does this well for `orientation` by supplying the allowed values the schema omits, but `max_wait_ms` and `observe_after` remain entirely undocumented, leaving a meaningful gap for a tool where observe_after likely controls post-rotation capture.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Turn the device') plus the exact set of accepted values ('portrait', 'landscape', 'reverse_portrait', 'reverse_landscape'), and the phone-turning analogy fixes the meaning unambiguously. No sibling in the list (tap, swipe, screenshot, etc.) overlaps, so an agent can route here without checking schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Sets clear preconditions for effective use: the display only follows if auto-rotate is on and the app permits it, and the agent should verify via the returned header. There is no competing alternative tool to exclude, so the lack of explicit "use X instead" wording is not a real gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotA

Current screen as JPEG, scaled to width px wide (the device is usually 1080 wide; scale coordinates back).

NameRequiredDescriptionDefault
widthNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose the output format (JPEG), the default device width (1080), and the important behavioral consequence that coordinates derived from the image must be scaled back. It omits whether the full screen or a cropped region is captured, and any size/rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly packed sentence: what is returned, how it is sized, and the practical implication for coordinates. Nothing is wasted and the return format is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only capture tool with no output schema, the description covers the essentials: format, sizing, and coordinate mapping. A brief note on screen coverage or how it differs from sibling visual tools would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain the single parameter, and it does: 'width' is the target pixel width, with the note that the device is usually 1080 wide and that coordinates must be scaled back. That adds meaning well beyond the bare integer schema and default of 540.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete resource and result: 'Current screen as JPEG', so an agent knows immediately this captures a visual snapshot. It does not explicitly distinguish itself from the sibling 'observe' tool, which likely also returns screen state, leaving some ambiguity about which to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the note about scaling coordinates back hints that this tool is used to locate elements before tapping. There is no explicit statement of when to use this versus 'observe' or when to prefer text-based element lookup over a pixel screenshot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scrollA

Scroll "down" (reveal content below), "up", "left" or "right", within a scrollable handle or the whole screen, by about distance of its height/width so consecutive pages overlap. fling=True lets the list coast further (faster for long lists, but items can be skipped).

NameRequiredDescriptionDefault
flingNo
targetNo
distanceNo
directionYes
duration_msNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full disclosure burden and does add real behavior: the scroll is page-sized with deliberate overlap, and fling introduces coasting that can skip items. It does not disclose what happens if no scrollable element exists, nor how timing/waiting parameters affect blocking or observation, leaving notable gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly packed sentences with the action and its scoping stated first and the fling trade-off immediately after; every clause carries information. Minor noise from quoting the direction names adds little, but the text is otherwise economical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. For a seven-parameter gesture tool with zero annotation coverage, the description covers the core action semantics and the main behavioral trade-off, which is enough for an agent to call it correctly; the undocumented timing params are defaults that rarely need changing. This is adequate rather than exhaustive, but nothing critical to a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 partially does: direction, distance (fraction of height/width), fling, and the handle-vs-screen notion of target are all given meaning. Three parameters — duration_ms, max_wait_ms, and observe_after — get no explanation at all, so roughly half the surface remains undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (scroll) with its four directions and scopes it to either a scrollable handle or the whole screen, so the resource and action are unambiguous. It does not explicitly differentiate itself from the sibling gesture tools such as swipe, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is clear conditional guidance for one parameter: fling=True is recommended for long lists but warns that items can be skipped, which is useful trade-off guidance. However, there is no statement about when to use scroll versus swipe, or when a scroll is inappropriate (e.g., nothing scrollable on screen).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusC

Which backends are in use, screen size and pacing.

NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It implies a read-only informational call via the listed fields, but never states that it is non-mutating, whether it requires an active session/device connection, or what the payload looks like beyond three named items. For a zero-annotation tool that is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single short phrase with no wasted words, but the fragmentary style leaves the action ('reports/returns') unstated and the three listed items are not clearly framed as return values. Brevity here edges toward under-specification rather than efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless diagnostic tool with no output schema, naming the three returned items is minimally sufficient. It does not indicate whether the list is exhaustive (e.g., also device/session state) or the format of values like 'pacing', so an agent cannot fully predict the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate beyond what the empty schema already shows. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description lists the content of the report ('which backends are in use, screen size and pacing'), which distinguishes it from the action siblings like tap or screenshot. However, it is a noun-phrase fragment with no verb ('Returns...' / 'Reports...'), so the operation itself 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when an agent should call this versus the other diagnostic siblings (observe, app_current, app_list). No prerequisites or exclusion conditions are given, leaving the agent to infer that this is a setup/debugging probe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

swipeC

Swipe from start to end (handles or "x,y"). Set hold_ms > 0 to press first, i.e. drag.

NameRequiredDescriptionDefault
endYes
startYes
hold_msNo
duration_msNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full disclosure burden. It explains the hold_ms press-then-drag behaviour, but says nothing about duration, timing/wait semantics, or that this performs a real input action on the device with 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the core action front-loaded and no filler. The trailing 'i.e. drag' is slightly redundant given the hold_ms explanation but costs little.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, but for a 6-parameter gesture tool with no annotations and zero schema coverage, half the parameters (duration, wait, observe) and the side-effect profile are left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 6 parameters, and the description only adds meaning for start, end (accepted formats) and hold_ms. duration_ms, max_wait_ms and observe_after remain undocumented anywhere, so compensation is only partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Swipe from `start` to `end`', with the coordinate format clarified. It is clearly distinguishable from tap, long_press and pinch, though it does not explicitly contrast with the sibling 'scroll'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated; the note that 'hold_ms > 0' turns the swipe into a drag gives one concrete condition for choosing behaviour. There is no explicit guidance on when to prefer scroll, pinch or long_press instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tapC

Tap an element handle ("e7") or device coordinates ("540,1200").

NameRequiredDescriptionDefault
targetYes
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden for an action that mutates UI state, yet it discloses nothing about blocking behavior, what max_wait_ms bounds, or what observe_after=true actually does after the tap. The default observe_after=true is a meaningful behavioral trait (it presumably captures a post-tap state observation) that the description leaves entirely unexplained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the two accepted input forms front-loaded and no filler. It is well-formed but so terse that the terseness trades away needed detail rather than achieving efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described, and the target formats are covered. However, for a state-changing interaction tool with zero annotations, silence on timing/waiting and the observe-after behavior leaves the agent guessing about side effects and post-call state.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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. It clarifies only the required target parameter's accepted formats and says nothing about max_wait_ms (units, what it waits for) or observe_after (what gets observed and returned). Two of three parameters remain semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a concrete verb ("tap") and states the two accepted target forms with literal examples ("e7" for an element handle, "540,1200" for coordinates). That is enough to distinguish it from sibling tap_text, which presumably taps by visible text rather than handle or coordinates, though the distinction 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use tap versus tap_text, long_press, or swipe, and no prerequisites or failure conditions are stated. The target format examples hint at usage but do not constitute when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tap_textC

Tap the first element whose text (or content description) contains text.

NameRequiredDescriptionDefault
textYes
exactNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full behavioral burden. It discloses that matching is substring-based and that the first match is tapped, but it says nothing about failure when no element matches, timeout behavior, whether tapping mutates state, or what observation follows the tap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a single front-loaded sentence with no redundant wording. It is concise and easy to parse, though its brevity contributes to gaps elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has four parameters with no schema descriptions and no annotations, and the description covers only the matching semantics of one parameter. The output schema means return values need not be described, but the missing timeout, exact-match, observation, and failure behavior leave the definition substantially incomplete for a UI interaction tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description needs to explain the four parameters. It adds useful meaning for 'text' by clarifying substring and content-description matching, but it does not explain 'exact', 'max_wait_ms', or 'observe_after' at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'Tap', and a specific target: the first element whose text or content description contains the supplied text. This clearly distinguishes it from coordinate-based 'tap' and text-entry 'type_text'. It does not explicitly name sibling alternatives, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, no exclusions, and no comparison with siblings such as 'tap' or 'wait_for'. Usage is only implied by the tool name and the one-sentence behavior statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

type_textB

Type into the focused field (tap the field first). Unicode is fine. clear=True replaces existing text.

NameRequiredDescriptionDefault
textYes
clearNo
max_wait_msNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose useful traits: focus requirement, Unicode acceptance, and that clear=True replaces rather than appends. It says nothing about what max_wait_ms or observe_after do behaviorally, nor about typing into non-editable targets, which is a meaningful gap for an unannotated mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and its precondition, with zero filler. Every clause conveys actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the core action and clear semantics are covered. But half the parameters are unexplained and there is no failure-mode context (no focused field, non-editable target), which is thin for a four-parameter interaction tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 only explains text and clear. The two timing/observation parameters (max_wait_ms, observe_after) get no meaning at all from either schema or description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Type into the focused field') and distinguishes itself from a plain tap by noting the field must be focused first. It does not explicitly name the tap_text sibling it competes with, so routing still requires inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The parenthetical '(tap the field first)' gives a concrete precondition for use, which is genuine when-to-use guidance. However, it never states when to prefer this over tap_text or what to do if no field is focused, leaving the main alternative unaddressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_forC

Wait until an element whose label (text or content description) contains text, and/or with resource id resource_id, appears.

NameRequiredDescriptionDefault
textNo
timeoutNo
resource_idNo
observe_afterNo

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and leaves out the most consequential details: what happens when the timeout elapses (exception, false, silently continue), whether the tool polls, and what observe_after actually toggles. It only states the waiting condition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler, which is the right size for a simple wait primitive. The 'and/or' construction is the one piece of wording that costs clarity rather than saving space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, for a blocking/conditional tool with zero annotation coverage and no documented parameters, the definition is missing timeout semantics and the effect of observe_after, which an agent needs before calling it reliably.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for all four parameters. It adds real meaning for `text` ('label ... contains', matching text or content description) but says nothing about `timeout` (units, default 5, failure mode) or the non-obvious `observe_after` boolean.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('wait until ... appears') plus the matching criteria (label text or resource id), which is enough to distinguish it from wait_idle in the sibling list by inference. It stops short of explicitly naming that sibling or stating that no other tool blocks on a specific element.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to prefer this over wait_idle or observe, nor on what to do if the element never appears. The 'and/or' phrasing also leaves the agent unsure whether both criteria are ANDed or ORed when both are supplied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_idleA

Wait until the screen stops changing and nothing is loading (use when the element list says loading, e.g. a web page still coming in), then return the element list.

NameRequiredDescriptionDefault
max_wait_msNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden: it discloses that the call blocks until idle and yields an element list, which is genuinely useful. However, it never says what happens on timeout — whether it returns the list anyway, raises, or returns a partial/stale list — which is the single most important behavior for a waiting tool that has a max wait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with the condition front-loaded before the parenthetical example and the return value. Efficient, though the nested parenthetical slightly interrupts the core instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be spelled out, and the description correctly says it returns the element list. But for a blocking tool with a user-configurable timeout, the absence of any timeout or failure-mode statement leaves a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter max_wait_ms, and the description never mentions it at all. The timeout parameter is exactly the semantics that needs explanation (whether exceeding it causes failure or a best-effort return), so the description fails to compensate for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (wait) with a precise termination condition (screen stops changing, nothing loading) and what it returns (the element list). The trigger phrase 'when the element list says `loading`' cleanly separates it from immediate-observation siblings like observe or screenshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit entry condition tied to observable state ('loading' in the element list, e.g. a page still coming in). It does not name alternatives such as wait_for or explain when to prefer a fixed wait over this idle-based wait, so the exclusion side is left to inference.

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.

  1. 18 tool updatesv0.1.0
    • First observedapp_current
    • First observedapp_launch
    • First observedapp_list
    • First observedapp_stop
    • First observedlong_press
    • First observedobserve
    • First observedpinch
    • First observedpress_key
    • First observedrotate
    • First observedscreenshot
    • First observedscroll
    • First observedstatus
    • First observedswipe
    • First observedtap
    • First observedtap_text
    • First observedtype_text
    • First observedwait_for
    • First observedwait_idle

TDQS

B3.2/5.0

Scored across 18 tools

Disambiguation4/5

Each tool has a distinct action: observation (screenshot/observe), input (type_text, press_key), gestures (tap, tap_text, long_press, swipe, scroll, pinch), waiting, and app lifecycle. Minor overlap exists between screenshot and observe (which can attach a screenshot) and between swipe and scroll, but descriptions clearly delineate when to use each.

Naming Consistency4/5

Names are uniformly lowercase snake_case with an `app_` prefix grouping the package-management tools and verb_noun forms like type_text, press_key, wait_for, long_press. A handful of bare single-word names (screenshot, observe, tap, status) deviate from the verb_noun pattern but remain unambiguous.

Tool Count4/5

18 tools is slightly on the heavy side but each maps to a needed mobile-automation primitive (perception, gesture input, waiting, app control, device state). No tool appears redundant enough to drop outright.

Completeness4/5

Core lifecycle is well covered: observe/screenshot for perception, tap/type/swipe/pinch/press_key for interaction, wait_for/wait_idle for synchronization, and app_launch/stop/current/list for app management. Gaps exist around clipboard/paste, deep-link or URL opening, and notification/shell access, but agents can work around most of these via existing tools.

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables AI agents to interact with Android devices through visual UI element detection and automated interactions. Provides comprehensive Android automation capabilities including touch gestures, text input, screenshots, and video recording via uiautomator2.
    12
    4
    -
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to automate Android and iOS devices, including emulators and physical devices, by capturing screenshots, reading UI accessibility trees, performing touch and text input, and managing app lifecycle and logs.
    18
    4
    MIT