scrcpy-agent
This server is an MCP server for remotely controlling and inspecting an authorized Android device over ADB, with a visible scrcpy screen mirror. It can list/select devices and read device info; start, stop, and check a configurable scrcpy mirror; take validated screenshots; dump and search the UI hierarchy; tap UI elements or coordinates; swipe, long-press, press allowlisted keys, and type text; list, inspect, launch, stop, install, and clear data for allowlisted apps; list and set runtime permissions; capture filtered/redacted logcat and retrieve crash/ANR reports; poll for UI conditions or screen changes; and run bounded, sanitized evidence sessions with notes. Mutating actions like app install, data clear, and permission changes require explicit approval, sensitive packages are blocked by default, and operations fail closed without generic shell access.
Allows observing and controlling an authorized Android device over USB via ADB, including screenshots, UI hierarchy inspection, semantic interaction, app inspection, logcat capture, and optional scrcpy mirroring.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@scrcpy-agentwhat's on the device screen right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Android Agent MCP (android-agent-mcp)
Android Agent MCP is a local MCP server that enables AI agents to control an explicitly authorized Android phone over ADB, with a visible server-owned scrcpy mirror. It exposes screenshots, UIAutomator state, semantic interaction, package diagnostics, bounded logcat, evidence recording, and reversible phone controls. scrcpy is the live-view subsystem, not the product's control plane.
The server does not call a language model and does not bypass Android locks, authentication, Play Integrity, DRM, root detection, permission prompts, or enterprise policy.
Status
Implemented and locally verified:
TypeScript build and strict type-checking
Automated unit, integration, protocol, and scrcpy tests, plus a separate opt-in physical-device smoke test
ADB/scrcpy adapters with injectable command runners
Device discovery, explicit selection, screenshots, UIAutomator parsing, semantic selectors, input, app inspection, logcat, scrcpy ownership, and evidence sessions
Low-latency quoted input batches, session-pinned geometry, bounded foreground probes, JPEG visual frames with PNG fallback, phase telemetry, and stateful action-observation sessions
Path-restricted APK installation and approval-gated mutations
Physical-device validation is opt-in and remains a separate gate. The full MCP stdio path has been validated on an authorized Samsung SM-A075F: discovery, selection, device information, visible scrcpy, app launch, screenshot image content, UI dump/find/tap, bounded logcat, evidence completion, and owned-mirror shutdown.
Related MCP server: @wilsonbeam/openclaw-adb-mcp
Requirements
Linux desktop is the supported initial platform; Manjaro/Arch is the primary tested distribution.
Node.js 22 or newer.
Android platform-tools (
adb).scrcpyis required by the default visible-mirror workflow; setANDROID_AGENT_MCP_MIRROR_AUTO_START=falsefor headless operation.A phone with Developer Options and USB debugging enabled, with this host’s RSA key accepted.
The server does not install ADB or scrcpy. Verify the host tools without changing system state:
adb version
scrcpy --version
adb devices -lThe repository also provides a read-only environment check:
npm run check:environment
# Add -- --require-scrcpy when mirroring is required.It never installs packages, changes udev rules, restarts ADB, or uses elevated privileges.
Install from a checkout
git clone https://github.com/EF-Code/android-agent-mcp.git
cd android-agent-mcp
npm run install:guided
npm run verifynpm run install:guided runs the locked local dependency install, builds the server, detects supported MCP hosts, and writes their native local stdio configuration. The compatibility alias npm run install:local remains available. It does not install system packages, change udev rules, restart ADB, or use elevated privileges. Use npm run install:guided -- --skip-dependencies when dependencies are already installed; add --check-environment to run the read-only ADB/scrcpy preflight during installation.
The same guided setup can be run after dependencies are installed:
npm run setup
node dist/index.js setup --client codex
node dist/index.js doctorSee the installer guide for supported hosts, native configuration locations, backups, preview mode, and generic configuration output.
The executable is then:
/absolute/path/to/android-agent-mcp/dist/index.jsRun it directly over stdio:
node /absolute/path/to/android-agent-mcp/dist/index.jsInstall from npm
The easiest path for a published release is:
npx -y android-agent-mcp@0.4.1 setupThis downloads the package, detects supported hosts, and configures only the hosts whose commands are available. No repository checkout is required. For a reusable global installation:
npm install --global android-agent-mcp@0.4.1
android-agent-mcp setupThe package also exposes android-agent-mcp doctor and android-agent-mcp setup --dry-run. The executable is a stdio server during normal MCP operation; setup and doctor are the installer subcommands.
Alternatively, let an MCP client download a pinned release when it starts the server. Configure the command as npx with these arguments:
{
"command": "npx",
"args": ["--yes", "android-agent-mcp@0.4.1"]
}Installing from npm provides the MCP server and its Node.js dependencies. It does not install host prerequisites such as adb or scrcpy; install those with your operating system's documented Android platform-tools and scrcpy packages first. The package runs locally on the computer connected to the authorized phone.
The process reads MCP messages from stdin and writes MCP messages to stdout. Diagnostics go to stderr.
Codex registration
Resolve the checkout path first, then register the local stdio server:
PROJECT_DIR="$(pwd)"
codex mcp add android-device -- node "$PROJECT_DIR/dist/index.js"
codex mcp listThe official OpenAI MCP guidance documents local stdio servers and the same codex mcp add <name> -- <command> shape. Restart Codex after registration so the server and its tools are loaded. A project-scoped .codex/config.toml can also be used for trusted projects.
Configuration
Configuration is optional. Without a file, the server enables broad non-sensitive phone control and a visible scrcpy mirror. Select a JSON file with ANDROID_AGENT_MCP_CONFIG:
ANDROID_AGENT_MCP_CONFIG=/absolute/path/to/android-agent-mcp.json \
node /absolute/path/to/android-agent-mcp/dist/index.jsExample:
{
"adbPath": "adb",
"scrcpyPath": "scrcpy",
"autoSelectSingleDevice": true,
"allowedPackages": ["*"],
"sensitivePackages": ["*.bank.*", "*.wallet.*", "*.password*"],
"allowedRuntimePermissions": [],
"allowedApkRoots": ["/home/user/projects"],
"evidenceRoot": "/home/user/android-agent-mcp-evidence",
"maxScreenshotBytes": 25000000,
"maxApkBytes": 500000000,
"maxLogBytes": 2000000,
"maxCommandOutputBytes": 4000000,
"maxEvidenceBytes": 100000000,
"maxEvidenceFiles": 500,
"evidenceRetentionMaxAgeMs": 604800000,
"defaultTimeoutMs": 15000,
"uiSnapshotMaxAgeMs": 3000,
"displayGeometryMaxAgeMs": 10000,
"approvalMode": "prompt",
"mirror": {
"autoStart": true,
"maxSize": 1600,
"maxFps": 30,
"audio": false
}
}Environment overrides use the ANDROID_AGENT_MCP_ prefix. The former ANDROID_MCP_ and ANDROID_DEVICE_MCP_ variables remain accepted as deprecated compatibility aliases, with canonical variables taking precedence. Lists are comma-separated. Configuration never contains a phone PIN, password, account credential, API key, cookie, or authorization token.
The default allowedPackages policy is *, so the agent does not require manual app selection. Banking, wallet, and password-style package patterns remain blocked by default; set ANDROID_AGENT_MCP_SENSITIVE_PACKAGES='' only for a deliberately trusted session that needs literal all-app control.
Preferred operating loop
Visual control sessions follow the same frame → structured action → ADB → next-frame pattern as Google's Android Computer Use quickstart, while remaining model-neutral and retaining this server's device, package, approval, and evidence boundaries.
Call
device_list.Call
device_selectwhen selection is not unambiguous.Call
device_infoand confirm the target.For semantic controls, use
ui_dump/ui_findfollowed byui_tap.For games, canvases, video, and other visual surfaces, start one
visual_control_startsession. It returns the initial frame, prefers fast JPEG capture with automatic PNG fallback, and defaults to Google-style normalized0-999coordinates.Use
visual_control_actionfor every visual step. It batches a complete move, executes it without UI hierarchy verification, and returns the next frame in the same response. Do not callscreen_capturebetween visual actions. Prefer one swipe for drag-based boards. Keep wait options at zero unless the app needs a bounded transition or opponent-response window.General packages are available by default; honor configured sensitive-package blocks.
Mutating tools remain fail-closed unless the host explicitly uses
approvalMode: "allow"; keep Codex write approval enabled as an additional client control.Selecting a device makes one best-effort attempt to start the visible scrcpy mirror unless
mirror.autoStartis disabled. A scrcpy failure is returned as a warning and never blocks ADB tools. Aftermirror_stop, usemirror_startto reopen it explicitly.Use
evidence_begin, explicitly capture the desired artifacts, thenevidence_finish.
For a two-tap visual move inside a session, prefer one call rather than two model round trips:
{
"session_id": "session-id-from-visual_control_start",
"actions": [
{ "type": "tap", "x": 375, "y": 700 },
{ "type": "tap", "x": 458, "y": 700 }
],
"coordinate_space": "normalized_1000",
"wait_for_change_ms": 0
}The visual session accepts taps, swipes, and allowlisted non-sensitive keys. It guards the foreground package in the same device command as each action, then returns an image plus compact JSON and phase timings from one observation command. Stop it with visual_control_stop when finished. Use screen_input_sequence for one-off native-pixel batches when a persistent visual loop is unnecessary. Run npm run benchmark:visual -- --iterations 10 --actions 1 to measure a chess-like single-action path separately from model latency.
If the selected phone disconnects or becomes unauthorized, the server invalidates retained UI state and requires an explicit device_select again after reconnecting, even when the serial is unchanged.
The server also finalizes an active evidence session during graceful shutdown after cleaning up its owned scrcpy process.
No generic shell tool is exposed.
Tests
npm run typecheck
npm test
npm run build
npm run verify
npm pack --dry-run
npm audit --omit=dev
# With an authorized device and non-sensitive foreground app:
npm run benchmark:visual -- --iterations 10The automated suite uses fake/injectable command boundaries and a child-process MCP client. It does not require a phone and does not install packages or alter device state.
Opt-in physical tests are separate:
export ANDROID_AGENT_MCP_PHYSICAL=1
export ANDROID_AGENT_MCP_TEST_PACKAGE=com.example.androiddevicetest
export ANDROID_AGENT_MCP_TEST_SELECTOR='{"text":"7"}'
npm run test:physicalThe physical harness remains deliberately explicit: it requires a designated test package, a repeatable harmless selector, and exactly one connected authorized phone. It starts the actual stdio MCP server and drives the complete protocol path. This fixture is separate from normal MCP operation, where the default policy permits all valid non-sensitive packages. Destructive tests are not run automatically.
Tool groups
Read-only tools include device_list, device_info, mirror_status, screen_capture, ui_dump, ui_find, app_list, app_info, permissions_list, logcat_capture, and logcat_crashes.
Interactive tools include device_select, mirror_start, mirror_stop, ui_tap, visual_control_start, visual_control_action, visual_control_stop, screen_tap, screen_swipe, screen_input_sequence, screen_long_press, key_press, text_type, app_launch, app_stop, and wait_for_ui.
Approval-required tools include app_install, app_clear_data, and permissions_set. Evidence tools are local artifact operations with bounded storage and redaction.
Limitations
USB ADB and display 0 are the initial supported targets.
UIAutomator may omit WebViews, games, video, Compose accessibility gaps, and custom canvases; warnings are surfaced.
Node IDs are snapshot-local and expire after the configured freshness window or a foreground change.
Default text entry is printable ASCII only and rejects password fields.
scrcpy audio/control flags are mapped only when supported by the detected version.
Logcat duration captures are bounded live reads;
sinceselects a bounded timestamp dump.Direct native input defaults to no UI/pixel verification for low latency; request
verify_change: truewhen the action must be checked by the server.Display geometry is cached for
displayGeometryMaxAgeMs; the cache is invalidated when the selected device disconnects or is reselected.Visual control sessions bind to one selected device session, return one screenshot per action, and expire on disconnect or explicit stop.
No wireless pairing, multiple-device parallel control, OCR, continuous video MCP frames, root features, iOS, or remote listener is provided.
See SECURITY.md and the documents under docs/ for operational details.
Name compatibility
The npm distribution and primary executable are both android-agent-mcp. The android-mcp and scrcpy-agent executables remain deprecated aliases for existing local setups. The MCP server registration name and protocol identity remain android-device, so existing Codex MCP configuration does not need to be renamed. Environment precedence is ANDROID_AGENT_MCP_*, then deprecated ANDROID_MCP_*, then older ANDROID_DEVICE_MCP_*.
Available Tools
29 toolsapp_clear_dataA
Approval-required irreversible clearing of local data for an allowlisted test package.
| Name | Required | Description | Default |
|---|---|---|---|
| approved | No | ||
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It explicitly states that the operation is irreversible, requires approval, and is restricted to allowlisted packages. This communicates the most critical behavioral traits, though it does not detail the exact extent of data cleared or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads critical qualifiers ('Approval-required irreversible') and wastes no words. Every term adds meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with two parameters and no output schema, the description covers the essential context: approval requirement, irreversibility, and package restriction. It does not mention prerequisites like whether the package must be installed, but the overall usage context is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions (0% coverage), so the description must compensate. It mentions 'Approval-required' and 'allowlisted test package', which loosely map to the 'approved' and 'package_name' parameters, but it does not explicitly explain how to use each parameter, such as setting 'approved' to true to confirm. Partial guidance is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool clears local data for a specific resource (an allowlisted test package). It uses the specific verb 'clearing' and includes important qualifiers ('approval-required', 'irreversible') that distinguish it from any sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need to clear local data for a test package), but it does not explicitly contrast it with alternatives or state when not to use it. There is no mention of other app-related tools like app_launch or app_stop, which would help differentiate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_infoARead-only
Inspect metadata for an allowlisted package.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint: true already establishes this is a safe read operation. The description adds the behavioral constraint that the package must be allowlisted, which is useful context beyond the annotation. However, it does not disclose what happens if the package is not allowlisted or what metadata is returned, so transparency is only partially enhanced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the action ('Inspect metadata') and immediately specifies the scope ('for an allowlisted package'). There is no redundant or unrelated information, and it is highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description should provide some indication of what is returned. Saying 'metadata' is vague and does not convey the breadth or structure of the returned information. Given there are sibling tools like permissions_list and app_list, more context about what distinguishes this tool's output would be valuable. The description is too minimal for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides package_name as a string with length limits, but no description. The tool description says 'allowlisted package', which adds semantic meaning to the parameter: the package must be allowlisted. This is helpful, but it does not explain the format or other constraints beyond that. Since schema coverage is 0%, the description partially compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: inspect metadata for an allowlisted package. The verb 'inspect' and resource 'metadata' are specific, and the scope 'allowlisted package' distinguishes it from siblings like app_list which lists packages. It is immediately clear 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when you need metadata for a specific package, but it does not explicitly state when to use it over alternatives like app_list or permissions_list. No prerequisites or exclusions are mentioned beyond the allowlisting constraint, which is inferred rather than explained. Thus, usage guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_installC
Approval-required installation of an APK under an allowed host root.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| replace | No | ||
| approved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavioral traits. It does mention an approval requirement, hinting at authorization needs, but it does not explain side effects, permissions, the destructive nature of installation, or what 'allowed host root' means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, making it concise in length. However, the unclear phrase 'under an allowed host root' introduces confusion, and the sentence omits critical parameter and usage details, earning it an average score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and no parameter documentation, the description leaves major gaps about return values, prerequisites, and operational semantics. For a tool that installs APKs—a significant mutating action—the description is severely under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions (coverage 0%), and the description does not explain the parameters path, replace, or approved. The meaning of path is only vaguely implied by 'APK,' and approved by 'Approval-required,' but replace is completely undocumented, leaving agents uncertain about how to set these fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'installation of an APK,' which distinguishes it from sibling tools like app_launch and app_stop. However, the phrase 'under an allowed host root' is ambiguous and may confuse the agent about the target environment or prerequisites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as app_launch or app_stop. It mentions 'Approval-required' but does not specify conditions for use, exclusions, or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_launchA
Launch an allowlisted package and verify it becomes foreground.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait: verification that the app becomes foreground. However, with no annotations provided, it does not cover failure behavior, prerequisites beyond allowlisting, or what happens if verification fails. This is partial disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that conveys the core action and verification without unnecessary words. Highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is mostly complete. It states the action and verification, but lacks details on edge cases like non-allowlisted packages or failed foreground verification, which would be useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not clarify what package_name should contain (e.g., package ID vs. app name). The schema only states type and length, leaving the meaning of the parameter under-specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Launch') and identifies the resource (allowlisted package) plus the verification aspect (becomes foreground). This clearly distinguishes it from sibling tools like app_stop or app_install.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for launching an app and confirming it reaches the foreground, but does not explicitly state when to choose this tool over alternatives or mention exclusions. The 'allowlisted' constraint is mentioned but not elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_listCRead-only
List bounded package metadata from the selected device.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| system | No | ||
| enabled | No | ||
| disabled | No | ||
| third_party | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation declares the operation safe, and the description aligns with that. However, the description adds only the vague qualifier 'bounded' without explaining what it means or how filters (system, enabled, etc.) affect the result. No meaningful behavioral context beyond the annotation is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, making it concise in length, but it is under-specified rather than efficiently informative. The term 'bounded' adds ambiguity without earning its place, and the structure lacks both clarity and precision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema and five optional filters, the description is too sparse. It does not explain the return format, the meaning of 'bounded', or how the boolean filters are applied. The readOnlyHint annotation helps, but the overall completeness is low.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has five parameters with zero descriptions, and the tool description does not mention any of them. The word 'bounded' might hint at a limit, but it is insufficient to convey the semantics of the boolean filters (system, enabled, disabled, third_party). Schema coverage is 0%, and the description fails to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and identifies the resource as 'package metadata' from the selected device, making the primary purpose clear. It distinguishes from siblings like app_info (single app) and device_info (device-level info), though the term 'bounded' is ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. Sibling context suggests it is for enumerating installed packages, but the description itself does not state use cases, exclusions, or prerequisites like needing a selected device.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
app_stopC
Force-stop an allowlisted package.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action without explaining consequences such as abrupt termination, potential data loss, or impact on app state. The term 'force-stop' is used but its implications are not elaborated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no redundant words. It is appropriately sized for the scope of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one parameter), the description still omits critical context like side effects, return behavior, or usage context. Without annotations or output schema, the agent lacks sufficient information to understand the full impact and safe invocation of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description for package_name, and the description only says 'allowlisted package,' which hints at a constraint but does not clarify the expected format, such as an Android application ID, or how to retrieve it. With 0% schema coverage, this is inadequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('force-stop') and the resource ('allowlisted package'), making the tool's function unambiguous. It implicitly differentiates from siblings like app_launch by focusing on stopping rather than starting, but it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The description does not mention scenarios for force-stopping, prerequisites beyond allowlisting, or conditions under which force-stop is appropriate. No exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_infoARead-only
Return normalized information for the selected device.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals no side effects. The description adds useful context like 'normalized' and 'selected device,' but it does not disclose what fields are returned or how the tool behaves if no device is selected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no filler. It front-loads the action and clearly states the target resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is simple (zero parameters) and covered by readOnlyHint, the description is largely complete. It would benefit from listing example data fields or error behavior, but it is adequate for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides complete coverage. The description correctly avoids inventing parameter details, and per rubric a baseline of 4 applies for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Return' and the resource 'normalized information for the selected device' clearly identify the tool's function. It is distinct from siblings like device_list (which lists devices) and device_select (which changes selection).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when needing info about the currently selected device), but it does not explicitly mention alternatives or exclusions, such as using device_list for available devices or app_info for app details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_listARead-only
List connected Android devices and their ADB authorization states.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation. The description adds meaningful context by specifying that the output includes ADB authorization states, which is not trivial and helps the agent understand the tool's behavior. It does not discuss edge cases like no devices connected, but the added detail justifies a score above baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that starts with the action verb and immediately states the resource. Every word contributes to the meaning, with no redundancy. It is front-loaded and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's trivial complexity (no parameters, no output schema), the description provides sufficient context for an agent to know what the tool does and what kind of output to expect. It names the key output elements (devices and authorization states), making the tool adequately specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema and description naturally cover everything. The baseline for 0 parameters is 4, and there is no additional parameter semantics needed. The description does not need to explain parameters that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'List' and clearly identifies the resource ('connected Android devices') and the scope ('their ADB authorization states'). This distinguishes it from sibling tools like device_info, which likely focuses on a single device, and mirror_status, which pertains to mirroring. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for enumerating connected devices, but it does not explicitly state when to choose this over alternatives like device_info, nor does it provide any situational guidance or exclusions. The user must infer that this is the go-to tool for a device list based on its name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
device_selectB
Select one authorized Android device by exact serial.
| Name | Required | Description | Default |
|---|---|---|---|
| serial | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose what 'select' means in terms of state changes, error behavior if the serial is invalid, or whether authorization is checked. Minimal information is given beyond the operation name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no unnecessary words, directly conveying the action and key constraint. It is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, but the description lacks behavioral details such as side effects (does selecting change the active device for all subsequent commands?), error handling, and usage context relative to siblings. This makes it incomplete for an agent to fully understand the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'serial' as a string with length constraints. The description adds useful semantics: 'exact' indicates an exact match requirement and 'authorized' suggests only authorized devices are selectable. However, it does not explain how to obtain a serial or what makes a device authorized, so partial compensation for 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Select') and the resource ('authorized Android device') with a specific qualifier ('by exact serial'). It distinguishes itself from sibling tools like device_list and device_info by indicating a selection action rather than listing or querying information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no mention of prerequisites (e.g., need to call device_list first to see available serials), and no exclusions. The context of being a selection step is implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evidence_beginC
Begin a sanitized, bounded local evidence session.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| metadata | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavior. It adds qualifiers 'sanitized, bounded, local' that hint at safety and scope, but does not explain what these mean in practice (e.g., session lifetime, data handling, side effects like clearing previous state). The agent gets little insight into the tool's actual behavioral traits beyond the vague qualifiers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant wording. It earns its place by stating the core purpose. However, given the complexity of a session-start tool with parameters, a slightly longer description would be acceptable, but as written it is efficiently concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no annotations, no output schema, and two undocumented parameters. The description is far too sparse to be considered complete for an agent to select and invoke it correctly. It leaves the agent without knowledge of parameter semantics, session behavior, return values, or workflow integration with sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has two parameters (label, metadata) with 0% description coverage, and the tool description does not mention them at all. The description adds no meaning to what these parameters are for, how they affect the session, or their format requirements. This is a critical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Begin') and a specific resource ('sanitized, bounded local evidence session'), clearly distinguishing this tool from its siblings (evidence_note, evidence_finish). It conveys the core function of starting an evidence collection session without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention that it should be called before evidence_note or evidence_finish, nor any context about prerequisites or exclusions. The 'Begin' verb only implies sequencing from the name, not from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evidence_finishA
Finish the active evidence session and write its summary.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It fails to mention side effects like destroying the session, what the summary contains, how it is returned/written, or error behavior if no active session exists. This lack of detail is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. It front-loads the primary action ('Finish') and clearly states the secondary outcome ('write its summary').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and no output schema, which lowers the burden. However, given the lack of annotations, the description should clarify prerequisites (e.g., an active session must exist) and consequences (e.g., session is closed, summary is persisted). The current description is minimal but adequate for a simple tool, yet leaves important behavioral gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema is empty, so schema coverage is 100%. The description needs no parameter explanation, and the baseline of 4 applies since parameters are absent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Finish the active evidence session and write its summary.' The verb 'finish' combined with the resource 'evidence session' and the outcome 'write its summary' leaves no ambiguity. It is distinct from siblings like evidence_begin and evidence_note, which handle session start and note-taking respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the final step in an evidence session by referencing the 'active evidence session.' It provides clear context for when to use the tool but does not explicitly mention alternatives or exclusions (e.g., 'do not use if you need to add more notes; use evidence_note instead'). The context is strong enough to guide usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evidence_noteB
Add a redacted note to the active evidence session.
| Name | Required | Description | Default |
|---|---|---|---|
| details | No | ||
| message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits beyond the basic action. It does not mention prerequisites, side effects, or what 'redacted' implies, leaving the agent to guess about session state and write behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant or generic filler. Every word contributes to the purpose, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 0% parameter coverage, the description omits critical context such as the need for an active session, return behavior, and parameter meanings. It is under-specified for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate by explaining the parameters, but it fails to mention 'message' or 'details', leaving their semantics entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (add), the object (a redacted note), and the context (active evidence session), which distinguishes it from sibling tools like evidence_begin and evidence_finish.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'active evidence session' implies when to use it, but there is no explicit guidance on alternatives or when not to use it. It is adequate but lacks clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
key_pressC
Press an allowlisted Android testing key.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| allow_power | No | ||
| verify_change | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only mentions 'allowlisted' but gives no information about side effects, permissions, or the role of parameters like allow_power or verify_change. The agent is left without insight into what actually happens when a key is pressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no redundant words. It efficiently conveys the core action without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is relatively simple, but with no annotations and no output schema, the description should provide more context about usage, parameter effects, and system impact. The one-liner does not sufficiently prepare an agent to invoke the tool correctly, especially for edge cases like the power key or the purpose of verify_change.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage, and the tool description does not compensate. It does not explain the meaning of 'key', 'allow_power', or 'verify_change'. The enum on 'key' provides some context, but the other two boolean parameters remain completely ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('press') and the target ('an allowlisted Android testing key'), and the scope ('allowlisted') implies a constrained set of possible keys. This distinguishes it from sibling tools like ui_tap or screen_swipe, which involve touch interactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention any conditions, exclusions, or related tools, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logcat_captureARead-only
Capture bounded, filtered, and redacted logcat output.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | ||
| tags | No | ||
| since | No | ||
| severity | No | ||
| max_bytes | No | ||
| max_lines | No | ||
| duration_ms | No | ||
| package_name | No | ||
| include_crash_buffer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that output is bounded, filtered, and redacted, which goes beyond the readOnlyHint annotation by specifying behavioral characteristics of the captured output. It does not contradict the annotation and adds context about the tool's constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence that immediately states the tool's purpose. Every word contributes meaning, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of 9 optional parameters with no schema descriptions and no output schema, this one-sentence description is too minimal. It does not explain return format, device prerequisites, or how parameters map to the filtering/bounding behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage for its 9 parameters, and the description does not mention any parameter names or explain their semantics. The phrase 'bounded, filtered, and redacted' only generically hints at filtering and size limits, leaving the agent to infer meaning from parameter names alone. This is insufficient for a tool with this many parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Capture' and identifies the resource as 'logcat output' with modifiers 'bounded, filtered, and redacted' that clarify the tool's scope. This distinguishes it from the sibling 'logcat_crashes', which appears focused on crash logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided regarding when to use this tool vs alternatives such as 'logcat_crashes'. The description lacks any mention of prerequisites, device selection, or comparison with other logging tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logcat_crashesARead-only
Return bounded recent crash and ANR evidence for an allowlisted package.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation. The description adds meaningful behavioral context by noting 'bounded', 'recent', and 'allowlisted' — constraints that are not obvious from the name or annotations. However, it does not specify the exact bound (e.g., number of items, time window) or the behavior for non-allowlisted packages, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence that front-loads the core action ('Return bounded recent crash and ANR evidence') followed by the scope ('for an allowlisted package'). There is no redundant or filler content; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one parameter and no output schema, the description is reasonably complete: it conveys what the tool returns, the restriction, and the bounded nature. However, it does not describe the exact output format or the meaning of 'bounded', which would be helpful for an agent to interpret the result, but the simplicity of the tool lowers the need for extensive extra detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single parameter package_name. The description mentions 'allowlisted package', which adds context about a restriction, but does not detail the package_name format or provide examples. Since there is only one parameter and its name is fairly self-explanatory, the description provides minimal but adequate compensation for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and clearly states a resource scope: 'crash and ANR evidence for an allowlisted package.' This distinguishes it from sibling tools like logcat_capture, which captures general logcat output, by focusing specifically on crashes and ANRs for a single package.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a specific use case (getting crash/ANR evidence) but does not explicitly state when to use it over alternatives like logcat_capture. It lacks exclusion criteria or explicit 'use this when...' guidance, so the context is implied rather than clearly defined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mirror_startC
Start a visible server-owned scrcpy mirror for the selected device.
| Name | Required | Description | Default |
|---|---|---|---|
| audio | No | ||
| control | No | ||
| max_fps | No | ||
| max_size | No | ||
| stay_awake | No | ||
| window_title | No | ||
| turn_screen_off | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It mentions 'visible' and 'server-owned' but omits side effects, whether the mirror is long-running, failure modes, or the need for a previously selected device.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no unnecessary words, effectively stating the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 params, no annotations, no output schema), the description is too sparse. It lacks context about the mirror lifecycle, return behavior, prerequisites, and parameter effects, making it insufficient for confident invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with 7 parameters, and the description does not explain any of them (audio, control, max_fps, etc.), leaving their semantics completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start') and the resource ('a visible server-owned scrcpy mirror for the selected device'), making it specific and distinguishable from siblings like mirror_stop and screen_capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as screen_capture or device_select, nor are any prerequisites mentioned beyond the implied 'selected device' requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mirror_statusARead-only
Return the status of the server-owned scrcpy process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates this is a safe read operation. The description clarifies the specific process being queried (server-owned scrcpy) but does not disclose additional behaviors such as return format or potential latency, which is minor given the tool's simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that states exactly what the tool does with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with no parameters and a read-only annotation. The description adequately covers its purpose, though it does not specify the return format (e.g., 'running' or 'not running'), which could be useful given there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the schema fully covers the input. The description does not need to elaborate on parameters; the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return the status' and identifies the resource as the 'server-owned scrcpy process', clearly distinguishing it from sibling tools like mirror_start and mirror_stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool or how it compares to alternatives like mirror_start or mirror_stop, but the name and action imply it is for checking the current mirroring state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mirror_stopB
Stop only the server-owned scrcpy mirror.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It indicates a mutating action ('Stop') but does not disclose consequences, reversibility, permission requirements, or any side effects. The only behavioral context is the scope 'server-owned,' which is more about purpose than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence that directly states the action and scope. No superfluous words or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema, no annotations), the description is minimally viable. However, it does not explain what 'server-owned' means, what happens after the stop, or how this relates to mirror_status or mirror_start. For a low-complexity tool, this is adequate but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, which makes parameter-semantics discussion moot. Per the rubric, 0 params earns a baseline of 4, and there is no schema information to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Stop' and clearly identifies the resource as 'the server-owned scrcpy mirror.' This distinguishes it from mirror_start and mirror_status, though it does not explicitly contrast with other stop tools like app_stop.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'server-owned' implies a filter against other mirrors, giving some contextual guidance. However, there is no explicit when-to-use or when-not-to-use guidance relative to sibling tools, and no alternative tools are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permissions_listARead-only
List requested and granted runtime permissions for an allowlisted package.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation, and the description's 'List' is consistent. The description adds no additional behavioral context beyond what the annotation provides (e.g., no mention of output format, pagination, or special conditions). There is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the verb and object. No wasted words, and it conveys the essential purpose and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter, the description plus readOnlyHint and schema provide sufficient context. The term 'allowlisted' is somewhat ambiguous and could be clarified, but overall the description is complete for the tool's simplicity and lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by clarifying that the package_name parameter refers to an 'allowlisted package'. This adds semantic meaning beyond the schema's bare string constraints, though it does not explicitly name the parameter or provide format examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and clearly identifies the resource ('requested and granted runtime permissions') and scope ('for an allowlisted package'). It effectively distinguishes from siblings like permissions_set, which handles setting permissions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (use to list permissions for a package) but does not explicitly state when to use it versus alternatives, nor does it mention any exclusions or prerequisites. The sibling context suggests it complements permissions_set, but that is not stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
permissions_setB
Approval-required grant or revoke of a requested runtime permission.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| approved | No | ||
| permission | Yes | ||
| package_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the operation is 'Approval-required,' which is a meaningful behavioral trait, but it does not explain side effects, prerequisites, or what occurs if approval is denied. For a mutation tool, this leaves significant ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, succinct sentence that communicates the core function without redundancy. It is front-loaded and every word contributes to the message, though this brevity sacrifices necessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation tool with no annotations, no output schema, and 4 parameters, yet the description fails to address the approval flow, side effects, or usage context. It is minimally viable but leaves major gaps that an agent would need to resolve elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the parameters. It only implies the 'action' (grant/revoke) and the concept of a permission, but it does not explain package_name, the permission string, or the approved boolean. This is insufficient for an agent to correctly map the schema fields to the intended use.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (grant or revoke) and the resource (a requested runtime permission), using specific verbs. It distinguishes from the sibling permissions_list tool, which lists permissions rather than modifying them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to change runtime permissions, but it does not provide explicit when-to-use guidance, exclusions, or alternatives. The 'Approval-required' hint suggests a workflow, but the description lacks clarity on when to invoke this tool versus others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_captureARead-only
Capture a validated PNG screenshot from the selected device.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| save_to_evidence | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds minimal context with 'validated' and 'selected device'. However, it fails to disclose what happens to the captured screenshot (e.g., returned path, whether it's automatically saved), so additional behavioral context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence with no redundant or superfluous words. It conveys the core purpose efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple capture tool, the description covers the basic function but omits key operational details such as parameter semantics, return value, and whether the screenshot is automatically saved. This is adequate but leaves gaps for an agent to function autonomously.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description does not explain the parameters 'label' or 'save_to_evidence'. The agent must infer their meaning solely from names, which may lead to incorrect usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Capture') and resource ('validated PNG screenshot') with a context ('from the selected device'). This unambiguously distinguishes it from sibling tools like ui_dump or screen_tap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied (when a screenshot is needed), but there is no explicit guidance on when to use this tool versus alternatives, nor any exclusion criteria. The description doesn't mention prerequisites like requiring a selected device.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_long_pressC
Perform a bounded stationary long press.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| duration_ms | No | ||
| verify_change | No | ||
| coordinate_space | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It mentions 'bounded' and 'stationary', hinting at duration limits and lack of movement, but does not explain what 'bounded' means, what happens after the press, or whether any verification is involved. This is minimal and insufficient for a tool with no other safety context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words, making it highly concise. It front-loads the core action. However, it lacks any structured additional context, which slightly lowers the score from a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 parameters, no output schema, and no annotations, yet the description only provides a basic action statement. It fails to convey essential details like coordinate space expectations, duration bounds, the role of verify_change, or the possible side effects. This is completely inadequate for reliable usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description adds no parameter-specific meaning. The terms 'bounded' and 'stationary' vaguely relate to duration and movement, but they do not clarify x, y, duration_ms, verify_change, or coordinate_space. The agent must rely on parameter names alone, which is inadequate for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (long press) and qualifies it as 'bounded stationary', distinguishing it from simple taps or swipes. The verb 'perform' is specific and the resource is implicitly the screen, as inferred from the tool name. However, 'bounded' is ambiguous without further explanation, slightly reducing clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like screen_tap or screen_swipe. The description lacks any context about appropriate scenarios or prerequisites, leaving the agent to guess based solely on the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_swipeC
Perform a bounded native coordinate or deterministic directional swipe.
| Name | Required | Description | Default |
|---|---|---|---|
| end_x | No | ||
| end_y | No | ||
| start_x | No | ||
| start_y | No | ||
| direction | No | ||
| duration_ms | No | ||
| verify_change | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only hints at boundedness and determinism, but does not explain side effects, failure modes, duration behavior, or the role of verify_change. This is insufficient for a swipe operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. However, it is under-specified; the brevity comes at the cost of missing critical information, so it earns a mid score for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with 7 parameters, no output schema, and no annotations. The description provides only one line, omitting return behavior, edge cases, and parameter usage. It is far from complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameters. It does not mention start_x, end_y, direction, duration_ms, or verify_change at all. The description adds no meaning beyond what the schema structurally provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action (swipe) and resource (screen), and distinguishes two modes: coordinate-based and directional. However, the terms 'bounded' and 'deterministic' are vague and not elaborated, slightly reducing clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like screen_tap or screen_long_press, nor when to prefer coordinate versus directional swipes. There is no mention of exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screen_tapC
Tap validated native device-pixel coordinates as a fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| verify_change | No | ||
| coordinate_space | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden, but it only mentions 'validated' without explaining the validation process, failure behavior, or side effects of tapping. It does not disclose whether this is a system-level tap, requires permissions, or what happens if coordinates are invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy. It conveys the core action efficiently, though it errs on the side of being too terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no annotations, and no output schema, the description is insufficient. It omits key behavioral details, parameter semantics, and fallback context, making it inadequate for reliable tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate, but it only uses the term 'device-pixel coordinates,' which is already encoded in the coordinate_space const. The purpose of x, y, and especially verify_change remain unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Tap') and the target ('validated native device-pixel coordinates'), and the phrase 'as a fallback' hints at being an alternative to other methods like ui_tap. However, it does not explicitly name the primary tool it falls back from, so differentiation is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'as a fallback' implies this tool should be used when other tapping methods (e.g., ui_tap) are unavailable, but it provides no explicit when/when-not guidance or named alternatives. The usage context is only implied, not fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_typeA
Type safe printable ASCII test text into the focused field; never use for secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It adds useful constraints like 'safe printable ASCII' and the warning against secrets, but it does not disclose details such as whether the tool overwrites existing content, how non-ASCII characters are handled, or any logging implications. For a simple tool this is adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence of 14 words, front-loaded with the verb 'Type' and the resource. Every word earns its place, including the security warning. No unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is complete enough: it specifies the target ('focused field'), the input type ('safe printable ASCII'), and the usage caveat (secrets). It could potentially mention prerequisites like ensuring focus, but 'focused field' already implies that requirement, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, and the description compensates by specifying that the 'text' parameter should contain 'safe printable ASCII test text'. This adds meaning beyond the schema's raw string type and length constraints. It does not mention the 1024 max length, but that is already present in the schema, so the description adds valuable semantic context without needing to repeat schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Type safe printable ASCII test text into the focused field', specifying the action (type), the resource (focused field), and the input scope (safe printable ASCII). It distinguishes itself from sibling tools like key_press and ui_tap by emphasizing text input rather than individual keys or taps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use it to type text into a focused field, with an explicit exclusion 'never use for secrets'. However, it does not explicitly name alternative sibling tools (e.g., key_press for individual keys) or describe scenarios where other tools would be preferable, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_dumpBRead-only
Capture and normalize the selected device UIAutomator hierarchy.
| Name | Required | Description | Default |
|---|---|---|---|
| compact | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile (read-only operation), and the description adds scope ('selected device') and a processing detail ('normalize'). However, it does not explain what normalization entails, possible side effects (e.g., blocking on UI response), or error behavior. The description adds some but not rich 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly worded sentence: 'Capture and normalize the selected device UIAutomator hierarchy.' It front-loads the primary verb and object, with no wasted words or redundant phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no parameter explanation, the description is insufficient for full comprehension. It does not state what the tool returns (presumably the hierarchy) or elaborate on the 'normalize' step. The tool is simple, but the lack of return-value and parameter details leaves gaps for an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'compact', has zero description coverage in the schema and is not mentioned in the tool description. The agent cannot determine what 'compact' does, making the parameter's semantics completely opaque. This is a critical gap for a documented optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool captures and normalizes the UIAutomator hierarchy for the selected device. This specific verb+resource combination distinguishes it from sibling tools like screen_capture (image capture) and ui_find (searching UI), making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites (e.g., device must be selected via device_select), or scenarios where ui_dump is preferable to ui_find or screen_capture. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_findARead-only
Find matching elements in a fresh or retained UI snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| selector | Yes | ||
| snapshot_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds context about using 'fresh or retained' snapshots, which is a behavioral trait beyond the annotation. However, it does not disclose how criteria in the selector are combined (AND/OR), what happens when no snapshot_id is provided, or what the return value looks like. Thus, some value is added but significant gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately conveys the primary action and scope. Every word contributes: 'Find matching elements' states the purpose, and 'fresh or retained UI snapshot' distinguishes the two modes. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool has a complex, nested selector schema with numerous matchable properties and no output schema. The description provides only the core idea, omitting how to construct a selector, how matches are returned, or how snapshot retention works. It is too sparse for an AI agent to use effectively without further assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for parameters, so the description must compensate. It only vaguely hints at snapshot_id via 'retained UI snapshot' and at selector via 'matching elements,' but does not explain that selector is a rich search criteria object or how to use its many fields. This is insufficient for a complex two-parameter tool with a recursive selector schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Find matching elements in a fresh or retained UI snapshot.' This specifies a concrete action (find) on a clear resource (UI elements) and distinguishes it from sibling tools like ui_dump (which captures the hierarchy) and ui_tap (which interacts). The 'fresh or retained' scope adds operational nuance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage—it's for querying elements within a UI snapshot—but does not explicitly state when to prefer this over ui_dump or wait_for_ui. The phrase 'fresh or retained' hints at scenarios with or without an existing snapshot, but no alternatives or exclusions are mentioned. This is implied guidance, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ui_tapC
Tap one uniquely resolved visible semantic UI element and verify the result.
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | No | ||
| selector | No | ||
| match_index | No | ||
| verify_change | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral disclosure. It adds constraints like 'uniquely resolved' and 'visible', and states that it 'verify[ies] the result', but it does not explain what happens on non-unique match, whether it waits for UI changes, or what 'verify' entails. This is a significant gap for a tap action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. It front-loads the action and target, but it is so brief that it sacrifices essential details for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex schema (nested selector with many properties, 4 parameters), no annotations, and no output schema, the description is grossly incomplete. It fails to explain how to specify an element, what match_index means, how verify_change behaves, or what the return value represents. This is far below the minimum viable completeness for such a tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 4 parameters (node_id, selector, match_index, verify_change) with 0% description coverage. The description does not explain any of these parameters, nor does it clarify how 'uniquely resolved' maps to selector or match_index. The nested selector structure is entirely undocumented in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Tap'), the target ('one uniquely resolved visible semantic UI element'), and the follow-up ('verify the result'). This distinguishes it from coordinate-based taps like screen_tap and from pure lookup tools like ui_find.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'uniquely resolved' implies that the element should already be resolved, perhaps via ui_find, but no explicit alternatives or exclusions are mentioned. It does not tell the user when to choose this over screen_tap or how to resolve uniqueness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_uiB
Poll for a bounded UI, foreground, disappearance, or screen-change condition.
| Name | Required | Description | Default |
|---|---|---|---|
| poll_ms | No | ||
| activity | No | ||
| selector | No | ||
| timeout_ms | No | ||
| package_name | No | ||
| disappearance | No | ||
| screen_change | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It only says 'Poll' without mentioning blocking behavior, timeout handling, poll intervals, or failure modes. The schema exposes timeout_ms and poll_ms, but the description does not explain the actual execution semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, concise and front-loaded with the main action. It wastes no words and is appropriately sized for its content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 parameters, a complex nested selector, and no output schema, yet the description is only a short phrase. It lacks critical details like return values, timeout behavior, and how to construct a valid condition, making it insufficient for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It vaguely references 'foreground', 'disappearance', and 'screen-change' which map to some parameters, but gives no explicit semantics for any of the 7 parameters or the nested selector object. This leaves the agent guessing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Poll') and identifies the resource (UI condition), mentioning concrete conditions like foreground, disappearance, and screen-change. This distinguishes it from sibling tools like ui_find and ui_dump, though 'bounded UI' is somewhat ambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its usage (polling for conditions) but never explicitly states when to choose this over alternatives like ui_find or ui_dump. There are no exclusions or alternative mentions, so it relies on the reader to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Most tools target distinct actions across devices, mirroring, UI, apps, permissions, logs, and evidence. A few pairs like screen_tap/ui_tap and ui_find/ui_dump could be confused, but description distinctions are clear enough.
All tool names follow a consistent snake_case pattern of <domain>_<action>, such as device_list, mirror_start, screen_swipe, and evidence_begin, with no mixed conventions or style deviations.
At 29 tools, the server exceeds the 25-tool threshold for a well-scoped toolkit. While each tool has a purpose, the large count suggests potential consolidation (e.g., evidence session tools, mirror control tools).
The toolset covers major areas of Android device interaction including device selection, mirroring, UI interaction, app lifecycle, permissions, logs, and evidence collection. Notable gaps include no app uninstall and no direct file operations, but these are workable for testing scenarios.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Remote MCP for Android CLI agent build gate, structured receipts, audit logs, and reviewer-ready evi
MCP server for static security analysis of Android source code
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
MCP server for Appcircle mobile CI/CD platform.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server that gives AI agents full vision and control over Android devices via ADB and scrcpy. Supports screenshots, input, apps, UI automation, shell, files, and clipboard.3839187MIT
- FlicenseBqualityDmaintenanceMCP server for Android device automation via ADB, enabling screen control, phone functions, app management, and device control.301
- FlicenseNot gradedqualityDmaintenanceA powerful MCP server that provides comprehensive Android device automation capabilities through ADB, enabling AI agents to interact with Android devices for testing, automation, and device control tasks.1
- FlicenseAqualityBmaintenanceMCP server for controlling Android, Fire TV, and Android TV devices through ADB, enabling device management, app operations, screenshots, UI dumps, and OBS recording.30
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/EF-Code/android-agent-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server