MCP server for mobile emulator/simulator lifecycle control (iOS and Android)
mcp-sim has 10 well-named tools with clear verb-noun patterns (list_devices, boot_device, stop_device, etc.). All tools have descriptions (avg ~80 chars, within baseline 34-392). Input schemas are present and typed for all tools. However, parameter descriptions are minimal (1-2 lines), lacking actionable constraints, format hints, and dependency documentation. Output schemas are inferred from code but not explicitly documented in tool definitions. Error handling is basic (ToolError with code/msg) but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. Missing pagination for list_devices despite potentially large result sets.
Block until the device is fully booted, or the timeout fires.
Boot a device by platform and target identifier.
Get the status of a controller proxy daemon.
Get the current state of a device (stopped/booting/running/error).
List all available emulators and simulators across configured platforms.
Open a URL or deep link on a device.
Start a controller proxy daemon.
Parameter descriptions lack actionable constraints. E.g., 'platform' accepts 'ios or android' but is not documented as an enum. 'timeout' has no min/max bounds. LLMs cannot infer valid ranges and will hallucinate values.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. wipe_device is DESTRUCTIVE, boot_device is WRITE, list_devices is READ_ONLY, these must be declared in tool metadata for agent safety.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Stop a controller proxy daemon.
Stop a running device by platform and target identifier.
Wipe a device, erasing its user data. Stops the device first if needed.
Output schemas not explicitly documented. Tool definitions show return types in code (contract.Device, contract.ProxyInfo) but MCP tool definitions lack explicit output schema declarations. LLMs cannot plan downstream calls without knowing response structure.
list_devices lacks pagination. No limit, offset, or cursor parameters. If many devices exist, response could exceed context window. Baseline pattern requires pagination for discovery tools.
Error handling provides error codes (ErrUnsupportedPlatform, ErrUnsupportedController) but no recovery guidance. Errors should suggest next steps: 'Platform not found. Call list_devices() to see available platforms.'