MCP server providing ADB (Android Debug Bridge) tools for managing Android devices, including package management, file syncing, USB speed detection, and device testing
adbfriend has 5 tools with mixed quality. Tools are visible in source code (Sync.kt, Uninstall.kt, Packages.kt, AdbSpeed.kt, Test.kt), so they are not inferred. However, critical issues severely limit quality: (1) Naming is weak, tools lack clear action verbs. 'sync' is acceptable, but 'adb_speed' is vague (should be 'get_device_usb_speed' or 'check_adb_speed'), 'test' is generic, 'packages' should be 'manage_packages' or split into separate tools (force_stop_packages, clear_app_cache, etc.). 'uninstall' is clear but lacks specificity (uninstall_packages would be better). (2) Descriptions exist but are sparse (10-100 chars) and lack LLM guidance. 'Executes various test operations' tells the LLM nothing about WHEN to use it or WHAT it returns. 'Prints the USB speed' is too narrow. (3) Input schemas are present for 3 tools (sync, uninstall, packages) with typed parameters and descriptions, this is good. However, 'adb_speed' and 'test' lack visible schemas in source. (4) Output schemas are not documented for any tool, the rubric requires documentation of what these tools return. (5) Error handling is absent, no guidance on what happens on failure or how to recover. (6) No tool annotations (readOnlyHint, destructiveHint). Tools like 'uninstall' (DESTRUCTIVE) and 'sync' (WRITE) need explicit risk annotation. (7) Composition issues: 'packages' combines three separate concerns (force_stop, clear cache, set immersive.full) into one tool, should be split per pattern:tool. Sync has many options that could be separate tools. (8) Parameter quality is mixed: sync has good descriptions and types, but 'packages' parameter in packages tool is just a string filter, ambiguous whether it matches package name, substring, or glob. (9) Test tool has no visible parameter schema and vague description. Average tool score: 38/100.
Prints the USB speed of connected devices. Only supported on MacOS X.
Manages packages on connected devices. Specifically force stop or clear the app data for packages matching the pattern. It can also apply the `immersive.full` flag to the identified packages.
Syncs files from local machine to connected Android devices. Offers file exclusion, MD5 comparison, deletion of remote files not existing locally, and configurable retry behavior.
Executes various test operations on connected Android devices
Offers a flexible API to uninstall packages matching the pattern on connected Android devices. Supports keeping app data and force confirmation bypass.
Output schemas completely undocumented. No tool specifies what fields are returned, their types, or structure. Rubric requires documented return types for ALL A+ tools.
Naming lacks action verbs and specificity. 'adb_speed' is vague, 'test' is generic, 'packages' is a noun. Tools should follow verb_noun convention (get_device_usb_speed, run_device_tests, manage_packages).
No tool annotations present. Tools with destructive actions (uninstall, packages clear, sync with deleteMissing=true) must declare destructiveHint. READ_ONLY tools (adb_speed, test) should declare readOnlyHint. WRITE tools need proper hints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 25 | - | v1 |
'packages' tool violates single-responsibility principle. Combines force_stop, clear, and set_immersive.full into one tool. Should be split into separate tools (force_stop_packages, clear_package_data, set_package_immersive_mode) or each action controlled by clear, mutually-exclusive parameters with explicit OR logic.
Ambiguous parameter: 'packages' string filter in uninstall and packages tools does not specify matching logic. Is it substring match, glob pattern, regex, or exact match? Description must clarify.
No error handling guidance. What happens if device is offline? Package not found? MD5 comparison fails? Tools should return actionable errors telling LLM what to do next (retry, ask user, or give up).
Missing input schema for 'test' and 'adb_speed'. 'test' description says 'various operations' but does not list what parameters control which operation.
Descriptions too vague for LLM decision-making. 'Executes various test operations' gives no hint when to call. Should say: 'Runs automated tests on connected devices. Specify test_type (unit|integration|e2e) to select which suite. Returns test_results with pass/fail counts and logs.' Current descriptions lack WHEN, WHAT, and RETURN guidance.