An MCP server that drives a real Android device over ADB and attaches the resulting screen to every action, so an agent never needs a separate screenshot call. Single native binary, with OCR for screens the accessibility tree cannot read.
Droidsight has 33 tools with significant definition gaps. Most tools lack complete input schemas visible in source, only 2 tools (mcp_android_input_act, mcp_android_app_manage) show full JSON Schema with typed parameters and descriptions. The remaining 31 tools have descriptions but no visible input schemas in the provided code, forcing a schema score of 0 for those tools. Descriptions are present but often terse (e.g., 'Control system settings and features on Android device' for mcp_android_system_control). Parameter descriptions are sparse or absent for most tools. Error handling is minimal, responses use generic error_response() without recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (DESTRUCTIVE, IRREVERSIBLE, WRITE). Tool naming follows verb_noun convention (good), but composition issues exist: mcp_android_session and mcp_android_stop_session are separate when they could be unified; mcp_android_vision_query and mcp_android_vision_stream overlap in responsibility.
Instrument and monitor app execution
Manage apps (launch, stop, list, install, crash_log, uninstall, clear_data, permission, enable, disable)
Atomically find and tap text on screen
Check for debug/security exposure on device
Check device health and status
Companion tool for advanced device interactions
Control device hardware and state
Read and write files on Android device
31 of 33 tools lack visible input schemas in source code. Only mcp_android_input_act and mcp_android_app_manage show complete JSON Schema with typed parameters. This violates the critical rule: 'If a tool has NO input schema at all: its schema score MUST be 0.' LLMs cannot infer parameter types, constraints, or valid values.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 38 | <=2025-11-25 | v2 |
Access forensic data and logs from device
Get current notifications from device
Get the accessibility tree/view hierarchy from device
Perform input actions on Android device (tap, swipe, type, key press, etc.)
Filter and search device logs
Stream and read device logs
Control network settings and connectivity
Open a URL on the Android device
Play back a recorded gesture sequence
Read recent events from device logs
Record a gesture sequence on device
Run a predefined flow/automation sequence
Run recorded macro sequences (requires DROIDSIGHT_ALLOW_ARBITRARY_SHELL=true)
Control and read device sensors
Control sentinel monitoring on device
Manage MCP session state and streaming
Execute arbitrary shell commands on device (requires DROIDSIGHT_ALLOW_ARBITRARY_SHELL=true)
Wait for a condition on the device screen
Start an Android intent
Start recording video from device screen
Stop recording video from device screen
Stop the current MCP session
Control system settings and features on Android device
Query device screen using vision/OCR
Stream vision data from device screen
Tool descriptions are terse and lack LLM-optimized guidance. Examples: 'Control system settings and features on Android device' (mcp_android_system_control), 'Manage MCP session state and streaming' (mcp_android_session). Descriptions under 50 chars lack context for tool selection. Baseline for A+ tools: 50-200 chars with WHAT, WHEN, and prerequisites.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite explicit risk levels in metadata (DESTRUCTIVE, IRREVERSIBLE, WRITE, READ_ONLY). mcp_android_app_manage has 'confirm_destructive' parameter but no destructiveHint annotation. Agents cannot infer safety without annotations.
Error handling is minimal. Code shows generic error_response(e.to_string()) without recovery guidance. No categorization of errors as retryable, user-fixable, or fatal. Example: app.rs stop_app() returns raw error string instead of 'Package not found. Try list_apps() to find valid packages.'
Composition issues: mcp_android_session and mcp_android_stop_session are separate tools when they could be unified with an 'action' enum (start/stop). mcp_android_vision_query and mcp_android_vision_stream overlap, unclear when to use each. Violates single-responsibility principle.