Fast Android device control via MCP — screenshot, UI dump, tap, swipe, type, app launch over scrcpy video stream.
phonefast has 14 well-named tools with consistent verb_noun patterns (list_devices, screenshot, tap, swipe, type_text, launch_app, observe, ocr). All tools have descriptions (10 - 200 chars, within baseline). Input schemas are present and properly typed for most tools. However, several critical gaps reduce the score: (1) OCR and observe lack input schema definitions in the visible code despite being registered; (2) parameter descriptions are minimal (avg ~50 chars vs baseline 72); (3) no output schemas documented, LLMs cannot predict response structure; (4) error handling is not visible in tool definitions; (5) no guidance on tool composition or chaining (e.g., observe returns UI elements, but no docs on how to use indices with tap_element). Naming is strong (all action verbs, clear intent), but parameter documentation and output contracts are weak.
Press the back button.
Get interactive UI elements from the current screen.
Press the home button.
Launch an app by Android package name (e.g. com.android.settings). Does not resolve display names.
List all connected Android devices.
Capture screenshot and UI elements in one call (fast).
OCR the current screen. Returns recognized text regions with bounding boxes, center coordinates, and confidence. Captures text invisible to accessibility: app-drawn labels, bitmap text, image overlays. Falls back to accessibility when OCR is unavailable.
OCR tool has no input schema visible in code. Tool is registered with description but WithNumber/WithString builders are absent.
No output schemas documented for any tool. LLMs cannot predict response structure (e.g., does screenshot return {data: base64} or {image: base64, width, height}?). Breaks downstream tool chaining.
Parameter descriptions are minimal (avg ~50 chars vs baseline 72). E.g., 'format' in get_ui_elements lists options but doesn't explain when to use each. 'max_elements' lacks guidance on performance impact of -1 (all elements).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Send a key event.
Capture the current device screen as base64 PNG.
Perform a swipe gesture.
Tap at specified coordinates.
Tap a UI element by index or text.
Type text into the current field.
Wait for a specified duration in milliseconds.
tap_element accepts 'index' or 'text' but no description clarifies mutual exclusivity or what happens if both are provided. LLMs may pass both, causing ambiguous behavior.
launch_app accepts both 'app' and 'package' parameters with identical descriptions. Unclear which is required, which is optional, and what the difference is. Likely 'app' is a display name and 'package' is the Android package ID, but this is not documented.