Skip to main content
Glama

adb-mcp

An MCP server that drives Android emulators and devices over adb

Website Release CI Go MCP


Boot an AVD, screenshot, read the UI hierarchy, tap/swipe/type, set a device lock, read logcat, run Gradle builds and tests. 80 tools, from Claude Code, Cursor, VS Code, or any MCP client over stdio.

It is the Android counterpart to XcodeBuildMCP, built on the official Go MCP SDK.

describe_ui → tap_on_text → screenshot, driven live against a real emulator (emulator-5556), showing the actual tool calls and their actual output.

Android is a trademark of Google LLC. adb-mcp is an independent, unofficial tool built for Android and is not affiliated with, sponsored, or endorsed by Google. The Android robot above is reproduced/modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

Why

Driving Android by hand means a long runbook of raw adb commands, and it is easy to get wrong (stale tap coordinates, CRLF-corrupted screenshots, forgetting exec-out, guessing coordinates off a downscaled image). This server bakes that knowledge into its tools, so the agent doesn't have to relearn it:

  • Screenshots use exec-out screencap (no CRLF corruption) and are auto-downscaled so the image reader accepts them.

  • describe_ui returns each element's center in true device pixels (so taps land where you mean them to, no guessing off the image) and retries the transient "could not get idle state" failure on its own.

The workflow itself ships as readable resources the agent can pull up mid-task (the observe→act loop, native PIN/lock handling, crash triage, see below) instead of relearning them each session.

Related MCP server: Playwright MCP

Getting started

1. Prerequisites

  • Android SDK with platform-tools (adb) and emulator. The server finds it via $ANDROID_HOME / $ANDROID_SDK_ROOT, else the platform default (~/Library/Android/sdk on macOS). If your MCP client launches the server without those set, pass --sdk /path/to/sdk in the client config's args (the server then exports it, so Gradle finds the SDK too). doctor prints the location it resolved.

  • At least one AVD (create one in Android Studio's Device Manager).

Go is not required: releases ship prebuilt binaries, and it's only needed to build from source.

2. Install

On macOS/Linux:

curl -fsSL https://raw.githubusercontent.com/iksnerd/adb-mcp/main/install.sh | sh

The script (install.sh) picks the right archive for your OS/architecture, verifies its SHA-256 against the release's checksums.txt, and installs to ~/.local/bin (override with BIN_DIR=...; pin a version with VERSION=v0.24.3).

Prefer to grab the binary yourself? Every platform's archive (macOS, Linux, and Windows, amd64 and arm64) is on the Releases page, each with a checksum in checksums.txt. On Windows, download the windows_amd64 or windows_arm64 zip and put adb-mcp.exe somewhere on your PATH.

Once installed, stay current with the built-in updater. It fetches the latest release, verifies its checksum, and swaps the binary in place:

adb-mcp update

The registration below launches the server by the bare name adb-mcp, so it must be on your $PATH (which adb-mcp should resolve; the installer warns if ~/.local/bin isn't on it). Otherwise point the client at the absolute path to the binary instead.

3. Register with your MCP client

Claude Code:

claude mcp add adb -- adb-mcp

(When working inside this repo itself, the bundled .mcp.json is picked up automatically, no registration needed.)

Or install as a plugin, which registers the server and adds a skill per driving guide:

claude plugin marketplace add iksnerd/adb-mcp
claude plugin install adb-mcp@adb-mcp

Register the server one way, not both. claude mcp add and the plugin each register it, under different names (adb and plugin:adb-mcp:adb), so using both gives a session two copies of all the tools and no clear one to call. If you added it with claude mcp add and then install the plugin, remove the first (claude mcp remove adb).

For Codex, the same plugin ships in Codex's manifest shape:

codex plugin marketplace add iksnerd/adb-mcp
codex plugin add adb-mcp@adb-mcp-plugins

The Claude plugin starts the server with node, which downloads the build for your machine from the GitHub release on first run and checks it against a pinned SHA-256, so it needs Node on your PATH but not step 2. The Codex plugin still expects adb-mcp on your PATH from step 2. What the plugin runs and sends is in docs/PRIVACY.md.

Cursor / VS Code: one-click install (assumes adb-mcp is on your PATH from step 2):

Any other client (Windsurf, Codex, …): run adb-mcp over stdio. The usual config shape:

{
  "mcpServers": {
    "adb": { "command": "adb-mcp" }
  }
}

To confirm it's wired up, ask your agent to "boot an emulator and take a screenshot".

From source (Go 1.26+)

The module pins toolchain go1.26.10; a Go 1.26 install downloads that patch itself the first time you build.

make install                 # builds ./bin/adb-mcp and copies it to ~/.local/bin
# or:
go build -o bin/adb-mcp ./cmd/adb-mcp
# or straight from the module (note the /cmd/adb-mcp suffix):
go install github.com/iksnerd/adb-mcp/cmd/adb-mcp@latest

Tools

80 tools across ten areas. Every device-facing tool takes an optional serial (adb -s). Omit it with one device attached, or pass one from list_devices with several. Full reference: docs/TOOLS.md.

  • Emulator / device: boot, list, wait-for-boot, shut down, connect over Wi-Fi, adb_reverse port forwarding (Metro!)

  • Observe: screenshot to see (works on multi-display foldables, pick a panel with display), describe_ui for true-pixel element centers, with the focused top window (spot a biometric prompt, or the wrong app entirely, occluding your target via optional package), filter/query/compact modes, and a hidden-node count so absence is trustworthy; render_stats counts the real view tree and frame health, which the viewport-scoped describe_ui cannot

  • Interact: tap, tap_on_text/tap_element (id-addressed), swipe, drag, long-press, type, key combos, PIN pads, wait, run_sequence (batch steps + guards in one call, which keeps native-timer flows from being perturbed by per-step round-trips); opt-in verify_change tells you whether a tap/key actually changed the UI; opt-in via_accessibility on tap_on_text/tap_element (EXPERIMENTAL) dispatches a real accessibility click for native views a coordinate tap can't reach, see bridge/README.md

  • Lock / Keystore / Biometrics: set/clear a secure lock screen, check lock state, has_biometric_enrolled + fingerprint_touch/finger_remove to satisfy a BiometricPrompt on the emulator

  • Extended Controls (emulator): send_sms (OTP/2FA), phone_call, set_battery (also works on real devices via dumpsys), cellular (roaming/weak-signal/throttled), set_sensor (accelerometer/light/…), rotate_screen, avd_snapshot, driving the emulator's console-only panel that describe_ui can't see

  • App lifecycle: install/uninstall, launch/stop, get_app_details (version and launcher activity of an installed app, or of a local APK via apk_path with no device), app_state (running pid(s) + Metro-vs-embedded bundle), launch_dev_client (Expo dev build → Metro, skipping the Dev Launcher), reload_app/open_dev_menu, clear data, permissions, deep links, push/pull files

  • Logs & capture: one-shot or streaming logcat (substring/priority/tag filters, since time window, opt-in redact to mask tokens/passwords/API keys before output), clear_logcat, last_crash, screen recording

  • Environment & diagnostics: dark mode, mock location, clean status bar, stay_awake (stop a doze-happy screen blanking your screenshots), doctor

  • Gradle build & test: assembleDebug, unit tests, instrumented tests, JVM unit-test coverage via JaCoCo (get_coverage_report/get_file_coverage), task + variant + module discovery (list_gradle_variants/list_gradle_projects), scaffold_android_project, one-shot build_and_run. Builds return a compact summary (status, error count, first errors, APKs) with the full redacted log on disk, and gradle_build background=true plus build_status keep a multi-minute build from holding the call open

  • Session defaults: pin project_dir/serial once (session_set_defaults) so a multi-module/multi-flavor project or multi-device session doesn't need them repeated on every call

The driving know-how itself ships as six MCP resources (android://guide/*) the client can list and read. See docs/TOOLS.md for the URIs, or jump straight to android://guide/driving for the core loop below.

The core loop

observe → locate → act → re-observe. screenshot to see, describe_ui to get true-pixel centers, tap/tap_on_text/swipe/input_text to act, then screenshot again to confirm. Read android://guide/driving for the full loop and the gotchas that waste turns.

Development

make check     # go vet + go test + doc-count check (unit tests need no emulator)
make run       # run over stdio for manual JSON-RPC poking

Layout:

cmd/adb-mcp/main.go        entry: subcommands (update/version) or serve MCP over stdio
internal/tools/            thin MCP tool bindings
internal/adb/              the device layer: an adb.Client whose methods are the commands
internal/gradle/           host-side Gradle: builds (summary, log, background jobs), secret redaction, test and coverage reports
internal/uiauto/           pure uiautomator-hierarchy model + parsing (unit-tested)
internal/sdk/              resolves the Android SDK (adb/emulator paths, PATH env)
internal/concurrent/       RunAll/RunIndexed: fan out independent I/O calls, join, done
internal/guides/           the skill guides, embedded and served as MCP resources
internal/selfupdate/       the `adb-mcp update` release fetch/verify/swap
internal/bridgeupdate/     the `adb-mcp bridge install` release fetch/verify/install

Dependencies point inward only (tools → adb, gradle, uiauto → sdk), and each internal/tools/<domain>.go adapter mirrors an execution file of the same name (device commands are adb.Client methods). Full map, the package graph, and the rules for adding a tool: ARCHITECTURE.md.

Documentation

Contributing

See CONTRIBUTING.md for setup and conventions. Found a security issue? See SECURITY.md instead of opening a public issue. Licensed under MIT.

Available Tools

80 tools
adb_reverseADB reverseA
Idempotent

Forward a DEVICE TCP port to a HOST port (adb reverse) so the emulator/device can reach a server on this machine — the canonical use is tcp:8081 for Metro. CRITICAL for RN/Expo dev clients: if the app can't reach its dev server it may SILENTLY fall back to the embedded bundle and ignore every code edit you make — set this up before a dev-client session, and suspect it whenever edits seem to have no effect (app_state confirms whether the running process is on Metro or the embedded bundle). remove=true undoes the forward.

NameRequiredDescriptionDefault
removeNoRemove the forward for device_port instead of creating it.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
host_portNoTCP port on the HOST to forward to. Defaults to device_port.
device_portYesTCP port on the DEVICE to forward, e.g. 8081 for Metro.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds important behavior beyond that: the silent fallback to the embedded bundle, why this matters before a dev-client session, and how app_state can confirm whether Metro is actually in use.

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?

The purpose is front-loaded and the critical fallback warning is useful context. The long CRITICAL sentence is somewhat verbose, but the overall structure remains clear and each part serves the agent.

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?

For a four-parameter tool with no output schema, it covers purpose, usage timing, failure mode, removal behavior, and the app_state diagnostic path. The input schema covers all parameters, so no critical calling context 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 coverage is 100% and already documents device_port with the 8081/Metro example, host_port defaulting to device_port, serial, and remove. The description reinforces the Metro example and remove=true undo behavior, but adds little meaning beyond the schema.

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?

It states a specific verb and resource: 'Forward a DEVICE TCP port to a HOST port (adb reverse)' and gives the canonical Metro use. This makes clear it is the port-forwarding tool rather than launch/reload/app_state siblings.

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?

It gives explicit timing: set this up before a dev-client session and suspect it whenever edits seem to have no effect. It also says remove=true undoes the forward, though it does not name sibling alternatives or state broader when-not-to-use conditions.

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

app_stateApp stateA
Read-only

Report an app's RUNTIME state: installed?, running?, foreground?, top activity, pid(s), main-process uptime, install/update times, and — for React Native/Expo — whether it is serving a live METRO bundle or its baked-in EMBEDDED one. When it is on Metro it also identifies WHICH dev server: port, pid, and the project root that server is running in. That matters because "metro" does not mean the RIGHT metro — a dev server left running from another checkout still holds port 8081, so the app connects happily and runs that branch's code while this call looks healthy. Pass source_path to get an explicit stale_verdict (stale | current | undetermined) with its reason, never silence. Run this FIRST when JS edits seem to have no effect.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name.
source_pathNoOptional host file or directory containing the app's source. When supplied, app_state ALWAYS returns a stale_verdict (stale | current | undetermined) with the reason — it compares the newest source mtime against the latest Metro/HMR marker, and checks that the dev server the app is connected to is rooted in this same checkout.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, consistent with a pure reporting tool, and the description adds genuine behavioral context: the stale_verdict is always returned ("never silence") when source_path is given, and it explains the failure mode where a stale Metro on port 8081 makes the app look healthy. That said, it does not disclose cost, latency, or side effects of the probe itself.

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?

The core claim is front-loaded and the escalation to source_path/stale_verdict follows logically; every sentence is doing work. It loses a point for rhetorical padding ("'metro' does not mean the RIGHT metro") and for restating the stale|current|undetermined enum that the schema already declares.

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?

With no output schema, the description carries the return-value burden and does so by listing the concrete state fields and the stale_verdict outcome with its cause. For a read-only three-parameter diagnostic, nothing an agent needs in order to decide or 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 coverage is 100%, so all three parameters are already documented, including source_path's mtime-vs-HMR comparison and enum values. The description adds rationale (why source_path matters, what a wrong-Metro checkout looks like) rather than new parameter meaning, so the baseline 3 is appropriate.

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 ("Report") and resource ("an app's RUNTIME state") and then enumerates the exact fields returned: installed/running/foreground, top activity, pids, uptime, install/update times, Metro vs embedded bundle, and the dev-server port/pid/root. The emphasis on RUNTIME implicitly separates it from static siblings like get_app_details or list_packages, so an agent can pick it without opening a schema.

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 trigger: "Run this FIRST when JS edits seem to have no effect," plus a conditional workflow (pass source_path to force a stale_verdict). It does not explicitly contrast with sibling diagnostics such as build_status, get_app_details, or reload_app, so the agent must infer those boundaries.

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

avd_snapshotAVD snapshotA
Destructive

Manage emulator AVD snapshots (adb emu avd snapshot): action=save|load|delete a named snapshot, or list them. Save a known-good state, then load it to reset the device deterministically between runs — faster than a wipe_data cold boot. Emulator-only.

NameRequiredDescriptionDefault
nameNoSnapshot name. Required for save/load/delete; ignored for list.
actionYesOne of: "save", "load", "delete", or "list".
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and openWorldHint=false; the description adds real context beyond that by explaining that load resets the device, i.e. the destruction applies to current device state, and that the tool requires an emulator rather than a physical device. It stops short of stating whether delete is reversible or what happens on a missing snapshot name.

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 tight sentences: purpose and operation list first, then the operational rationale and constraint. No redundant restatement of the title, and every clause carries information.

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?

There is no output schema, and the description does not say what the list action returns or what a successful save/load reports, which is a modest gap for an agent verifying results. Everything needed to choose and invoke the tool correctly is present.

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 100%, so all three parameters and the action enum values are already documented in the schema. The description restates the action values and implies the name argument but adds no format, defaulting, or edge-case meaning (e.g. name collisions on save). Baseline 3 applies when the schema carries the semantics.

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 and resource ("Manage emulator AVD snapshots") and enumerates the exact operations (save|load|delete|list). It also disambiguates from siblings like list_avds, boot_emulator, and shutdown_emulator by scoping to snapshot state and declaring "Emulator-only."

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 a concrete workflow rationale — save a known-good state, then load it to reset deterministically between runs — and contrasts it with the wipe_data cold boot alternative. It does not name a sibling tool explicitly, so selection still requires a small inference step, but the when-to-use guidance is clear.

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

boot_emulatorBoot emulatorA

Boot an AVD by name and return its device serial (e.g. emulator-5554). Launches the emulator detached so it outlives this call, and waits for full boot (sys.boot_completed) by default. Use the returned serial for later tools if you boot more than one device. Booting can take 30-120s on a cold start. If an emulator of this AVD is already running it returns that serial instead of launching a second one; no_snapshot and wipe_data then error, because they cannot apply to a running emulator (stop it with shutdown_emulator first).

NameRequiredDescriptionDefault
avdYesAVD name to boot (see list_avds).
timeout_sNoBoot timeout in seconds. Default 180.
wipe_dataNoFactory-reset the AVD on this boot (-wipe-data). Default false. Use to start from a pristine device.
no_snapshotNoCold boot without loading a saved snapshot. Default true when launching; if the AVD is already running it is ignored unless set true, which errors.
wait_for_bootNoWait until fully booted before returning. Default true.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare openWorldHint=false and destructiveHint=false; the description adds the traits that actually matter: the process is launched detached and outlives the call, it blocks until sys.boot_completed by default, and cold starts take 30-120s. It also discloses the idempotent no-op path and the error semantics for no_snapshot/wipe_data against a live emulator, which usefully qualifies an otherwise understated destructiveHint=false (wipe_data is a factory reset).

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?

Four sentences, front-loaded with the action and return value, then side effects, then the already-running edge case. Every sentence carries operational information; nothing is redundant with the title or schema.

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?

There is no output schema, but the description states what is returned (the serial) and how to use it. Combined with timing expectations, detached-launch behavior, and the already-running error path, an agent has everything needed to call this correctly on the first try.

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 coverage is 100%, so the schema already documents all five parameters and the baseline is 3. The description still adds meaning beyond it: the 30-120s cold-start figure informs how to set timeout_s, and the statement that no_snapshot/wipe_data error when the emulator is already running clarifies interaction rules the schema only partially captures.

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 and resource ("Boot an AVD by name") plus the concrete return value (device serial, e.g. emulator-5554). It also names the related siblings (list_avds for names, shutdown_emulator for stopping), so an agent can distinguish it without opening a schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use context (boot a device, then reuse the returned serial for later tools) and an explicit when-not path: if the AVD is already running it returns that serial rather than launching a second one, and no_snapshot/wipe_data error in that case — with the remedy "stop it with shutdown_emulator first."

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

build_and_runBuild and runA

One-shot build → install → launch: runs Gradle (default task assembleDebug) in project_dir, installs the resulting APK on the device, and launches package. Equivalent to gradle_build + install_app + launch_app in a single call, and it blocks for the whole build. A failed build returns the same summary and full-log path as gradle_build. If several APKs exist under build/outputs (multi-flavor projects, leftover androidTest APKs), the newest non-test one is installed.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).
taskNoGradle task to run. Defaults to assembleDebug.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name to install and launch, e.g. com.example.app.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the annotations (openWorldHint/destructiveHint), disclosing that the call blocks for the entire build, that failures return the same summary and full-log path as gradle_build, and the newest-non-test APK selection heuristic. These are exactly the operational traits an agent needs before committing to a long blocking call.

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?

Four dense sentences, front-loaded with the action chain, then equivalence, then blocking behavior, then the APK-selection edge case. Every sentence carries non-redundant information.

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?

With no output schema, the description covers the failure return shape and the blocking/side-effect profile well. The success return value (e.g. what the install/launch summary looks like) is only implied, which is the one remaining gap for a tool whose output the agent must interpret.

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 100%, so all five parameters are already documented in the schema, including the assembleDebug default. The description reinforces project_dir and package context but adds no new syntax, format, or constraint information beyond what the schema provides. Baseline 3 is appropriate.

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 compound verb chain (build → install → launch) with the exact resource (Gradle task, APK, package) and explicitly names the three sibling tools it replaces. An agent can distinguish it from gradle_build, install_app, and launch_app without opening any schema.

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?

The 'equivalent to gradle_build + install_app + launch_app in a single call' framing tells the agent this is the one-shot path versus composing three calls. It also resolves the ambiguity of which APK gets installed for multi-flavor projects. It stops short of an explicit when-not (e.g. 'use gradle_build alone if you don't want to install'), which keeps it from a 5.

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

build_statusBuild statusA
Read-only

Report a background gradle_build (started with background=true): running with elapsed time, or the final summary (passed/failed, error count, first errors, APK paths, full-log path). Jobs live only as long as this server process.

NameRequiredDescriptionDefault
job_idYesJob id returned by gradle_build with background=true.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered, but the description adds real behavioral value: it enumerates what the terminal summary contains (pass/failed, error count, first errors, APK paths, full-log path) and warns that jobs live only as long as the server process, which tells the agent results can vanish. It does not say what happens when an unknown or expired job_id is supplied.

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 compact sentences, front-loaded with the action and immediately followed by the two possible result states. Every clause earns its place by describing either the trigger, the return shape, or the lifetime constraint.

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?

With no output schema, the description carries the burden of describing returns and does so well by listing both the running state and the final summary fields. The only meaningful omission is error behavior for an invalid or expired job_id, which matters given the stated process-lifetime limitation.

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?

There is a single parameter with 100% schema description coverage, and the schema already says job_id comes from gradle_build with background=true. The description repeats that origin rather than adding format, validation, or expiry semantics, so the baseline of 3 applies.

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 and resource ("Report a background gradle_build") and explicitly scopes it to builds started with background=true, which cleanly separates it from the sibling gradle_build. An agent can distinguish this polling tool from the build-launching tool without opening a schema.

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?

The parenthetical "(started with background=true)" makes the trigger condition clear: use this after launching a backgrounded gradle_build. It stops short of stating the negative case (that foreground builds need no status call, or that repeated polling is expected), so it is clear context rather than full when/when-not guidance.

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

cellularCellularA
Idempotent

Shape the emulated cellular radio (adb emu gsm / network): data and voice registration state (unregistered/home/roaming/searching/denied/off/on), signal strength (0-4), and mobile-data throughput/latency (network_speed like "lte"/"edge" or ":" kbps; network_delay like "umts" or ":" ms). Test offline/roaming/weak-signal and slow-network behaviour deterministically. Every field optional; set at least one. Emulator-only.

NameRequiredDescriptionDefault
dataNoMobile-data registration state: one of unregistered, home, roaming, searching, denied, off, on. Omit to leave unchanged.
voiceNoVoice registration state: one of unregistered, home, roaming, searching, denied, off, on. Omit to leave unchanged.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
signalNoSignal strength 0-4 (0 = no bars, 4 = full). Omit to leave unchanged.
network_delayNoLatency: a named profile (none, gprs, edge, umts) or raw "<min>:<max>" in ms. Omit to leave unchanged.
network_speedNoData throughput: a named profile (gsm, gprs, edge, umts, hsdpa, lte, evdo, full) or raw "<up>:<down>" in kbps. Omit to leave unchanged.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds valuable non-annotation context: the capability is emulator-only, omitted fields are left unchanged (partial-update semantics), and changes are aimed at deterministic test scenarios. It does not explain how to reset the radio afterwards, which would be the last piece of behavioral context.

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?

Purpose and the two main parameter groups are front-loaded, and the trailing sentences carry the testing rationale and the emulator-only constraint. It is dense with parenthetical detail (enum lists, example profile names) that partially duplicates the schema, which keeps it just below a 5.

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 6-parameter emulator-state mutation with full schema coverage and annotations, the description supplies the essential extras: emulator-only scope, partial-update behavior and intended test use. With no output schema, it would benefit from a line on what confirmation or resulting state the caller sees, and on resetting the radio.

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 coverage is 100%, so the per-parameter documentation baseline is 3. The description still adds meaning beyond the schema by stating the cross-field rule that all fields are optional yet at least one must be set, and by explaining that unset fields remain unchanged, which the schema only implies per-property.

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?

The description opens with a specific verb and resource ('Shape the emulated cellular radio') and names the underlying mechanisms (adb emu gsm / network), then enumerates the exact controllable facets: registration state, signal strength, throughput and latency. It is clearly distinguishable from siblings such as phone_call, send_sms, set_battery or set_sensor, which touch different device state.

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?

It gives a concrete usage context ('Test offline/roaming/weak-signal and slow-network behaviour deterministically') and a hard precondition ('Emulator-only'), plus the operational rule 'Every field optional; set at least one'. It stops short of naming alternatives for adjacent device-state tools or stating how to restore defaults, so it is strong but not exhaustive.

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

clear_app_dataClear app dataA
DestructiveIdempotent

Wipe an app's data and cache (pm clear) to reset it to a first-launch state — the fastest way to reproduce onboarding/permission flows from scratch.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name (e.g. com.example.app).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, so the bar is lower; the description still adds real value by stating exactly what is erased (data and cache) and what state the app lands in (first launch). It stops short of noting that login state, permissions, and local databases are irrecoverably lost, which is the main risk an agent should consider.

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 sentence, front-loaded with the action and mechanism, followed by the outcome and the use case. No redundant restatement of the title and nothing wasted.

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 simple two-parameter destructive tool with full schema coverage and no output schema, the description covers action, mechanism, and result state adequately. Only the loss of authentication/onboarding-adjacent state is left implicit, a minor gap given the destructiveHint annotation.

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 100% — both parameters, including the optional serial fallback behavior, are documented in the schema itself. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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?

The description gives a specific verb+resource ('Wipe an app's data and cache'), the underlying mechanism (pm clear), and the resulting state ('first-launch state'). This clearly separates it from siblings like stop_app, reload_app, and uninstall_app, which do not remove stored data.

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?

It provides a concrete usage context: reproducing onboarding/permission flows from scratch. However, it never names an alternative or exclusion — e.g. that uninstall_app or revoke_permission are different choices when you want to remove the app or just drop a grant — so the agent must infer when this is preferable.

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

clear_device_lockClear device lockB
Destructive

Remove the secure lock screen, supplying the current credential as old_value. Use to restore a clean state after testing a Keystore flow.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
old_valueYesThe current credential, needed to clear the lock.

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare destructiveHint=true and openWorldHint=false, and the description is consistent with them by framing this as a removal. It adds that a credential is required and that the operation is meant for post-test cleanup, but it does not say whether the lock can be re-set afterward, what happens on an incorrect credential, or whether any device state is lost — meaningful gaps for a destructive tool.

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 short sentences with the action stated first and the usage hint second — no filler. The phrase about old_value partially restates the schema description, which is the only real redundancy.

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 two-parameter, no-output-schema tool this is close to adequate: the action, the required credential, and the intent are all present. What is missing is the precondition (a lock must currently be set) and the consequence of failure, which matters because annotations flag the call as destructive.

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 100%, so both serial and old_value are already documented in the input schema. The description reinforces old_value as 'the current credential' but adds no syntax, format, or failure semantics beyond what the schema states, so the baseline of 3 applies.

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 and resource: 'Remove the secure lock screen', which an agent can map directly to a state change on the device. It never names the adjacent sibling set_device_lock (which sets the same lock) or is_device_secure, so the agent must infer the distinction from names alone.

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?

'Use to restore a clean state after testing a Keystore flow' supplies one concrete scenario, but it is narrow and reads as a recommendation rather than a rule. There is no statement about when not to call it (e.g. device already unlocked, no lock configured) or that set_device_lock is the counterpart for enabling a lock.

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

clear_logcatClear logcatA
DestructiveIdempotent

Empty the device's logcat ring buffer (adb logcat -c). The sharpest isolation primitive for a press→observe loop: clear, perform ONE action, then logcat — every line you read was caused by that action. Without it, a filter hit may be minutes old and an empty result may just mean the buffer rotated. (For reaching BACK in time instead, use logcat's since param.)

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=true, so the description's job is to say what is destroyed and why it matters; it does that well by explaining that prior log lines become unreachable and that an empty read may otherwise be misread as buffer rotation. It stops short of stating failure modes (no device attached, permission problems) or whether clearing is device-wide across all apps, which would be the remaining useful behavioral detail.

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?

Front-loaded with the action and the adb equivalent, then the rationale, then the alternative — a sensible order with no filler sentences. Minor deduction for editorial framing ('The sharpest isolation primitive') that costs tokens without adding selection information.

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, no-output-schema utility, the definition covers effect, workflow role, and the competing option, which is enough to call it correctly. The only gap is scope detail an agent might want (device-wide vs per-app, behavior with zero attached devices).

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 100% and the single `serial` parameter is already documented there, including the 'optional when exactly one device is attached' rule. The description adds no further meaning about the parameter, so the baseline 3 applies.

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 and resource ('Empty the device's logcat ring buffer') plus the underlying adb command, which disambiguates it from the sibling `logcat` (read) and `start_logcat_capture`/`stop_logcat_capture` (capture lifecycle). An agent can pick this tool without opening the schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use pattern — clear, perform ONE action, then read logcat — and names the alternative for the opposite need ('For reaching BACK in time instead, use logcat's since param'). It also explains why the alternative matters (stale filter hits, rotated buffers), so the routing decision is unambiguous.

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

connect_wirelessConnect wirelessA

Connect to a device over Wi-Fi/TCP (adb connect), optionally pairing first (adb pair) with the 6-digit code from Android 11+ Wireless debugging. Pass host:port; for pairing also pass the pairing address + code shown on the device.

NameRequiredDescriptionDefault
host_portYesDevice address to connect to, host:port (e.g. 192.168.1.42:5555).
pair_addressNoPairing address host:port (Android 11+ Wireless debugging), if different from host_port. Only needed when pairing.
pairing_codeNo6-digit pairing code shown on the device. Provide to pair before connecting.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare openWorldHint=true and destructiveHint=false, so the bar is lower, and the description adds real context: pairing is a distinct prerequisite step that must happen before connecting and requires a code displayed on the device. It does not mention failure behavior (timeouts, unauthorized keys), which keeps it from 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.

Conciseness5/5

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

Two sentences, front-loaded with the core action and followed by the pairing condition and argument guidance. Every clause carries information an agent needs, with no filler.

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 three-parameter, no-output-schema connection tool whose annotations already convey the safety profile, the description covers the necessary inputs and the pairing prerequisite. Only edge-case behavior on failed connections is left unstated.

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 100%, so each parameter is already documented, and the description largely restates schema content such as pair_address differing from host_port and pairing_code enabling pairing. It adds only the framing that host_port is the primary argument and pairing args are conditional, which matches the baseline for a fully documented schema.

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?

The description names a specific verb and resource ('Connect to a device over Wi-Fi/TCP') and names the underlying mechanism (adb connect / adb pair), so an agent can tell exactly what the tool does and how it differs from device-listing or app-launching siblings.

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?

It states the required host:port input and the condition under which pairing extra arguments apply ('Android 11+ Wireless debugging' with a 6-digit code), which is clear context for use. It stops short of explicit exclusions such as when to prefer a USB/emulator connection path over this one.

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

describe_uiDescribe UIA
Read-only

Read the on-screen UI hierarchy as a list of elements, each with its text, content_desc, resource_id, class, clickable flag, pixel bounds, and a precomputed center in TRUE DEVICE PIXELS. This is your source of truth for AIMING: pass an element's center straight to tap. Never guess coordinates from the screenshot (it is downscaled and you will miss). The response header states the FOCUSED WINDOW (if it's a system overlay — biometric prompt, permission dialog — the elements belong to that overlay, not your app) and how many nodes the filter hid. Default filter keeps labelled/clickable/id-carrying elements minus redundant wrappers; filter="clickable" returns only tap targets (much smaller); filter="all" returns every bounded node — the only mode where absence proves an element isn't in the CURRENT VIEWPORT's hierarchy. Every mode is viewport-scoped: Android omits a ScrollView's off-screen children from the accessibility tree entirely, so scroll before concluding an element does not exist, and never use this to COUNT a long list (it will undercount) — render_stats reports the whole view tree. Canvas-drawn (RN/Flutter/Skia) content appears in NO mode.

NameRequiredDescriptionDefault
queryNoCase-insensitive substring to match against text, content_desc, and resource_id — return only matching elements. The cheap way to ask 'is X on this screen?'. Combine with filter='all' to prove absence definitively.
filterNoWhat to include: 'auto' (default — elements with text, content_desc, resource_id, or clickable; identical-bounds label-less wrappers dropped), 'clickable' (tap targets only, the smallest view), or 'all' (every bounded node, unfiltered — use to PROVE an element is absent from the CURRENT VIEWPORT). 'all' is still viewport-scoped: Android omits off-screen ScrollView children from the accessibility tree, so scroll before concluding absence, and use render_stats (not this) to count a long list.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
compactNoReturn one line per element (center, bounds, flags, labels) instead of JSON — ~10x fewer tokens, same aiming information. Use for repeated look-drive loops and geometry work.
packageNoOptional package expected to own the focused window. If another app or SystemUI owns focus, the response calls that out explicitly.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, it discloses focused-window and system-overlay behavior, hidden-node counts, filter semantics, viewport-scoped accessibility-tree omissions, and the absence of canvas-drawn content in every mode. These are substantial behavioral details an agent needs to avoid incorrect conclusions.

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 description is dense but front-loaded: it starts with what is returned and the aiming use case, then covers caveats and alternatives. Every sentence contributes operational guidance, with no filler.

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?

For a read-only UI inspection tool with no output schema, the description supplies the critical return semantics, coordinate behavior, focus-window caveats, filter tradeoffs, and scope limitations. An agent has enough context to invoke it correctly and interpret its results.

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 100%, and the schema already documents query matching, filter modes, serial targeting, compact output, and package focus expectations. The description reinforces strategy around filter and query use, but adds limited meaning beyond what the schema already provides.

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?

It states a specific operation: read the on-screen UI hierarchy as elements with text, content_desc, resource_id, class, clickable flag, bounds, and true-device-pixel centers. It also clearly distinguishes the tool from screenshot-based guessing and from render_stats for counting.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: pass an element's center directly to tap, never infer coordinates from a downscaled screenshot, scroll before concluding absence, and use render_stats instead for long-list counting. It also explains when to use query, clickable filtering, and all-mode filtering.

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

doctorDoctorA
Read-only

Diagnose the local toolchain, and the first call of any session that isn't going well: Android SDK path (and whether it really is an SDK), adb/emulator availability, known AVDs, attached devices, per-device accessibility bridge status, plus the host build tools — a JDK (Gradle needs one) and a system gradle (needed only so scaffold_android_project can generate a wrapper). Run this first when something isn't working, especially a Gradle tool failing with "SDK location not found".

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already establish this as a safe, non-destructive, local-only read (readOnlyHint=true, openWorldHint=false), so the description only needs to add context — and it does, explaining the diagnostic dependencies (Gradle needs a JDK; system gradle is required only so scaffold_android_project can generate a wrapper). It does not describe the shape or grouping of the report, but the safety profile is fully covered by annotations.

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?

Content is front-loaded with the verb and resource, and the second sentence carries the trigger condition, so the structure is sound. The first sentence is long and stacks several parenthetical asides, which makes it slightly harder to scan than an ideal definition, but no clause is filler.

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?

There is no output schema, so the description carries the burden of telling the agent what it will learn — and it enumerates the checks in enough detail to know what a result will contain. Combined with the trigger guidance, an agent has everything needed to decide to call it and interpret the outcome.

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, which is the correct baseline-4 case; there is nothing for the description to disambiguate. The absence of arguments is itself consistent with the "run it and it checks everything" framing.

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?

"Diagnose the local toolchain" is a specific verb plus resource, and the description then enumerates exactly what is probed (SDK path validity, adb/emulator availability, AVDs, attached devices, per-device accessibility bridge status, JDK, system gradle). This clearly separates it from narrower siblings such as list_devices or list_avds, which each cover only one slice of the same surface.

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?

"Run this first when something isn't working" plus the concrete trigger (a Gradle tool failing with "SDK location not found") gives an agent a clear, actionable entry condition, and "first call of any session that isn't going well" further scopes it. What is missing is any when-not guidance or explicit hand-off to siblings once the diagnosis narrows the problem.

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

dragDragA

Press-hold-move-release drag from (x1,y1) to (x2,y2) in true device pixels (input draganddrop, Android 11+). Unlike swipe (which flings), this holds at the start first — use it for drag handles, long-press-to-reorder lists, and drag-and-drop targets a quick swipe skips.

NameRequiredDescriptionDefault
x1YesStart X in true device pixels.
x2YesEnd X in true device pixels.
y1YesStart Y in true device pixels.
y2YesEnd Y in true device pixels.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
duration_msNoDrag duration in ms. Default 400.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false and openWorldHint=false, so the safety profile is known. The description adds genuinely new behavioral context: the gesture holds at the start before moving, and the tool requires Android 11+ (input draganddrop) — a hard platform constraint an agent must know before calling. It stops short of describing failure modes or what happens on unsupported API levels.

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 zero filler; the coordinate/gesture definition is front-loaded and the disambiguation against swipe follows immediately, matching the order an agent needs to evaluate the tool.

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 simple coordinate-input tool with a fully documented schema, annotations, and no output schema, the description covers purpose, gesture mechanics, and the Android 11+ prerequisite. The only real gap is a brief note on duration tuning for slow reorder interactions, which is minor.

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 100%, so all six parameters including duration_ms and the optional serial are already documented. The description restates the 'true device pixels' unit but adds no syntax, defaults, or tuning guidance (e.g. when to raise duration_ms for reorder lists) beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb sequence and resource: 'Press-hold-move-release drag from (x1,y1) to (x2,y2) in true device pixels', plus the underlying primitive (input draganddrop, Android 11+). It explicitly distinguishes itself from the swipe sibling, so an agent can pick between drag, swipe, and long_press without opening 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?

Gives concrete when-to-use cases (drag handles, long-press-to-reorder lists, drag-and-drop targets) and names the contrasting sibling ('Unlike swipe (which flings)'). It does not address the long_press sibling, which overlaps with the hold-at-start behavior, leaving one routing decision to inference.

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

enter_pinEnter PINA

Enter digits on a numeric PIN pad by tapping each key with a settle delay. Use when input_text does nothing because the pad renders its own key views. Visibility is PAD-SPECIFIC — run describe_ui on the pad screen first: a native-view pad (digits listed as Buttons with text) works with the default hierarchy lookup, no extra args. Only CANVAS-DRAWN pads (React Native / Skia SDK pads, whose keys are invisible to describe_ui) need 'grid' (the pad's bounding box; digits placed on a standard 3x4 dialpad) or 'coords' (explicit per-digit x,y) — read those bounds off a screenshot.

NameRequiredDescriptionDefault
gridNoOptional bounding box {x1,y1,x2,y2} of the PIN pad. Provide this for custom-drawn (React Native / Skia) pads whose keys are invisible to describe_ui: digits are placed on a standard 3x4 dialpad grid (1-2-3 / 4-5-6 / 7-8-9 / _-0-_) inside the box.
coordsNoOptional explicit per-digit tap points as 'digit:x,y' pairs separated by ';', e.g. '1:540,1600;2:640,1600'. Overrides grid and hierarchy for the digits given. Use when the pad is not a regular grid.
digitsYesThe digits to enter, e.g. "1234".
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description carries most of the behavioral burden and does well: it discloses the settle delay between taps, the pad-specific visibility constraint, the precedence rule that coords overrides grid and hierarchy, and where to obtain bounds (a screenshot). The gap is risk disclosure — entering a PIN can trigger device lockout or biometric fallback, and neither that consequence nor any verification of successful entry is mentioned.

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?

Front-loaded with the core action and the input_text failure case before the pad-taxonomy detail, and the em-dash/caps structure makes the native-vs-canvas branch scannable. It runs long and duplicates some of the grid/coords explanation already in the schema, so a little tightening is possible, but no sentence is filler.

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 4-parameter input-simulation tool with no output schema and thin annotations, the definition covers the hard part — deciding which targeting mode to use and what prerequisite UI inspection to run. It stops short of stating the outcome of the call (does it confirm entry, what happens on timeout or wrong pad detection) or the lockout risk, which matters for a PIN-entry tool with siblings like is_device_secure, set_device_lock, and prefer_pin.

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 100%, so the schema already defines grid, coords, digits, and serial in comparable detail; the description largely restates the grid/coords distinction. It adds modest value by framing grid as 'the pad's bounding box' on a 'standard 3x4 dialpad' and telling the agent to read bounds off a screenshot, which is procedural meaning beyond the schema's types.

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 and resource ('Enter digits on a numeric PIN pad by tapping each key') and immediately distinguishes itself from the sibling input_text, naming the exact condition where input_text fails. An agent can select this tool over input_text, press_key, or tap without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('when input_text does nothing because the pad renders its own key views'), an explicit prerequisite ('run describe_ui on the pad screen first'), and a decision rule for which argument to supply: default hierarchy for native-view pads, 'grid' or 'coords' only for canvas-drawn React Native / Skia pads. Alternatives and exclusions are both present.

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

fingerprint_touchFingerprint touchA

Simulate a fingerprint-sensor touch on an EMULATOR (adb emu finger touch). With a fingerprint enrolled it satisfies a BiometricPrompt, so you can drive the real biometric path instead of cancelling into the PIN fallback. finger_id must match an enrolled finger (default 1). Check has_biometric_enrolled FIRST: with nothing enrolled the prompt sits on "Touch the sensor" forever. GOTCHA: it reports OK even when the id matches nothing, and wrong ids trip a HAL lockout, so enroll deterministically rather than sweeping ids (the pin-and-lock guide: a skill, or the android://guide/pin-and-lock resource). Emulator-only.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
finger_idNoId of the enrolled finger to touch with (must match a finger enrolled in Settings). Default 1.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (which only say openWorldHint=false, destructiveHint=false) by disclosing a false-success failure mode ('reports OK even when the id matches nothing'), the HAL lockout risk from sweeping ids, and the hang when nothing is enrolled. It also names the environment restriction (emulator-only) and points to a guide resource for the enrollment workflow.

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?

Front-loaded with what the tool does, then prerequisites, then gotchas, in a sensible order. Dense but nearly every sentence carries operational weight; the trailing guide/skill parenthetical and repeated emulator-only framing add slight redundancy.

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?

For a two-optional-parameter tool with no output schema, the description covers everything an agent needs: scope (emulator), preconditions (enrollment check), argument correctness (id must match enrolled finger), and return-value caveats (OK is not proof of success). Nothing material 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 coverage is already 100%, so both serial and finger_id are documented in the schema itself. The description reinforces the key constraint that finger_id must match an enrolled finger (default 1) and warns against sweeping ids, but adds no new detail about serial.

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 concrete verb and resource ('Simulate a fingerprint-sensor touch on an EMULATOR') and even names the underlying command 'adb emu finger touch'. It is clearly distinguishable from siblings like finger_remove, has_biometric_enrolled, enter_pin, and prefer_pin, which it implicitly contrasts with via the PIN-fallback sentence.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (to drive the real BiometricPrompt path rather than cancelling into PIN fallback) and a hard prerequisite ordering: 'Check has_biometric_enrolled FIRST'. Also states the emulator-only scope, which rules out physical devices.

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

finger_removeFinger removeA
Idempotent

Lift the simulated finger off the sensor (adb emu finger remove) — the complement to fingerprint_touch, for flows that watch for the finger-up event. Emulator-only.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely new operational context: this only works against emulators and it exists to emit a finger-up event. It does not state what happens if no finger is currently down, though the idempotent hint largely covers that.

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?

One front-loaded sentence with the action first, the raw adb equivalent parenthetically, and the emulator constraint at the end. No redundant restatement of the title or the schema.

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 trivial one-call emulator control with full annotation coverage and no output schema, the description says everything an agent needs to decide and invoke. Only a note about the expected response or no-op behavior 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?

With a single optional parameter at 100% schema description coverage, the schema already explains the serial/-s targeting and the single-device default. The description adds no meaning beyond that, which is the expected baseline.

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 and resource ("Lift the simulated finger off the sensor"), grounds it in the underlying command (adb emu finger remove), and explicitly positions it as the complement to fingerprint_touch. An agent can distinguish it from the sibling that presses the finger down without opening either schema.

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 concrete applicability ("for flows that watch for the finger-up event") and a hard scope limit ("Emulator-only"), plus names the sibling it pairs with. It stops short of an explicit when-not rule, e.g. what to do on a physical device where this call is meaningless.

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

get_app_detailsGet app detailsA
Read-only

Report an installed app's version name/code and its launchable activity (dumpsys package + resolve-activity) — to confirm what build is installed and find the activity to launch. Pass apk_path instead of package to read a local .apk (package id, version, launcher activity) with no device attached — handy right after gradle_build.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageNoInstalled application package name (e.g. com.example.app). Required unless apk_path is given.
apk_pathNoLocal path to an .apk to read instead of querying a device: returns its package id, version and launcher activity via aapt2. Needs no device; use it right after a build to get the applicationId.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description is consistent with a pure read. It adds real value beyond annotations by disclosing the underlying commands, that apk_path mode requires no attached device (aapt2), and what is returned in each mode. It stops short of stating behavior when the package is not installed or the apk path is invalid.

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 primary outcome (version + launchable activity) before the alternate mode. Parenthetical implementation details are dense but each reinforces a distinct fact; no filler text.

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 3-parameter, read-only tool with annotations and no output schema, the description supplies what an agent needs: what is returned in both modes, when the device is unnecessary, and the fallback if no device is attached via the optional serial.

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 coverage is 100%, so the baseline is 3, but the description adds mode-selection semantics: apk_path substitutes for package and switches to an offline aapt2 read that yields package id, version and launcher activity. The mutual-exclusivity relationship between package and apk_path is reinforced beyond the schema wording.

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 and resource: reports an installed app's version name/code plus its launchable activity. It names the underlying mechanisms (dumpsys package + resolve-activity) and clearly separates the two modes (device query vs. local .apk read), which distinguishes it from siblings like list_packages or app_state.

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 explicit when-to-use framing: 'to confirm what build is installed and find the activity to launch', plus a stated condition for the alternate mode ('pass apk_path instead of package... no device attached — handy right after gradle_build'). It does not name sibling tools it replaces or should be preferred over, so routing against list_packages/app_state 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.

get_coverage_reportGet coverage reportA

Run a JaCoCo coverage-report Gradle task in project_dir (default 'jacocoTestReport') and summarize coverage: overall line/branch/method/class percentages plus a per-package breakdown, worst-covered first; multi-module reports are merged. 'jacocoTestReport' is NOT an Android Gradle plugin task: if it is missing, pass AGP's 'createDebugUnitTestCoverageReport' as task= (find it with list_gradle_tasks; see the build-and-test guide: a skill, or the android://guide/build-and-test resource). JVM unit tests only. Pass json=true for structured JSON.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace).
jsonNoReturn structured JSON instead of the human-readable text summary.
taskNoGradle task that generates the JaCoCo XML report. Defaults to jacocoTestReport, which is NOT a task the Android Gradle plugin defines — it exists only if the project declares it. If it is missing, check list_gradle_tasks for AGP's built-in "createDebugUnitTestCoverageReport" (present when a build type sets enableUnitTestCoverage = true). Module-qualified names work: ":app:jacocoTestReport".
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only cover openWorldHint and destructiveHint=false; the description adds that a real Gradle task is executed, that multi-module reports are merged, that JVM unit tests are the only supported scope, and how to switch output format. It does not mention execution time, failure behavior, or that the build is compiled as a side effect, which keeps 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?

Front-loaded with the action and output, then the caveat and alternatives in descending priority. Slightly dense in the middle clause and repeats a few schema facts, but no sentence is wasted.

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?

No output schema exists, and the description explains what the summary contains plus the JSON alternative, and it covers the main failure mode (missing JaCoCo task on Android projects). Missing only runtime/failure-handling details for a build-executing tool.

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 100% and the description largely restates schema content (json=true, task default, project_dir). It does add the module-qualified name convention and the AGP fallback rationale, but these are already in the task parameter's own description.

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?

Specific verb+resource: 'Run a JaCoCo coverage-report Gradle task ... and summarize coverage' with the exact output contents (line/branch/method/class percentages, per-package breakdown worst-first, merged multi-module). It is clearly distinct from siblings like get_file_coverage and run_unit_tests.

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

Usage Guidelines5/5

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

Explicitly scopes usage ('JVM unit tests only'), states the default task, names the AGP alternative task to pass when the default is absent, and routes the agent to list_gradle_tasks plus a skill/resource for discovering it. Alternatives and exclusions are both present.

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

get_file_coverageGet file coverageA

Same JaCoCo run and task fallback as get_coverage_report, scoped to one source file: the missed and partially-covered line numbers plus per-method detail. Use it after get_coverage_report names the weakest package. file matches by suffix across every module (an ambiguous name returns every match; a miss lists the files that have data). JVM unit tests only. Pass json=true for structured JSON.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace).
fileYesSource file to report coverage for — a filename (e.g. Foo.kt) or package-qualified path (e.g. com/example/Foo.kt). Matched by suffix; an ambiguous bare filename returns every match.
jsonNoReturn structured JSON instead of the human-readable text summary.
taskNoGradle task that generates the JaCoCo XML report. Defaults to jacocoTestReport, which is NOT a task the Android Gradle plugin defines — it exists only if the project declares it. If it is missing, check list_gradle_tasks for AGP's built-in "createDebugUnitTestCoverageReport" (present when a build type sets enableUnitTestCoverage = true). Module-qualified names work: ":app:jacocoTestReport".
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.3/5.0
Behavior4/5

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

With only openWorldHint/destructiveHint supplied, the description carries most of the burden and does so well: suffix matching semantics, ambiguous-name behavior (returns every match), and miss behavior (lists files that have data) are all disclosed. The remaining gap is cost — it implies a Gradle/JaCoCo run happens but never says whether calling it triggers a build or reuses a prior report.

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?

Front-loaded with the scope and relation to get_coverage_report, then behavior caveats, then the JSON flag. Every sentence carries information, though the task-fallback aside is dense enough that it reads closer to schema prose than invocation guidance.

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?

No output schema exists, and the description compensates by naming the return content (line-level and per-method detail) and offering the json=true alternative shape. The only omission is whether coverage data is freshly generated or read from an existing report, which matters for a tool that shells out to Gradle.

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 100%, so all five parameters including the task fallback and project_dir defaults are already documented in the schema. The description only restates file suffix matching and json=true, adding no new syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific resource (JaCoCo coverage for one source file) and the exact payload: missed and partially-covered line numbers plus per-method detail. It explicitly positions itself against the sibling get_coverage_report by scope, so an agent can distinguish the two without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit workflow ordering: 'Use it after get_coverage_report names the weakest package.' It also states a hard applicability boundary ('JVM unit tests only'), which tells the agent when not to reach for it, and points at list_gradle_tasks as the fix path when the default task is absent.

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

gradle_buildGradle buildA
Destructive

Build the app with Gradle (default task assembleDebug) in project_dir. project_dir must contain the Gradle wrapper (gradlew). Runs on the host, not a device. Returns a compact summary (status, duration, error count, first errors) and the path of the full log, with credential-shaped values redacted. It also lists the APKs under build/outputs, newest first; that can include APKs left by earlier builds. For builds that take minutes pass background=true: it returns a job id and log path at once, and build_status reports the result.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).
taskNoGradle task to run. Defaults to assembleDebug.
backgroundNoStart the build detached and return at once with a job id and log path; poll with build_status. Use for builds that take minutes.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4/5.0
Behavior4/5

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

The annotations only flag openWorldHint and destructiveHint; the description adds real context beyond them — host-vs-device execution, credential-shaped value redaction in the log, and the caveat that the APK list can include artifacts from earlier builds. It could still say what a build overwrites in build/outputs to earn the destructive flag more concretely.

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?

Four tight sentences, front-loaded with the action and location before the return-value and background details. Minor overlap with the schema on project_dir and background, but nothing is filler.

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?

With no output schema, the description carries the return contract itself: status, duration, error count, first errors, full-log path, and a newest-first APK listing. Combined with the async job-id path, an agent has everything needed to call and interpret it.

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 100%, and each schema property already documents task default, extra args, background polling, and the session-default fallback for project_dir. The description restates those same points rather than adding syntax or format detail, so the baseline 3 applies.

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?

"Build the app with Gradle (default task assembleDebug) in project_dir" gives a specific verb, resource, and default. "Runs on the host, not a device" partially separates it from device-side siblings, but the most confusable neighbor, build_and_run, is never named or contrasted.

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?

Usage conditions are clear: project_dir must contain the wrapper (or be pinned via session_set_defaults), and background=true is prescribed for multi-minute builds with build_status for polling. It stops short of saying when to choose this over build_and_run or run_unit_tests.

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

gradle_project_propertiesGradle project propertiesA
Read-only

Dump Gradle's evaluated properties for one module, such as :app or :feature:login. Use after list_gradle_projects when you need the module's namespace, Android SDK settings, build directory, or other effective configuration rather than just its task/variant names. This is the module's FULL effective property set — the same one ./gradlew properties would print, which can include credentials a build.gradle reads from ~/.gradle/gradle.properties or env (e.g. private Maven repo auth). Values for keys that look secret-shaped (password/token/key/credential) are redacted before being returned.

NameRequiredDescriptionDefault
moduleYesGradle module path, e.g. :app or :feature:login.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations cover only readOnlyHint and openWorldHint; the description adds materially: the output equals what './gradlew properties' prints, may surface credentials read from ~/.gradle/gradle.properties or env (private Maven repo auth), and secret-shaped keys (password/token/key/credential) are redacted before return. That is exactly the security and scope context an agent can't infer from the annotations, and it does not contradict readOnlyHint.

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 sentences, front-loaded with what it does, then routing, then the safety caveat last where it matters most. Every sentence carries load, including the credential/redaction warning, with no restating of the title or annotations.

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?

No output schema exists, and the description names the kind of content returned (namespace, SDK settings, build directory, full effective property set), its parity with ./gradlew properties, and the redaction behavior. That is sufficient for a two-parameter read-only tool.

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 100%, so both parameters are already documented in-schema, and the module example in the description duplicates the schema text. The description never mentions project_dir or the session default fallback, so it adds essentially no parameter meaning beyond structured fields; baseline 3 applies.

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 ('Dump') and resource ('Gradle's evaluated properties') scoped to one module, with concrete module-path examples (:app, :feature:login). It also implicitly separates this from list_gradle_projects, list_gradle_tasks and list_gradle_variants by contrasting 'effective configuration' with 'just its task/variant names'.

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

Usage Guidelines5/5

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

Explicitly names the sequencing ('Use after list_gradle_projects') and the deciding condition: you need namespace, Android SDK settings, build directory or other effective configuration rather than task/variant names. An agent can pick between this and the sibling list_* tools without opening a schema.

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

grant_permissionGrant permissionA
Idempotent

Grant a runtime permission to an app (pm grant), e.g. android.permission.CAMERA — skips the in-app permission dialog so you can drive straight to the feature.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name.
permissionYesFull permission name, e.g. android.permission.CAMERA.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral fact: the operation changes app permission state silently, bypassing the in-app dialog. It omits prerequisites such as the permission needing to be declared in the manifest, the runtime-permission API level requirement, or whether the app must be restarted to observe the change.

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 front-loaded sentence: verb+resource first, then mechanism, then the practical benefit. No filler and no repetition of schema content.

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 three-parameter mutation tool with no output schema, the description covers what it does and why but leaves out call-affecting prerequisites (manifest declaration, API level, whether the app must be installed/running) and the fact that the change is undone via revoke_permission. Adequate but with clear gaps.

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 100%, so package, permission and serial are already documented in the schema, including the same android.permission.CAMERA example. The description adds no meaning beyond that, which is the baseline 3 case.

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 and resource ("Grant a runtime permission to an app") plus the concrete mechanism ("pm grant") and an example permission value. The grant/revoke distinction against the sibling revoke_permission is implicit in the verb but the sibling is never named, so this falls just short of full sibling differentiation.

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?

The clause "skips the in-app permission dialog so you can drive straight to the feature" tells the agent exactly why and when to reach for this tool instead of driving the permission UI with tap/tap_on_text. It stops short of explicit exclusions (e.g. non-runtime permissions, or when to prefer revoke_permission to undo the change).

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

has_biometric_enrolledHas biometric enrolledA
Read-only

Report whether any fingerprint is enrolled (and how many), from dumpsys fingerprint. Check this BEFORE a biometric flow: with nothing enrolled, fingerprint_touch can never satisfy a BiometricPrompt — it just sits on "Touch the sensor" — so branch to enrolling one or to the PIN path instead of guessing. Works on emulators and physical devices. Note: the framework exposes only an enrolled COUNT, never which finger id is enrolled, and a wrong fingerprint_touch id trips a HAL lockout after a few tries — so enroll deterministically rather than sweeping ids.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, but the description adds real context: it reads dumpsys, only a count is exposed, it works on emulators and physical devices, and wrong finger ids risk a HAL lockout. That lockout warning is operationally important and appears nowhere in the structured fields.

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?

Front-loaded with the core purpose, then prerequisites, then caveats. It is dense but every sentence carries a distinct constraint; the final sentence is slightly long but still earns its place via the lockout warning.

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?

With no output schema, the description correctly states the return content (whether enrolled and how many). It also covers device scope and the main failure mode, leaving nothing an agent needs before calling it.

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 100% and the single optional serial parameter is fully documented there. The description adds no meaning about the serial argument, so the baseline of 3 applies.

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 and resource ('Report whether any fingerprint is enrolled (and how many)') and names the data source (dumpsys fingerprint). It is clearly distinguishable from siblings like fingerprint_touch and finger_remove.

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

Usage Guidelines5/5

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

Explicitly says 'Check this BEFORE a biometric flow' and explains the consequence of skipping it (fingerprint_touch sits on 'Touch the sensor'), then routes the agent to enrolling or the PIN path. Both the when and the alternative branches are spelled out.

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

input_key_comboInput key comboA

Press several keys together as a chord (input keycombination, Android 11+). Use preset="select_all" (or copy/paste/cut/undo/redo/save/find) for a named shortcut, or keys=["ctrl","a"] / ["alt","tab"] to spell one out — modifier(s) first, then the action key; each is a key name (ctrl/alt/shift/meta, a-z, enter, tab, ...) or a raw keycode. For a single key use press_key instead.

NameRequiredDescriptionDefault
keysNoKeys to press together, modifier(s) first, e.g. ["ctrl","a"] or ["alt","tab"]. Each is a key name (ctrl, alt, shift, meta, a-z, enter, tab, ...) or a raw keycode number. Needs at least 2. Omit if preset is given.
presetNoNamed combo shortcut (select_all, copy, paste, cut, undo, redo, save, find) that expands to the right chord — use this instead of keys when a name will do.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description must contribute the operative constraints – and it does, with the Android 11+ requirement and the modifier-first ordering rule that governs how chords are interpreted. It stops short of stating failure behavior (e.g. unsupported key names, missing device) or what the response looks like.

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?

Front-loads the core action and packs the routing rule into the same sentence. The preset list and examples are repeated from the schema, which is mild redundancy but keeps the description self-sufficient.

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 zero-required-parameter input tool with no output schema, this covers action, format, version constraint, and the sibling alternative. The only real omission is device-targeting behavior for serial when multiple devices are attached.

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 100%, so keys, preset, and serial are already fully documented including the modifier-first example and the at-least-2 rule. The description restates the same ordering and preset list, adding little beyond the schema; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ("Press several keys together as a chord") and immediately distinguishes itself from the sibling press_key for single keys and implicitly from input_text. The Android 11+ platform note scopes it further.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use preset for named shortcuts, keys when spelling out a chord, and press_key instead for a single key. This is a clear when-to-use / when-not-to-use / alternative triple.

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

input_textInput textA

Type text into the currently focused input field via the IME. Tap the field first so it has focus. Afterwards the soft keyboard may cover buttons lower on screen — dismiss it with press_key escape (or back) before tapping them. For native non-IME PIN pads this does nothing; use enter_pin instead.

NameRequiredDescriptionDefault
textYesText to type into the focused field.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description carries most of the burden — and it does, disclosing the visible side effect (soft keyboard covering lower buttons) and the silent-no-op failure mode on non-IME PIN pads. It stops short of stating whether existing field content is replaced or appended, and whether a failure is reported, which keeps it from 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.

Conciseness5/5

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

Three tight sentences: action first, then the focus prerequisite, then the side-effect workaround and the alternative tool. No filler and no repetition of schema details.

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 2-parameter, non-destructive input tool with no output schema, the definition covers the prerequisite, the side effect, the mute failure case, and the sibling to use instead. The main remaining gap is append-vs-replace behavior on a field that already has content.

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 100% and both parameters (text, serial) are already documented, so the baseline applies. The description only mildly enriches "text" by tying it to the focused field; it adds no format, length, or escaping guidance.

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 and target ("Type text into the currently focused input field via the IME") plus the mechanism (IME), which distinguishes it from press_key, input_key_combo, and enter_pin without needing the schema.

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

Usage Guidelines5/5

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

Gives an explicit prerequisite ("Tap the field first so it has focus"), a named exclusion (native non-IME PIN pads), and the alternative to use instead (enter_pin). It even prescribes the follow-up action (dismiss keyboard with press_key escape/back) before tapping lower buttons.

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

install_appInstall appA
Idempotent

Install (or reinstall, -r) an APK from a local file path onto the device. Use to deploy a build you want to test.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
apk_pathYesLocal filesystem path to the .apk to install.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful behavior (the -r reinstall flag), but says nothing about blocking duration, failure modes such as signature/version conflicts, or what a successful result looks like.

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 short sentences with the action front-loaded and no filler. The parenthetical '-r' is compact but slightly cryptic without stating what reinstall implies for existing app data.

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 simple two-parameter tool with full schema coverage and annotations, this is nearly complete. The remaining gap is that with no output schema, the description does not indicate whether the call blocks until install finishes or what success/failure feedback is returned.

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 100%, so both parameters are already documented. The description reinforces that apk_path is a local filesystem path and introduces the -r reinstall semantics, but adds no detail on serial/device selection or path formats beyond the schema.

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 (install an APK from a local file path onto the device) and names the reinstall variant. It is clearly distinct from siblings like uninstall_app or launch_app, though it does not explicitly contrast with reload_app/launch_app for the post-install step.

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?

'Use to deploy a build you want to test' gives an implied usage context but no explicit when-not or alternatives (e.g., use launch_app after installing, use gradle_build to produce the APK). Device-targeting guidance lives only in the schema, not the description.

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

is_device_secureIs device secureA
Read-only

Report whether a secure lock screen is set (probed with locksettings; this is what KeyguardManager.isDeviceSecure, which Keystore checks, reflects). Use it to verify set_device_lock worked before running a Keystore-gated flow.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value by disclosing the implementation (locksettings probe) and what the answer semantically reflects (the signal Keystore checks), but it never says what the call actually returns, so an agent cannot tell whether to expect a boolean, a string, or a structured object without a separate output schema.

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 purpose before the usage cue. The nested parenthetical audit trail is slightly heavy but every clause is informative and nothing is padding.

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-optional-parameter read-only probe with no output schema, the definition covers what is checked, why it matters, and the verification workflow. The only material omission is the shape of the returned result, which an agent must discover at call time.

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 100% — the single optional serial parameter is fully documented with the multi-device fallback. The description adds nothing about the parameter, which is acceptable given the schema carries it.

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 check — whether a secure lock screen is set — and pins down its semantics by naming the underlying probe (locksettings) and the equivalent API (KeyguardManager.isDeviceSecure, which Keystore gates on). That goes well beyond the tautological title. It does not explicitly name the near-neighbour checks it is not (has_biometric_enrolled, clear_device_lock), so it stops short of a full 5.

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?

"Use it to verify set_device_lock worked before running a Keystore-gated flow" gives an explicit when-to-use and names the sibling that precedes it. No when-not guidance or alternatives for adjacent security checks, but the intended context is unambiguous.

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

last_crashLast crashA
Read-only

Return the most recent app crash from the system DropBox (dumpsys dropbox — JVM/React-Native and native crashes), with the full exception header and stack in one call. Optionally filter to a package. Use this instead of grepping logcat when an app just crashed: DropBox keeps the whole fatal (header + Caused by + frames) together even after it has scrolled out of the logcat ring buffer.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageNoOptional package name to filter to (e.g. com.example.app); omit for the most recent crash from any app.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description's added value is the source and retention semantics of DropBox versus the logcat ring buffer — genuinely useful context an agent cannot infer from the annotations. It does not cover edge cases such as behavior when no crash is present, which keeps it at a 4.

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 tight sentences, front-loaded with what the tool returns, followed by the disambiguation advice. Every clause carries information; nothing is padding.

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 two-parameter read tool with no output schema, the description covers the source, scope, filtering and return contents adequately. It stops short of saying what comes back when no crash exists, which is the one operational detail an agent might still need.

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 100%, so both parameters are already documented; the description's 'Optionally filter to a package' merely restates the package parameter. It adds no format or semantics beyond the schema, so the baseline 3 applies.

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 and resource ('Return the most recent app crash from the system DropBox') plus the exact data source (dumpsys dropbox) and payload shape (exception header + stack in one call). It is clearly distinguishable from the sibling 'logcat' tool, which it explicitly contrasts.

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

Usage Guidelines5/5

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

Gives an explicit routing rule: 'Use this instead of grepping logcat when an app just crashed,' and explains the condition that makes it preferable (DropBox retains the full fatal even after it scrolls out of the logcat ring buffer). The alternative and the selecting condition are both named.

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

launch_appLaunch appA

Launch an app by package name (starts its LAUNCHER activity) and echo the resolved component on success. Fails with a clear message (not a raw monkey dump) when the package isn't installed or has no launcher activity. Combine with stop_app to restart an app cleanly from a known state.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name (e.g. com.example.app).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare non-destructive and non-open-world, so the safety profile is covered; the description adds what the agent actually needs beyond that — the LAUNCHER-activity targeting, that the resolved component is echoed on success, and that failure produces a clear message rather than a raw monkey dump.

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?

Three short sentences, front-loaded with the action and mechanism, then failure behavior, then the sibling pairing. The parenthetical "(not a raw monkey dump)" is a slightly incidental implementation aside but still communicates error quality, so it earns its place.

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?

There is no output schema, so the description usefully states what success returns (the resolved component) and what failure looks like. Device targeting is covered by the schema. Only the relationship to restart-adjacent siblings remains unaddressed, which is minor for a simple two-parameter action.

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 100%, so both `package` and `serial` are already documented, including the single-device default for `serial`. The description reinforces that `package` is a package name but adds no format or resolution detail beyond the schema, so the baseline of 3 applies.

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 and resource ("Launch an app by package name") and immediately explains the mechanism — starting the package's LAUNCHER activity — which separates it from siblings like install_app, reload_app, and app_state without needing to name them.

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 combination pattern: pair with stop_app to restart from a known state. It does not explicitly exclude or contrast with reload_app or launch_dev_client, which are the closest ambiguous alternatives, so routing guidance is strong but not complete.

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

launch_dev_clientLaunch dev clientA

Launch an Expo dev build straight at a Metro dev server, skipping the Dev Launcher's server-picker screen. Builds the "://expo-development-client/?url=http://host:port" deep link and opens it. Pass scheme (your app.json "scheme"); host/port default to localhost:8081. PREREQUISITE: run adb_reverse {device_port: 8081} first so the device can reach Metro, otherwise the dev client falls back to its embedded bundle. For plain Expo Go (not a dev build) use open_url with the exp:// URL instead.

NameRequiredDescriptionDefault
hostNoMetro dev-server host as the DEVICE sees it. Default localhost (works once adb_reverse {device_port: 8081} is set).
portNoMetro dev-server port. Default 8081.
schemeYesThe app's URL scheme from app.json (e.g. "myapp") — used to build the expo-development-client deep link.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageNoOptional package to target the intent at (disambiguates if multiple apps claim the scheme).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only cover title, openWorldHint=false and destructiveHint=false, so the description must carry the behavioral load — and it does: it discloses the deep-link construction, the localhost:8081 defaults, the adb_reverse prerequisite, and the specific failure mode if the prerequisite is skipped (falls back to the embedded bundle). That fallback consequence is exactly the kind of non-obvious behavior an agent needs before invoking.

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 action and its mechanism come first, prerequisites second, and the sibling alternative last — a logical order with no filler sentences. Quoted deep-link template and the `{device_port: 8081}` invocation are dense, high-value content rather than padding.

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?

With no output schema and a simple open-a-deep-link action, the description covers everything needed: what gets opened, what the caller must set up beforehand, what happens if they don't, and where to go for the Expo Go case. Nothing material is missing for correct invocation.

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 100%, so the schema already documents all five parameters including defaults and the device-serial semantics; the baseline here is 3. The description mostly restates scheme/host/port rather than adding new constraints (e.g. whether serial is required when multiple devices are attached is only implied by the schema's own wording).

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 and resource ('Launch an Expo dev build straight at a Metro dev server') and explains the concrete mechanism (building and opening a `<scheme>://expo-development-client/?url=...` deep link). It is clearly distinguished from nearby siblings launch_app and open_url, the latter of which is explicitly named as the wrong tool for dev builds.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (dev build + Metro), an explicit prerequisite ('run adb_reverse {device_port: 8081} first'), and an explicit alternative for the other case ('For plain Expo Go ... use open_url with the exp:// URL instead'). An agent can route correctly without consulting any other tool.

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

list_avdsList avdsA
Read-only

List the Android Virtual Devices (AVDs) installed on this machine that can be booted. Start here when no emulator is running yet; the returned names feed boot_emulator.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: only bootable AVDs are returned (a filtering guarantee) and the output is a set of names usable as boot_emulator input. It does not mention cost, latency, or behavior when no AVDs are installed.

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 short sentences, no filler, and the identification of the resource comes first followed by the workflow placement. Every clause earns its place by either defining the resource or routing the agent.

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 zero-parameter read tool with no output schema, the agent knows what it gets (bootable AVD names) and what to do next (boot_emulator). The only gap is the empty-result case, which an agent can handle reasonably without further text.

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; the schema is already closed with additionalProperties=false. Baseline applies and the description does not muddy it with phantom inputs.

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 and resource — 'List the Android Virtual Devices (AVDs)' — and narrows the scope to those 'installed on this machine that can be booted'. That qualifier separates it from the sibling list_devices, which covers connected/running devices, so an agent can pick correctly without opening either schema.

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 trigger — 'Start here when no emulator is running yet' — and names the downstream consumer, boot_emulator, which the returned names feed. It lacks an explicit 'do not use when…' clause pointing at list_devices for already-running emulators, so it falls short of full routing guidance.

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

list_devicesList devicesA
Read-only

List attached emulators/devices and their adb state (device = ready, offline, unauthorized). Use it to confirm a device is up before driving it, or to get the serial when several are attached. Driving a React Native/Expo dev build? Follow the rn-expo guide before you start (a skill, or the android://guide/rn-expo resource) — the ordering (adb_reverse BEFORE launch, app_state before believing anything) is the part that costs sessions.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so safety is covered. The description adds real value beyond them by decoding the returned adb states ('device = ready, offline, unauthorized') and by flagging the rn-expo ordering pitfall (adb_reverse before launch, app_state before trusting results). It does not describe the full return shape, but for a read-only listing that gap is modest.

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?

The core purpose and usage are front-loaded in the first two clauses. The rn-expo sentence is longer than needed with nested parentheticals and reads partly like a pointer to other documentation, which dilutes the listing tool's own description, though it is not wasted given the stated ordering pitfalls.

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-optional-parameter read tool with annotations covering safety and no output schema, the description supplies the state vocabulary and pre-launch verification guidance an agent needs. Only minor gaps remain, such as whether model/API level are also returned.

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 100% and the serial parameter is already documented as optional when one device is attached. The description's 'get the serial when several are attached' reinforces the same idea rather than adding new semantics, so the schema is doing the heavy lifting.

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 and resource ('List attached emulators/devices') and adds the scope detail that separates it from siblings: it reports attached devices with their adb state, not available AVDs (list_avds) or boot readiness (wait_for_boot). The parenthetical 'device = ready, offline, unauthorized' pins down exactly what is reported.

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 two concrete selection cases: confirm a device is up before driving it, and fetch the serial when multiple devices are attached. It also routes the agent to the rn-expo guide for ordering constraints. It stops short of naming exclusion alternatives explicitly (e.g., use list_avds to create an AVD, wait_for_boot to block on boot), so it is strong but not fully routing-complete.

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

list_gradle_projectsList gradle projectsA
Read-only

List the Gradle modules (sub-projects) in project_dir (gradlew projects) — the map of a multi-module build, e.g. :app, :core, :feature:login. Use it to find which module to point gradle_build/list_gradle_variants at, or to address a task at one module with ':' (e.g. :app:assembleDebug). A single-module build reports no sub-projects.

NameRequiredDescriptionDefault
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds real behavior context by noting it shells out to the Gradle wrapper and that single-module builds report no sub-projects. It stops short of mentioning execution cost/timeouts or failure modes when the wrapper is missing.

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 dense sentences, purpose front-loaded, with the sibling routing and the task-path syntax following in priority order. No filler or repetition of the title.

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 single-optional-parameter read tool with no output schema, the description supplies the return shape (a module map with examples) and the edge case of a single-module build. Minor gap: nothing on behavior when project_dir is unresolved or gradlew is absent.

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 100% and the schema already explains project_dir, including the session_set_defaults fallback. The description only implies the path is where gradlew runs, adding little beyond the schema, so the baseline of 3 applies.

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?

Names a specific verb and resource (list Gradle modules/sub-projects) and grounds it in the underlying command (gradlew projects). It explicitly differentiates from sibling tools gradle_build and list_gradle_variants, so the agent can select it without opening any schema.

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

Usage Guidelines5/5

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

States concrete follow-on use cases: find the module to pass to gradle_build/list_gradle_variants, or address a task with '<path>:<task>' syntax. The alternative tools are named and the condition that selects them is spelled out.

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

list_gradle_tasksList gradle tasksA
Read-only

List the available Gradle tasks in project_dir (gradlew tasks) — to discover build/test/install targets. In a multi-module build this lists the ROOT project's own tasks by default; pass task=":tasks" (e.g. ":app:tasks", from list_gradle_projects) to scope to a submodule instead.

NameRequiredDescriptionDefault
taskNoGradle task to scope to, e.g. ":app:tasks" to list the :app module's tasks or variants. Defaults to the root project's tasks.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and network-awareness are covered. The description adds real behavioral context beyond that: in a multi-module build only the ROOT project's own tasks appear by default, which is a non-obvious output-scoping behavior an agent would otherwise get wrong. It stops short of noting runtime cost or wrapper prerequisites.

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 sentences, no filler, with the primary purpose first and the multi-module caveat as a follow-on clause. The parenthetical invocation and inline example are compact enough to earn their space.

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?

A simple two-optional-parameter read tool with annotations and no output schema, and the description covers purpose, scoping behavior, and module discovery. Only minor omissions remain, such as whether the output is verbatim gradlew text or parsed, which matters for parsing the result.

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 100%, so both parameters are already fully documented, including the ":app:tasks" example and the session_set_defaults fallback for project_dir. The description largely restates that, adding only the cross-reference to list_gradle_projects as the source of module names, so the baseline of 3 applies.

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 and resource ('List the available Gradle tasks') and grounds it in the concrete invocation ('gradlew tasks'), then adds the intent ('to discover build/test/install targets'). This distinguishes it from list_gradle_projects and list_gradle_variants without the agent needing to open the schema.

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 a clear use case (discovering build/test/install targets) and specifies the multi-module default plus the exact condition to override it with task="<module>:tasks", including where to get the module name (list_gradle_projects). No explicit statement of when-not-to-use or why to pick list_gradle_variants instead, which keeps it short of a 5.

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

list_gradle_variantsList gradle variantsA
Read-only

List the buildable build variants in project_dir (parsed from the assemble* tasks) — the Android analogue of "list schemes". Each variant V maps to an assembleV / installV Gradle task; pass it as the task= arg to gradle_build/build_and_run to disambiguate a multi-flavor project. Test-only APK tasks (androidTest/unitTest) are excluded. In a multi-module build the ROOT project usually has no variants of its own (no Android plugin applied there) — pass task=":tasks" (e.g. ":app:tasks", from list_gradle_projects) to scope to the module that actually builds APKs.

NameRequiredDescriptionDefault
taskNoGradle task to scope to, e.g. ":app:tasks" to list the :app module's tasks or variants. Defaults to the root project's tasks.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.5/5.0
Behavior4/5

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

Beyond readOnlyHint/openWorldHint the description discloses real behavioural details: test-only APK tasks (androidTest/unitTest) are excluded from results, and the root project of a multi-module build typically yields nothing. It does not mention that the call shells out to the Gradle wrapper and is therefore slow, which would be the remaining useful trait.

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?

Front-loaded with the core action and free of filler; each sentence carries new information (mapping, exclusions, multi-module caveat). It is dense to the point of being slightly long, packing three distinct ideas into a single sentence, but nothing is redundant.

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?

No output schema exists, and the description compensates by implying the result is variant names reusable as the task= argument. Together with the exclusion rules and the multi-module workaround, an agent has enough to call it correctly; only the return shape (plain name list vs. structured entries) is left implicit.

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 coverage is 100%, so 3 is the baseline, but the description adds genuine meaning: it explains the variant-name-to-task mapping (V -> assembleV/installV) and shows a concrete scoping form task=":app:tasks" along with where that module name comes from.

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 (list) and resource (buildable build variants in project_dir) and explains the underlying derivation (parsed from assemble* tasks). It also distinguishes itself from neighbours by framing the result as task names to be reused, which separates it from list_gradle_tasks/list_gradle_projects.

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

Usage Guidelines5/5

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

Gives explicit follow-on usage: pass the variant as task= to gradle_build/build_and_run to disambiguate a multi-flavor project. It also names the when-not case (multi-module root has no variants) and the alternative call to use instead, task="<module>:tasks" sourced from list_gradle_projects.

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

list_packagesList packagesA
Read-only

List installed package names, optionally filtered by substring — to confirm an app is installed and get its exact package name for launch_app/stop_app.

NameRequiredDescriptionDefault
filterNoSubstring to filter package names.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds only that the filter is a substring match and that results are package names; it says nothing about empty results, ordering, or multi-device behavior beyond what the schema's serial parameter already states.

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 sentence that front-loads the core action and follows with the intent, with no redundant or filler wording.

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 simple two-parameter read tool with full schema coverage and safety annotations, this is nearly complete: it establishes what is listed, how filtering works, and why an agent would call it. Only minor gaps remain, such as result ordering or behavior when no packages match.

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 100%, so both parameters are already fully documented in the schema, including the single-device fallback for serial. The description's 'optionally filtered by substring' merely restates the filter parameter, so the baseline of 3 applies.

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 and resource ('List installed package names') plus the optional substring filtering, so there is no ambiguity about what the tool returns. It also names the concrete downstream consumers (launch_app/stop_app), which distinguishes it from generic device-inspection siblings.

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 a clear when-to-use: confirming an app is installed and obtaining its exact package name before calling launch_app/stop_app. It lacks explicit when-not guidance or a pointer to alternatives such as get_app_details or app_state, which could also answer some of the same questions.

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

logcatLogcatA
Read-only

Dump recent native log lines — the last N (default 400) or, with since="2m"/"90s", everything from that long ago on the device clock (the right axis when the report is 'I just hit an error'; on a chatty emulator 400 lines can span seconds). Optionally filtered by a case-insensitive substring, a minimum priority (V/D/I/W/E/F — e.g. priority="E" for errors and up), and/or tags (OR'd). This is how you find the REAL reason a native call failed when the UI only shows a generic 'X failed' alert: filter by your app tag or 'Exception'/'Caused by' and read the 'Caused by:' line — that is the root cause. Dumps and exits (does not stream); chatty spam is stripped.

NameRequiredDescriptionDefault
tagsNoKeep only lines whose log tag contains one of these (case-insensitive, OR'd), e.g. ["SessionStore","AuthModule"]. Omit for no tag filtering.
linesNoNumber of recent lines to dump. Default 400. Ignored when since is given.
sinceNoTime window instead of a line count: only lines from the last e.g. "2m", "90s", "1h30m" (device clock). The right axis when the report is "I just hit an error" — on a chatty emulator 400 lines can span under ten seconds.
filterNoCase-insensitive substring to keep (e.g. an app tag or "Exception").
redactNoMask common secrets (token, password, authorization, api key, secret) before returning log lines. Recommended for payment/auth SDKs and debug builds.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
priorityNoMinimum priority to keep: V, D, I, W, E, or F (matches adb's own "*:E"-style filter — E keeps Error and Fatal). Omit for no priority filtering.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuinely behavioral facts beyond that — it terminates rather than streams, defaults to 400 lines, strips chatty spam, and uses the device clock for since windows. It stops short of describing pagination/truncation behavior when the dump is large, so a 4 rather than 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?

Front-loaded with the core behavior, then the diagnostic use case, then the termination caveat — a sensible order. It is on the long side and repeats the "chatty emulator / 400 lines can span seconds" point that also appears in the since schema field, which is a small redundancy rather than a real flaw.

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?

Seven optional parameters, no output schema, and thin annotations — the description carries the load well, covering selection strategy, filter composition, redaction expectations, and the fact that output is a finite dump. An agent has everything needed to call it correctly on the first try.

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 coverage is 100%, so the per-parameter baseline is 3. The description still adds cross-parameter meaning the schema only implies: lines is ignored when since is supplied, tags are OR'd while filter/priority narrow further, and the rationale for choosing since over lines on a chatty emulator.

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?

Opens with a specific verb+resource ("Dump recent native log lines") and immediately bounds scope with the two selection axes (last N lines or since-based window). It also distinguishes itself from the streaming siblings by stating "Dumps and exits (does not stream)", so an agent can separate it from start_logcat_capture/stop_logcat_capture without inspecting other 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?

Gives a concrete when-to-use scenario ("when the UI only shows a generic 'X failed' alert") and a concrete recipe (filter by app tag or 'Exception'/'Caused by', read the Caused by line). The non-streaming clause implicitly routes streaming needs elsewhere, but no sibling tool is named explicitly, which keeps it short of a 5.

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

long_pressLong pressA

Press and hold a coordinate (true device pixels) for a duration — for context menus, drag handles, and long-press actions.

NameRequiredDescriptionDefault
xYesX coordinate in true device pixels.
yYesY coordinate in true device pixels.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
duration_msNoHold duration in ms. Default 600.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description carries the rest of the behavior burden. It correctly discloses that the hold duration is what defines the action and that coordinates are true device pixels, but says nothing about whether the gesture blocks, what the default hold is derived from, or what happens if the target widget has no long-press handler. Adequate but not rich.

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 zero padding; the unit clarification and the use cases both earn their place. Slightly compressed by the em-dash construction, but nothing is wasted.

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?

This is a low-complexity input tool with full schema coverage, non-destructive annotations, and no output schema, so the description does not need to explain return values. It covers what the gesture is and when it applies; only multi-device behavior and blocking semantics are left to the schema.

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 100%, so all four parameters are already documented including the 600ms default and the serial targeting rule. The description only restates the pixel-unit convention for x/y, adding essentially no meaning beyond the schema — baseline 3 applies.

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 specific verb+resource ('press and hold a coordinate') plus the distinguishing characteristic of a hold duration, and enumerates concrete outcomes (context menus, drag handles, long-press actions). It implicitly separates itself from the sibling 'tap' by the hold semantics, though it never names tap/swipe/drag to make the boundary explicit.

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 use-case list ('for context menus, drag handles, and long-press actions') gives implied guidance on when to reach for this instead of tap or drag. There is no explicit when-not statement, no mention of prerequisites, and no named alternative among the many input siblings.

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

open_dev_menuOpen dev menuA

Open the React Native dev menu (KEYCODE_MENU) on the foreground app — the reliable way to reach a dev build's Reload/Debug JS Remotely/etc. options when reload_app's broadcast doesn't apply. Follow with tap_on_text or describe_ui to pick a menu item.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description carries the real burden and delivers: it discloses the mechanism (a synthesized MENU key event), the target (foreground app), and the resulting UI state that must be navigated afterwards. It stops short of stating failure behavior — e.g., what happens when the foreground app is not a dev build and no menu appears — which is the one gap an agent might hit.

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 sentences with no filler: the action and mechanism come first, the contrast with the sibling second, the follow-up step last. Every clause carries information that changes how an agent calls it.

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-optional-param, no-output-schema tool this is close to complete — it explains the triggering mechanism and the required follow-up interaction. Only the no-menu/failure case is unaddressed, a minor omission given the tool's simplicity.

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 100% and the single 'serial' parameter is fully documented in the schema, including the optional-when-one-device-attached rule. The description adds nothing about the parameter, so the baseline of 3 applies.

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?

Names a specific verb and resource ('Open the React Native dev menu') and even the underlying mechanism (KEYCODE_MENU on the foreground app), which makes it immediately distinguishable from generic input tools like press_key or input_key_combo.

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

Usage Guidelines5/5

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

Explicitly names the alternative (reload_app) and the condition under which this tool wins ('when reload_app's broadcast doesn't apply'), and then routes the agent forward to tap_on_text or describe_ui to select a menu item. Both when-to-use and what-to-do-next are covered with no inference required.

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

open_urlOpen URLA

Open a URL or deep link via an ACTION_VIEW intent (am start) — the way to jump straight to a deep-linked screen. Optionally target a specific package.

NameRequiredDescriptionDefault
urlYesURL or deep link to open (ACTION_VIEW).
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageNoOptional package to target the intent at.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare openWorldHint and destructiveHint=false; the description adds real behavioral context by disclosing that this is an ACTION_VIEW intent issued via am start, so an agent knows it hands off to whatever app resolves the link rather than controlling the target itself. It does not cover what happens when nothing resolves the URL, but the mechanism disclosure is substantive.

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 states the action, the mechanism, and the optional package in one pass with no filler. The em-dash aside is slightly loose but still earns its place by clarifying the deep-link use case.

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 three-parameter tool with full schema coverage and safety annotations, the description covers the essentials: what it does, how it dispatches the intent, and device/package targeting. Only failure semantics for unresolvable links are absent, a minor gap given the tool's simplicity.

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 100%, so all three parameters are already documented. The description only echoes that a package can optionally be targeted, adding no syntax examples or behavioral notes about how pinning a package interacts with link resolution.

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 ('Open a URL or deep link') and names the underlying mechanism (ACTION_VIEW / am start), which clearly separates it from launching an app package or opening a dev menu. It stops short of explicitly naming the sibling it differs from (e.g. launch_app), so it lands just under the top band.

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 clause 'the way to jump straight to a deep-linked screen' implies the use case but never states when to prefer this over launch_app or open_dev_menu, nor any exclusions. Usage has to be inferred from the phrasing.

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

phone_callPhone callA

Drive an emulated voice call (adb emu gsm). action="call" (default) rings an incoming call from number; "accept"/"cancel"/"busy"/"hold" transition an in-progress call. Use to test call-interruption behaviour and CALL_PHONE flows. Emulator-only.

NameRequiredDescriptionDefault
actionNoWhat to do: "call" (default — ring an incoming call), "accept", "cancel" (hang up), "busy", or "hold".
numberYesPhone number for the call, e.g. "+15551234567".
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false; the description adds real behavioral context beyond that: the underlying mechanism (adb emu gsm), the emulator-only restriction, and the fact that "call" rings an incoming call while the other actions transition an already in-progress call. It does not disclose error behavior (e.g. what happens if "accept" is sent with no ringing call), so it is 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.

Conciseness5/5

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

Three compact sentences: mechanism, per-action semantics, then use case plus constraint. The most decision-relevant facts (what it does, emulator-only) are front-loaded and there is no filler.

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 3-parameter tool with full schema coverage, existing annotations, and no output schema, the description supplies the mechanism, the action lifecycle, and the emulator-only constraint. It is nearly complete, with only failure/edge-case reporting left unstated.

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 100%, so all three parameters, including the full action enumeration, are already documented in the schema. The description restates the same action semantics without adding format details, side effects, or defaults beyond what the schema already provides, so the baseline of 3 applies.

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 ("Drive an emulated voice call (adb emu gsm)") and enumerates the action transitions, so the agent knows this places/manages a voice call rather than an SMS or generic input. It stops short of naming the nearest sibling (send_sms) as an alternative, so differentiation is inferred from the resource rather than stated.

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?

"Use to test call-interruption behaviour and CALL_PHONE flows" gives a concrete use case, and "Emulator-only" states a hard applicability constraint, which is the key gating information for an agent choosing between tools. No explicit when-not or named alternative is provided, which keeps it below a 5.

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

prefer_pinPrefer PINA

Try to move a standard BiometricPrompt to its PIN/password fallback by selecting an explicit system button, or sending BACK as the generic cancel path. App-controlled prompts may suppress or rename this option, so confirm the resulting PIN pad with describe_ui before calling enter_pin.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false; the description adds meaningful behavior beyond that — this is a best-effort 'try' whose success depends on the prompt implementation, and the outcome must be verified with describe_ui. It does not say what a failed attempt returns or whether the prompt is left in a changed state, but the reliability caveat is the important one.

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 sentences, no filler: the primary mechanism first, then the failure mode and required verification step. Every clause carries operational weight.

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?

For a one-parameter UI action with no output schema and non-destructive annotations, the description supplies everything needed: how it works, when it may not work, and the exact follow-up call to confirm state before entering the PIN.

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?

There is a single optional parameter ('serial') and the schema documents it at 100% coverage, including the 'optional when exactly one device is attached' rule. The description adds nothing about device targeting, so the baseline of 3 applies — the schema carries this dimension.

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 (move a standard BiometricPrompt to its PIN/password fallback) via two concrete mechanisms (an explicit system button or BACK as cancel path). It clearly positions itself upstream of enter_pin, so an agent can distinguish it from the sibling that actually types the PIN.

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?

The when-to-use context is explicit: standard BiometricPrompt needing fallback, followed by describe_ui verification and then enter_pin. It also flags the exclusion case implicitly by warning that app-controlled prompts may suppress or rename the option, though it does not name an alternative tool for that scenario.

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

press_keyPress keyA

Press a hardware/navigation key by name (enter, back, home, menu, tab, del, escape, up, down, left, right, dpad_center, app_switch, search, power, wakeup, sleep, volume_up, volume_down, ...) or a raw Android keycode number. Handy to submit a form (enter), dismiss the keyboard (escape), or go back (back). To turn the screen ON use wakeup (not power, which toggles and may sleep an awake screen); sleep turns it off. A key can be silently consumed with no effect (e.g. back while a biometric prompt is up) — pass verify_change=true to get ui_changed: true/false instead of guessing. Batching several presses (or a press whose timing matters relative to other actions) belongs in run_sequence, not in separate calls.

NameRequiredDescriptionDefault
keyYesKey name (enter, back, home, menu, tab, del, escape, up, down, left, right, ...) or a raw keycode number.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
verify_changeNoAlso report whether the UI hierarchy changed after the key press (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when the key may be silently consumed (e.g. back while a biometric prompt is up).

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the supplied annotations, it discloses important behavioral caveats: a key may be silently consumed with no effect, verify_change=true reports ui_changed at the cost of extra hierarchy reads, and power toggles the screen rather than reliably waking it. This adds meaningful operational context for a key-press tool with minimal annotation coverage.

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?

The description is front-loaded with the core action and remains dense with useful guidance. It is somewhat long and repeats the key-name list already present in the schema, but every sentence contributes operational value and no major filler is present.

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?

For a three-parameter tool with no output schema, the description is complete: it explains accepted key forms, key behavioral edge cases, the verify_change result, and the batching alternative. An agent has enough information to choose and invoke the tool correctly.

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 100%, so the schema already documents key, serial, and verify_change. The description still adds useful semantics beyond the schema, especially the distinction between wakeup, sleep, and power, and the silent-consumption scenario for verify_change; it does not add anything for serial, which keeps it from a 5.

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?

The description states a specific verb and resource: pressing a hardware/navigation key by name or raw Android keycode. It lists concrete key names (enter, back, home, power, wakeup, sleep) and distinguishes behavior from siblings by naming run_sequence for batching and clarifying power vs. wakeup.

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

Usage Guidelines5/5

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

It gives explicit when-to-use guidance: enter to submit a form, escape to dismiss the keyboard, back to go back. It also names alternatives and exclusions: use wakeup rather than power to turn the screen on, sleep to turn it off, and run_sequence for batching or timing-sensitive presses.

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

pull_filePull fileA
Destructive

Copy a file off the device to a local path (adb pull) — e.g. retrieve a generated file, database, or screenshot.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
local_pathYesLocal destination path.
device_pathYesFile path on the device to copy off.

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already declare destructiveHint=true and openWorldHint=false, so the safety profile is carried by structured data. The description adds mechanism (adb pull) and retrieval examples but never explains the striking thing about this tool: why it is marked destructive, i.e. whether an existing local file at local_path is overwritten, and what happens on a missing device path.

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?

One sentence, front-loaded with the action and destination, with the adb equivalent and use cases tucked into a compact parenthetical. 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?

A three-parameter, no-output-schema tool with decent schema coverage; the description covers the what but leaves the destructiveHint unexplained, which is the one behavioral fact an agent would want before calling. Adequate but with a clear gap around overwrite and failure behavior.

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 100%, including the serial parameter's note that it is optional when exactly one device is attached, so the schema carries parameter meaning fully. The description adds nothing per-parameter, making the 3 baseline correct.

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 and resource with explicit directionality: "Copy a file off the device to a local path (adb pull)." The direction phrase distinguishes it cleanly from the push_file sibling without needing to name it, and the parenthetical grounds it in the concrete adb operation.

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?

The examples ("generated file, database, or screenshot") give concrete situations that select this tool, which is more than most definitions offer. It stops short of explicit exclusions or a direct contrast with push_file, so an agent must infer the inverse case.

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

push_filePush fileB
Destructive

Copy a local file onto the device (adb push) — e.g. seed test data or a file to import.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
local_pathYesLocal file to copy onto the device.
device_pathYesDestination path on the device, e.g. /sdcard/Download/x.json.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and openWorldHint=false, so the description only needs to explain why a 'copy' is destructive — namely that an existing file at device_path is overwritten — and it does not. The adb push equivalence and use-case examples add some context beyond annotations, but the most important behavioral fact is left implicit.

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 the action first, then the mechanism, then examples; nothing is redundant. The parenthetical and trailing example are compact and earn their 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?

For a simple three-parameter tool with full schema coverage this is close to sufficient, but a destructive write tool should state overwrite semantics and any precondition (writable destination, connected device). Those gaps leave the agent relying on annotations to infer risk.

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 100%, including the serial-to-device matching rule and an example destination path, so the schema carries the parameter burden. The description adds only a loose framing of the two required paths and no new semantics such as whether parent directories are created.

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?

Names a specific verb and resource ('Copy a local file onto the device') and anchors it to the underlying mechanism (adb push) with concrete example uses. It does not name the obvious sibling pull_file, so the direction of the transfer must be inferred from the name alone.

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 examples ('seed test data or a file to import') imply when to reach for this tool, but there is no explicit when-not guidance and no mention of pull_file as the inverse operation. An agent has enough to guess the use case but no routing rule.

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

reload_appReload appA

Best-effort: trigger a Metro/JS reload on a React Native dev-client build via the classic .RELOAD_APP_ACTION broadcast. Only works on debug builds of classic (non-bridgeless) RN architectures that register the receiver — on newer RN/Expo dev clients it may silently no-op with no error. If the app doesn't visibly reload, use open_dev_menu then tap_on_text("Reload") instead. PREREQUISITE: the app must be able to reach Metro at all — run adb_reverse {device_port: 8081} first, or a reload lands you back on the EMBEDDED bundle and your edits still won't appear (app_state tells you which bundle the running process is actually serving).

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name (e.g. com.example.app).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false and openWorldHint=false; the description adds substantial context beyond that: best-effort semantics, silent no-op on newer RN/Expo dev clients, and the trap where a reload without adb_reverse lands on the embedded bundle. It doesn't spell out whether the broadcast is scoped to the given package's receiver beyond the action name, but the failure modes are unusually well disclosed.

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?

Front-loaded with the core action and the best-effort caveat, then prerequisite. It is dense and every sentence carries information, though the long parenthetical sentence about Metro reachability is slightly harder to parse than it needs to be.

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?

For a two-parameter, no-output tool this is complete: it covers what the tool does, when it silently fails, what to do instead, and the prerequisite that determines whether the reload is meaningful. An agent has everything needed to call it correctly or route around it.

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 100%, so both serial and package are already documented in the schema. The description adds related context (Metro port 8081 via adb_reverse, app_state for bundle inspection) but nothing that further clarifies these two parameters themselves, so the baseline 3 applies.

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 and resource: trigger a Metro/JS reload on a React Native dev-client build via the RELOAD_APP_ACTION broadcast. It immediately distinguishes itself from siblings by naming open_dev_menu and tap_on_text as the fallback path.

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

Usage Guidelines5/5

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

Explicitly states when it works (debug builds, classic non-bridgeless architecture with a registered receiver) and when it fails silently. It names the concrete alternative (open_dev_menu then tap_on_text("Reload")) and the prerequisite step (adb_reverse {device_port: 8081}).

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

render_statsRender statsA
Read-only

Count an app's REAL view tree and recent frame health: total views, render-node kB, per-window breakdown, jank percentage and frame-time percentiles, plus Choreographer's "Skipped N frames" tally. Use this — not describe_ui — to MEASURE a screen: describe_ui is viewport-scoped (Android drops off-screen ScrollView children from the accessibility tree), so it undercounts a long list even at filter="all". The three numbers together are what argues an unvirtualised list: a large view count, render-node kB that grows as you scroll, and skipped frames on the main thread. Pass reset=true to zero the frame counters after reading so the next call measures one specific interaction.

NameRequiredDescriptionDefault
resetNoZero gfxinfo's frame counters after reading, so the NEXT call measures only what happens in between. Use it to attribute jank to one interaction instead of to the whole session.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name.

TDQS

A4.4/5.0
Behavior4/5

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

The annotations only cover readOnlyHint and openWorldHint, so the description carries the real weight here, and it adds substantial context: what the three headline numbers mean together, why they argue an unvirtualised list, and the counter-zeroing effect of reset. It does not mention cost or latency, and reset=true arguably mutates device telemetry state under a readOnlyHint, though that tension is disclosed rather than hidden.

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?

The what-it-does clause is front-loaded before the comparison and the reset note, and every sentence is task-relevant. It runs dense and relies on heavy capitalization for emphasis, which costs a little readability but not correctness.

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?

There is no output schema, so the description must explain what comes back, and it does so explicitly by listing the returned metrics and their interpretation. Combined with the read-only annotation and full param coverage, an agent has everything needed to call and read this tool correctly.

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 100%, so all three parameters are already documented in the schema, including reset's zeroing semantics. The description reinforces reset's intent ("measure one specific interaction") but adds no new syntax or format detail beyond what the schema states, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource ("count an app's REAL view tree and recent frame health") and immediately enumerates the concrete outputs: total views, render-node kB, per-window breakdown, jank percentage, frame-time percentiles, and skipped-frame tally. It also explicitly separates itself from describe_ui, so the agent can tell the two apart without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit routing rule ("Use this — not describe_ui — to MEASURE a screen") plus the reason describe_ui fails for this job: viewport scoping drops off-screen ScrollView children, so it undercounts even at filter="all". It also tells when to set reset=true, namely to attribute jank to one interaction rather than the whole session.

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

revoke_permissionRevoke permissionA
DestructiveIdempotent

Revoke a runtime permission from an app (pm revoke) — to test the denied path or re-trigger the permission-request dialog on next use. Pairs with grant_permission. Note: revoking some permissions kills the app process.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name.
permissionYesFull permission name, e.g. android.permission.CAMERA.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds genuinely new behavioral context the annotations cannot convey: that revoking certain permissions kills the app process, which directly affects how an agent should sequence subsequent steps. It does not describe the response shape, but with no output schema and the key side effect flagged, this is a strong contribution.

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 short sentences plus a one-line caution, with the action front-loaded and the purpose and pairing packed into the first sentence. Nothing is padding; the process-kill warning earns its sentence because it changes agent behavior.

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 three-parameter tool with full schema coverage and no output schema, the description covers what is needed: what it does, why to call it, its complement, and its most dangerous side effect. The only gap is what happens when the permission was never granted (error vs. silent no-op), which would be nice but is not essential to invoke it correctly.

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 100%, so package, permission, and the optional device serial are already documented in the schema, including the permission-name format example. The description adds no additional meaning about parameter formats, defaults, or interactions, so the baseline 3 applies.

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?

The description gives a specific verb and resource ('Revoke a runtime permission from an app') plus the underlying mechanism ('pm revoke'), and it names the sibling it is the inverse of ('Pairs with grant_permission'). An agent can distinguish it from grant_permission and from unrelated app-lifecycle tools without opening any schema.

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?

It states concrete situations for use — testing the denied permission path or forcing the permission-request dialog to reappear on next use — and points to the complementary tool grant_permission. It stops short of explicit when-not guidance (e.g., revoking a permission the app never declared), but the positive guidance is clear enough to select the tool.

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

rotate_screenRotate screenA
Idempotent

Rotate the emulator to its next orientation (adb emu rotate) — the quick way to exercise landscape/portrait layout and rotation-driven state loss. Emulator-only.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A3.7/5.0
Behavior2/5

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

The annotations cover the safety profile (destructiveHint=false, openWorldHint=false), so the bar is lower, but the description's core behavior — 'next orientation', i.e. each call advances the orientation cycle (portrait→landscape→…) — conflicts with the declared idempotentHint=true, since a second identical call does not leave the device in the same state. The useful added context (state loss on rotation, emulator-only failure mode) is real but is undercut by this inconsistency.

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 tight sentence with the verb front-loaded, a parenthetical for the underlying command, and the emulator-only qualifier at the end. No filler, though the ordering means the hard constraint appears last.

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-optional-param, no-output-schema tool, the description covers purpose, mechanism, scope limit, and a key side effect (layout/state loss). Only the discrepancy with the idempotency annotation keeps it from being 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?

There is a single optional parameter and schema description coverage is 100%, so the schema already explains that serial maps to adb -s and is unnecessary when one device is attached. The description adds nothing about the serial parameter; the baseline of 3 applies.

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 and resource ('Rotate the emulator to its next orientation') and even names the underlying mechanism (adb emu rotate). The 'Emulator-only' tag separates it from general device helpers like press_key or set_dark_mode in the sibling list.

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 a concrete use case — exercising landscape/portrait layouts and rotation-driven state loss — plus an explicit exclusion ('Emulator-only'), so the agent knows not to call it on a physical device. It stops short of naming a fallback for non-emulator targets, so it is not a full when/when-not/alternative statement.

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

run_instrumented_testsRun instrumented testsA
Destructive

Run Gradle instrumented (on-device) tests (default task 'connectedAndroidTest') in project_dir — requires a booted device/emulator. Returns per-suite timing and failing-test stack traces; pass json=true for a structured JSON summary. Runs in the foreground and can take minutes; for a long run use gradle_build with task=connectedAndroidTest and background=true, then read the log.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).
jsonNoFor run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary.
taskNoGradle task to run. Defaults to the tool's standard task.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.5/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: foreground execution, multi-minute duration, device prerequisite, and return content (per-suite timing, failure stack traces). The one gap is that annotations declare destructiveHint=true and the description never explains what is destructive (app install/data on device, test artifacts), leaving the agent to infer the blast radius.

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 sentences, front-loaded with the action and default task, then prerequisites, then the long-run escape hatch. No filler; each clause carries operational information.

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?

No output schema exists, and the description compensates by describing both return modes (human-readable summary vs. json=true structured summary). Combined with the device prerequisite and runtime warning, an agent has everything needed to call it correctly or defer to gradle_build.

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 100%, so all four parameters are already documented, and the description only restates the default task and the json flag. It adds no syntax or constraint detail (e.g. how args interacts with task) beyond the schema.

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 and resource ('Run Gradle instrumented (on-device) tests') and names the concrete default task 'connectedAndroidTest', which pins down exactly what executes. It is clearly separable from run_unit_tests (JVM tests) and gradle_build (generic build runner) named later in the text.

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

Usage Guidelines5/5

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

Gives an explicit prerequisite ('requires a booted device/emulator') and an explicit routing rule: for long runs use gradle_build with task=connectedAndroidTest and background=true, then read the log. Both when-to-use and when-to-use-something-else are stated.

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

run_sequenceRun sequenceA

Run several interaction steps in ONE call — no agent round-trip between them. Use for scripted flows and, crucially, flows driven by NATIVE TIMERS (background-token clear, a biometric prompt that auto-fires on resume) where a round-trip per step would perturb the timing you're testing: e.g. key:home → sleep:19 → launch → sleep:9 → tap_text:Cancel (if_present:biometric) → assert_foreground(package) → describe_ui. Each step has an 'action' (sleep, tap, tap_text, tap_element, key, text, swipe, launch, stop, assert_foreground, wait_text, describe_ui) with its params; an if_present/if_absent guard skips a step unless a selector is (not) on screen — that's how you express a conditional cancel; and optional=true lets a step fail without aborting. Returns a per-step result (ok/skipped/error) with elapsed_ms plus the final hierarchy. A non-optional step error stops the rest.

NameRequiredDescriptionDefault
stepsYesOrdered steps to run in one call. Each has an 'action' (sleep, tap, tap_text, tap_element, key, text, swipe, launch, stop, assert_foreground, wait_text, describe_ui) plus that action's params, and optional if_present/if_absent guards and an 'optional' flag. Results include elapsed_ms.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
capture_finalNoAppend the settled UI hierarchy after the last step (unless the run aborted) so you see the end state in this same response. Default true.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description carries most of the burden and does well: it discloses abort semantics ('A non-optional step error stops the rest'), the optional-flag escape hatch, guard behavior, the per-step result shape (ok/skipped/error with elapsed_ms) and the final hierarchy capture. It omits practical limits such as maximum sequence length, overall timeout behavior, or how timing jitter is handled if any step blocks.

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?

Front-loaded with the core value proposition, then the timer rationale, then mechanics and return behavior in a single dense paragraph. The inline example sequence is long but earns its place by demonstrating guards and assertions; the step-action enumeration partially duplicates the schema's 'steps' description.

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?

For a complex orchestration tool with nested step objects and no output schema, the description covers what an agent needs: purpose, when to prefer it, how guards and optional work, abort behavior, and what comes back (per-step status plus final hierarchy). Little is left indeterminate before calling it.

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 100% and each nested step property is already documented in the schema, so the description only reinforces what is there. It does add semantic value by showing if_present used as a conditional cancel ('if_present:biometric') and by pairing optional with abort behavior, but the per-field meanings remain the schema's job.

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 and resource ('Run several interaction steps in ONE call') and immediately distinguishes itself from siblings by eliminating agent round-trips between steps. The inline example sequence makes the scope concrete enough that an agent can choose it over calling tap/wait_for_text individually.

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

Usage Guidelines5/5

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

Explicitly names the situations that select this tool: scripted flows and, 'crucially,' flows driven by native timers where per-step round-trips would perturb timing, illustrated with a biometric-prompt scenario. It effectively contrasts with the single-step siblings (tap, key, wait_for_text, describe_ui) without needing to list them.

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

run_unit_testsRun unit testsA

Run Gradle JVM unit tests (default task 'test') in project_dir and return the result summary, including per-suite timing and failing-test stack traces. On an Android project 'test' runs EVERY variant's unit tests (debug and release both); pass task="testDebugUnitTest" (or ":app:testDebugUnitTest" in a multi-module build) to run just one and roughly halve the time. Pass json=true for a structured JSON summary. Runs in the foreground and blocks until Gradle finishes; for a long run use gradle_build with this task and background=true, then read the log.

NameRequiredDescriptionDefault
argsNoExtra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).
jsonNoFor run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary.
taskNoGradle task to run. Defaults to the tool's standard task.
project_dirNoPath to the Android project root containing the Gradle wrapper (gradlew). Optional if session_set_defaults has pinned a project_dir for this session.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations only supply title, openWorldHint=true and destructiveHint=false, so the description carries most of the behavioral burden and does so well: it discloses that the tool runs in the foreground and blocks until Gradle finishes, that the default 'test' task expands to every variant on Android (roughly doubling time), and what the output contains. The main remaining gap is what happens on Gradle failure, timeouts, or a missing gradlew, which matters for a blocking build tool – keeping it from the top score.

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?

Front-loaded with the core action and return value, then the variant-timing caveat, then the alternative tool, then the json flag. Dense but each sentence carries actionable content; the single unbroken paragraph makes it slightly harder to scan than a bulleted form would.

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?

No output schema exists, so the description correctly describes the return shape (summary, per-suite timing, failing-test stack traces) and the JSON alternative. Combined with the default-task and blocking-run disclosures, an agent has everything needed to invoke it correctly on both plain JVM and Android projects.

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 coverage is 100%, so the baseline is 3, and the description adds concrete meaning on top: an example value for task ("testDebugUnitTest", and the ':app:' prefix form for multi-module builds), the effect of json=true (structured summary), and the session-pinned default for project_dir. It does not discuss the args parameter, which stays with the schema.

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 and resource ('Run Gradle JVM unit tests ... in project_dir') plus the returned artifact (result summary, per-suite timing, failing stack traces). It also implicitly separates itself from run_instrumented_tests by naming 'JVM unit tests' and from gradle_build by pointing to it only for background runs.

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

Usage Guidelines5/5

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

Explicit when/when-not routing: pass task="testDebugUnitTest" to avoid running every Android variant, and use gradle_build with background=true instead when the run is long. The json=true option is also given a use condition, so the agent can choose among alternatives without inference.

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

scaffold_android_projectScaffold android projectA

Create a minimal Kotlin Android application in a new empty directory, including Gradle Kotlin DSL files, an AndroidManifest, a launcher Activity, resources, README, and gitignore. The tool never overwrites a non-empty directory. It also generates the Gradle wrapper when a system gradle is on PATH, so the result is immediately buildable with gradle_build; if no gradle is installed the result says so, and gradle wrapper has to be run in that directory before any Gradle tool here will work (they all drive ./gradlew).

NameRequiredDescriptionDefault
nameYesHuman-readable app name.
packageYesApplication id/package, e.g. com.example.app.
destinationYesEmpty or new directory to create the project in.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare destructiveHint=false and openWorldHint=false; the description adds the substantive behavior: writes a fixed file set, refuses non-empty destinations, conditionally generates the Gradle wrapper, and reports when it could not. It also discloses a downstream consequence — that all Gradle tools drive ./gradlew and will fail until `gradle wrapper` is run. That is real value beyond the structured fields.

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?

Three sentences, front-loaded with the artifact list, then constraints, then the wrapper prerequisite. Dense and purposeful, though the final sentence is a long compound clause that could be split for readability.

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?

For a scaffolding tool with thin annotations and no output schema, this covers everything an agent needs: what is produced, the destination precondition, failure behavior on non-empty directories, and the gradle-wrapper dependency that determines whether the result is immediately buildable.

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 100%, so each of the three parameters already carries its own definition, making 3 the baseline. The description reinforces the destination constraint ('new empty directory') and the package/app-id relationship, but adds no format or validation detail not already in the schema.

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?

Specific verb + resource ('Create a minimal Kotlin Android application') with an enumerated artifact list (Gradle Kotlin DSL files, manifest, launcher Activity, resources, README, gitignore). It is clearly distinguishable from siblings like gradle_build or build_and_run, which operate on an existing project rather than generating one.

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?

The description gives the operative condition ('in a new empty directory') and a hard constraint ('never overwrites a non-empty directory'), plus the follow-up path into gradle_build and the fallback when no system gradle exists. It stops short of explicitly naming an alternative tool or stating a when-not-to-use case, but the context needed to choose it is present.

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

screenshotScreenshotA
Read-only

Capture the current screen as a PNG so you can SEE the UI state. Call it after every action to confirm the screen changed before acting again — driving blind chains taps onto the wrong screen. The image is auto-downscaled (default max 760px) so it is accepted by the image reader; this is for seeing only — derive tap coordinates from describe_ui, not from this image. Auto-retries an all-black frame (an intermittent capture glitch) and, if it stays black, says why (FLAG_SECURE content like a native PIN pad, or a sleeping display) — when black, use describe_ui instead. Works on multi-display foldables (the default display captures correctly); pass display="cover"/"inner"/an index to grab a specific panel.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
displayNoWhich physical display to capture on a multi-display device (a foldable). Omit for the default/built-in screen. Accepts a name alias ('inner'/'primary' or 'cover'/'outer'), an HWC index ('0','1'), or a raw physical display id. Only needed to grab the NON-default panel — the default display already captures correctly without it.
max_dimNoMax width/height of the returned image in pixels. Omit for the default 760; pass 0 (or a negative) to disable downscaling and get the full-resolution image.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior beyond them: auto-downscaling with a default cap, auto-retry on all-black frames, the FLAG_SECURE/sleeping-display failure explanation, and multi-display foldable handling. These are exactly the operational traits an agent needs to interpret a failed or degraded capture.

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?

Front-loaded with the core action and the most important rule (screenshot after every action), then layers caveats. Dense but nearly every clause carries distinct information; the multi-display sentence is the only part that could be trimmed since the schema covers it.

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?

No output schema exists, and the description compensates by describing the return (a downscaled PNG), the failure mode (black frame with cause), and the fallback tool. For a zero-required-parameter capture tool, an agent has everything needed to call it and interpret results.

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 100% and the schema already documents serial, display aliases, and the max_dim default/0-disables behavior, so the description largely restates it. It does add a small amount of framing (default display 'already captures correctly'), but that nuance is also present in the schema, so baseline 3 applies.

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 and resource ('Capture the current screen as a PNG') plus the intent ('so you can SEE the UI state'), and explicitly distinguishes itself from describe_ui by saying coordinates must come from that tool, not this image.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('call it after every action to confirm the screen changed'), a rationale for the rule (blind chaining taps the wrong screen), and a when-not/alternative path ('when black, use describe_ui instead'). Nothing 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.

send_smsSend SMSA

Deliver an incoming SMS to the emulator (adb emu sms send) — the standard way to drive OTP / 2FA flows without a second phone. Pass a sender number (from) and the message text (e.g. the code). Emulator-only.

NameRequiredDescriptionDefault
fromYesSender phone number the SMS appears to come from, e.g. "+15551234567".
textYesMessage body (e.g. an OTP code) delivered to the device's SMS inbox.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false, so the description's contribution is meaningful: it clarifies that the message is injected into the emulator's inbox rather than sent over a real network, and that a second device is unnecessary. It could add more about timing or whether the SMS appears immediately, but the key behavioral nuance is covered.

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?

Three compact clauses, front-loaded with the action and its mechanism, then the use case, then the environment restriction. The '(adb emu sms send)' parenthetical is slightly technical filler but remains short and earns its place as mechanism disclosure.

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 simple two-required-parameter tool with full schema coverage and annotations providing the safety profile, the description supplies what is needed to call it correctly: purpose, mechanism, use case, and environment constraint. No output schema exists, so return-value explanation is not required.

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 100%, so all three parameters — including the optional serial — are already documented with examples in the schema. The description's restatement of 'from' and 'text' adds no syntax or format detail beyond that, so the baseline 3 applies.

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 and resource ("Deliver an incoming SMS to the emulator") and even discloses the underlying command (adb emu sms send). It does not explicitly contrast with the sibling phone_call, but the injection-of-SMS framing combined with "Emulator-only" makes the scope unambiguous.

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?

It gives a concrete usage scenario — driving OTP / 2FA flows without a second phone — which tells the agent exactly when this is the right tool. It states the emulator-only restriction, though it does not name an alternative for physical devices or a when-not case beyond that constraint.

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

session_clear_defaultsSession clear defaultsA
Idempotent

Clear any project_dir/serial defaults pinned for this session, reverting to requiring them on every call (serial still falls back to the single-attached-device default).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavioral nuance beyond that: after clearing, parameters are required on every call again, except serial still falls back to the single-attached-device default, which the annotations do not express.

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 front-loaded sentence with no redundant framing; the parenthetical fallback rule is the only slightly dense element but it earns its place by preventing a wrong mental model of post-clear behavior.

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 zero-parameter, idempotent state-reset tool with annotations and no output schema, this is nearly complete. A brief pointer to session_show_defaults for inspection would close the last gap.

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 the baseline is 4. The description appropriately spends no words on parameter semantics and instead describes the effect on parameter requirements elsewhere.

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 ('clear') and resource ('project_dir/serial defaults pinned for this session'), so the agent knows exactly what state is being reset. It doesn't name the sibling tools session_set_defaults or session_show_defaults, so explicit differentiation is absent, but the semantics are unambiguous.

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 description conveys the outcome of calling it (reverting to requiring defaults on every call), which implies when you'd want it, but it never states a when-to-use condition or points to session_set_defaults as the inverse operation. Usage is inferable rather than guided.

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

session_set_defaultsSession set defaultsA
Idempotent

Pin a default project_dir and/or serial for the rest of this session so later calls can omit them — the fix for a multi-module or multi-flavor project (or multiple attached devices) forcing you to repeat the same project_dir/serial on every Gradle or device call. Only the fields you pass are changed; omit a field to leave its current default alone. An explicit project_dir/serial on any individual call always overrides the session default for that one call.

NameRequiredDescriptionDefault
serialNoDefault device serial to use whenever a tool call omits serial. Leave empty to leave the current default unchanged.
project_dirNoDefault Android project root to use whenever a tool call omits project_dir. Leave empty to leave the current default unchanged.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare idempotent, non-destructive, closed-world behavior, and the description adds the two facts that matter most: partial-update semantics ('Only the fields you pass are changed; omit a field to leave its current default alone') and precedence ('An explicit project_dir/serial on any individual call always overrides the session default'). It stops short of saying whether values are validated (e.g., an unknown serial) or how defaults are removed.

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?

Front-loaded with the action and the payoff, then the two rules that govern behavior. It is dense but every clause carries information; the only cost is a single long opening sentence that would read better split.

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 two-optional-parameter session setter with full schema coverage and annotations, the description covers scope, merge behavior, and precedence. The one real gap is that it never points to session_clear_defaults for unsetting, and the schema's 'leave empty to leave unchanged' wording implies there is no in-tool way to remove a default.

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 coverage is 100% and both parameters are already documented, so the baseline is 3. The description adds genuine meaning beyond the schema by spelling out override precedence for individual calls, which the schema never states, and by reinforcing the omit-means-unchanged rule.

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 and object ('Pin a default project_dir and/or serial') plus its scope ('for the rest of this session') and its effect ('later calls can omit them'). The purpose is unmistakable and clearly distinct from sibling setters like stop_app or set_location.

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 a concrete triggering scenario ('multi-module or multi-flavor project, or multiple attached devices forcing you to repeat the same project_dir/serial on every Gradle or device call'), which is strong when-to-use guidance. It falls short of a 5 because the obvious companion tools session_clear_defaults and session_show_defaults are never named as alternatives for unsetting or inspecting the defaults.

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

session_show_defaultsSession show defaultsA
Read-only

Show the project_dir/serial defaults currently pinned for this session (set via session_set_defaults).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds the useful behavioral fact that the scope is per-session state rather than global device state. It stops short of describing what is returned when no defaults are pinned (empty, null, or absent keys), which matters since there is no output schema.

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 sentence with no filler, front-loaded with the verb and resource, and the trailing parenthetical earns its place by linking to the setter. Nothing is redundant with the title or annotations.

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 zero-parameter read of session state with annotations covering safety, the description is nearly complete. The one remaining gap is the return shape when nothing is pinned, which the agent cannot infer because no output schema exists.

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 the baseline is 4. The description correctly implies no input is needed by framing the values as already pinned for the session, and there are no parameters whose meaning needs elaboration.

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 ("Show") and a specific resource (the project_dir/serial defaults pinned for the current session), and it ties that resource back to the sibling that sets it (session_set_defaults). This lets an agent separate it from session_set_defaults and session_clear_defaults without opening any schema, though it doesn't state the read-only counterpart relationship explicitly.

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 parenthetical "(set via session_set_defaults)" tells the agent where the values come from, hinting this is the inspection step after setting defaults. There is no explicit when-to-use statement, no when-not-to-use, and no mention of session_clear_defaults as the alternative for removing defaults.

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

set_batterySet batteryA
Idempotent

Set the battery level (0-100) and/or charging state — test low-battery UI and charging-only logic deterministically. On an emulator it uses the console (adb emu power); on a PHYSICAL device it forces the values via dumpsys battery, which persist until you call this again with reset=true (or the device reboots). Provide level, charging, or both — or reset=true to restore automatic reporting. (For a fake battery in a clean SCREENSHOT status bar only, use set_status_bar instead.)

NameRequiredDescriptionDefault
levelNoBattery charge level 0-100. Omit to leave the level unchanged.
resetNoRestore automatic battery reporting (dumpsys battery reset) and ignore level/charging. On a physical device the forced values persist until this (or a reboot); use it to clean up after testing.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
chargingNotrue = plugged into AC, false = on battery. Omit to leave the charging state unchanged.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare idempotent/non-destructive/openWorld, so the description carries the real burden and does: it discloses the emulator-vs-physical-device implementation difference (adb emu power vs dumpsys battery), that forced values persist until reset or reboot, and that reset restores automatic reporting. That is exactly the persistence/cleanup context an agent needs.

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?

Dense but front-loaded: the purpose and effect land in the first clause, with persistence and the sibling alternative following. The nested parenthetical at the end is slightly heavy, but every sentence carries usable information.

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?

No output schema exists, yet the description covers state persistence, cross-platform behavior differences, the reset cleanup path, and the sibling alternative — sufficient for an agent to call it correctly and undo it.

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 100%, so the schema already explains level, charging, reset, and serial including the 'omit to leave unchanged' semantics. The description reinforces the level/charging/both combination and reset precedence but adds little syntax or meaning beyond the structured fields, so baseline 3 applies.

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?

Names a specific verb and resource (set battery level and/or charging state) and immediately states the purpose — deterministic low-battery/charging logic testing. It explicitly distinguishes itself from the sibling set_status_bar for the screenshot-only case.

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

Usage Guidelines5/5

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

States exactly how to invoke it (level, charging, or both; or reset=true) and names the alternative (set_status_bar) with the condition that selects it. It also covers the cleanup path via reset, which is the key usage rule for a persisting mutation.

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

set_dark_modeSet dark modeA
Idempotent

Turn the system dark theme on or off (cmd uimode night) — to test light/dark appearances.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
enabledYestrue = dark theme on, false = off.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=false, and the description adds the shell-level mechanism (cmd uimode night), which tells the agent this manipulates a system setting. It does not say whether the change persists across reboot or whether it affects the whole device rather than a single app, which is the main behavioral unknown here.

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 sentence with zero filler, front-loading the action and the underlying command before the purpose clause. Nothing is repeated from the title or schema.

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 two-parameter, non-destructive toggle with full schema coverage and annotations, the description covers what it changes and why. The only omissions, persistence across reboot and whether a device must be online, are minor for a low-complexity tool with no output schema.

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 100%; both the optional serial (adb -s, single-device fallback) and the boolean enabled flag are fully documented in the schema. The description adds no syntax or meaning beyond that, so the baseline of 3 applies.

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: turning the system dark theme on or off, and cites the underlying mechanism (cmd uimode night) plus intent ('to test light/dark appearances'). This clearly separates it from other device-state tools like rotate_screen or stay_awake, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

'to test light/dark appearances' implies the usage context, so an agent can infer this is for appearance testing rather than general theming. There is no explicit when-not guidance, no prerequisite note (e.g. device must be connected), 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.

set_device_lockSet device lockA
Destructive

Set a secure lock screen (type: pin [default], pattern, or password). REQUIRED before AndroidKeyStore / Keystore-backed crypto flows, which fail with 'A secure lock screen is required' on a fresh emulator that has no lock. Follow with is_device_secure to confirm.

NameRequiredDescriptionDefault
typeNoLock type: pin (default), pattern, or password.
valueYesCredential to set, e.g. "1234".
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
old_valueNoThe CURRENT credential, required only when a lock is already set and you want to change it (locksettings refuses to overwrite otherwise).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and openWorldHint=false, and the description adds real context beyond that: the downstream failure mode ("A secure lock screen is required"), the fresh-emulator scenario, and the fact that locksettings refuses to overwrite an existing credential without old_value. It does not say whether an existing lock is replaced or whether anything on the device is reset, which is the main remaining behavioral gap.

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 tight sentences, front-loaded with the action and its parameter default, then the reason to call it, then the verification step. No filler or repetition of the schema.

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 four-parameter mutation with no output schema, the description supplies the motive for calling it, the prerequisite, and the verification path, which is enough to invoke it correctly. The only gap is the effect on an already-configured device, which the old_value note only partially covers.

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 coverage is 100%, so the schema already documents all four parameters; the description only restates the type enum and default. It does reinforce the old_value precondition by explaining the underlying refusal to overwrite, but adds little syntax or format detail beyond the schema.

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 ("Set a secure lock screen") and enumerates the accepted credential types with the default called out. It never names the obvious siblings (clear_device_lock, enter_pin, prefer_pin), so an agent must infer the boundary, which keeps it 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 Guidelines4/5

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

Gives a concrete precondition for use ("REQUIRED before AndroidKeyStore / Keystore-backed crypto flows") and a follow-up step ("Follow with is_device_secure to confirm"). It does not state when not to use it or how it differs from clear_device_lock / enter_pin, so exclusions are absent.

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

set_locationSet locationA
Idempotent

Set the emulator's mock GPS location (longitude, latitude) — for location-gated features.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
latitudeYesLatitude of the mock GPS fix.
longitudeYesLongitude of the mock GPS fix.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare non-destructive, idempotent, and non-open-world behavior. The description adds that this is a mock location on the emulator, but does not disclose whether it requires an emulator/root, whether the fix persists across reboots, or how to clear it.

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 compact sentence, front-loaded with the verb and resource, with no redundant or wasted wording.

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 simple three-parameter mutation, the description plus rich schema and annotations are largely sufficient, but it omits how to revert/clear the mock location and whether the emulator-only constraint is absolute.

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 100%, so latitude/longitude/serial are fully documented in the schema; the description only repeats the tuple, adding no ordering or format guidance beyond what is already structured.

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 and resource ('Set the emulator's mock GPS location') with the exact values affected, and distinguishes it clearly from sibling set_* tools like set_battery and set_sensor by naming the resource.

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 phrase 'for location-gated features' gives a usage context, but there is no explicit when-to-use/when-not guidance, no mention of alternatives (e.g., using real device location), and no prerequisite notes.

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

set_sensorSet sensorA
Idempotent

Set an emulated hardware sensor value (adb emu sensor set) — drive accelerometer/gyroscope/orientation (pass x, y, z) or a single-value sensor like light/proximity/temperature/pressure/humidity (pass x only). Use to exercise shake/tilt/rotation handlers or ambient-light/proximity logic. Emulator-only.

NameRequiredDescriptionDefault
xYesFirst value (the only value for single-axis sensors like light/proximity).
yNoSecond value for multi-axis sensors. Omit for single-value sensors.
zNoThird value for multi-axis sensors. Omit for single-value sensors.
sensorYesSensor name, e.g. acceleration, gyroscope, magnetic-field, orientation (3 values) or light, proximity, temperature, pressure, humidity (1 value).
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds meaningful context beyond that: it emulates a hardware sensor via adb emu, is emulator-only, and affects sensor-driven app logic, though it does not detail value ranges or persistence beyond the idempotency hint.

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 description is compact and front-loaded: the core operation and command are stated first, followed by axis guidance, use cases, and the emulator-only constraint. Every sentence contributes relevant selection or invocation information.

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 simple, annotation-rich, no-output-schema tool, the definition is nearly complete: it covers the operation, sensor categories, axis requirements, use cases, and emulator-only scope. It could add value ranges or units for sensor values, but that is a minor gap rather than a blocker.

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 100%, so the baseline is 3. The description restates the axis mapping for three-value versus one-value sensors, but that information is already present in the schema property descriptions, so it adds little beyond the structured fields.

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?

The description gives a specific verb and resource: 'Set an emulated hardware sensor value', and names the underlying adb emu command. It also distinguishes multi-axis sensors requiring x, y, z from single-value sensors requiring only x, so an agent can identify exactly what this tool does.

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?

It explains when to use the tool ('exercise shake/tilt/rotation handlers or ambient-light/proximity logic') and when it is not applicable ('Emulator-only'). It does not explicitly name alternatives among the set_* siblings, which keeps it short of full when-to-use/when-not guidance.

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

set_status_barSet status barA
Idempotent

Pin a clean status bar via SystemUI demo mode (enabled=true) — fixed clock, chosen signal/battery, no notification icons by default — so screenshots for docs don't leak the wall clock or a random signal state. Optionally set clock (HHMM), battery (0-100), network_type (wifi/mobile/none) with mobile_level/data_type/carrier for mobile, and notifications_visible/notification_icon. Call with enabled=false to restore the live bar.

NameRequiredDescriptionDefault
clockNoFixed clock as 4 digits HHMM, e.g. "1200". Only when enabled=true; omit to leave unchanged.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
batteryNoFixed battery level 0-100 (shown unplugged). Only when enabled=true; omit to leave unchanged.
carrierNoCarrier/operator name shown in the status bar. Only used when network_type=mobile.
enabledYestrue = enter demo mode (clean, fixed status bar); false = exit and restore the live status bar.
data_typeNoMobile data-type icon shown next to the signal, e.g. lte, 4g, 5g, 3g, edge, 1x, h, h+, roam. Only used when network_type=mobile.
mobile_levelNoMobile signal bars 0-4. Only used when network_type=mobile. Default 4.
network_typeNoNetwork icon: "wifi" (default, full signal), "mobile", or "none" (hide network icons). Only when enabled=true.
notification_iconNoBest-effort: an AOSP SystemUI icon resource name to show in the first notification slot. Support varies by SystemUI/Android version. Only when enabled=true.
notifications_visibleNoShow notification icons in the status bar. Default false (hidden, for clean screenshots). Only when enabled=true.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare idempotentHint, destructiveHint=false, and openWorldHint=false, so safety is covered; the description goes further by naming the underlying mechanism (SystemUI demo mode), disclosing defaults (notification icons hidden, wifi full signal, mobile_level 4) and the restore semantics. It does not say whether the pinned state survives device reboot/disconnect or requires elevated adb permissions, which would be the remaining behavioral gap.

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?

The purpose and its rationale are front-loaded in the opening clause, and the final sentence delivers the exit path. It is dense with em-dash subordination and the middle parameter list largely duplicates the schema, costing a bit of economy.

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 ten-parameter mutation-adjacent tool with no output schema, the description covers the mechanism, the defaults, the conditional parameter relationships, and the undo path — enough to call it correctly. Only persistence/permission expectations are unstated.

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 100%, so every one of the ten parameters is already documented, making 3 the baseline. The description restates the key knobs and their conditional grouping (data_type/carrier only for mobile) but adds no format or interaction detail beyond the schema, so it earns no lift.

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?

The description states a specific verb and mechanism ("Pin a clean status bar via SystemUI demo mode") plus the concrete motive ("so screenshots for docs don't leak the wall clock or a random signal state"). That motive cleanly separates it from neighbors like set_battery, screenshot, or cellular, which an agent might otherwise confuse it with.

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?

Use-when is clear (preparing screenshots for docs), and the reverse path is spelled out explicitly: "Call with enabled=false to restore the live bar." What is missing is any explicit alternative — e.g., whether set_battery/cellular should be preferred for non-screenshot automation — so the agent must infer the boundary with siblings.

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

shutdown_emulatorShutdown emulatorA
DestructiveIdempotent

Power off a running emulator (adb emu kill). Use when you are done with a device you booted.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds the underlying adb command and the lifecycle framing (emulator you booted), though it does not say what happens to running apps or in-flight state on shutdown.

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?

One sentence with the action and mechanism front-loaded, followed by a short usage clause. No filler.

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, no-output-schema tool with destructiveness already declared in annotations, the description covers purpose, mechanism, and timing adequately. Minor gap: no mention of failure behavior when no emulator is running or when multiple devices are attached.

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 100% and the single serial parameter is fully documented in the schema, including the optional-when-one-device-attached rule. The description adds nothing about the parameter, so the baseline 3 applies.

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+resource ("Power off a running emulator") and backs it with the concrete mechanism (adb emu kill), which unambiguously separates it from siblings like stop_app or boot_emulator.

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 clear when-to-use guidance: after you are done with a device you booted. It does not name an alternative for narrower shutdown needs (e.g., stop_app) or state when-not to use it, so it falls short of a full routing statement.

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

start_logcat_captureStart logcat captureA

Begin streaming logcat into a buffer for this device (optionally clearing first). Pair with stop_logcat_capture to get everything logged DURING a flow — use this instead of the one-shot 'logcat' when you need logs across an interaction.

NameRequiredDescriptionDefault
clearNoClear the logcat buffer before capturing. Default true.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare openWorldHint=false and destructiveHint=false; the description adds the meaningful behavior that output is accumulated into a buffer that must be closed by stop_logcat_capture, and that the buffer may be cleared first. It does not say what happens if a capture is already running, or whether clearing is permanent — minor gaps given the low annotation coverage of statefulness.

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 sentences, front-loaded with the action and followed by the pairing/alternative guidance. Every clause carries information; no filler.

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 two-parameter, no-output-schema tool, the description covers purpose, lifecycle pairing, and the sibling alternative, which is nearly everything an agent needs. The one unaddressed point is whether the call returns a handle or simply relies on the device serial for the stop call, and whether calling it twice is safe.

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 100%, so both 'clear' and 'serial' are already documented in the schema. The description echoes the clearing option and the device scoping but adds no syntax, default, or multi-device detail beyond what the schema provides, so the baseline 3 applies.

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 and resource ('Begin streaming logcat into a buffer') plus its scoping ('for this device'), and explicitly distinguishes itself from the sibling one-shot 'logcat' tool. An agent can tell the streaming variant apart from the one-shot variant without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance ('when you need logs across an interaction'), names the required companion tool ('Pair with stop_logcat_capture'), and names the alternative it replaces ('instead of the one-shot logcat'). The selection rule is unambiguous.

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

start_screen_recordStart screen recordA

Start recording the screen to an mp4 on the device (Android caps a single recording at ~180s). Pair with stop_screen_record.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=false and openWorldHint=false, so the safety profile is covered; the description adds a genuinely useful non-obvious constraint (Android caps a single recording at ~180s). It omits where the file lands, what it is named, and whether an existing recording blocks a new one.

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 short sentences with zero filler; the core action and output format come first and the cap warning and pairing advice follow.

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 start/stop recording pair, an agent still needs to know where the mp4 is written and how to retrieve it (pull_file), which the description never addresses. There is no output schema to carry that information, so the gap is real, though the tool is otherwise simple.

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 100% and the single 'serial' parameter is fully documented in the schema, so the description needs to add nothing. It stays silent on device targeting, which is acceptable here but means no value beyond the schema.

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 and resource ('Start recording the screen') plus the output artifact ('to an mp4 on the device'), which distinguishes it clearly from screenshot, render_stats, and logcat siblings. It also names its counterpart stop_screen_record, so an agent can place it in the record/stop pair without reading the schema.

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?

'Pair with stop_screen_record' gives clear guidance on the lifecycle and implies you must not leave a recording running. It does not, however, say when to prefer a video capture over screenshot or render_stats, nor whether the recording must be pulled off the device afterward.

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

stay_awakeStay awakeA
Idempotent

Keep the display from dozing during a driving session (svc power stayon true) — the fix when screenshots keep coming back black with screen_off:true because the device sleeps between steps (common on emulators with a short timeout). enabled=true holds the screen on while charging (emulators always are); enabled=false restores the normal timeout. describe_ui works regardless, but any screenshot/coordinate flow needs the screen on.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
enabledYestrue = keep the screen on while charging (svc power stayon true); false = restore the normal display timeout.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only cover safety (non-destructive, idempotent, closed-world); the description adds the actual mechanism, the caveat that hold-on only applies while charging and that emulators always are, and the precise blast radius (screenshots and coordinate flows, not describe_ui). It stops short of saying whether the setting persists after the session or across reboots, which is the one remaining behavioral unknown for a persisted device setting.

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?

Front-loaded with the core action and the failure mode it fixes, and every clause carries information. The single dense paragraph with two parentheticals is slightly overloaded compared with a clean two-sentence split, but there is no filler.

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?

For a two-parameter toggle with a fully described schema, no output schema, and annotations covering safety and idempotency, nothing an agent needs in order to decide to call it is missing. The symptom-to-fix mapping and the describe_ui exemption are exactly the context that would otherwise be 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 coverage is 100%, so both parameters are already documented and the baseline is 3. The description's restatement of enabled matches the schema; the only marginal addition is the note that emulators are always charging, which tells the agent the 'while charging' condition will in practice be satisfied.

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 and resource ('Keep the display from dozing during a driving session') and names the underlying command (svc power stayon true). It also distinguishes itself from neighbors by naming describe_ui as the thing that does not need it and screenshot/coordinate flows as the thing that does.

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

Usage Guidelines5/5

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

Gives a concrete triggering symptom ('screenshots keep coming back black with screen_off:true'), a diagnosis (device sleeps between steps, common on emulators with short timeouts), and explicit direction for both argument values including when to turn it back off. It also carves out the case where the tool is unnecessary (describe_ui).

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

stop_appStop appA
Idempotent

Force-stop an app by package name. Pair with launch_app to reset an app to a clean start when reproducing a bug.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name (e.g. com.example.app).

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds the 'force-stop' framing, which implies the process is killed without wiping state, but it never explicitly states that app data is preserved (unlike clear_app_data) or what happens if the app is not running.

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 short sentences with zero filler: the action is front-loaded and the workflow hint follows. Nothing is repeated from the title or annotations.

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 two-parameter, low-risk, output-schema-less tool, the description plus annotations cover everything needed to invoke it correctly. Minor omission: no note on behavior when the app is already stopped, though idempotentHint largely covers that.

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 100%: both 'serial' (with the single-device fallback) and 'package' (with an example) are fully documented in the schema. The description only reinforces that package is the selector and adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

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?

"Force-stop an app by package name" names a specific verb (force-stop), the resource (app), and the required identifier (package name). This clearly separates it from siblings like clear_app_data or uninstall_app, which act on app data rather than the running process.

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?

The description gives a concrete usage context: pair with launch_app to reset an app to a clean start when reproducing a bug, which names a sibling and a workflow. It stops short of explicitly excluding the nearest alternatives (clear_app_data, uninstall_app, reload_app), so the agent must infer the boundary.

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

stop_logcat_captureStop logcat captureA

Stop the running logcat capture and return what was collected since start, optionally filtered by a case-insensitive substring, a minimum priority (V/D/I/W/E/F), and/or tags (OR'd). Output is capped to the last 500 lines by default (override with tail) so a long capture doesn't blow the token budget — narrow with the filters first.

NameRequiredDescriptionDefault
tagsNoKeep only lines whose log tag contains one of these (case-insensitive, OR'd).
tailNoKeep only the last N lines after filtering (the most recent, where a crash usually is). Default 500; pass a larger number for more, or a huge one to effectively disable the cap.
filterNoCase-insensitive substring to keep.
redactNoMask common secrets (token, password, authorization, api key, secret) before returning captured lines.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
priorityNoMinimum priority to keep: V, D, I, W, E, or F.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare openWorldHint=false and destructiveHint=false, so the description does not need to explain safety from scratch. It adds useful behavioral context: captured lines are capped to the last 500 by default, tail overrides the cap, and filters should be narrowed first to avoid token-budget issues. It does not mention error behavior when no capture is running, but the main operational traits are disclosed.

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 description is two sentences, front-loaded with the action and return behavior, and every clause adds useful operational context. The cap rationale is placed immediately after the filter description, making it easy to parse.

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 six-parameter tool with no output schema, the description covers the essential purpose, return content, filtering behavior, and default output cap. It leaves less-critical details such as redaction and serial targeting to the schema, but is sufficient for correct selection and invocation.

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 coverage is 100%, so the schema already documents all six parameters thoroughly. The description adds cross-parameter guidance by explaining the purpose of the cap and tail in token-budget terms and by advising filter narrowing, though it does not describe redact or serial beyond what the schema provides.

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?

The description states a specific verb and resource: stop the running logcat capture. It also adds the distinctive return behavior, 'return what was collected since start,' which separates it from start_logcat_capture, logcat, and clear_logcat.

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?

It implies the tool is used when a logcat capture is already running and mentions narrowing with filters, but it does not explicitly name alternatives such as logcat, clear_logcat, or last_crash. The when-to-use context is therefore present only by implication.

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

stop_screen_recordStop screen recordA

Stop the screen recording, finalize the mp4, and pull it to a local path.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
local_pathYesLocal path to save the pulled mp4, e.g. /tmp/rec.mp4.

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already state destructiveness and world scope, so the lower bar applies; the description still adds real value by revealing that this tool both finalizes the mp4 AND performs a pull to a local path, which is not apparent from the name. It does not say whether the pull is skippable, what happens if the device write is incomplete, or how errors surface when no recording exists.

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 front-loaded sentence that names the action first and the consequences second, with zero filler and no repetition of the title.

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 two-parameter tool with full schema coverage and no output schema, this is nearly sufficient: the agent knows the recording is stopped, the mp4 finalized, and the file written locally. The remaining gap is edge-case behavior when no recording is active or when local_path is unwritable, which the description does not address.

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 100%, so both parameters are already documented, and the description's 'pull it to a local path' merely corroborates local_path's meaning. It adds no new semantics for serial or for path format beyond the schema examples, which is the expected baseline when the schema carries the load.

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?

Description states a specific verb+resource ('Stop the screen recording') and names two concrete side effects ('finalize the mp4', 'pull it to a local path'), so an agent can distinguish it from siblings like pull_file, screenshot, or start_screen_record. It stops short of an explicit 'this is the counterpart to start_screen_record' statement, but the name plus description make the pairing obvious.

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 by 'Stop the screen recording' – it applies only when a recording started by start_screen_record is in progress – but there is no explicit when/when-not guidance, no mention of what happens if no recording is running, and no pointer to pull_file as an alternative for retrieving an already-finished file.

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

swipeSwipeA

Swipe/drag from a start point to an end point. Params: x1,y1 (start) and x2,y2 (end) in true device pixels — x and y are accepted aliases for x1 and y1. To SCROLL DOWN a list, swipe from a HIGH y to a LOW y (drag the content up); reverse to scroll up. A longer duration_ms gives a slower, controlled drag; a short one flings.

NameRequiredDescriptionDefault
xNoAlias for x1 (start X).
yNoAlias for y1 (start Y).
x1NoStart X in true device pixels (alias: x).
x2YesEnd X in true device pixels.
y1NoStart Y in true device pixels (alias: y).
y2YesEnd Y in true device pixels.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
duration_msNoSwipe duration in ms. Default 300.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish this is non-destructive and not open-world, so the safety bar is low. The description adds real behavioral context beyond them: direction-to-scroll mapping, the effect of duration_ms (controlled drag vs fling), and the pixel-coordinate contract. It doesn't mention what happens on failure or whether the gesture can be interrupted.

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?

Front-loaded with the action, then parameter semantics, then practical scroll guidance — every sentence carries information. Minor waste in restating the x/y alias mapping that the schema already declares verbatim.

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 an 8-parameter device-input tool with no output schema, the description covers the essentials: coordinate system, required points, scroll direction, and duration behavior. It omits any mention of the optional `serial` device targeting, though the schema documents it adequately.

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 100%, so all eight parameters are already documented, giving a baseline of 3. The description does add value on top by explaining that coordinates are in true device pixels and by giving the practical semantics of duration_ms and the y-direction, but it largely restates alias information already present in the schema.

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?

Opens with a specific verb+resource ('Swipe/drag from a start point to an end point') and adds coordinate semantics, so an agent knows exactly what operation this performs. It does not distinguish itself from the sibling `drag` tool, which appears to do something very similar, leaving 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?

Provides genuinely useful implied usage guidance for scrolling: 'To SCROLL DOWN a list, swipe from a HIGH y to a LOW y... reverse to scroll up', and explains duration trade-offs (slow controlled drag vs fling). However there is no explicit when-to-use/when-not guidance relative to `drag`, `tap`, or `long_press`, which is the main ambiguity an agent faces.

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

tapTapA

Tap a single coordinate in true device pixels. Use a center value from describe_ui. If a tap seems to do nothing, the coordinate is almost always stale/misscaled — re-run describe_ui and use a fresh center. Prefer tap_on_text when you know the element's label. When a tap lands but nothing happens, pass identify=true (reports which element the coordinate hit — or that it hit a non-clickable wrapper / no reported element) and/or verify_change=true (reports whether the UI actually changed) to tell the failure modes apart. Note: some native views (e.g. Compose/RN NativeTabs bars) don't respond to coordinate taps at all — use tap_on_text/tap_element with via_accessibility=true there (EXPERIMENTAL, requires adb-mcp bridge install once per device).

NameRequiredDescriptionDefault
xYesX coordinate in true device pixels.
yYesY coordinate in true device pixels.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
identifyNoAlso report which UI element the coordinate lands in (a hit test against the hierarchy read just before tapping). Use when a tap seems to do nothing: it tells you whether the coordinate hit the element you expected, a non-clickable wrapper, or no reported element at all (an unseen overlay). Costs one extra hierarchy read.
verify_changeNoAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations, which only declare non-destructive and closed-world. It discloses the dominant failure mode (stale/misscaled coordinates), the fact that some Compose/RN native views never respond to coordinate taps at all, and the one-time `adb-mcp bridge install` prerequisite for the accessibility fallback. It stops short of describing return payloads in detail, which is the only notable gap.

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?

Front-loads the action, then the sourcing rule, then the fallbacks and diagnostics, so the most important information comes first. It is dense and slightly overstuffed in the closing sentence (native views plus the experimental bridge install), but no sentence is filler.

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?

There is no output schema, and the description compensates by saying what identify reports (hit element, non-clickable wrapper, or nothing) and what verify_change reports (ui_changed: true/false). For a simple 5-parameter tap tool, nothing an agent needs to call or interpret it correctly is missing.

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 coverage is 100%, so the baseline is 3, but the description adds decision-level meaning: it frames identify and verify_change as a paired diagnostic for distinguishing failure modes rather than as standalone flags. The cost hints (extra hierarchy reads) are already in the schema, so the added value is mostly the workflow framing.

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 and resource ('Tap a single coordinate in true device pixels') and immediately separates itself from tap_on_text and tap_element by the coordinate-vs-label distinction. An agent can route between tap, tap_on_text, and tap_element from this sentence alone.

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

Usage Guidelines5/5

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

Gives explicit when-to-use and when-to-use-something-else: prefer tap_on_text when the element label is known, and use tap_on_text/tap_element with via_accessibility for native views that ignore coordinate taps. It also names the diagnostic escalation path (identify/verify_change) for the specific failure case of a silent no-op.

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

tap_elementTap elementA

Find an element by resource_id and tap its center — the id-addressed sibling of tap_on_text, for elements with no visible label. Runs describe_ui internally (filter=all, so even unlabeled wrapper nodes are findable) and re-resolves the element right before tapping, narrowing the window where a stale coordinate lands on an overlay (e.g. an Expo dev-menu bubble) the a11y tree never reported. Use exact match (partial=false) to avoid hitting the wrong item when ids overlap; verify_change reports whether the tap had any visible effect. If a coordinate tap lands but nothing happens (e.g. a Compose/RN NativeTabs bar), pass via_accessibility=true to dispatch a real accessibility click instead (EXPERIMENTAL — see that param's description).

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
partialNoSubstring match instead of exact. Default true.
resource_idYesResource id to find and tap, e.g. "com.example.app:id/submit_button" or just "submit_button" (matches by substring by default).
verify_changeNoAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.
via_accessibilityNoEXPERIMENTAL. Dispatch a real accessibility click (AccessibilityNodeInfo.performAction(ACTION_CLICK)) through the adb-mcp accessibility bridge instead of a coordinate tap — reaches native views (Compose/RN NativeTabs bars, some overlays) that ignore input tap entirely. Requires the bridge installed once per device: run "adb-mcp bridge install" on the host first, or this returns a clear error telling you to. Default false (coordinate tap).

TDQS

A4.4/5.0
Behavior3/5

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

Annotations are minimal (destructiveHint=false, openWorldHint=false) and do not declare readOnly, so the description usefully adds that it runs describe_ui internally with filter=all, re-resolves right before tapping to shrink the stale-coordinate window, and can dispatch a real accessibility click requiring a one-time bridge install. That is meaningful behavior beyond the structured fields. It stops short of saying what the tool returns on failure to find the element or how a missing id is reported, which keeps it from the top band.

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?

Front-loaded with the core action and sibling relationship, then layered guidance in descending priority. Dense with parentheticals and slightly long for a single tool, but nearly every clause carries decision-relevant information rather than restating the name.

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?

For a one-required-param tap tool with no output schema, it covers the failure modes an agent will actually hit: stale coordinates over overlays, silent no-op taps, unmatched ids, and the missing-bridge error. Nothing needed to invoke or recover is absent.

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 coverage is 100%, so baseline is 3, but the description goes further by explaining the tradeoff behind partial vs exact matching and the cost/benefit of verify_change ('two extra hierarchy reads' is in the schema, but the guidance to set partial=false on overlapping ids is not). The via_accessibility sentence adds the recovery scenario, though it defers detail to the param description.

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 and resource ('Find an element by resource_id and tap its center') and immediately differentiates it from the sibling tap_on_text by framing itself as the 'id-addressed sibling ... for elements with no visible label.' An agent can route between tap, tap_on_text, and tap_element without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions: exact match (partial=false) when ids overlap, verify_change when a silent no-op would derail the agent, and via_accessibility for Compose/RN NativeTabs bars that swallow coordinate taps. It also names the alternative (tap_on_text) and the situation that selects it.

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

tap_on_textTap on textA

Find an element by its visible text or content-description and tap its center — the one-shot way to press a labelled button/row without computing coordinates yourself. Runs describe_ui internally and prefers a clickable match. Matching folds typographic punctuation to ASCII, so a typed "Don't allow" finds the system dialog's "Don’t allow" (U+2019) and an en/em dash matches a hyphen. Use exact match (partial=false) to avoid hitting the wrong item when labels overlap. If a coordinate tap lands but nothing happens (e.g. a Compose/RN NativeTabs bar), pass via_accessibility=true to dispatch a real accessibility click instead (EXPERIMENTAL — see that param's description).

NameRequiredDescriptionDefault
textYesText or content-description to find.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
partialNoSubstring match instead of exact. Default true.
verify_changeNoAlso report whether the UI hierarchy changed after the tap (ui_changed: true/false). Costs two extra hierarchy reads (~2-3s); use when a tap silently doing nothing would send you down the wrong path.
via_accessibilityNoEXPERIMENTAL. Dispatch a real accessibility click (AccessibilityNodeInfo.performAction(ACTION_CLICK)) through the adb-mcp accessibility bridge instead of a coordinate tap — reaches native views (Compose/RN NativeTabs bars, some overlays) that ignore input tap entirely. Requires the bridge installed once per device: run "adb-mcp bridge install" on the host first, or this returns a clear error telling you to. Default false (coordinate tap).

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the sparse annotations (only destructiveHint=false, openWorldHint=false): it discloses that describe_ui runs internally, that a clickable match is preferred, that punctuation is folded, and that via_accessibility requires a one-time bridge install and is EXPERIMENTAL. The setup prerequisite and the silent-failure fallback path are exactly the behavioral context annotations do not carry.

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?

Front-loaded with the core action, then ordered by escalation: matching semantics, then exact-match advice, then the experimental fallback. Dense with no filler, though the closing EXPERIMENTAL parenthetical partially restates the parameter description.

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?

For a five-parameter tap tool with no output schema and thin annotations, the description covers matching behavior, fallback strategy, prerequisites, and verification options. The only minor omission is what happens on a no-match (error vs. silent), which the caller could infer but would benefit from knowing.

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 coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the Unicode punctuation folding rule (U+2019 to ASCII apostrophe, en/em dash to hyphen) is invisible in the schema, and the partial=false recommendation is given with a rationale. The via_accessibility pointer mostly duplicates its parameter description rather than extending it.

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 and resource ('find an element by its visible text or content-description and tap its center') and positions itself against coordinate taps. The phrase 'without computing coordinates yourself' plus the internal describe_ui mention distinguishes it from the raw tap/swipe siblings.

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 concrete when-to-use conditions: prefer this over coordinate taps, use partial=false when labels overlap, use via_accessibility=true when a coordinate tap lands but nothing happens on Compose/RN NativeTabs bars. It never names the near-identical sibling tap_element or tap explicitly, so an agent must infer the boundary from the description alone.

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

uninstall_appUninstall appA
DestructiveIdempotent

Uninstall an app by package name (adb uninstall). Use to remove a build before a clean install, or to verify first-run behavior after reinstalling. To keep the app but reset it, prefer clear_app_data.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
packageYesApplication package name (e.g. com.example.app).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=false, so the safety profile is covered structurally. The description adds real value beyond that by naming the adb command and framing the operation as full removal versus reset. It stops short of stating that app data/settings are wiped and that uninstalling a non-installed package fails, which would have made it 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.

Conciseness5/5

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

Three short sentences, front-loaded with the action and resource, then use cases, then the alternative. No filler or repetition of the title.

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 two-parameter mutation tool with full annotation coverage and no output schema, the description supplies everything needed to select and invoke it. The only omission is failure behavior (e.g. package not installed) and confirmation that user data is discarded.

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 100%, with both `package` and `serial` fully documented including the single-device default for serial. The description's "by package name" only restates the schema, so baseline 3 applies.

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 and resource ("Uninstall an app by package name") and even names the underlying mechanism (adb uninstall). It explicitly distinguishes itself from the sibling clear_app_data, so an agent can route between the two without opening a schema.

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

Usage Guidelines5/5

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

Gives two concrete use cases (removing a build before a clean install, verifying first-run behavior after reinstall) and an explicit alternative with its selecting condition: "To keep the app but reset it, prefer clear_app_data." That is when-to-use, when-not-to-use, and the alternative in one place.

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

waitWaitA
Read-only

Sleep for a number of seconds (fractions ok, capped at 300), then return. For TIME-based conditions where wait_for_text's polling doesn't apply: backgrounding an app long enough to trip a native auth timer, waiting out a cooldown or rate limit, letting a long animation finish. If the sleep sits BETWEEN actions whose timing you are testing, put the whole flow in run_sequence instead — an agent round-trip per step perturbs native timers.

NameRequiredDescriptionDefault
secondsYesHow long to wait, in seconds. Fractions allowed; capped at 300.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond them: the 300s hard cap, fraction support, and the warning that per-step agent round-trips perturb native timers. It does not describe return payload, but for a pure sleep that matters little.

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?

Front-loaded with the core behavior, then usage cases, then the alternative. Every sentence carries distinct information, though the '(fractions ok, capped at 300)' parenthetical duplicates the schema description verbatim and could be dropped.

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?

For a single-parameter sleep tool with annotations and no output schema, nothing an agent needs to call it correctly is missing: duration semantics, the cap, and when to prefer a sibling are all present.

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?

With one parameter at 100% schema description coverage, the schema already documents units, fractions, and the cap. The description restates the same facts rather than adding new meaning, so the baseline 3 applies.

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 and resource ('Sleep for a number of seconds ... then return') and immediately distinguishes itself from wait_for_text, which polls for text. An agent can tell exactly what this tool does and what it is not.

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

Usage Guidelines5/5

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

Gives concrete when-to-use cases (native auth timers, cooldowns/rate limits, long animations) and an explicit exclusion for wait_for_text's polling. It also names an alternative (run_sequence) with the condition that selects it, so routing is fully determined.

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

wait_for_bootWait for bootA
Read-only

Block until a device finishes booting (sys.boot_completed=1). Only needed if you started an emulator elsewhere; boot_emulator already waits by default.

NameRequiredDescriptionDefault
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
timeout_sNoTimeout in seconds. Default 120.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds the genuinely non-obvious trait that this call blocks, plus the specific system property it polls. It stops short of stating what happens on timeout (error vs. silent return) or what the call returns, which is the one behavioral gap.

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 sentences, zero filler, with the blocking semantics front-loaded and the routing caveat second. Every clause carries actionable information.

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?

A simple read-only polling tool with full schema coverage and no output schema, so the description need not explain return values. The only shortfall is timeout failure semantics, which matters for a blocking call but is a minor omission given how narrow the tool is.

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 100% – both serial ('adb -s', optional when one device is attached) and timeout_s (default 120) are fully documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

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?

Names a specific verb ('block until') and resource ('a device finishes booting') and pins the exact completion signal (sys.boot_completed=1). It also contrasts itself with the sibling boot_emulator, so an agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit when-not condition ('only needed if you started an emulator elsewhere') and names the alternative that already covers the common case ('boot_emulator already waits by default'). This is exactly the routing guidance an agent needs to avoid a redundant call.

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

wait_for_textWait for textA
Read-only

Poll the UI until an element with the given text/content-description appears (or times out), then return it. Use this after an async action (network load, navigation, animation) instead of a blind wait-then-screenshot — it returns as soon as the element is present, with its tappable center. Note: canvas-drawn (RN/Skia) text never enters the hierarchy, so it will time out on those — screenshot instead.

NameRequiredDescriptionDefault
textYesText or content-description to wait for.
scrollNoWhen true, swipe upward through the current scroll container while polling. Useful when Android omits off-screen ScrollView content from the accessibility tree.
serialNoTarget device serial (adb -s). Optional when exactly one device is attached.
partialNoSubstring match instead of exact. Default true.
timeout_sNoHow long to wait, in seconds. Default 15.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavior beyond them: it returns immediately when the element is found rather than after a fixed delay, returns a tappable center coordinate, and has a known failure mode for canvas-rendered text. It stops short of describing what a timeout response looks like or any polling interval, so a 4 rather than 5 is warranted given the annotations already lower the bar.

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?

Three sentences, front-loaded with the core behavior before the usage rule and the caveat. Dense but every sentence carries distinct information; the em-dash caveat is slightly compressed but not wasteful.

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?

For a five-parameter polling tool with no output schema, the description covers the return value (the element plus tappable center), the timing semantics (returns early, times out), the recommended usage context, and the primary failure mode. An agent can decide and call correctly without further information.

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 100%, so all five parameters including scroll, partial, timeout_s, and serial are already documented in the schema. The description only glosses 'text/content-description' and the timeout concept, adding little parameter-level meaning beyond structured data, so the baseline 3 applies.

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 and mechanism: 'Poll the UI until an element with the given text/content-description appears (or times out), then return it.' This is clearly distinguishable from sibling wait tools (wait, wait_for_boot, describe_ui, screenshot) because it names the polled target and the success condition.

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

Usage Guidelines5/5

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

Explicitly says when to use it ('after an async action (network load, navigation, animation)') and names the alternative it replaces ('instead of a blind wait-then-screenshot'), plus an explicit when-not: canvas-drawn RN/Skia text will time out, use screenshot instead. That is a complete routing rule.

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. 1 tool updatev0.24.6
    • Changedboot_emulator1 field changed
      • changedInput schema / properties / no_snapshot / description
        Previous value: -"Cold boot without loading a saved snapshot. Default true."New value: +"Cold boot without loading a saved snapshot. Default true when launching; if the AVD is already running it is ignored unless set true, which errors."
  2. 8 tool updatesv0.24.3
    • Addedbuild_status
    • Changedget_app_details3 fields changed
      • addedInput schema / properties / apk_path
        Added value: +{
        +  "description": "Local path to an .apk to read instead of querying a device: returns its package id, version and launcher activity via aapt2. Needs no device; use it right after a build to get the applicationId.",
        +  "type": "string"
        +}
      • changedInput schema / properties / package / description
        Previous value: -"Application package name (e.g. com.example.app)."New value: +"Installed application package name (e.g. com.example.app). Required unless apk_path is given."
      • removedInput schema / required
        Removed value: -[
        -  "package"
        -]
    • Changedgradle_build3 fields changed
      • addedInput schema / properties / background
        Added value: +{
        +  "description": "Start the build detached and return at once with a job id and log path; poll with build_status. Use for builds that take minutes.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / json
        Removed value: -{
        -  "description": "For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary. Ignored by gradle_build and list_gradle_tasks.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / task / description
        Previous value: -"Gradle task to run. Defaults to the tool's standard task."New value: +"Gradle task to run. Defaults to assembleDebug."
    • Changedlaunch_dev_client1 field changed
      • changedInput schema / properties / host / description
        Previous value: -"Metro dev-server host as the DEVICE sees it. Default localhost (works once adb_reverse tcp:8081 is set)."New value: +"Metro dev-server host as the DEVICE sees it. Default localhost (works once adb_reverse {device_port: 8081} is set)."
    • Changedlist_gradle_tasks3 fields changed
      • removedInput schema / properties / args
        Removed value: -{
        -  "description": "Extra arguments passed to Gradle (e.g. --stacktrace, -Pflavor=free).",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": [
        -    "null",
        -    "array"
        -  ]
        -}
      • removedInput schema / properties / json
        Removed value: -{
        -  "description": "For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary. Ignored by gradle_build and list_gradle_tasks.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / task / description
        Previous value: -"Gradle task to run. Defaults to the tool's standard task."New value: +"Gradle task to scope to, e.g. \":app:tasks\" to list the :app module's tasks or variants. Defaults to the root project's tasks."
    • Changedlist_gradle_variants1 field changed
      • changedInput schema / properties / task / description
        Previous value: -"Gradle task to scope to, e.g. \":app:tasks\" to list variants for the :app module. Defaults to the root project's tasks."New value: +"Gradle task to scope to, e.g. \":app:tasks\" to list the :app module's tasks or variants. Defaults to the root project's tasks."
    • Changedrun_instrumented_tests1 field changed
      • changedInput schema / properties / json / description
        Previous value: -"For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary. Ignored by gradle_build and list_gradle_tasks."New value: +"For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary."
    • Changedrun_unit_tests1 field changed
      • changedInput schema / properties / json / description
        Previous value: -"For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary. Ignored by gradle_build and list_gradle_tasks."New value: +"For run_unit_tests/run_instrumented_tests: return the test summary as structured JSON (per-suite timing, full failure stack traces) instead of the human-readable text summary."
  3. 3 tool updatesv0.23.0
    • Changedapp_state1 field changed
      • changedInput schema / properties / source_path / description
        Previous value: -"Optional host file or directory containing the app's source. When supplied, app_state compares its newest mtime with the latest Metro/HMR marker to flag stale JavaScript."New value: +"Optional host file or directory containing the app's source. When supplied, app_state ALWAYS returns a stale_verdict (stale | current | undetermined) with the reason — it compares the newest source mtime against the latest Metro/HMR marker, and checks that the dev server the app is connected to is rooted in this same checkout."
    • Changeddescribe_ui1 field changed
      • changedInput schema / properties / filter / description
        Previous value: -"What to include: 'auto' (default — elements with text, content_desc, resource_id, or clickable; identical-bounds label-less wrappers dropped), 'clickable' (tap targets only, the smallest view), or 'all' (every bounded node, unfiltered — use to PROVE an element is absent from the hierarchy)."New value: +"What to include: 'auto' (default — elements with text, content_desc, resource_id, or clickable; identical-bounds label-less wrappers dropped), 'clickable' (tap targets only, the smallest view), or 'all' (every bounded node, unfiltered — use to PROVE an element is absent from the CURRENT VIEWPORT). 'all' is still viewport-scoped: Android omits off-screen ScrollView children from the accessibility tree, so scroll before concluding absence, and use render_stats (not this) to count a long list."
    • Addedrender_stats
  4. 78 tool updatesv1.0.0
    • First observedadb_reverse
    • First observedapp_state
    • First observedavd_snapshot
    • First observedboot_emulator
    • First observedbuild_and_run
    • First observedcellular
    • First observedclear_app_data
    • First observedclear_device_lock
    • First observedclear_logcat
    • First observedconnect_wireless
    • First observeddescribe_ui
    • First observeddoctor
    • First observeddrag
    • First observedenter_pin
    • First observedfinger_remove
    • First observedfingerprint_touch
    • First observedget_app_details
    • First observedget_coverage_report
    • First observedget_file_coverage
    • First observedgradle_build
    • First observedgradle_project_properties
    • First observedgrant_permission
    • First observedhas_biometric_enrolled
    • First observedinput_key_combo
    • First observedinput_text
    • First observedinstall_app
    • First observedis_device_secure
    • First observedlast_crash
    • First observedlaunch_app
    • First observedlaunch_dev_client
    • First observedlist_avds
    • First observedlist_devices
    • First observedlist_gradle_projects
    • First observedlist_gradle_tasks
    • First observedlist_gradle_variants
    • First observedlist_packages
    • First observedlogcat
    • First observedlong_press
    • First observedopen_dev_menu
    • First observedopen_url
    • First observedphone_call
    • First observedprefer_pin
    • First observedpress_key
    • First observedpull_file
    • First observedpush_file
    • First observedreload_app
    • First observedrevoke_permission
    • First observedrotate_screen
    • First observedrun_instrumented_tests
    • First observedrun_sequence
    • First observedrun_unit_tests
    • First observedscaffold_android_project
    • First observedscreenshot
    • First observedsend_sms
    • First observedsession_clear_defaults
    • First observedsession_set_defaults
    • First observedsession_show_defaults
    • First observedset_battery
    • First observedset_dark_mode
    • First observedset_device_lock
    • First observedset_location
    • First observedset_sensor
    • First observedset_status_bar
    • First observedshutdown_emulator
    • First observedstart_logcat_capture
    • First observedstart_screen_record
    • First observedstay_awake
    • First observedstop_app
    • First observedstop_logcat_capture
    • First observedstop_screen_record
    • First observedswipe
    • First observedtap
    • First observedtap_element
    • First observedtap_on_text
    • First observeduninstall_app
    • First observedwait
    • First observedwait_for_boot
    • First observedwait_for_text

TDQS

A3.9/5.0

Scored across 80 tools

Disambiguation4/5

The tools cover distinct concerns across device lifecycle, emulator controls, UI interaction, Gradle builds, logging, and app state. A few deliberate near-neighbors exist (tap vs tap_on_text vs tap_element, gradle_build vs build_and_run, logcat vs logcat capture), but their descriptions clearly differentiate them; the main risk is simply the sheer number of options.

Naming Consistency4/5

Names are overwhelmingly snake_case and mostly follow recognizable verb_noun patterns (launch_app, set_battery, list_devices, clear_app_data). There are some noun-only or state/report names such as screenshot, logcat, doctor, app_state, and build_status, but there is no camelCase or truly chaotic mixing.

Tool Count2/5

Eighty tools is far beyond typical MCP scope and well past the already-heavy 16–25 range, even for a broad Android automation server. Some clusters (Gradle inspection, tap variants, logging capture modes, session defaults) could likely be consolidated without losing capability.

Completeness5/5

The surface covers an unusually complete Android development/testing lifecycle: emulator boot and snapshots, install/launch/stop/uninstall, data clearing, permissions, UI interaction, screenshots, logs/crashes, sensors, calls/SMS, locks/biometrics, Gradle build/test/coverage, file transfer, and session defaults. Only minor gaps such as a generic adb shell command or forward-port control are apparent.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers