Cross-platform sandbox management system for Android device control, streaming, and automation with local server support
GBOX is an Android device management and testing tool exposing 20 CLI-based tools via HTTP. While tool names are action-oriented and schemas are present, critical gaps severely limit LLM usability: (1) Parameter descriptions are minimal or absent, most tools lack clear guidance on what values are valid or what side effects occur. (2) Output schemas are completely undocumented, LLMs cannot know what fields to expect, blocking downstream tool composition and planning. (3) Descriptions are often generic ('Connect to an Android device') without explaining WHEN to use the tool vs. similar alternatives (connect_device vs. connect_device_with_id). (4) No error recovery guidance, failures offer no hints for retry or correction. (5) Critical composition issues: connect_device returns nothing visible, but get_device_info requires the same serial, unclear if that serial is the output or must be retained from previous context. (6) Device metadata (serial, deviceId, osType) is scattered across tools with inconsistent naming (serial vs. serialKey vs. deviceId), forcing LLMs to track multiple identifier types. This is a functional tool suite but poorly optimized for agent interaction.
Check if Node.js and npm are installed
Connect to an Android device via serial number
Connect to an Android device using device ID and metadata
Create a WebRTC bridge for device streaming
Disconnect from an Android device
Get bridge information by device serial
Retrieve device information by serial number
Get the reconnection state of a device
Output schemas completely undocumented for 6 tools (get_device_info, list_bridges, get_bridge, get_device_reconnect_state). LLMs cannot know what fields to extract or pass to downstream tools, blocking composition.
Parameter descriptions are generic or missing context. E.g. 'Device serial number' alone does not tell LLMs what format is valid, whether it must be pre-obtained via a discovery tool, or what happens if the device is not connected. Missing: expected format, constraints, prerequisites, and error recovery guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Get device serial number by device ID
Install Appium server and its components (drivers and plugins)
Check if Appium is already installed in the working directory
Check if a device is currently connected
List all active WebRTC bridge connections
Reconnect all previously registered devices
Remove a WebRTC bridge connection
Stop and then start the gbox server
Start the gbox server if it's not already running
Check if the gbox server is running and display its status
Stop the gbox server if it's running
Update device information
Tool naming conflicts and ambiguity: connect_device vs. connect_device_with_id, unclear distinction. LLMs will not know which to call without trying both. 'serial' vs. 'serialKey' vs. 'deviceId' are used interchangeably across tools, forcing LLMs to track and reconcile multiple identifier types.
update_device_info accepts a generic 'device' object with no schema. LLMs cannot determine what fields are valid, required, or what values they accept. This invites malformed payloads and silent failures.
No output chaining support. E.g., connect_device_with_id has 4 input params (serialKey, deviceId, deviceType, osType) but no documentation of what it returns. If it returns a serialKey, get_device_info can use it; if not, LLMs must discover the serial via get_serial_by_device_id, adding an extra round-trip.
No error handling or recovery guidance. Tools have no documented error cases, retryability, or recovery paths. E.g., if connect_device fails with 'device not found', there is no guidance: should the LLM call list_bridges first? Try a different serial? Or abandon the attempt?
Tool descriptions lack WHEN guidance. E.g., 'Check if a device is currently connected' (is_device_connected) does not explain: should I call this before every operation? Is it required? What does 'connected' mean in this system? This forces LLMs to guess intent.