Fling demonstrates solid naming conventions (verb_noun pattern: list_devices, build_app, install_app) and comprehensive tool coverage for Android automation. However, definition quality is inconsistent. Tool descriptions vary widely in detail, some are excellent (build_app, install_app with config field documentation), others are minimal (list_devices: 9 words). Input schemas are present for most tools but lack consistent parameter descriptions. Output schemas are not documented. Error handling guidance is minimal. The server follows good composition patterns (single responsibility per tool) but lacks LLM-optimized descriptions (target 50-200 chars; many are too brief). Average tool description ~120 chars, below the 194-char baseline for A+ tools.
Run the project's build (default: gradle wrapper + assembleDebug). On success returns the discovered APK path. Honors fling.config.json fields: buildCommand, gradleTask, buildCwd, apkPath, apkGlob.
Build, install, and launch an Android app in one operation.
Query the current state of a device (battery, screen, connectivity, etc.).
Dismiss an open dialog by tapping outside it or pressing back.
Dump the current UI hierarchy as XML (accessibility tree).
Search for text or patterns on the screen using OCR or UI tree matching.
Forward Chrome DevTools Protocol (CDP) from a device to a local port.
Minimal descriptions on discovery/read tools. list_devices (9 words), screenshot (5 words), read_logs (9 words), dump_ui (9 words) lack context for LLM selection. Target 50-200 chars; these are 30-50 chars.
Output schemas not documented. Tools return structured data (APK paths, UI hierarchies, device state) but LLMs cannot see expected fields. Prevents downstream tool chaining and forces guessing.
Tool 'deploy_and_run' combines three responsibilities (build + install + launch). Violates single-responsibility principle. Should split into separate tools or document composition clearly.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 34 | 2025-06-18+ | v2 |
Push an .apk file to a connected Android device and install it via `adb install`. By default the install is a reinstall (-r) which preserves existing app data. When `apk_path` is omitted, Fling resolves it from fling.config.json (apkPath / apkGlob).
Launch an app and wait for a specific UI element to appear.
Start an installed app on the device. If `activity` is omitted, the default launcher activity is started (via `monkey`). If `activity` is given, it is passed to `am start -n <package>/<activity>` directly. When `package_name` is omitted, falls back to fling.config.json (packageName, mainActivity). Note: success means the launch intent was dispatched, not that the app is stable — an app that crashes immediately after onCreate still returns success. When you need to wait for a specific UI element before proceeding, prefer `launch_and_wait` which polls dump_ui internally.
List all connected Android devices and their connection states.
Open a system settings screen or app settings page.
Retrieve logcat output from a connected Android device.
Capture a screenshot from a connected Android device.
Capture a screenshot and return both the image and the UI hierarchy.
Scroll a scrollable container until a target element becomes visible.
Initiate wireless pairing via QR code.
Issue `adb shell am force-stop <package>` to terminate every process of the named app. Force-stopping an already-stopped app is a no-op (idempotent). When `package_name` is omitted, falls back to fling.config.json packageName.
Find and tap a UI element by its content description.
Find and tap a UI element by its resource ID.
Find and tap a UI element by its visible text.
Tap a UI element by text and verify the action succeeded.
Remove an installed app via `adb uninstall`. Pass `keep_data: true` to keep the app's data and cache directories (adb's -k flag). When `package_name` is omitted, falls back to fling.config.json packageName.
Poll the UI until a specific element appears or a condition is met.
Wait for a wireless pairing operation to complete.
Parameter descriptions inconsistent. Some tools (build_app, install_app) document config field behavior; others (tap_by_text, tap_by_resource_id) lack parameter details. 100% of A+ tools have param descriptions.
No error recovery guidance. Tools return errors but do not guide LLM on retry strategy, alternatives, or next steps. E.g., 'Device not found' should suggest 'Call list_devices() first.'