MCP server that drives a physical iPhone through the macOS iPhone Mirroring window.
Strong tool naming (verb-first, clear intent) and comprehensive parameter schemas with proper type definitions and bounds. All 13 tools have descriptions and input schemas. Tool annotations present (readOnlyHint, destructiveHint, idempotentHint). Key gaps: output schemas not documented in code; error handling guidance minimal; some parameter descriptions lack format/constraint details (e.g., 'query' in tap_label lacks character limit enforcement note despite 500-char limit in code); no recovery guidance for common failure modes.
Find text on screen using OCR within an optional region.
Invoke a menu action (home, app_switcher, spotlight).
Diagnose macOS version, permissions, dependencies, displays, and native backends.
Capture phone content. The result includes dimensions, sha256, and iphoneInUse.
Return app/window visibility, bounds, display mapping, permissions, and capabilities.
Open an app by name using Spotlight.
Press a named key (Home, VolumeUp, VolumeDown, etc.).
Output schemas not documented. Code returns structured metadata (sha256, iphoneInUse, interactionBlocked, blockedReason, dimensions) but no formal schema definition visible for LLM planning.
Parameter constraint descriptions incomplete. tap_label 'query' accepts 1-500 chars (enforced in code via ocr_args) but description omits this limit. LLM may pass invalid lengths.
Error handling lacks recovery guidance. No tool description explains what to do if interactionBlocked=true, if OCR fails, or if expected_sha256 mismatch occurs. Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2025-06-18+ | v2 |
Scroll using HID wheel events at normalized 0-1 coordinates.
Tap 0-1 phone-content coordinates after a disconnected/stale-screen safety check.
Safely tap, wait up to 10 seconds, then return the resulting screenshot.
Find and tap a visible label by OCR query, then return the resulting screenshot.
Type text into the focused field using HID/cliclick.
Wait up to 60 seconds for the screen to change, then return the screenshot.
Mode parameter enum values ('background', 'hid', 'skylight') lack explanation. Description says 'Input mode (default: skylight)' but does not explain when to use each mode or compatibility implications.
No confirmation/dry-run pattern for destructive operations. Tools like open_app, menu, type_text modify device state but lack a preview or confirmation step. Agents cannot verify intent before execution.