The `npx serve` of Android Emulators — stream any emulator to the browser with full interaction, no instrumentation.
serve-avd presents 22 UI automation and device control tools with MODERATE naming clarity and INCONSISTENT schema documentation. Tool names follow verb_noun pattern (tap, swipe, type, scroll) which is good for clarity. However, schema completeness varies significantly: tools like 'tap' and 'swipe' have detailed parameter schemas with type info and descriptions; others like 'screenshot', 'back', 'home', 'recents', 'wait', and 'find' lack visible input schema definitions in the source. Descriptions are present for all tools but tend to be brief (10-50 chars) and lack context about WHEN to use each tool, WHY it matters, and WHAT to do with output. No parameter output schemas are documented. Error handling is absent, no guidance on retryable vs fatal errors, no recovery paths. The 'batch' tool composition is sparse and underdocumented. Security: shell command execution and APK installation are exposed without input sanitization guidance or permission gating. This is a functional UI automation layer, but falls short of production-grade tool design patterns.
Press the back button
Execute a batch of actions sequentially
Simulate an incoming call (emulator only)
Find UI elements matching a query
Set device geolocation (emulator only)
Press the home button
Install an APK on the device
Press a key or key combination
NO input schemas visible for 9 tools (screenshot, back, home, recents, and others with empty {} input). Cannot verify parameter types or constraints.
Tool descriptions are extremely brief (10-50 chars). Examples: 'Press the back button' (24 chars), 'Press the home button' (21 chars), 'Capture the current screen' (26 chars). Baseline for A+ tools is 194 chars. These descriptions lack context on WHEN to use, WHAT to do with output, and dependencies. LLMs cannot reason about tool selection with such sparse docs.
No output schemas documented for any tool. Users cannot know what shape of data to expect. Example: 'screenshot' returns what? Base64 PNG? File path? JSON metadata? 'find' returns what structure? 'wait' returns success or a matched element? Without output docs, LLMs cannot compose tools or extract needed data for downstream calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
Launch an activity or application
Control network connectivity (emulator only)
Get or set the device orientation
Control device power state (emulator only)
Press the recents/overview button
Capture the current screen
Scroll in a direction by a normalized amount
Run an adb shell command
Send an SMS message (emulator only)
Swipe from (x1,y1) to (x2,y2) in normalized coords over durationMs (default 300)
Tap a point (normalized x,y) or the first UI element matching text / id / desc / class
Type text into a focused field
Uninstall a package from the device
Wait for a UI element matching a query to appear or disappear
Shell and install/uninstall tools expose dangerous operations (arbitrary command execution, APK installation) with NO security guidance. No mention of permission gating, input sanitization, or audit trails. 'shell' description is 'Run an adb shell command' with zero validation guidance. LLMs could be tricked into executing harmful commands.
Parameter 'key' in key() tool is undescribed. No enum, no format guidance, no examples. What key names are valid? 'Back'? 'BACK'? 'KeyBack'? 'Power'? This forces LLMs to guess.
No error handling or recovery guidance in any tool description. If 'find' returns empty, should the LLM retry? If 'tap' fails because element is not clickable, what's the recovery path? If 'shell' times out, is it retryable? Agents have no guidance.
Parameters for multi-value matching (text, id, desc, class) in 'tap', 'find', 'wait' are not marked as mutually exclusive or prioritized. If an LLM passes all four, what happens? Which takes precedence?
'batch' tool composition is vague. Description: 'Execute a batch of actions sequentially' (40 chars). What is an 'action object'? What format? What fields? Can it contain nested batches? No examples, no schema for the 'actions' array element structure. LLMs will struggle to use this.