Internal MCP server for driving iOS apps in the Simulator with Claude, for bug reproduction and fix validation. Vision-first tools for iOS simulator automation.
SimDrive has 14 tools with complete input schemas and descriptions. Naming is verb-first and clear (session_start, observe, tap, swipe). Descriptions are adequate (50-150 chars typical) but lack LLM-optimized guidance on WHEN to use each tool vs alternatives. Parameters are typed and described, but many lack constraints (enums, ranges, patterns). Output schemas are not documented, LLMs cannot predict what observe() or list_devices() returns. Error handling is absent from descriptions. No tool annotations (readOnlyHint/destructiveHint) despite clear READ/WRITE semantics. Composition is good: tools chain naturally (observe → tap/swipe). Security: no secrets in params (good). Overall: solid foundation, but missing output documentation and LLM-optimized descriptions that would push this to 75+.
List available iOS Simulators and devices. Returns UDID, name, state, and HID support status.
Get recent app console logs from the iOS Simulator.
Vision-first observation: capture screenshot and extract reliable targets (marks) with accessibility metadata. Returns annotated screenshot with detected UI elements.
Press a hardware key (e.g., 'return', 'delete', 'home').
Begin recording a sequence of actions for replay. Clears the step buffer.
Stop recording and save the replay YAML. Returns the recorded flow.
Replay a recorded sequence of actions from YAML.
Output schemas not documented. LLMs cannot predict what observe() returns (screenshot format? mark structure? confidence scores?), forcing them to guess or make unsafe assumptions about downstream tool parameters.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Risk field is declared in metadata but not exposed to LLM. Tools like session_start, tap, swipe, type_text should be marked destructive so agents understand retry semantics.
Descriptions lack LLM-optimized guidance. Missing WHEN to use each tool vs alternatives (e.g., when to use tap vs tap_and_wait_keyboard?). Missing prerequisites (e.g., observe() must be called before tap with mark_id). Missing error recovery hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Stop the active session and clean up resources.
Start a session on the iOS Simulator or device. Initializes the simulator/device connection and prepares for interaction.
Get the current session status and metadata.
Perform a swipe gesture from (x1, y1) to (x2, y2). Supports settle_ms for animation completion.
Tap a UI element by stable_id, mark_id, or coordinates. Supports both simulator and device input.
Atomically tap a field and wait for the keyboard to appear. Saves two round-trips.
Type text into the focused field. Supports tap_first to focus a field and clear_first to clear before typing.
Parameters lack constraints. confidence_floor accepts 'low'|'medium'|'high' but is typed as string with no enum. key in press_key has no enum of valid keys. mark_limit has no min/max bounds. Unbounded or unconstrained params invite invalid LLM inputs.
No error handling guidance in descriptions. What happens if tap fails? If session_start fails? If observe returns no marks? Descriptions should guide LLM recovery (retry, call alternative tool, ask user).