Skip to main content
Glama
WARNING

Latest MCP required. PolyScreen speaks the current Model Context Protocol revision (2026-07-28). Use a recent Cursor / Claude / VS Code / Codex (or other) MCP host that negotiates that era. Older 2025-only clients may connect on a legacy path but will miss modern features such as cacheable tools/list hints and subscriptions/listen.


Why

Existing mobile MCP servers commonly:

  • confuse Android logical display IDs with SurfaceFlinger physical IDs;

  • capture one display while injecting input into another;

  • expose only a small hard-coded set of physical buttons;

  • treat uiautomator dump as multi-display aware when it is not;

  • return prose that agents must parse;

  • expose unrestricted shell commands as ordinary tools.

PolyScreen keeps those boundaries explicit and returns structured evidence for every operation. The portable core uses the official adb executable and probes each connected device at runtime instead of assuming capabilities from the Android version.

On npm: polyscreen-mcp · Repo: Zyzto/polyscreen-mcp


Related MCP server: android-mcp-server

Features at a glance

Area

What you get

Displays

Logical ↔ physical ID correlation; capture/input stay on the same display

Input

Device-probed input help — keys, gamepad, touch, display targeting

UI

Snapshot / find / wait without treating uiautomator as multi-display

Evidence

Structured JSON tool results (not prose agents must scrape)

Sessions

Async record / focus / logcat with marks and wall-clock join keys

Analysis

Black/dim flash detection via ffmpeg; theme-flash reports

Profiles

Compact core plus opt-in apps, diagnostics, files, performance, companion

Transport

Stdio default; loopback Streamable HTTP with Host/Origin + optional bearer

Platforms: Android 11+ (multi-display baseline). Host: Node.js 22.12+, adb on PATH.


Requirements

  • Node.js 22.12 or newer

  • pnpm 11

  • Android platform tools with adb on PATH, or ADB_PATH=/absolute/path/to/adb

  • Android 11 or newer for the supported multi-display baseline

  • ffmpeg and ffprobe on PATH for mobile_analyze_recording

  • JDK 17 and Android SDK only when building the optional companion

Install and build

pnpm install
pnpm check
pnpm build

Stdio remains the default. The server speaks MCP 2026-07-28 (stateless Streamable HTTP via createMcpHandler) and still serves legacy 2025-era clients from the same factory. Prefer a client on that revision (or newer) for cacheable tools/list hints and subscriptions/listen. Wire-up snippets for Cursor, Claude, VS Code, Windsurf, and others: Client configs.

Tool profiles

The default core profile is deliberately compact. Additional profiles advertise tools only when requested.

Profile

Capabilities

core

Server info, devices, displays, screenshots, async record/analyze, async focus traces, artifacts list/prune, UI, input, apps

apps

Packages, default-app roles, notifications (list/get/post), and scoped broadcasts

diagnostics

Dumpsys slices, activity tops, layer hints, crash list/get, logcat snapshot/start/stop, wake, night mode, debuggable shared_prefs read

files

Constrained push/pull under approved roots

performance

CPU, power, battery, memory, and frame snapshots

device-admin

Explicit runtime permission grant/revoke

companion

All-display accessibility windows and explicit key press/down/up

all

Every implemented profile

unsafe and emulator profiles are reserved but do not expose raw shell in this release.

Client configs

Stdio launch (pin the published version):

npx -y polyscreen-mcp@0.9.0 --profile core diagnostics

diagnostics is required for logcat start/stop, activity tops, wake, and night-mode tools. After editing config or reconnecting, call mobile_server_info once and confirm version, toolCount, and detective tools match a fresh tools/list. Prefer an MCP host that speaks 2026-07-28 so the client negotiates the modern era instead of falling back to 2025 initialize.

Client

Config file

Root key

Cursor

.cursor/mcp.json (project) or ~/.cursor/mcp.json

mcpServers

Claude Desktop

macOS ~/Library/Application Support/Claude/claude_desktop_config.json · Linux ~/.config/Claude/claude_desktop_config.json · Windows %APPDATA%\Claude\claude_desktop_config.json

mcpServers

Claude Code

.mcp.json (project) or ~/.claude/settings.json

mcpServers

VS Code / Copilot

.vscode/mcp.json or MCP: Open User Configuration

servers (+ "type": "stdio")

Windsurf

~/.codeium/windsurf/mcp_config.json

mcpServers

Continue

.continue/mcpServers/*.yaml (preferred) or ~/.continue/config.yaml

mcpServers

Zed

~/.config/zed/settings.json

context_servers

Gemini CLI

~/.gemini/settings.json

mcpServers

Cline / Roo

MCP Servers panel → Edit Configuration

mcpServers

Cursor / Claude Desktop / Windsurf / Claude Code / Gemini CLI / Cline

Same mcpServers shape (merge into the existing object):

{
  "mcpServers": {
    "polyscreen": {
      "command": "npx",
      "args": ["-y", "polyscreen-mcp@0.9.0", "--profile", "core", "diagnostics"]
    }
  }
}

If the tool list looks stale in Cursor, toggle the server off/on so tool-list change notifications (list_changed / subscriptions/listen) are applied.

VS Code (GitHub Copilot)

Workspace .vscode/mcp.json — note the servers root key (not mcpServers):

{
  "servers": {
    "polyscreen": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "polyscreen-mcp@0.9.0", "--profile", "core", "diagnostics"]
    }
  }
}

Continue

Preferred: workspace .continue/mcpServers/polyscreen.yaml (Continue also accepts the same mcpServers list in ~/.continue/config.yaml, and can load Claude/Cursor-style JSON dropped into .continue/mcpServers/):

name: PolyScreen MCP
version: 0.9.0
schema: v1
mcpServers:
  - name: polyscreen
    type: stdio
    command: npx
    args:
      - -y
      - polyscreen-mcp@0.9.0
      - --profile
      - core
      - diagnostics

Zed

~/.config/zed/settings.json (flat command + args — not a nested command.path object):

{
  "context_servers": {
    "polyscreen": {
      "command": "npx",
      "args": ["-y", "polyscreen-mcp@0.9.0", "--profile", "core", "diagnostics"]
    }
  }
}

Local Streamable HTTP (any client with URL transport)

polyscreen-mcp --listen 3300 --token "replace-with-a-secret"

Endpoint: http://127.0.0.1:3300/mcp. HTTP always binds to loopback, validates Host and Origin, and optionally requires the configured bearer token.

Core tools

  • mobile_server_info

  • mobile_devices_list

  • mobile_device_inspect

  • mobile_displays_list

  • mobile_screen_capture

  • mobile_screen_capture_pair

  • mobile_screen_record

  • mobile_sessions_status

  • mobile_record_start / mobile_record_mark / mobile_record_stop

  • mobile_analyze_recording (mode: "flash" for regression hunting)

  • mobile_theme_flash_report

  • mobile_focus_trace (blocking) / mobile_focus_trace_start / mobile_focus_trace_stop

  • mobile_artifacts_list / mobile_artifacts_prune

  • mobile_ui_snapshot / mobile_ui_find / mobile_ui_wait — each node includes ref (@nN)

  • mobile_input_tap / mobile_input_double_tap / mobile_input_long_press / mobile_input_swipe / mobile_input_drag

  • mobile_input_key / mobile_input_key_sequence / mobile_input_key_combination / mobile_input_text. mobile_input_key_sequence sends a timed sequence: digits between actions are millisecond pauses, not a simultaneous chord, and x,y tokens are taps (x,y+x,y is a touch combo with no pause between points). stepped.checks runs that walk one action at a time and polls for a UI node before the next action.

  • mobile_batch — run up to 16 registered tools in one call (screenshots and blocking records stay outside the batch)

  • mobile_app_inspect / mobile_app_launch / mobile_app_stop / mobile_app_relaunch_on_displays / mobile_app_foreground

  • mobile_app_install / mobile_app_uninstall

  • mobile_open_url (http and https only)

  • mobile_orientation / mobile_device_fold / mobile_location / mobile_clipboard

Every display-sensitive tool takes a framework logical displayId. Screenshot and recording implementations resolve that to a SurfaceFlinger physical ID internally. mobile_screen_capture also returns coordinateSpace: multiply a screenshot pixel by scaleX and scaleY to get the logical point mobile_input_tap expects. Returned screenshots are downscaled when the long edge exceeds 1280px, and coordinateSpace describes the bytes that were returned. UI refs (@nN) stay valid across Streamable HTTP requests until the next UI read on that serial and display. mobile_input_swipe, mobile_input_drag, and mobile_input_text accept those refs. A non-default display UI dump uses the companion hierarchy when a companion session is active.

Screenshots can be retained with saveArtifact. Artifact listings are metadata stubs only (uri, name, mimeType, sizeBytes). Binary bytes are read on demand via resources/read — prefer mobile_analyze_recording JSON over many mobile_screen_capture images when hunting flashes.

Server info and tool-list integrity

mobile_server_info returns { version, profiles, toolCount, toolNames, artifactRoot }. On startup the process logs the registered tool count and names to stderr. HTTP publishes tool-list changes via subscriptions/listen (handler.notify.toolsChanged()); stdio clients should refresh from tools/list / mobile_server_info after reconnect.

Devices and serials

mobile_devices_list returns exact ADB serials plus:

  • reachable — short get-state probe (stale wireless/mDNS entries often fail here);

  • hardwareSerial — ro.serialno when the probe succeeds;

  • preferred / preferredSerial — when the same hardware appears under multiple serials (for example TCP IP:port and an adb-tls mDNS name), the list prefers a reachable TCP serial;

  • aliases — other serials in the same hardware group (only when hardwareSerial matches; empty product/model metadata never collapses unrelated devices).

Never invent a serial. Pass the exact preferred value from this list into every other tool.

Async recording and visual analysis

mobile_screen_record blocks for its full durationSeconds. Prefer the async session when input must interleave:

Tool

Purpose

mobile_sessions_status

List active record / focus / logcat sessions (recover IDs after reconnect).

mobile_record_start

Start on-device screenrecord for one logical display. Returns { recordId, pathHint, startedAtIso }.

mobile_record_mark

Label a point with offsetMs + wallClockIso.

mobile_record_stop

Finalize MP4 + marks sidecar.

mobile_analyze_recording

Quantify black/dim frames from path or artifactUri (hasBlackFlash / hasDimFlash).

Async sessions do not hold the mutation queue.

mobile_analyze_recording options:

Option

Default

Meaning

mode

default

flash sets sample export on and denser summary

fps

30

Sample rate

blackThreshold

16

Mean gray below this = black (true_black band)

dimThreshold

80

Mean gray below this = dim

exportSampleFrames

false (true in flash)

PNGs at first/last black and each mark

includeFullTimeline

false

Include full per-frame meanGrayTimeline (large)

timelineDownsampleMs

200 (100 in flash)

Step for compact timelineSummary

Compact fields always returned: counts, blackRuns/dimRuns, marks, timelineSummary, bucketCounts, optional samples.

mobile_theme_flash_report reads night mode, runs mode: "flash" analysis, and lists marks whose offsets fall inside any reported black/dim run (± markWindowMs). Run lists are capped (blackRunsTruncated / dimRunsTruncated).

Buckets (OEM-agnostic heuristics; mean-gray ranges are examples, not universal truth):

Bucket

Example mean gray

Meaning

true_black

~0–15

Empty / compositor black

near_black_content

~16–29

Near-black splash/content (not empty)

system_launcher_idle

~30–55

Mid-gray idle chrome / wallpaper-like band

dark_app_ui

~56–119

Dark theme / dark splash

light_app_ui

~190–230

Light app UI

other

remainder

Unclassified

Calibrate with exportSampleFrames on the device under test — thresholds alone are insufficient for regressions.

Time bases (joining record / focus / logcat)

Record/focus sessions share wall-clock ISO timestamps from host Date.now(). Logcat session bounds use host ISO; individual lines keep Android threadtime:

Source

Fields

Record marks

offsetMs from record start, wallClockIso

Focus samples

tMs from focus session start, wallClockIso, optional recordOffsetMs when boundRecordId is set

Logcat session

Host startedAtIso / stoppedAtIso (+ optional boundRecordStartedAtIso); each line keeps Android threadtime

Join record marks and focus on wallClockIso or recordOffsetMs when boundRecordId is set. Logcat lines are device threadtime — correlate the session window to the bound recording via boundRecordStartedAtIso / host session bounds, not per-line recordOffsetMs.

Focus timeline

Tool

Purpose

mobile_focus_trace

Blocking sample for a fixed durationMs (default 250ms interval, ring buffer)

mobile_focus_trace_start / stop

Non-blocking; bind with boundRecordId for recordOffsetMs

Stop results include changes / changeCount (focus transitions per display) — prefer that over raw samples when hunting launcher/app swaps. Default maxSamples is 800 (covers 180s @ 250ms). If the ring evicts, truncated/droppedSamples report it. Large responses also write a JSON artifact (samplesArtifactUri) and inline only a prefix unless includeAllSamples is true.

Artifacts

Tool

Purpose

mobile_artifacts_list

Metadata stubs only

mobile_artifacts_prune

maxAgeMs / maxCount, with dryRun

Diagnostics extras (diagnostics profile)

  • mobile_logcat / mobile_logcat_start / mobile_logcat_stop

  • mobile_crashes_list / mobile_crash_get (dropbox crash, ANR, and tombstone tags)

  • mobile_diagnostics_collect / mobile_diagnostics_activity_tops / mobile_diagnostics_layer_hints

  • mobile_power_wake / mobile_uimode_get / mobile_uimode_set

  • mobile_app_prefs_read (debuggable run-as shared_prefs)

mobile_app_launch / mobile_app_stop / mobile_app_relaunch_on_displays cover per-package force-stop and display-targeted launch (including stop→launch recipes across multiple logical displays).

Default apps (apps profile)

Tool

Purpose

mobile_default_apps_list

RoleManager holders for common defaults (home, browser, dialer, sms, …) via dumpsys role

mobile_default_app_get

Holders for one role (short name or android.app.role.*)

mobile_default_app_set

cmd role add-role-holder (exclusive clear+add by default); optional homeComponent for HOME

mobile_default_app_clear

clear-role-holders or remove-role-holder when packageName is set

Requires shell access to RoleManager (typical on userdebug/eng or with suitable privileges). bypassQualification: true can help assign roles to test APKs. mobile_broadcast_send covers app debug broadcasts.

Notifications (apps profile)

Tool

Purpose

mobile_notifications_list

Active keys via cmd notification list; optional packageName / includeDetails (title/text)

mobile_notification_get

Details for one key (userId|package|id|tag|uid)

mobile_notification_post

Post as com.android.shell with tag + text (optional title)

Posted notifications are owned by the shell package. Keys contain | and are quoted automatically for the device shell.

Visual regression workflow (device-agnostic)

Always discover IDs at runtime. Never hardcode serials, logical display IDs, launcher packages, or OEM model names.

  1. mobile_devices_list → pick a reachable / preferred serial

  2. mobile_displays_list → note the logical displayId(s) under test

  3. mobile_server_info — confirm version and detective tools after reconnect

  4. mobile_record_start on the logical display under test

  5. Optional (diagnostics): mobile_logcat_start with boundRecordId

  6. mobile_focus_trace_start for the relevant displayIds (optionally same boundRecordId)

  7. mobile_record_mark → input (tap / key / gamepad / HOME) → mobile_record_mark

  8. Stop focus/logcat → mobile_record_stop

  9. mobile_analyze_recording with mode: "flash" and/or mobile_theme_flash_report

  10. Assert: no unexpected hasBlackFlash / true_black runs; use focus changes to see if another package briefly owned the display. Treat system_launcher_idle as mid-gray idle chrome — not a black flash.

Optional cookbook: dual-display handhelds

Some handhelds expose two logical displays (for example internal + presentation). After mobile_displays_list, pass both IDs to mobile_focus_trace_start / mobile_screen_capture_pair / mobile_app_relaunch_on_displays. Use mobile_sessions_status if a reconnect loses session IDs. These devices are stress cases for the same APIs — not a separate tool surface.

Multi-display model

Android has multiple identifier spaces:

  • logical display IDs are small framework integers used by WindowManager, ActivityManager, input -d, and accessibility;

  • physical display IDs are unsigned 64-bit SurfaceFlinger identifiers used by screencap -d and screenrecord --display-id;

  • virtual displays may have a logical ID but no capturable physical ID.

Physical IDs are represented as decimal strings so JavaScript never loses precision. Correlation uses DisplayInfo.uniqueId, display addresses, and bounded evidence from:

  • dumpsys display

  • dumpsys SurfaceFlinger --display-id

  • dumpsys input

  • dumpsys window displays

  • dumpsys activity activities

Requested activity placement is always treated as a request. Callers should inspect tasks and window focus to verify the observed result.

Input behavior

The ADB backend probes the device's own input help and exposes only supported options:

  • keyboard, dpad, gamepad, and touchscreen sources;

  • display targeting with -d;

  • key press, long press, double tap, and explicit duration where supported;

  • any symbolic or numeric Android keycode, including face buttons, shoulders, triggers, thumb buttons, START, SELECT, and MODE;

  • taps, swipes, text, and modern command capabilities reported by inspection.

ADB shell gamepad events still use a synthetic virtual device identity. They are not equivalent to a physical controller descriptor.

Points outside the target display are rejected. input tap exits 0 for off-screen coordinates and drops the event, which is indistinguishable from a tap that did nothing.

Where to tap

Android delivers a touch to the last-painted clickable view under the point, so the geometric centre of a label is frequently the wrong coordinate: the label itself is usually not clickable, and floating search bars, install buttons, and bottom sheets are painted over the rows behind them.

Every node from mobile_ui_snapshot, mobile_ui_find, and mobile_ui_wait therefore carries a resolved tap plan alongside its raw geometry:

Field

Meaning

center

Raw geometric centre of bounds. Reported as-is; it may belong to another view.

ref

@n plus nodeIndex. Pass it to mobile_input_tap, mobile_input_double_tap, or mobile_input_long_press. Valid until the next UI read on that serial and display.

tap

{ x, y, nodeIndex, via, adjusted } — the point that reaches this node. Pass this, or ref, to mobile_input_tap.

tappable

false when the node is off-screen or completely covered.

occludedBy

The clickable node that would swallow a tap on center.

warnings

Why the plan differs from center, or why there is no plan.

Inside tap, nodeIndex and via name the view that receives the click — self, an ancestor container, or unhandled when nothing in the branch is exposed as clickable and the tap depends on an undeclared touch handler. adjusted is true when the point had to move off that view's own centre to dodge something painted over it. When a node is not tappable, scroll it clear or dismiss the overlay named in occludedBy instead of tapping blind.

A disabled control counts as an occluder. View.onTouchEvent returns clickable before it checks whether the view is enabled, so a greyed-out button still swallows every touch that lands on it.

Boolean node attributes are reported as a flags array listing only what is true, for example "flags": ["clickable", "enabled", "focusable"]. Empty strings and false flags are omitted rather than serialised, which keeps a 500-node snapshot readable.

Optional companion

Build:

gradle -p companion :app:assembleDebug :app:assembleDebugAndroidTest :fixture:assembleDebug

Outputs:

  • companion/app/build/outputs/apk/debug/app-debug.apk

  • companion/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk

Enable the companion profile, then call:

  1. mobile_companion_install

  2. mobile_companion_start

  3. mobile_companion_key or mobile_companion_windows

  4. mobile_companion_stop

The host creates a random per-session token and an owned adb forward to a local-abstract socket. Frames are length-prefixed JSON with a 1 MiB maximum. The instrumentation process preserves key downTime, supports explicit press/down/up and repeats, and releases all held keys when a client disconnects.

Platform limits are reported rather than hidden:

  • keys follow Android's focused-display policy because public KeyEvent has no portable display setter;

  • a normal APK cannot hold the signature-only INJECT_EVENTS permission;

  • synthetic gamepad events do not have physical controller identity;

  • accessibility exposes interactive windows and nodes, not secure or inaccessible rendering.

Security

  • Host-side commands are argv arrays (no host /bin/sh -c). On-device async screenrecord uses a bounded sh -c with a validated physical display ID and quoted remote path under /data/local/tmp.

  • Device serials, packages, components, keycodes, tags, permissions, paths, and display IDs are validated.

  • Input/UI mutations are serialized per device. Async record/logcat/focus sessions intentionally bypass that queue so agents can interleave input.

  • Subprocesses have deadlines, cancellation, and output caps.

  • Push paths must remain under the server host root.

  • Pull/push device paths are restricted to shared storage and /data/local/tmp.

  • Raw shell, root, remount, verity, SELinux, partition, credential, and system-process operations are not exposed.

  • Recording stop probes /proc/<pid>/cmdline for this session's screenrecord path (token match). Transient probe failures while the PID is still alive are treated as uncertain and still signaled so a live recording is not pulled mid-write.

See SECURITY.md for reporting and deployment guidance.

Agent interaction benchmark

This benchmark compares PolyScreen's structured Android automation surface with direct adb commands on an Android emulator. It uses Janan's Add medication button and name field, plus the Camera shutter, so the actions exercise navigation, semantic button discovery, text input, and photo capture.

The run targeted emulator-5554, logical display 0 (1280×2856), and typed PolyScreenTest. All four tasks succeeded through both paths; both camera trials produced a JPEG in the emulator's /sdcard/Pictures/ directory.

Token counts use the o200k_base tokenizer and include the agent-visible request/command text plus textual tool results. MCP initialization bytes, model reasoning, and binary image bytes are excluded. The adb path used uiautomator XML for target discovery and verification; hard-coded coordinates would use fewer tokens but would be more brittle.

Task

PolyScreen MCP

Direct adb

Difference

Ease of use

Navigate to Janan

1 call / 230 tokens

2 calls / 169 tokens

adb used 61 fewer tokens

PolyScreen resolves the activity automatically

Click Add medication

3 / 457

3 / 4,241

PolyScreen used 89.2% fewer

PolyScreen returns a semantic match and tap plan

Input PolyScreenTest

2 / 324

2 / 2,710

PolyScreen used 88.0% fewer

PolyScreen provides a dedicated text operation and structured verification

Take a picture

4 / 640

5 / 4,231

PolyScreen used 84.9% fewer

PolyScreen finds the shutter semantically and targets the logical display

Task total

10 / 1,651

12 / 11,351

PolyScreen used 85.5% fewer (9,700 tokens)

PolyScreen was easier overall

The main difference is response shape: mobile_ui_find returns only the matching node and its resolved tap point, while the comparable adb workflow returns the full UI hierarchy for the agent to parse. In this single sequential run, measured call-time totals were about 15.0 seconds for PolyScreen and 14.0 seconds for adb; latency is environment-dependent and was not the primary measure.

PolyScreen has a one-time session cost: the core profile's 33-tool catalog and discovery calls consumed 12,503 text tokens in this run, compared with 113 tokens for the two basic adb setup checks. This catalog cost is separate from the task table and is normally amortized across a session.

Testing and development

pnpm format
pnpm lint
pnpm typecheck
pnpm test
pnpm test:coverage
pnpm build
gradle -p companion :app:assembleDebug :app:assembleDebugAndroidTest

The local suite covers:

  • ADB subprocess timeouts, cancellation, output limits, and argv safety;

  • logical/physical display parsing, virtual displays, capture routing, and launch verification;

  • UI hierarchy parsing and matching;

  • per-device mutation serialization;

  • host/device path confinement and typed command validation;

  • MCP tool-profile registration and Streamable HTTP security;

  • artifact storage and traversal protection;

  • companion framing and request correlation.

Device integration checks are intentionally separate from deterministic unit tests. Multi-display acceptance additionally verifies physical-ID capture and recording, all-display accessibility windows, authenticated companion forwarding, and independent key down/up injection.

Never silently select the first connected device: pass the exact serial returned by mobile_devices_list.

Occasional Logical display N is not available flakes on multi-display handhelds usually clear after re-listing displays, tapping the target display (or waking it), and retrying. The device acceptance scripts recover via runWithDisplay.

Repeatable device acceptance

The generic suite is read-mostly. It captures requested displays and can optionally record, inspect one package, and exercise an already-installed companion:

POLYSCREEN_DEVICE=<serial-from-devices_list> \
POLYSCREEN_DISPLAY_IDS=<ids-from-displays_list> \
POLYSCREEN_RECORD=1 \
POLYSCREEN_TEST_PACKAGE=com.example.app \
POLYSCREEN_COMPANION=1 \
pnpm test:device

The destructive suite uses a dedicated integration-fixture APK, separate from the production companion. It installs and launches the fixture, verifies tap/swipe/drag/text input, grants and revokes CAMERA, force-stops the fixture, and uninstalls it during cleanup:

POLYSCREEN_DEVICE=<serial-from-devices_list> \
POLYSCREEN_DISPLAY_ID=<id-from-displays_list> \
POLYSCREEN_ALLOW_DESTRUCTIVE=1 \
pnpm test:device:destructive

The destructive suite refuses to run without the acknowledgement variable and never chooses a device serial implicitly. Override POLYSCREEN_FIXTURE_APK when testing an externally built fixture.


Branding

The logo wordmark uses Baz (Baz Light) by fakharia (SIL OFL) — the same Arabic typeface as Siglat and Edadat. The face is vendored at assets/fonts/baz-Light.otf; the SVG outlines HarfBuzz-shaped شــاشات (tatweel after ش, not after ا) so GitHub/npm render without loading the font.


License

MPL-2.0 — weak copyleft, commercial use allowed. Modified package files stay under MPL; your app can remain closed-source.

Available Tools

43 tools
mobile_analyze_recordingAnalyze recording for black/dim framesA

Sample mean grayscale over an MP4 (ffmpeg), detect black/dim runs, and classify OEM-agnostic brightness buckets (true_black, near_black_content, system_launcher_idle, dark_app_ui, light_app_ui). Bucket ranges are heuristics—calibrate with exportSampleFrames on the device under test. Use mode='flash' for one-call regressions. Full per-frame timeline is omitted unless includeFullTimeline=true.

NameRequiredDescriptionDefault
fpsNo
modeNoflash: exportSampleFrames=true, timelineDownsampleMs=100, blackThreshold=16default
pathNo
marksNo
serialNoExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
artifactUriNo
dimThresholdNo
blackThresholdNoMean gray below this counts as black (default 16 = true_black)
exportSampleFramesNo
includeFullTimelineNo
timelineDownsampleMsNo

Output Schema

NameRequiredDescription
pathYes
marksYes
widthYes
heightYes
dimRunsYes
samplesYes
blackRunsYes
sampleFpsYes
durationMsYes
frameCountYes
hasDimFlashYes
maxDimRunMsYes
bucketCountsYes
dimThresholdYes
dimFrameCountYes
hasBlackFlashYes
maxBlackRunMsYes
blackThresholdYes
blackFrameCountYes
lastDimOffsetMsYes
timelineSummaryYes
dimRunsTruncatedYes
firstDimOffsetMsYes
meanGrayTimelineNo
lastBlackOffsetMsYes
blackRunsTruncatedYes
firstBlackOffsetMsYes

TDQS

A4.1/5.0
Behavior4/5

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

Adds substantive context beyond the annotations: the output is heuristic buckets that may need calibration, the timeline is omitted by default, and mode='flash' expands into a preset. Annotations mark readOnlyHint=false, and the mention of exportSampleFrames is consistent with producing artifacts, though the description never explicitly states that files are written.

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

Conciseness4/5

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

Three dense, front-loaded sentences with no filler; the core action leads and the calibration and defaults follow. The first sentence is long, but each clause carries distinct, useful information.

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

Completeness4/5

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

For an analysis tool with an output schema, the description covers the sampling method, bucketing semantics, calibration caveat, and key mode/timeline defaults. It omits the fact that readOnlyHint=false implies artifact writes, which is a minor gap given the structured fields already present.

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

Parameters3/5

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

Schema coverage is low (27%) across 11 params, so the description must compensate. It clarifies mode='flash', includeFullTimeline, exportSampleFrames, and implicitly blackThreshold (16=true_black), but leaves fps, path, marks, serial, artifactUri, dimThreshold, and timelineDownsampleMs unexplained. Partial but incomplete compensation warrants the baseline 3.

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

Purpose5/5

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

States specific verbs (sample, detect, classify) and resource (MP4 recording via ffmpeg), and enumerates the exact brightness buckets it produces. An agent can distinguish this analysis tool from capture/record siblings like mobile_screen_record or mobile_theme_flash_report without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context and a named alternative: calibrate heuristics with exportSampleFrames on the device under test, and use mode='flash' for one-call regressions. It stops short of explicit when-not-to-use guidance, but the routing signal is strong.

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

mobile_app_foregroundRead the foreground Android appA
Read-onlyIdempotent

Return the focused package and activity for one logical display. Window focus is preferred; activity tops are the fallback.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdNoAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
serialYes
sourceYes
taskIdNo
activityNo
displayIdYes
packageNameNo
focusedWindowNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive, so the safety burden is covered. The description still adds genuine resolution semantics beyond the annotations: window focus is preferred and activity top is the fallback, telling the agent how the returned value is derived.

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

Conciseness5/5

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

Two tight sentences with the primary purpose front-loaded and the fallback behavior following. Every clause earns its place; no restatement of the title or schema.

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

Completeness4/5

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

With an output schema present and annotations covering safety, the description need not explain return shape. It covers purpose, scope and resolution precedence; the only minor gap is unspecified behavior when no window holds focus or when several displays exist.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented (including the ADB serial caveat and the logical-display distinction). The description's 'one logical display' phrasing only echoes displayId without adding syntax or format detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Return') and resource ('focused package and activity') plus a scope qualifier ('for one logical display'). An agent can tell this reports foreground state, but the description never names a sibling (e.g. mobile_app_inspect, mobile_focus_trace) to differentiate against.

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

Usage Guidelines3/5

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

The use case is implied clearly enough by the description, but there is no explicit when-to-use, when-not, or alternative named among the many app/focus siblings. An agent must infer the routing on its own.

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

mobile_app_inspectInspect Android appB
Read-onlyIdempotent

Read package state, permissions, components, users, and installation metadata.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
packageNameYes

Output Schema

NameRequiredDescription
dumpYes
packageNameYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered without the description. The description's enumeration of what it reads adds some scope context, but an output schema exists that would reveal the returned fields, so the marginal disclosure is modest. No auth requirements, device-precondition, or cost details are added.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the verb and resource lead and the enumeration follows. Every clause carries information and nothing is redundant.

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

Completeness4/5

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

For a low-complexity read-only tool with an output schema (so return values need not be explained) and complete safety annotations, the description covers purpose and content adequately. Its main residual gap is the absence of routing guidance among the large set of mobile_app_* siblings and the undocumented packageName parameter.

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

Parameters3/5

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

Schema coverage is 50%: serial carries a strong schema description (pointing to mobile_devices_list and the multi-device inference rule), but packageName documents only a regex pattern with no explanation. The description itself says nothing about either parameter, so it fails to compensate for the documented half-gap. Baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb (read) and resource (package), and enumerates scope: state, permissions, components, users, installation metadata. This clearly separates it from the many sibling action tools. It does not explicitly contrast with the close sibling mobile_device_inspect, but the 'package' framing implies app-level vs device-level, so it stops just short of the 5 bar.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance, and no named alternatives. The description never tells the agent to prefer this over mobile_device_inspect or when inspecting an app is the right step. Usage must be inferred entirely from the name and title.

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

mobile_app_installInstall Android APKB

Install one local APK with a bounded timeout and structured ADB result.

NameRequiredDescriptionDefault
pathYes
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
replaceNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnly=false, idempotent=false, destructive=false, openWorld=true, so the safety profile is covered. The description usefully adds that the operation is timeout-bounded and returns a structured ADB result, but says nothing about failure behavior, whether a live device session is required, or what 'replace' does to existing installs.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the core action and its constraints come first. It is arguably under-specified rather than over-long, but the structure itself is efficient.

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

Completeness3/5

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

With an output schema present, explaining the return value is unnecessary, and the bounded-timeout note is useful. However, for a 3-parameter mutation tool at 33% schema coverage it leaves the 'replace' semantics and the local-device prerequisite unaddressed, so it is only minimally sufficient.

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

Parameters2/5

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

Schema coverage is only 33%, so the description must compensate and largely does not. It clarifies that 'path' is a local APK, but adds nothing about 'replace' (default true) or about the timeout it mentions having no corresponding parameter. 'serial' is documented in the schema, not the description.

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

Purpose4/5

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

The description states a specific verb and resource ('Install one local APK') and adds scope constraints ('local', 'one', 'bounded timeout', 'structured ADB result') that separate it from mobile_app_launch, mobile_app_uninstall, and mobile_app_inspect. It stops short of naming a sibling condition explicitly, so the differentiation is inferable rather than stated.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing says to install only when the app is absent, nor routes the agent to mobile_app_launch for already-installed apps or mobile_app_uninstall for removal. The only implicit signal is 'local APK', which hints at a prerequisite but not a decision rule.

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

mobile_app_launchLaunch Android appB

Resolve and launch an activity on a logical display with ActivityManager wait diagnostics.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
userIdNocurrent
activityNo
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
packageNameYes

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare non-read-only, non-idempotent, non-destructive behavior. The description adds value with 'resolve' (implies failure if the activity/package cannot be resolved) and 'ActivityManager wait diagnostics' (implies it waits and reports diagnostics), which go beyond the annotations. It still omits what happens on a cold start, whether an existing instance is foregrounded, and any error surface.

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

Conciseness4/5

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

A single dense sentence with no filler, and the core action is front-loaded. It is efficient, though the trailing 'ActivityManager wait diagnostics' clause is jargon that a reader must decode.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and annotations cover the safety profile. What remains missing is routing guidance against lifecycle siblings and clarification of the packageName/activity/userId semantics, leaving the definition adequate but not self-sufficient.

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

Parameters2/5

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

Schema coverage is only 40%, so the description should compensate, but it mainly echoes the displayId schema text ('logical display') and only vaguely gestures at 'activity'. It explains nothing about the tricky userId parameter or the interaction between packageName and the optional activity argument.

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

Purpose4/5

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

States a specific verb (resolve and launch) and resource (an activity on a logical display) plus a behavioral detail (ActivityManager wait diagnostics). However, it gives no differentiation from close siblings like mobile_app_relaunch_on_displays, mobile_app_foreground, or mobile_app_stop, so an agent cannot route confidently between them from the description alone.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives, despite the crowding of app-lifecycle siblings (relaunch_on_displays, foreground, stop). No prerequisites, no conditions, no exclusions are given.

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

mobile_app_relaunch_on_displaysStop then launch on displaysA

Force-stop a package, then launch its main (or given) activity on each logical display in order. Use for dual-display cold-start / flash reproduction.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
userIdNocurrent
activityNo
settleMsNo
displayIdsYes
packageNameYes

Output Schema

NameRequiredDescription
stoppedYes
launchesYes
packageNameYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the bar is lower. The description adds real behavioral detail beyond them: the stop-then-launch ordering, per-display iteration "in order", and that it is a forced (not graceful) stop. It omits any permission/auth notes or what state is lost on the force-stop.

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

Conciseness5/5

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

Two tight sentences with the action and sequencing front-loaded; every clause earns its place and no filler is present.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and annotations carry the safety profile. The main gap is the low schema coverage on userId and settleMs, which the description does not compensate for.

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

Parameters3/5

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

Schema description coverage is only 17%, so the description carries weight here. It touches packageName, activity ("main (or given) activity") and displayIds scope, but adds no meaning for serial, userId, or settleMs, whose defaults and constraints live only in the schema.

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

Purpose5/5

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

States a specific compound action (force-stop then launch) applied to a named resource (package/activity) across a scoped target (each logical display). It clearly distinguishes itself from siblings mobile_app_launch and mobile_app_stop by the ordered multi-display sequence.

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

Usage Guidelines4/5

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

"Use for dual-display cold-start / flash reproduction" gives explicit context for selecting this tool over plain launch/stop. It does not state when not to use it or name an alternative for single-display cold starts, so it falls short of the top band.

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

mobile_app_stopForce-stop Android appB
Idempotent

Force-stop a package, including its processes and pending implicit launches.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
userIdNocurrent
packageNameYes

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations declare the safety profile (idempotentHint=true, destructiveHint=false, readOnlyHint=false), and the description adds real value beyond them by naming what actually gets terminated: the package's processes and pending implicit launches. It still omits permission requirements and whether the app is removed from recents, but it meaningfully extends the annotation-covered profile.

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

Conciseness5/5

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

A single front-loaded sentence with the action first and the scope qualifier second. No filler, no redundancy.

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

Completeness3/5

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

An output schema exists so return values need not be described, and annotations cover safety, but with an undocumented userId and packageName the definition leaves gaps an agent must resolve. Adequate but incomplete for a 3-param mutation tool.

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

Parameters2/5

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

Schema description coverage is only 33% (serial documented; userId and packageName bare except for a pattern/default), so the description carries the burden to compensate but adds no parameter meaning at all. Neither how userId='current' behaves nor the packageName format is explained in prose.

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

Purpose4/5

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

Specific verb 'force-stop' plus resource 'package', with added scope ('processes and pending implicit launches') that clarifies what stopping entails. It does not explicitly differentiate from near siblings like mobile_app_uninstall or mobile_app_relaunch_on_displays, but the action is unambiguous.

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

Usage Guidelines2/5

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

No statement of when to use this versus alternatives (e.g., uninstall, relaunch, or launch/reset flows), no prerequisites, and no note that the app must be installed/running. The agent must infer all usage context 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.

mobile_app_uninstallUninstall Android appB
Destructive

Uninstall a package, optionally retaining its data.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
keepDataNo
packageNameYes

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered structurally. The phrase 'optionally retaining its data' adds genuine context about data destruction, but the description never states what the default (keepData=false) does or that the removal is irreversible.

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

Conciseness4/5

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

One short sentence with the action front-loaded and no filler. It is efficient, though its brevity is partly the cause of the other gaps rather than a virtue.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and annotations carry the destructiveness profile. Still, for a destructive, non-idempotent tool the description omits when to use it and provides thin coverage of the two undocumented parameters.

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

Parameters2/5

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

Schema description coverage is only 33%: only 'serial' carries a description; 'packageName' (pattern only) and 'keepData' (boolean, default false) are undocumented. The description gestures at 'keepData' via 'retaining its data' but adds no format or default semantics beyond the schema's bare type.

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

Purpose4/5

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

States a specific verb ('Uninstall') and resource ('a package'), which cleanly separates it from the install/launch siblings. It does not, however, distinguish itself from other mutating app tools like mobile_app_stop, leaving the agent to infer the difference.

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

Usage Guidelines2/5

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

The description gives no when-to-use guidance, no prerequisites, and no indication of when to prefer mobile_app_stop or a reinstall instead. Only the existence of the tool itself is conveyed.

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

mobile_artifacts_listList local artifactsA
Read-onlyIdempotent

List metadata stubs (uri, name, mime, size) for files under the artifact root. Does not embed binary contents.

NameRequiredDescriptionDefault
limitNo

Output Schema

NameRequiredDescription
countYes
artifactsYes
artifactRootYes

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real value beyond them by specifying the shape of the returned metadata (uri, name, mime, size) and explicitly ruling out binary payload retrieval.

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

Conciseness5/5

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

Two short sentences, purpose and return shape front-loaded, negative scope immediately after. Nothing is wasted or repeated from the schema.

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

Completeness4/5

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

An output schema exists, so return-value documentation is not strictly required, yet the description still names the stub fields. For a read-only one-optional-param list, only pagination/limit semantics and the artifact-root location are missing.

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

Parameters2/5

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

The single 'limit' parameter has 0% schema description coverage and the description never mentions it — no statement of whether it caps total results, whether listing is paginated, or what the 200 default implies. With a non-zero uncovered parameter, the description fails to compensate.

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

Purpose4/5

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

Specific verb+resource ('List metadata stubs ... for files under the artifact root') with the exact returned fields enumerated. It is readily distinguishable from the only nearby sibling, mobile_artifacts_prune, by the verb, but the sibling is never named, so it falls short of the 5 bar.

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

Usage Guidelines3/5

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

Usage is only implied: 'Does not embed binary contents' signals this is the cheap enumeration path, but there is no explicit when-to-use, no prerequisite, and no mention of alternatives such as prune or the analyze tools.

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

mobile_artifacts_prunePrune local artifactsA
Destructive

Delete old or excess artifact files by maxAgeMs and/or maxCount. Use dryRun to preview.

NameRequiredDescriptionDefault
dryRunNo
maxAgeMsNo
maxCountNo

Output Schema

NameRequiredDescription
dryRunYes
deletedYes
retainedYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the destructive nature is covered. The description adds that dryRun previews (useful), but omits whether deletion is permanent, whether combined criteria are AND or OR, and what maxCount=0 or maxAgeMs=0 means.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action and criteria, with the dryRun preview tip second. No filler or redundancy.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and annotations carry the safety profile. For a zero-required-parameter destructive tool this is nearly complete, missing only the AND/OR combination semantics of the retention criteria.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry the load, and it does name all three parameters' roles: maxAgeMs for 'old', maxCount for 'excess', and dryRun for 'preview'. It stops short of stating units or default behavior, so it is good but not complete.

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

Purpose4/5

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

States a specific verb (delete) plus resource (artifact files) and the controlling criteria (maxAgeMs and/or maxCount), which clearly separates it from the read-only sibling mobile_artifacts_list. It does not explicitly name the sibling, but the action and scope are unambiguous.

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

Usage Guidelines3/5

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

"Use dryRun to preview" gives one actionable usage hint, implying the tool should be previewed before committing. However, there is no guidance on when to prune vs. simply listing artifacts, no prerequisites, and no note on how the two criteria combine.

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

mobile_batchRun several Android tools in orderA

Call other registered tools in one request. Each step is validated with that tool's schema. Nested mobile_batch, screenshots, and blocking screen records are rejected. stopOnError ends the sequence at the first failure.

NameRequiredDescriptionDefault
stepsYes
stopOnErrorNo

Output Schema

NameRequiredDescription
resultsYes

TDQS

A3.7/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: each step is schema-validated, nested batches and certain tool types are rejected, and stopOnError terminates the sequence on first failure. These are meaningful execution semantics. It stops short of noting the 16-step cap or ordering/rollback behavior on partial failure.

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

Conciseness4/5

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

Four tight sentences, front-loaded with the core action, then validation, then exclusions, then the stopOnError flag. No filler; each clause carries a constraint or behavior.

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

Completeness4/5

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

With an output schema covering returns and annotations covering the safety profile, the description supplies the operational constraints an agent needs (validation, rejected step types, stopOnError). Missing the 16-step limit and the mobile_-prefix requirement keeps it from being fully complete.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry the load. It explains stopOnError ('ends the sequence at the first failure') and that step args are validated, which adds value, but omits the minItems/maxItems bounds (1-16) and the mobile_ naming pattern, both of which the schema encodes only structurally.

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

Purpose4/5

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

States a clear verb and resource: 'Call other registered tools in one request' within an ordered sequence. The meta/aggregator role is unmistakable and distinct from the concrete UI/input siblings, though no sibling batch tool is named to contrast against.

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

Usage Guidelines3/5

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

Implies that this is the tool for chaining multiple operations, and it explicitly lists what cannot be batched (nested mobile_batch, screenshots, blocking screen records). But it never says when batching is preferable to calling tools individually, nor what the alternative is.

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

mobile_clipboardRead or write the Android clipboardA

Read dumpsys clipboard, then cmd clipboard get when the dump is redacted. set uses cmd clipboard set. When the shell cannot read or write, an active companion session uses ClipboardManager. Without a companion, the result says the read was denied and names the companion. An empty string is returned only when a read can see that the clipboard is empty. A clip the companion cannot see stays readable false.

NameRequiredDescriptionDefault
textNo
actionNoget
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist

Output Schema

NameRequiredDescription
setNo
textNo
reasonNo
backendNo
readableNo
redactedNo

TDQS

A3.9/5.0
Behavior5/5

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

Despite annotations covering the safety profile, the description adds substantial behavioral context beyond them: the dumpsys-then-cmd fallback chain, the companion-session path when shell access is blocked, the denial behavior that names the companion, and the critical distinction between an empty string (verified empty) and readable=false (unseen clip). These details materially change how an agent interprets results.

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

Conciseness4/5

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

Six tight sentences, each carrying distinct behavioral information with no padding, and the primary read path is front-loaded. The telegraphic fragments ('set uses cmd clipboard set') trade readability for density but do not waste space.

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

Completeness4/5

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

For a tool with an output schema and full annotations, the description covers the non-obvious edge cases an agent needs (fallback, denial, empty-vs-unreadable). It omits what a successful set returns and any permission prerequisites, but these are largely covered by the output schema and annotations.

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

Parameters3/5

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

Schema description coverage is only 33% (serial is documented in-schema), so the description must compensate and only partly does: it clarifies the semantics of get and set actions implicitly but never addresses the text parameter's 8000-character limit or writing behavior. Baseline for low coverage with partial compensation.

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

Purpose4/5

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

The title and opening sentences make the resource (Android clipboard) and both directions (get/set) unambiguous, and no sibling tool competes for clipboard access. However, the description leads with implementation mechanics ('Read dumpsys clipboard, then cmd clipboard get') rather than stating the purpose directly, so an agent must infer intent from the mechanism.

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

Usage Guidelines3/5

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

The get-vs-set distinction is only implied through the flow descriptions ('set uses cmd clipboard set'), and the default action=get is left to the schema. There is no explicit statement of when to prefer this tool or when clipboard access is inappropriate, so usage must be inferred.

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

mobile_device_foldRead or set fold stateB

List cmd device_state postures and, when state is set, switch to a name such as OPEN or CLOSED or a numeric identifier. Non-foldables return foldable false.

NameRequiredDescriptionDefault
stateNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist

Output Schema

NameRequiredDescription
nameNo
reasonNo
statesNo
foldableNo
currentIdNo
identifierNo
currentNameNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare it is not read-only, not idempotent, and non-destructive, so the safety profile is covered. The description adds a genuine behavioral fact ('Non-foldables return foldable false') about edge-case output. It does not disclose auth needs, reversibility of a state change, or rate limits, so it is useful but not rich.

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

Conciseness4/5

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

Two sentences, front-loaded with the read behavior before the write behavior, with little waste. The wording is slightly tangled but the structure is efficient.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained, and the annotations carry the safety profile. It also notes the non-foldable case. What is missing is clearer usage framing and any statement about what a state change affects, which for a mutation-capable tool leaves a modest gap.

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

Parameters4/5

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

Coverage is 50%: 'serial' is documented in the schema (exact ADB serial from mobile_devices_list), and the description compensates for the undocumented 'state' param by giving valid value forms ('OPEN or CLOSED or a numeric identifier'). That is meaningful semantics beyond the bare schema for the undocumented parameter.

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

Purpose3/5

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

The description conveys that this reads fold postures and can set them, and the title reinforces 'Read or set fold state'. However the phrase 'List cmd device_state postures' is awkward and half-restates an underlying command rather than cleanly stating the resource, so the purpose is only adequately clear. It does not explicitly distinguish itself from siblings like mobile_orientation, but fold state is distinctive enough.

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

Usage Guidelines3/5

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

It implies usage: call without state to list postures, pass state to switch. That conditional is useful but unstated in when/when-not terms, and no alternative tool is named for adjacent needs. Adequate minimum-viable guidance.

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

mobile_device_inspectInspect Android capabilitiesB
Read-onlyIdempotent

Probe the selected device's actual ADB, input, command, build, and backend capabilities.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
refreshNo

Output Schema

NameRequiredDescription
capabilitiesYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds only the notion that it probes *actual* (live-observed rather than declared) capabilities, but says nothing about cost, latency, or whether probing has side effects on the device.

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

Conciseness4/5

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

One front-loaded sentence with no filler, though the trailing capability list reads as keywords rather than explanatory prose. It is efficiently sized for a simple two-parameter tool.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the probes cover a low-complexity read. Still, the description leaves the refresh flag's effect and the intended workflow position (when to re-probe) unspecified, which leaves a gap for a two-parameter tool.

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

Parameters2/5

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

Schema coverage is 50%: serial is well documented in the schema, but 'refresh' (default false) is undocumented in both the schema and the description. The description never mentions the refresh parameter or what cache/probe semantics it toggles, despite 'actual' hinting that a cached-vs-live distinction exists.

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

Purpose4/5

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

Specific verb ('Probe') plus a well-scoped resource (device ADB/input/command/build/backend capabilities), which separates it from mobile_app_inspect's app-level scope. It does not, however, explicitly distinguish itself from mobile_server_info or mobile_devices_list, which an agent might reasonably confuse it with.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance: nothing says whether this should be run before input/app operations, how often, or why the caller would pick this over mobile_devices_list or mobile_server_info. 'Probe the selected device's actual... capabilities' implies a diagnostic posture but leaves the trigger condition to inference.

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

mobile_devices_listList Android devicesA
Read-onlyIdempotent

List ADB devices with reachability, hardware serial grouping, preferred TCP serial, and aliases when the same device appears under multiple serials.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
devicesYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuine behavioral context beyond that: it discloses that the same physical device may surface under multiple serials and that results are grouped by hardware serial with a preferred TCP serial and alias resolution. That is meaningful operational nuance.

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

Conciseness5/5

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

A single front-loaded sentence with no filler, and it packs the returned semantics in without redundancy. Nothing could be cut without losing information.

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

Completeness4/5

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

With an output schema present, the description need not enumerate return fields, and annotations carry the safety profile, so the essentials are covered. The only real gap is the absence of explicit routing guidance relative to mobile_device_inspect and the other device-scoped siblings.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4. The schema is an empty object and the description correctly does not invent inputs.

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

Purpose4/5

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

Names a specific verb and resource ('List ADB devices') and goes further by describing what the listing contains (reachability, serial grouping, preferred TCP serial, aliases). This clearly separates it from single-target siblings like mobile_device_inspect, though that differentiation is implied rather than stated.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the discovery/enumeration entry point before inspecting or acting on a device. There is no explicit when-to-use statement, no mention of prerequisites (e.g. ADB server running), and no named alternative for narrower queries.

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

mobile_displays_listList Android displaysB
Read-onlyIdempotent

List logical displays and correlated physical capture IDs with evidence and focus state.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist

Output Schema

NameRequiredDescription
displaysYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already establish the full safety profile (readOnly, idempotent, non-destructive, closed-world), so the description is not obligated to restate it. It adds modest scope context by saying results include correlated capture IDs, evidence, and focus state, but does not describe ordering, paging, or failure behavior.

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

Conciseness4/5

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

A single front-loaded sentence with no wasted filler. It is appropriately terse, though the trailing 'with evidence and focus state' phrase is the least informative part and could be sharper.

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

Completeness4/5

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

An output schema exists so return-value detail is not the description's job, and the only parameter is fully specified. What is missing is usage context relative to siblings, not structural coverage.

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

Parameters3/5

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

Schema description coverage is 100%, and the single serial parameter is already well documented in the schema, including the 'never inferred when multiple devices exist' caveat. The description adds nothing beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific verb (list) and resource (logical displays) and adds that physical capture IDs plus evidence and focus state are correlated. It is clear on its own but never distinguishes itself from display-adjacent siblings like mobile_screen_capture or mobile_app_relaunch_on_displays, and 'evidence' is undefined jargon.

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

Usage Guidelines2/5

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

There is no explicit when-to-use, no prerequisite (e.g. needing a connected device first), and no mention of alternatives despite many displays/capture siblings. The intended invocation context is only implied by the name.

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

mobile_focus_traceTrace focused package/activity per display (blocking)A

Blocking sample of focused package/activity/taskId for a fixed duration. Prefer mobile_focus_trace_start/stop when interleaving input or recording. Large sample sets are written to an artifact; only a compact prefix is inlined.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdsYes
durationMsYes
maxSamplesNo
sampleIntervalMsNo
includeAllSamplesNo

Output Schema

NameRequiredDescription
serialYes
changesYes
samplesYes
truncatedYes
displayIdsYes
durationMsYes
changeCountYes
sampleCountYes
startedAtIsoYes
stoppedAtIsoYes
boundRecordIdNo
droppedSamplesYes
focusSessionIdYes
sampleIntervalMsYes
responseCompactedNo
samplesArtifactUriNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations are weak here (readOnlyHint=false, idempotentHint=false, destructiveHint=false) and say nothing about the blocking nature or where output lands, so the description carries real value: it discloses that the call blocks and that large sample sets go to an artifact with only a compact prefix inlined. Missing dependency/permission requirements (e.g. root) and timeout risk, keeping it below 5.

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

Conciseness5/5

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

Three tight sentences: purpose first, routing second, output behavior last. No filler, and the most decision-relevant information is front-loaded.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description covers the blocking contract and artifact behavior. It stops short of covering prerequisites (root/permissions) and failure modes, which matters for a blocking call that can run up to 180s.

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

Parameters3/5

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

Schema coverage is only 17% — serial and the displayIds item type are documented, but durationMs, maxSamples, sampleIntervalMs, and includeAllSamples have no schema descriptions. The description hints at duration and sampling volume (large sets to artifact, compact prefix inlined) but does not explain interval, cap, or includeAllSamples semantics, so it only partially compensates.

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

Purpose5/5

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

States a specific verb (blocking sample), resource (focused package/activity/taskId), and scope (fixed duration), and explicitly distinguishes itself from the mobile_focus_trace_start/stop siblings. An agent can select it without opening the schema.

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

Usage Guidelines4/5

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

Names the alternative (mobile_focus_trace_start/stop) and the condition that selects it (interleaving input or recording), which is solid routing guidance. It doesn't spell out when-not beyond that single case, but the key decision point is covered.

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

mobile_focus_trace_startStart async focus traceA

Start non-blocking focus sampling for logical displays. Optionally bind to a recordId so samples include recordOffsetMs aligned with record marks. Default interval 250ms; samples are ring-buffered (maxSamples).

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdsYes
maxSamplesNo
boundRecordIdNo
sampleIntervalMsNo

Output Schema

NameRequiredDescription
startedAtIsoYes
focusSessionIdYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnly=false, idempotent=false, destructive=false), so the bar is lower, yet the description still adds real behavior: sampling is non-blocking, samples are ring-buffered up to maxSamples (i.e. old samples are overwritten), and recordOffsetMs alignment is produced when bound. It does not mention the lifecycle requirement to stop the trace or resource cost.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the core action, then optional binding, then defaults and buffer behavior. No filler; every clause carries information an agent needs.

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

Completeness4/5

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

An output schema exists, so return values need no exposition, and the description covers action, key parameters, and buffering. The notable gap is lifecycle context: it never states the trace must be terminated with mobile_focus_trace_stop or whether concurrent traces are permitted.

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

Parameters4/5

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

With schema coverage at only 20%, the description carries much of the burden and delivers: it explains boundRecordId's purpose, the default sampleIntervalMs (250ms), and maxSamples as the ring-buffer bound. It leaves serial and displayIds semantics to the schema, which happens to document them well.

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

Purpose4/5

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

States a specific verb+resource ('Start non-blocking focus sampling for logical displays') and the 'async/non-blocking' framing distinguishes it from the synchronous sibling mobile_focus_trace. It does not name the sibling or mobile_focus_trace_stop explicitly, so differentiation is implied rather than stated.

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

Usage Guidelines3/5

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

The binding-to-recordId note implies a key use case (aligning samples with record marks during a recording), which gives implicit context for when to reach for this tool. However, it never says when to use this versus mobile_focus_trace or the record_* family, nor any prerequisite or exclusion.

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

mobile_focus_trace_stopStop async focus traceA

Stop an async focus session and return focus change events plus samples (wallClockIso, tMs, optional recordOffsetMs). Prefer changes for flash/launcher hunting. Large traces write samples JSON to an artifact.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
focusSessionIdYes
includeAllSamplesNo

Output Schema

NameRequiredDescription
serialYes
changesYes
samplesYes
truncatedYes
displayIdsYes
durationMsYes
changeCountYes
sampleCountYes
startedAtIsoYes
stoppedAtIsoYes
boundRecordIdNo
droppedSamplesYes
focusSessionIdYes
sampleIntervalMsYes
responseCompactedNo
samplesArtifactUriNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the agent knows this is a state-mutating but non-destructive stop. The description adds real context beyond that: large traces write samples JSON to an artifact, a side effect not visible in the annotations. It does not explain reversibility or the artifact's lifecycle.

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

Conciseness4/5

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

Three compact sentences with the main action front-loaded, and no wasted phrasing. The field-name parenthetical is slightly dense but earns its place by clarifying the return shape.

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

Completeness4/5

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

With an output schema and annotations already present, the description need not re-explain returns, yet it still summarizes them and adds the artifact-writing behavior. The main gap is the undocumented includeAllSamples input, which is minor for an otherwise complete stop-and-collect tool.

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

Parameters2/5

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

Schema coverage is only 33% (only serial is documented). The description explains none of the input parameters and never mentions includeAllSamples, which is the one parameter most in need of clarification and is only given a default. The parenthetical field list (wallClockIso, tMs, recordOffsetMs) describes outputs, not inputs, so it does not compensate.

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

Purpose4/5

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

States a specific verb and resource ('Stop an async focus session') and describes the return content (focus change events plus samples). It is clearly the stop counterpart to mobile_focus_trace_start, though it never explicitly names that sibling.

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

Usage Guidelines3/5

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

'Prefer `changes` for flash/launcher hunting' gives steering on which output to consume, and stopping a started session is implied. But there is no explicit when-to-use vs alternatives (e.g., mobile_focus_trace vs mobile_focus_trace_start) and no preconditions stated.

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

mobile_input_double_tapDouble-tap Android displayB

Inject two display-targeted taps at the same point in one on-device script, so gapMs is the pause between the taps. Pass ref or x and y.

NameRequiredDescriptionDefault
xNo
yNo
refNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display. Wins over x and y.
gapMsNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, non-idempotent, closed-world). The description adds that both taps occur 'in one on-device script', which hints at atomicity and reduced round-trips, but says nothing about target-side effects, failure modes, or confirmation behavior.

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

Conciseness4/5

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

Two tight sentences with the core behavior front-loaded and the gapMs definition immediately after. No filler, though 'Pass ref or x and y' is a bare fragment that could carry precedence detail.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the serial/displayId/ref semantics live in the schema. The description covers the main ambiguity (gapMs, ref-or-coordinates) but leaves x/y semantics to inference, which is a minor gap for this complexity.

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

Parameters3/5

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

Schema coverage is only 50% and x, y, and gapMs have no schema descriptions. The description partially compensates by defining gapMs as 'the pause between the taps' and framing ref vs x/y as alternatives, but x/y coordinate space and units remain undocumented.

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

Purpose4/5

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

States a specific verb and resource ('inject two display-targeted taps at the same point') and clarifies the defining trait vs a single tap. It does not name mobile_input_tap as the sibling it supersedes, so discrimination relies on the agent inferring it from 'two taps'.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing says to prefer this over calling mobile_input_tap twice, or when gapMs matters relative to mobile_input_long_press. 'Pass ref or x and y' is argument instruction, not usage context.

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

mobile_input_dragDrag on Android displayB

Inject a capability-gated long-press drag-and-drop on one logical display. startRef and endRef come from the latest UI read and win over start and end.

NameRequiredDescriptionDefault
endNo
startNo
endRefNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
startRefNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationMsNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is covered. The description adds genuine value with 'capability-gated' (the call can fail when the device/display doesn't support the gesture) and the ref-precedence rule, but it never states that repeated drags mutate UI state non-idempotently or whether coordinates are display-relative.

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

Conciseness5/5

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

Two sentences, no filler, with the core action front-loaded and the ref-precedence caveat second. Every clause carries information the schema doesn't.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained, and the ref-override rule closes the biggest gap. Still missing for a mutating gesture tool: what durationMs controls (only its 300ms default is visible) and what happens when the capability gate fails.

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

Parameters4/5

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

Schema coverage is 57%, and the description compensates by resolving a real ambiguity the schema leaves open: startRef/endRef override start/end when both are supplied. That precedence rule is the single most important thing to know about this 7-parameter schema. It still leaves durationMs's effect unmentioned.

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

Purpose4/5

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

States a specific action ('Inject a ... long-press drag-and-drop') on a specific resource ('one logical display'), which separates it from siblings like mobile_input_swipe and mobile_input_long_press. It never explicitly names those siblings, so the differentiation is inferential rather than stated.

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

Usage Guidelines2/5

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

There is no when-to-use guidance: nothing says to prefer this over mobile_input_swipe for a drag, or how it differs from mobile_input_long_press. The only conditional content is the ref-vs-coordinate precedence rule, which is parameter semantics rather than usage routing.

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

mobile_input_keySend Android keyC

Send symbolic or numeric Android keys with gamepad source and capability-gated press options.

NameRequiredDescriptionDefault
keyYes
actionNopress
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
sourceNogamepad
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationMsNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=false, so the safety profile is carried by structured data. The description adds one real behavioral trait, that press options are 'capability-gated' (they may be unavailable depending on device capability), but it is too vague to be actionable and says nothing about how keys are resolved or what failure looks like.

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

Conciseness4/5

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

A single front-loaded sentence with no padding or repetition. It is efficient, though the vague 'capability-gated' clause consumes words without delivering usable detail.

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

Completeness2/5

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

For a 6-parameter, non-idempotent input tool with low schema coverage, the description leaves key syntax, action semantics, and duration behavior undocumented. An output schema exists so return values need not be covered, but the invocation-relevant gaps remain substantial.

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

Parameters2/5

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

Schema description coverage is only 33% (only serial and displayId are documented), so the description must compensate for key, action, source, and durationMs. It touches them only obliquely ('symbolic or numeric' hints at key format, 'gamepad source' echoes the source default, 'press options' hints at action) without explaining the accepted key syntax, the meaning of durationMs, or the non-idempotent semantics.

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

Purpose4/5

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

The description gives a specific verb and resource ('Send symbolic or numeric Android keys'), so an agent knows this injects key events rather than taps, swipes, or text. However, it never names the sibling it differs from (mobile_input_text, mobile_input_key_combination, mobile_input_key_sequence), so sibling differentiation is only implied by the 'key' noun.

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

Usage Guidelines2/5

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

There is no when-to-use guidance and no mention of when to prefer this over mobile_input_text or the combination/sequence variants. The phrase 'capability-gated press options' gestures at a precondition but does not state one.

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

mobile_input_key_combinationSend simultaneous Android keysB

Inject a device-supported key combination with explicit ordering and chord duration.

NameRequiredDescriptionDefault
keysYes
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
sourceNogamepad
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationMsNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare this as a non-destructive but non-idempotent write operation, so the safety profile is covered. The description adds useful behavior: keys must be device-supported, ordering is significant, and durationMs governs the chord hold, but it omits auth requirements, device/session preconditions, and rate limits.

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

Conciseness4/5

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

One front-loaded sentence with no filler; the essential verb and resource lead the sentence. It is clean but extremely terse for a 5-parameter tool, leaving no room for structural grouping of constraints.

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

Completeness2/5

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

With an output schema present, return values need not be explained, and annotations cover safety. However, for a required 3-parameter input tool with only 40% schema coverage, the description omits key string format, source semantics, multi-device serial rules, and when to prefer this over sibling input tools, leaving meaningful gaps.

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

Parameters3/5

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

Schema description coverage is 40%, so the description must compensate. It adds meaning for the keys array ('explicit ordering') and durationMs ('chord duration'), but gives no explanation of the source enum values or the key-string format expected in the array.

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

Purpose4/5

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

States a specific verb (inject) and resource (key combination) plus scope modifiers (ordering, chord duration). The word 'combination' conceptually separates it from mobile_input_key (single) and mobile_input_key_sequence (sequential), though no sibling is named explicitly.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no conditions for choosing this tool over mobile_input_key, mobile_input_key_sequence, or mobile_input_text, and no prerequisites or exclusions. Usage is only weakly implied by the word 'combination'.

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

mobile_input_key_sequenceSend a timed Android key sequenceA

Send a timed sequence of Android keys and touchscreen taps in one call. Digits between actions are millisecond pauses, not a simultaneous chord. An x,y token is a tap; join points with + for a touch combo with no pause between them. Pass stepped.checks, one entry per action, to run each action on its own and poll for a UI node before continuing.

NameRequiredDescriptionDefault
gapMsNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
sourceNogamepad
steppedNo
sequenceYes
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral detail beyond that: digit tokens are pauses rather than a chord, x,y tokens are taps, plus signs create pause-free touch combos, and stepped.checks polls for a UI node before continuing.

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

Conciseness5/5

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

The description is four dense sentences with no filler. It front-loads the core action and then spends each remaining sentence on high-value syntax or execution-mode information.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and the annotations cover the safety profile. The description adequately explains the complex sequence and stepped-execution behavior, but it leaves gaps around source selection, gapMs usage, and when to use this tool versus sibling input tools.

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

Parameters4/5

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

Schema description coverage is only 33%, so the description must compensate. It gives essential meaning to the sequence grammar and to stepped.checks, which are otherwise opaque in the schema, though it does not explain gapMs, source, pollMs, or timeoutMs beyond what their names and schema defaults imply.

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

Purpose5/5

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

The description states a specific verb and resource: sending a timed sequence of Android keys and touchscreen taps in one call. It also distinguishes this from a simultaneous key chord by saying digits are millisecond pauses, not a chord, which helps separate it from sibling tools like mobile_input_key_combination.

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

Usage Guidelines3/5

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

The description implies usage for multi-action input in one call and explains the stepped.checks mode, but it never explicitly says when to choose this tool over mobile_input_key, mobile_input_tap, mobile_input_key_combination, or mobile_batch. The operational context is present, but alternative selection guidance is left to inference.

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

mobile_input_long_pressLong-press Android displayB

Hold a display-targeted touch at one point by swiping from that point to itself. Pass ref or x and y.

NameRequiredDescriptionDefault
xNo
yNo
refNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display. Wins over x and y.
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationMsNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare this is a non-read-only, non-idempotent, non-destructive input action, so safety is covered. The description usefully discloses that the gesture is synthesized as a zero-distance swipe, which explains why it exists as a distinct tool. It says nothing, however, about how the hold duration is controlled or what failure/side effects to expect, so it adds only modest behavioral context.

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

Conciseness4/5

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

Two short sentences, front-loaded with the core action and followed by the minimal targeting instruction. No filler, though the second sentence partially restates the schema's ref description rather than adding new information.

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

Completeness3/5

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

An output schema exists, so return values need not be described, and annotations cover the safety profile. What is missing for a gesture tool is the hold-duration story (no mention of durationMs or its default/bounds) and any hint of when long press is preferable to tap or drag; the definition is adequate but leaves the agent to infer the defining behavior.

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

Parameters3/5

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

Schema description coverage is 50%, and the description partially compensates by telling the agent to supply 'ref or x and y' (the ref-wins-over-coordinates rule is also in the schema). It never mentions durationMs, which is the parameter that actually defines a long press and has a non-obvious default of 800ms with a 200-10000ms range, leaving a meaningful gap.

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

Purpose4/5

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

The description states a specific action (hold a touch at one point) and even explains the mechanism (swiping from the point to itself), which implicitly separates it from mobile_input_swipe and mobile_input_drag. It is clear what the tool does, though it never explicitly names the sibling tools it competes with (tap, double_tap).

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

Usage Guidelines2/5

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

The second sentence ('Pass ref or x and y') is targeting mechanics, not usage guidance. There is no statement of when a long press is the right gesture versus mobile_input_tap, mobile_input_double_tap, or mobile_input_drag, and no prerequisites or exclusions are given.

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

mobile_input_swipeSwipe Android displayB

Inject a display-targeted touchscreen swipe with explicit duration. startRef and endRef come from the latest UI read and win over start and end.

NameRequiredDescriptionDefault
endNo
startNo
endRefNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
startRefNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationMsNo

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=false, so the agent knows this is a state-changing, non-repeatable on-device operation. The description adds 'display-targeted' and 'explicit duration' but says nothing about what UI/app state the gesture affects, stale-ref failure modes, or permission needs.

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

Conciseness5/5

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

Two sentences, both load-bearing, with the core action stated first and the ref-precedence rule second. There is no redundancy or filler.

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

Completeness3/5

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

An output schema exists, so return values need no prose, and the precedence rule covers the trickiest ambiguity among 7 parameters. However, for a non-idempotent injection tool with stale-ref risk, the description omits failure behavior and where the gesture lands, leaving meaningful gaps.

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

Parameters4/5

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

Schema coverage is 57%, and the description compensates by stating a real semantic rule absent from the schema: startRef/endRef 'win over' start and end when both are supplied. It does not clarify displayId (framework vs SurfaceFlinger is only in the schema) or the durationMs default, so it is not fully compensating.

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

Purpose4/5

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

States a specific verb and resource: 'Inject a display-targeted touchscreen swipe with explicit duration.' An agent can tell it apart from mobile_input_tap or mobile_input_long_press, though the boundary with the sibling mobile_input_drag (which likely also expresses a move gesture) is not addressed.

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

Usage Guidelines2/5

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

No when-to-use/when-not guidance and no alternative named; the agent is left to infer that a swipe differs from drag. The only routing-style statement is the startRef/endRef precedence, which is closer to parameter semantics than usage guidance.

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

mobile_input_tapTap Android displayA

Inject a display-targeted touchscreen tap in logical display coordinates. Pass ref from the latest UI read, or x and y. ref wins when both are set. Prefer ref over a node's raw center.

NameRequiredDescriptionDefault
xNo
yNo
refNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display. Wins over x and y.
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the agent knows this is a non-destructive, non-idempotent mutation. The description adds the staleness constraint ('latest UI read') and the coordinate-space semantics, but says nothing about error behavior when a ref is stale or a tap targets an off-screen location.

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

Conciseness5/5

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

Three short sentences, zero filler, with the action and coordinate space front-loaded and the ref-vs-x/y precedence rule immediately after. Every sentence carries distinct information.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the annotations cover the safety profile. What remains thin is side-effect/failure context for a mutation tool (what a tap does if the ref is stale or the coordinates are outside the display), but the essentials for calling it correctly are present.

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

Parameters4/5

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

Schema coverage is 60%, and the description partially compensates: it explains the x/y vs ref precedence and advises preferring ref over a node's raw center, which is guidance the schema does not contain (the schema only says ref 'wins over x and y'). The coordinate-space phrasing also clarifies displayId's meaning.

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

Purpose5/5

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

States a specific verb and resource ('Inject a display-targeted touchscreen tap') plus the coordinate space ('logical display coordinates'). This is unambiguously the single-tap input tool, distinguishable from mobile_input_double_tap, mobile_input_long_press, and mobile_input_drag without opening any schema.

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

Usage Guidelines4/5

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

Gives clear operational context: the ref must come from 'the latest UI read,' and ref is preferred over x/y or a node's raw center. It does not, however, name when to reach for a sibling input tool (double_tap, long_press) instead, so it stops short of full alternative routing.

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

mobile_input_textType Android textA

Type text through ADB's virtual keyboard. Pass ref to tap that node first. Reports the Unicode limitation instead of hiding it.

NameRequiredDescriptionDefault
refNoRef from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.
textYes
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
dataYes
deviceYes
backendYes
displayNo
warningsYes
durationMsYes
operationIdYes
schemaVersionYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, destructive=false, openWorld=false, so the safety profile is covered. The description adds genuinely new behavioral context: that a ref causes a prior tap on that node, and that Unicode input is a known limitation that will be surfaced rather than silently swallowed. It does not say what happens to existing field content.

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

Conciseness5/5

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

Three short sentences with no filler, and the primary action is front-loaded before the ref precondition and the caveat. Every sentence carries distinct information.

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

Completeness5/5

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

With an output schema present and annotations covering the safety/mutation profile, the description does not need to explain return values. It covers the action, the ref precondition, and the Unicode caveat, which is what an agent needs to call this correctly.

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

Parameters3/5

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

Schema description coverage is 75%, so the baseline is 3. The description does add real meaning for ref (it triggers a tap before typing, not just a lookup key), which the schema only implies. It adds nothing for text length limits or displayId.

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

Purpose4/5

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

Specific verb+resource: 'Type text through ADB's virtual keyboard', which is clearly distinguishable from the key-event siblings (mobile_input_key, mobile_input_key_sequence). It also discloses the Unicode constraint up front. It stops short of naming an alternative sibling when text entry won't work.

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

Usage Guidelines3/5

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

'Pass ref to tap that node first' gives conditional usage guidance for one parameter, and 'Reports the Unicode limitation instead of hiding it' signals an expected failure mode. However, it never says when to prefer this over mobile_clipboard, mobile_input_key, or other input tools, so usage is implied rather than stated.

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

mobile_locationSet or clear a mock locationA

On an emulator, set uses adb emu geo fix (longitude then latitude). Clearing an emulator fix fails because the console has no clear. On a device, set requires Android 12 (API 31) and injects a gps test provider via cmd location. Fused location clients can ignore that provider. clear removes it.

NameRequiredDescriptionDefault
actionNoset
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
latitudeNo
longitudeNo
accuracyMetersNo

Output Schema

NameRequiredDescription
backendNo
clearedNo
warningNo
latitudeNo
longitudeNo

TDQS

A3.9/5.0
Behavior5/5

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

Rich behavioral disclosure beyond the annotations: emulator path uses 'adb emu geo fix' with a specific argument order, clear on emulator is unsupported, device path requires Android 12/API 31 and injects a GPS test provider, and fused clients may ignore that provider. This is exactly the kind of platform-specific caveat an agent cannot infer from readOnlyHint/destructiveHint.

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

Conciseness4/5

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

Four tight sentences, each carrying a distinct platform fact, with no filler or repetition. It reads as dense reference prose rather than a front-loaded summary, but nothing is wasted.

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

Completeness4/5

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

For a platform-divergent mutation tool, the description covers the critical failure modes and prerequisites, and an output schema exists so return values need no explanation. It stops short of clarifying accuracy and validation rules for coordinates, which is the main remaining gap.

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

Parameters3/5

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

Schema coverage is only 20%, so the description must compensate, and it partially does by documenting the longitude-then-latitude ordering for the emulator path. It says nothing about accuracyMeters semantics/default behavior, the action enum default, or lat/long validity constraints, leaving a real gap.

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

Purpose4/5

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

The title and opening establish a specific verb+resource ('Set or clear a mock location'), and the body clarifies the two supported actions with real mechanism detail. It does not explicitly contrast with a sibling tool, but the sibling list contains no overlapping location tool, so ambiguity is low.

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

Usage Guidelines3/5

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

The description implies usage contexts by splitting emulator vs device behavior and warns that clearing an emulator fix fails ('the console has no clear'), which is a genuine when-not-to-use signal. It never states when to reach for this tool vs any alternative, so guidance is mostly implicit.

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

mobile_open_urlOpen an http(s) URLA

Start ACTION_VIEW for an http or https URL on one logical display. Other schemes are rejected.

NameRequiredDescriptionDefault
urlYes
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdNoAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
urlYes
outputYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the safety profile is largely covered. The description adds the useful scheme-validation behavior, but says nothing about which app handles the intent, foreground changes, or failure behavior for a non-idempotent action.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core action and the scheme restriction front-loaded. Every clause carries information an agent needs.

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

Completeness4/5

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

With an output schema present, return values need not be described, and the description covers the action, accepted schemes, and display targeting for a 3-parameter tool. Minor gaps remain around required device/serial handling and failure modes, but nothing essential to invoking it correctly is missing.

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

Parameters3/5

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

Schema coverage is 67%: serial and displayId are documented in the schema, while url carries only length bounds. The description adds the meaningful constraint that url must be http/https, partially compensating, but 2048-char limit and display semantics add nothing beyond the schema. Baseline 3 fits.

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

Purpose4/5

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

States a specific action ('Start ACTION_VIEW') and resource ('http or https URL'), and narrows scope to one logical display. It is distinguishable from siblings like mobile_app_launch or mobile_input_tap, though it never names an alternative sibling, so it stops short of a 5.

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

Usage Guidelines3/5

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

The scheme restriction ('http or https... others rejected') implies when the tool is valid, but there is no explicit statement of when to prefer this over mobile_app_launch or other navigation-oriented siblings, and no prerequisites such as requiring an unlocked device.

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

mobile_orientationGet or lock display rotationA

Read or set user rotation for one logical display. action lock uses rotation 0, 1, 2, or 3. action free lets the accelerometer decide. action get returns free or lock N, plus observedRotation from the live display when it is known.

NameRequiredDescriptionDefault
actionNoget
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
rotationNo
displayIdNoAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
rawNo
modeYes
rotationNo
displayIdYes
observedRotationNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-destructive, non-idempotent, closed-world mutation; the description adds real behavioral detail beyond that, notably that 'free' delegates to the accelerometer and that 'get' returns 'free' or 'lock N' plus observedRotation when known. It leaves out any note on permission requirements or what happens to a locked display across reboots/disconnects.

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

Conciseness5/5

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

Three tight sentences, each carrying distinct information (scope, lock/free semantics, get semantics). The read-or-write framing is front-loaded and nothing is padded.

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

Completeness4/5

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

An output schema exists, so the return-value sentence is bonus rather than a requirement. Scope, action semantics, and the display-ID caveat (carried in the schema) together cover what an agent needs; only behavioral edge cases and the exact serial requirement (schema-only) are left unaddressed here.

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

Parameters4/5

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

Schema description coverage is only 50% (serial and displayId are documented; action and rotation are not). The description compensates by enumerating the action values and tying rotation 0-3 specifically to the lock action, which the schema's bare 0-3 enum does not explain.

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

Purpose5/5

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

States a specific verb pair and resource: 'Read or set user rotation for one logical display.' No sibling tool touches rotation, and the display scoping ('one logical display') is stated up front, so an agent can place it immediately.

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

Usage Guidelines4/5

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

The description disambiguates the three actions concretely: 'lock' consumes rotation 0-3, 'free' hands control to the accelerometer, 'get' reports state. That is clear per-action context, though it does not explicitly frame when a caller should prefer get vs lock vs free (e.g. before asserting orientation in a test).

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

mobile_record_markMark async recording timelineB

Attach a labeled timestamp (offsetMs from record start) for later correlation with analyze/focus/logcat.

NameRequiredDescriptionDefault
labelYesTimeline label, e.g. pre-launch, press-a, home
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
recordIdYes

Output Schema

NameRequiredDescription
labelYes
offsetMsYes
recordIdYes
wallClockIsoYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, non-idempotent), so the agent knows this is a non-destructive write. The description adds the 'offsetMs from record start' framing but omits behaviors like what happens if no recording is active, whether labels must be unique, or ordering guarantees.

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

Conciseness4/5

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

A single, front-loaded sentence with the core action stated first and no wasted words. The trailing 'analyze/focus/logcat' reference is slightly loose (not exact tool names) but still compact and informative.

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

Completeness3/5

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

An output schema exists, so return values needn't be explained, and the simple mark operation is mostly covered. Still missing the operational prerequisite that a recording must be running and that recordId must originate from mobile_record_start, which matters for a 3-required-param write tool.

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

Parameters3/5

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

Schema coverage is 67%, with serial and label well described in the schema; recordId carries only a format/pattern. The description adds little param detail beyond clarifying label semantics implicitly via 'labeled timestamp'. The mention of 'offsetMs' refers to a computed value, not a parameter, so it doesn't clarify any input.

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

Purpose4/5

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

The description states a concrete action ('Attach a labeled timestamp') plus the mechanism ('offsetMs from record start'), so an agent understands this records a timeline marker within an active recording. It doesn't explicitly name or contrast itself against siblings like mobile_record_start/stop, but the purpose is clearly distinguishable from them.

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

Usage Guidelines3/5

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

'for later correlation with analyze/focus/logcat' implies why you'd use it, giving implied usage context. However, it never states the key precondition (a recording must be active, recordId from mobile_record_start) or when-not to use it, leaving the agent to infer.

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

mobile_record_startStart async display recordingA

Start a non-blocking screenrecord on one logical display so input tools can run during capture. One active session per (serial, displayId).

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
pathHintYes
recordIdYes
displayIdYes
startedAtIsoYes
physicalDisplayIdYes

TDQS

A4/5.0
Behavior4/5

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

Annotations cover safety (non-readOnly, non-destructive, non-idempotent, openWorld), so the bar is lower. The description still adds real operational context beyond annotations: capture is non-blocking and only one active session per (serial, displayId) is allowed. It omits what a session produces and how it is terminated.

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

Conciseness5/5

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

Two tight sentences, zero filler, with the non-blocking behavior front-loaded and the concurrency constraint as the closing caveat. Every clause carries information.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and annotations carry the safety profile. The description supplies the key behavioral traits (async, single-session-per-target), but does not mention lifecycle pairing with mobile_record_stop or mobile_record_mark, a minor gap for a session-starting tool.

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

Parameters3/5

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

Schema coverage is 100%, so both serial and displayId semantics (exact ADB serial, framework logical display ID vs SurfaceFlinger ID) are already fully documented in the schema. The description adds no parameter-level detail, making the baseline 3 correct.

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

Purpose4/5

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

States a specific verb and resource: 'Start a non-blocking screenrecord on one logical display.' The 'non-blocking' qualifier and 'one logical display' scope meaningfully distinguish it from a generic record sibling, but no sibling (e.g. mobile_screen_record, mobile_record_stop) is named for explicit contrast.

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

Usage Guidelines4/5

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

'so input tools can run during capture' tells the agent the condition that selects this tool over a blocking capture. No exclusion or explicit pointer to mobile_screen_record / mobile_record_stop, so it stops short of full alternative routing.

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

mobile_record_stopStop async display recordingB

Stop screenrecord with SIGINT, pull the MP4 into artifacts, and return marks with offsets.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
recordIdYes

Output Schema

NameRequiredDescription
pathYes
marksYes
serialYes
recordIdYes
displayIdYes
sizeBytesYes
durationMsYes
artifactUriYes
startedAtIsoYes
stoppedAtIsoYes
physicalDisplayIdYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations declare the safety profile (readOnly=false, openWorld=true, idempotent=false, destructive=false), so the description only needs to add context – and it does: it discloses the SIGINT termination mechanism, that the MP4 is copied into the artifacts store, and that marks with offsets are returned. It omits failure modes (unknown recordId, already-terminated session) and whether artifact retention is bounded.

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

Conciseness4/5

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

A single front-loaded sentence with three sequentially ordered clauses, each carrying information (mechanism, side effect, return). No padding, though it is terse enough that some behavioral context is squeezed out.

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

Completeness4/5

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

An output schema exists, so the return value need not be explained in depth, and the description still flags that marks with offsets come back. For a two-parameter stop tool, the main remaining gap is the lifecycle linkage to mobile_record_start and error behavior, not the core call contract.

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

Parameters2/5

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

Schema coverage is only 50%: 'serial' is documented but 'recordId' has just a UUID format/pattern with no textual meaning. The description adds nothing about either parameter – it doesn't say where recordId comes from (presumably mobile_record_start) or why serial must be exact when multiple devices exist, which is the exact gap the low coverage leaves open.

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

Purpose4/5

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

States a specific verb (stop), the resource (screenrecord), and the concrete outcome (MP4 pulled into artifacts, marks with offsets). An agent can distinguish it from mobile_record_start and mobile_record_mark by name, though the description never names those siblings explicitly.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or prerequisite guidance. The pairing with mobile_record_start and mobile_record_mark is only inferable from the wording ('stop screenrecord', 'return marks'), and nothing states what to do if the recording was never started or already stopped.

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

mobile_screen_captureCapture an Android displayA

Capture one logical display after resolving its SurfaceFlinger physical display ID. Images whose long edge exceeds 1280px are downscaled before they are returned. coordinateSpace.scaleX and scaleY convert those screenshot pixels into the logical coordinates used by mobile_input_tap.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
saveArtifactNo

Output Schema

NameRequiredDescription
serialYes
displayYes
mimeTypeYes
sizeBytesYes
downscaledYes
durationMsYes
artifactUriNo
coordinateSpaceYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare the safety profile, and the description adds genuinely useful behavior beyond them: the >1280px downscaling rule and the coordinateScale conversion for downstream input tools. It does not explain the readOnlyHint=false flag for what reads like a capture operation (likely artifact persistence), a minor gap.

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

Conciseness4/5

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

Three dense sentences with no filler, and the core operation is front-loaded before the downscaling and coordinate-mapping details. Every sentence carries information relevant to correct invocation.

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

Completeness4/5

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

An output schema exists, so return values need not be described, and the description covers the key non-obvious behaviors (downscaling, coordinate conversion, ID resolution). The only real omission is what saveArtifact does, which leaves a small completeness gap.

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

Parameters3/5

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

Schema coverage is 67% and the schema already documents serial and displayId well, including the logical-vs-physical ID distinction. The description echoes the physical-ID resolution idea but does not clarify the undocumented saveArtifact parameter, so it adds only marginal meaning over the schema.

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

Purpose4/5

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

States a specific verb and resource ('Capture one logical display') and adds the qualifier 'after resolving its SurfaceFlinger physical display ID', which clarifies the operation. It implicitly distinguishes itself from the sibling mobile_screen_capture_pair via 'one logical display', though it never names the sibling explicitly.

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

Usage Guidelines3/5

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

Provides implied usage guidance around needing to resolve a physical display ID first and how the resulting coordinateSpace maps to mobile_input_tap. However, it never states when to prefer this over mobile_screen_capture_pair, mobile_screen_record, or mobile_ui_snapshot, so the agent must infer the choice.

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

mobile_screen_capture_pairCapture paired Android displaysB

Capture multiple logical displays as tightly paired same-moment screenshots (parallel screencap after one display resolve).

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdsYes
saveArtifactNo

Output Schema

NameRequiredDescription
serialYes
skewMsYes
capturesYes

TDQS

B3/5.0
Behavior3/5

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

Annotations declare non-read-only, non-idempotent, non-destructive, closed-world. The description adds genuine behavioral context beyond them by disclosing the mechanism: 'parallel screencap after one display resolve,' which explains how simultaneity is achieved. It does not disclose what happens to saveArtifact output or artifact persistence, so it is useful but incomplete.

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

Conciseness4/5

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

A single compact sentence, front-loaded with the verb and the distinguishing scope. Nothing is wasted, though the parenthetical is dense and could be clearer.

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

Completeness3/5

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

An output schema exists so return values need not be explained, but with 33% schema coverage on a 3-param tool the description should at minimum account for saveArtifact and give a hint of when this tool is appropriate. As written it is minimally viable for a moderately simple capture tool.

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

Parameters2/5

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

Schema description coverage is only 33%: serial and the displayIds item type are documented in the schema, but saveArtifact has no description anywhere. The tool description adds no parameter meaning at all, so it fails to compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb (Capture) and resource (multiple logical displays as tightly paired same-moment screenshots), and the 'paired/same-moment' scope clearly distinguishes it from the singular mobile_screen_capture sibling, even though that sibling is not named.

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

Usage Guidelines2/5

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

No explicit when/when-not guidance. The phrase 'tightly paired same-moment' implies it is for synchronized multi-display captures, but nothing tells the agent when to prefer this over two calls to mobile_screen_capture or what prerequisites (e.g., display IDs from mobile_displays_list) apply.

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

mobile_screen_recordRecord an Android displayA

Blocking record of one physical-backed display for a bounded duration. Prefer mobile_record_start/mark/stop when input must be interleaved.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
durationSecondsNo

Output Schema

NameRequiredDescription
pathYes
serialYes
displayIdYes
sizeBytesYes
artifactUriYes
physicalDisplayIdYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly=false, idempotent=false, openWorld=true, destructive=false. The description adds non-obvious behavior beyond these: the call is BLOCKING and the duration is bounded (matching the 180s schema max), which is important context for planning. It omits where the resulting artifact lands, though an output schema exists.

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

Conciseness5/5

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

Two tight sentences with zero filler. The core operation and scope are front-loaded, and the sibling routing follows immediately.

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

Completeness4/5

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

Annotations cover the safety profile and an output schema covers return values, so the description only needs behavioral nuance—which it supplies (blocking, bounded, single display target). Complete enough to invoke correctly; only artifact/destination details are unaddressed, and those are arguably covered by the output schema.

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

Parameters3/5

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

Schema coverage is 67% and the two complex params (serial, displayId) already carry rich inline descriptions, including the logical-vs-physical display distinction. The description adds little parameter-level detail and leaves durationSeconds semantics to the schema bounds/default. Baseline 3 given the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (record) and resource (one physical-backed display) with clear scope (bounded duration). It also names the sibling family it competes with (mobile_record_start/mark/stop), so an agent can distinguish it without opening either schema.

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

Usage Guidelines4/5

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

Explicitly routes the agent: 'Prefer mobile_record_start/mark/stop when input must be interleaved.' This gives a concrete condition selecting the alternative. It stops short of stating when NOT to record at all, so it's clear but not exhaustive.

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

mobile_server_infoPolyScreen server infoA
Read-onlyIdempotent

Return package version, active profiles, and the exact registered tool list. Call after reconnect to verify Cursor sees the full core surface.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
nameYes
versionYes
profilesYes
toolCountYes
toolNamesYes
artifactRootYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful operational context about the tool's role as a post-reconnect registration check, but stops short of describing return shape or failure behavior (partially excused by the output schema).

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

Conciseness5/5

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

Two short sentences with zero filler. What the tool returns is front-loaded, and the invocation cue follows immediately.

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

Completeness5/5

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

For a zero-argument, read-only introspection tool with an output schema, the description covers everything an agent needs: the returned fields, the safe/idempotent nature (via annotations), and the situation that calls for invoking it.

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

Parameters4/5

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

Zero parameters, so the schema baseline of 4 applies; there is nothing for the description to disambiguate. No parameter text is needed or missing.

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

Purpose5/5

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

States a specific verb ('Return') and three concrete resources (package version, active profiles, exact registered tool list). No sibling tool exposes server/package metadata, so it is unambiguously distinguishable from the mobile_* family.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition: 'Call after reconnect to verify Cursor sees the full core surface.' That is a clear when-to-use signal, though it names no alternatives or when-not scenarios (arguably none exist for a zero-arg diagnostics tool).

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

mobile_sessions_statusList active detective sessionsA
Read-onlyIdempotent

Return active async recording, focus, and logcat sessions (optional serial filter). Use before stop/mark to recover IDs after a reconnect.

NameRequiredDescriptionDefault
serialNoExact ADB serial from mobile_devices_list; never inferred when multiple devices exist

Output Schema

NameRequiredDescription
logcatsYes
recordingsYes
focusTracesYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and non-open-world, so the safety profile is covered. The description adds the set of session types returned and the reconnect/ID-recovery scenario, which is useful scope context but not deep behavioral disclosure (no pagination, ordering, or staleness notes).

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

Conciseness5/5

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

Two tight sentences, front-loaded with what is returned and followed by the routing hint. No filler.

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

Completeness4/5

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

With an output schema present and rich annotations, return format and safety are already covered, and the when-to-use hint closes the main gap. Minor omission: it does not spell out that omitting serial returns sessions across all devices.

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

Parameters3/5

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

Schema coverage is 100% and the schema itself explains the serial (exact ADB serial from mobile_devices_list, never inferred with multiple devices). The description only restates it as an 'optional serial filter', so the schema carries the semantic load.

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

Purpose4/5

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

States a clear verb+resource: returns active async recording, focus, and logcat sessions, with an optional serial filter. This distinguishes it from the start/stop/mark siblings, though it never names them explicitly.

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

Usage Guidelines4/5

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

Gives a concrete when-to-use: 'Use before stop/mark to recover IDs after a reconnect.' That is real routing guidance, but there are no exclusions or explicit alternative tools.

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

mobile_theme_flash_reportTheme / night-mode flash reportC

Correlate system night mode with a recording analysis (mode=flash) and marks whose offsets fall inside any reported black/dim run (± markWindowMs).

NameRequiredDescriptionDefault
pathNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
artifactUriNo
markWindowMsNo

Output Schema

NameRequiredDescription
analysisYes
nightModeNo
marksNearDimYes
nightModeRawYes
marksNearBlackYes

TDQS

C2.8/5.0
Behavior2/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so an agent can see this is not a pure read despite being a 'report' tool. The description adds nothing beyond the computation itself: no mention of side effects, artifact persistence, permissions, or cost, so it fails to explain why a report operation is flagged as non-read-only.

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

Conciseness4/5

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

A single front-loaded sentence that leads with the verb and packs the scoping detail into a trailing parenthetical. It is efficient with no padding, though the density borders on cryptic for an agent unfamiliar with the domain vocabulary.

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

Completeness3/5

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

The presence of an output schema relieves the description of explaining return values, and the core computation is stated. However, with 25% schema coverage, no usage sequencing, and no explanation of the non-read-only flag, it falls short of fully equipping an agent to call this correctly.

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

Parameters2/5

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

Schema coverage is only 25%, so the description must carry the load for path, artifactUri, and markWindowMs. It references markWindowMs by name and implication, but never clarifies what path vs artifactUri select or how they interact, leaving three of four parameters effectively undocumented.

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

Purpose4/5

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

The description names a specific verb ('Correlate') and the resources involved (system night mode, a flash-mode recording analysis, and marks), which is enough to distinguish it from general analysis siblings like mobile_analyze_recording. It is dense and assumes the reader already knows what a 'flash' analysis and a 'black/dim run' are, but the core purpose is legible.

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

Usage Guidelines2/5

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

There is no explicit when-to-use, when-not-to-use, or named alternative. The prerequisites (a recording must first be analyzed with mode=flash, marks must exist) are implied by the mechanics but never stated, leaving the agent to infer the sequencing.

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

mobile_ui_findFind Android UI nodesA
Read-onlyIdempotent

Find accessibility nodes by text, content description, or resource ID. Each match has a ref (@nN) and a tap point that accounts for clickable containers and overlays. Pass ref to mobile_input_tap. This replaces refs from the previous UI read.

NameRequiredDescriptionDefault
textNo
exactNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
resourceIdNo
contentDescriptionNo

Output Schema

NameRequiredDescription
countYes
matchesYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, non-destructive, non-open-world, so the safety profile is set. The description adds non-obvious behavior: matches carry a ref (@nN) and a tap point that compensates for clickable containers and overlays, plus the important staleness caveat that it invalidates prior refs. This is genuine value beyond the annotations.

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

Conciseness5/5

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

Three tight sentences, front-loaded with what is matched, followed by result shape and downstream handoff. No filler; every sentence earns its place.

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

Completeness4/5

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

An output schema exists, so return values needn't be exhaustively explained, yet the description usefully notes what each match contains. Combined with annotation coverage and the ref-lifecycle note, it is largely complete; only the 'exact' parameter and explicit sibling routing are missing.

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

Parameters3/5

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

With only 33% schema coverage, three of the search parameters (text, resourceId, contentDescription) are named in prose but receive no syntax or matching-format detail, and 'exact' is omitted entirely from both schema and description. The description maps loosely to the parameters but does not compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb (Find) and resource (accessibility nodes) and enumerates the three matching criteria (text, content description, resource ID). It is clear, but sibling differentiation is only implicit — it hints at a relationship to the UI read via 'previous UI read' without naming mobile_ui_snapshot or explaining how finding differs from snapshotting.

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

Usage Guidelines3/5

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

Gives workflow sequencing ('Pass ref to mobile_input_tap') and lifecycle guidance ('replaces refs from the previous UI read'), which is helpful. However, it never states when to use this over mobile_ui_snapshot or mobile_ui_wait, nor any when-not conditions, so usage is only implied.

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

mobile_ui_snapshotSnapshot Android UIA
Read-onlyIdempotent

Return parsed accessibility nodes, each with a ref (@nN) and the point that actually routes a tap to it. Pass ref to tap, double-tap, long-press, swipe, drag, or text. Refs are shared across HTTP requests until the next UI read on this serial and display. Portable ADB supports only display 0; other displays use the companion hierarchy when a companion session is active.

NameRequiredDescriptionDefault
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID

Output Schema

NameRequiredDescription
nodesYes
serialYes
backendYes
displayIdYes
truncatedYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/non-destructive/idempotent, so the safety profile is covered. The description adds genuinely non-obvious behavior beyond that: refs persist across HTTP requests until the next UI read on the same serial+display, and portable ADB only supports display 0. It does not disclose tree size/cost, behavior on an empty or inaccessible hierarchy, or failure modes, which keeps it out of the top band.

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

Conciseness5/5

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

Three tightly packed sentences with no filler, and the most decision-relevant facts (what is returned, what to do with it) are front-loaded before the edge-case caveats.

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

Completeness5/5

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

An output schema exists, so return-value documentation is not required, yet the description still characterizes the return (nodes with refs and tap routing) plus ref lifetime and display scope. For a two-parameter read tool this covers everything an agent needs to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100% and both required parameters (serial, displayId) are fully documented in the schema, so the baseline is 3. The description's display caveat indirectly informs the displayId value, but it adds little parameter-level syntax or meaning beyond what the schema already states.

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

Purpose5/5

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

States a specific verb and artifact ('Return parsed accessibility nodes'), and goes further by naming the returned refs (@nN) and the routing point. It also maps itself into the workflow by listing the sibling input tools that consume its refs (tap, double-tap, long-press, swipe, drag, text), so an agent can place it in the toolchain without opening any schema.

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

Usage Guidelines4/5

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

Gives clear operating context: take the returned ref and pass it to the input tools, and note the display restriction ('Portable ADB supports only display 0; other displays use the companion hierarchy when a companion session is active'). It stops short of explicitly stating when to prefer this over the sibling readers mobile_ui_find / mobile_ui_wait / mobile_screen_capture, so no exclusions or named alternatives are given.

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

mobile_ui_waitWait for Android UIC
Read-onlyIdempotent

Poll until a matching accessibility node appears or the bounded timeout expires.

NameRequiredDescriptionDefault
textNo
exactNo
pollMsNo
serialYesExact ADB serial from mobile_devices_list; never inferred when multiple devices exist
displayIdYesAndroid framework logical display ID, not a SurfaceFlinger physical ID
timeoutMsNo
resourceIdNo
contentDescriptionNo

Output Schema

NameRequiredDescription
foundYes
matchesYes
attemptsYes
elapsedMsYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description does add genuine behavior beyond that: the call polls and is bounded by a timeout. What it omits is the outcome on non-match (throw vs. empty result) and the polling cadence, which matter for a blocking wait tool.

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

Conciseness4/5

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

A single front-loaded sentence with no filler or restatement of the title. It is efficiently structured, though the terseness contributes to the parameter- and outcome-level gaps noted elsewhere rather than being purely a virtue.

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

Completeness2/5

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

An output schema exists, so return values need not be spelled out, and annotations cover safety. But for an 8-parameter wait tool with 25% schema coverage, the description leaves the match semantics and the non-match outcome unspecified — the two things an agent most needs to call this correctly.

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

Parameters2/5

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

Schema description coverage is only 25% (8 parameters, only serial and displayId documented), so the description is expected to compensate and does not. It says 'matching accessibility node' without indicating that text, exact, resourceId, or contentDescription are the match keys, and says nothing about pollMs or timeoutMs beyond the word 'bounded'.

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

Purpose4/5

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

The description names a specific verb (poll/wait) and resource (matching accessibility node), and states the termination condition (node appears or bounded timeout). It is clear on its own, but it never distinguishes itself from siblings like mobile_ui_find or mobile_ui_snapshot, which an agent must choose between for the same accessibility-node surface.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, and no alternative is named. The 'poll until ... or timeout expires' phrasing implies the async-UI case, but the agent must infer that mobile_ui_find is the immediate-check counterpart rather than being told.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 43 tool updatesv0.9.0
    • Changedmobile_analyze_recording2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmobile_app_foreground
    • Changedmobile_app_inspect2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_app_install2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_app_launch2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_app_relaunch_on_displays2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_app_stop2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_app_uninstall2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_artifacts_list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_artifacts_prune2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmobile_batch
    • Addedmobile_clipboard
    • Addedmobile_device_fold
    • Changedmobile_device_inspect2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_devices_list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_displays_list2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_focus_trace2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_focus_trace_start2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_focus_trace_stop2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmobile_input_double_tap
    • Changedmobile_input_drag5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / endRef
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • addedInput schema / properties / startRef
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "serial",
        -  "displayId",
        -  "start",
        -  "end"
        -]New value: +[
        +  "serial",
        +  "displayId"
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_input_key2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_input_key_combination2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmobile_input_key_sequence
    • Addedmobile_input_long_press
    • Changedmobile_input_swipe5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / endRef
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • addedInput schema / properties / startRef
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "serial",
        -  "displayId",
        -  "start",
        -  "end"
        -]New value: +[
        +  "serial",
        +  "displayId"
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_input_tap4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display. Wins over x and y.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "serial",
        -  "displayId",
        -  "x",
        -  "y"
        -]New value: +[
        +  "serial",
        +  "displayId"
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_input_text3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Ref from the latest mobile_ui_snapshot, mobile_ui_find, or mobile_ui_wait on this serial and display.",
        +  "pattern": "^@n\\d+$",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedmobile_location
    • Addedmobile_open_url
    • Addedmobile_orientation
    • Changedmobile_record_mark2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_record_start2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_record_stop2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_screen_capture5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / coordinateSpace
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "displayHeight": {
        +      "type": "number"
        +    },
        +    "displayWidth": {
        +      "type": "number"
        +    },
        +    "imageHeight": {
        +      "type": "number"
        +    },
        +    "imageWidth": {
        +      "type": "number"
        +    },
        +    "scaleX": {
        +      "type": "number"
        +    },
        +    "scaleY": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "imageWidth",
        +    "imageHeight"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / downscaled
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "serial",
        -  "display",
        -  "mimeType",
        -  "sizeBytes",
        -  "durationMs"
        -]New value: +[
        +  "serial",
        +  "display",
        +  "mimeType",
        +  "sizeBytes",
        +  "durationMs",
        +  "downscaled",
        +  "coordinateSpace"
        +]
    • Changedmobile_screen_capture_pair5 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / captures / items / properties / coordinateSpace
        Added value: +{
        +  "additionalProperties": false,
        +  "properties": {
        +    "displayHeight": {
        +      "type": "number"
        +    },
        +    "displayWidth": {
        +      "type": "number"
        +    },
        +    "imageHeight": {
        +      "type": "number"
        +    },
        +    "imageWidth": {
        +      "type": "number"
        +    },
        +    "scaleX": {
        +      "type": "number"
        +    },
        +    "scaleY": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "imageWidth",
        +    "imageHeight"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / captures / items / properties / downscaled
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / captures / items / required
        Previous value: -[
        -  "displayId",
        -  "mimeType",
        -  "sizeBytes",
        -  "durationMs"
        -]New value: +[
        +  "displayId",
        +  "mimeType",
        +  "sizeBytes",
        +  "durationMs",
        +  "downscaled",
        +  "coordinateSpace"
        +]
    • Changedmobile_screen_record2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_server_info2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_sessions_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_theme_flash_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_ui_find2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_ui_snapshot2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmobile_ui_wait2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 33 tool updatesv0.5.0
    • First observedmobile_analyze_recording
    • First observedmobile_app_inspect
    • First observedmobile_app_install
    • First observedmobile_app_launch
    • First observedmobile_app_relaunch_on_displays
    • First observedmobile_app_stop
    • First observedmobile_app_uninstall
    • First observedmobile_artifacts_list
    • First observedmobile_artifacts_prune
    • First observedmobile_device_inspect
    • First observedmobile_devices_list
    • First observedmobile_displays_list
    • First observedmobile_focus_trace
    • First observedmobile_focus_trace_start
    • First observedmobile_focus_trace_stop
    • First observedmobile_input_drag
    • First observedmobile_input_key
    • First observedmobile_input_key_combination
    • First observedmobile_input_swipe
    • First observedmobile_input_tap
    • First observedmobile_input_text
    • First observedmobile_record_mark
    • First observedmobile_record_start
    • First observedmobile_record_stop
    • First observedmobile_screen_capture
    • First observedmobile_screen_capture_pair
    • First observedmobile_screen_record
    • First observedmobile_server_info
    • First observedmobile_sessions_status
    • First observedmobile_theme_flash_report
    • First observedmobile_ui_find
    • First observedmobile_ui_snapshot
    • First observedmobile_ui_wait

TDQS

B3.4/5.0

Scored across 43 tools

Disambiguation4/5

Most tools have distinct resource/action targets, and descriptions explicitly distinguish blocking vs async recording/focus and input variants. Some overlap remains among UI node reads (snapshot/find/wait) and capture/record families, but guidance usually clarifies selection.

Naming Consistency4/5

All tools use a mobile_ prefix and snake_case, so the convention is broadly readable. However the ordering is mixed: many use noun_verb (mobile_screen_capture, mobile_app_launch) while others use verb_noun (mobile_open_url, mobile_analyze_recording).

Tool Count2/5

43 tools is heavy for one device-automation server; many variants (blocking vs async capture/record/focus, several input primitives) could be consolidated or grouped. The broad Android testing scope justifies some breadth, but the surface exceeds the 25-tool threshold in the rubric.

Completeness4/5

Coverage is broad across device/display discovery, capture, recording, UI inspection, input, app lifecycle, location, clipboard, and batching. Minor gaps include no direct logcat tool despite session status mentioning logcat, and no generic file/shell operations, but core device-control workflows are well supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that provides tools for controlling Android devices using uiautomator2, enabling AI to automate tasks like tapping, swiping, and managing apps.
    168 PyPI
    53
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for controlling Android devices over ADB, using direct commands and semantic accessibility selectors with a Kotlin helper APK.
    71 npm
    MIT