local MCP / real devices
Give your agent a real screen.
Inspect the iOS Simulator or Android Emulator already on your machine. Capture it, act on it, and return visual proof through MCP.
What it exposes
A small command surface for visual feedback.
The server does not install or change your app. It connects to the device you already booted and keeps the screenshot in the local feedback loop.
device_captureReturn PNG by default, or request a smaller JPEG, resize, or crop.
device_stepRun known actions in order with one optional final screenshot. Bounded deadline and partial-completion reporting.
device_inspectFetch bounded iOS accessibility on demand through the opt-in persistent backend.
device_tapTap normalized coordinates from 0 to 1.
device_swipeMove through a screen with one platform-neutral gesture.
device_typeType into the focused control on either platform.
device_repair_inputRepair iOS Simulator input services. Restarts SpringBoard and closes running apps.
device_statusShow which simulator or emulator is available.
Fewer processes / smaller observations
Keep the connection. Request only what you need.
The opt-in iOS backend connects directly to a pinned serve-sim server over a reusable WebSocket. Latest-frame capture can avoid simctl, but frames may be replayed: it is not proof that an action finished rendering.
Use device_step for already-known actions and one final observation. Choose JPEG and a maximum dimension to reduce image payloads. Fresh PNG capture remains the compatible default; continuous video is not added to model context.
Android keeps ADB as the default. Emulator gRPC is an authenticated, experimental opt-in backend, not a validated replacement yet. Helpers started by this MCP are owned and cleaned up; externally started streams are never stopped.
Backend setup, limits, and benchmarksXcode 27 input troubleshooting
Keep Device Hub and the Simulator ready for input.
With Xcode 27, Device Hub must be open and the target Simulator window visible and frontmost. macOS may require Accessibility permission for the app that launched this MCP server; check System Settings → Privacy & Security → Accessibility.
If keyboard or touch input still fails, call device_repair_input explicitly. It restarts SpringBoard and closes running apps. Then restart the stream with device_stop and device_start, and reopen the app. The repair is never triggered automatically by typing.
Start from your terminal
One server. Two device targets.
Install the binary once, boot a device, then choose iOS or Android with one environment variable.
iOS
DEVICE_PLATFORM=ios
device-simulator-mcpUses serve-sim and the selected Simulator.
Android
DEVICE_PLATFORM=android
device-simulator-mcpUses adb and the selected Emulator.
Configure an AI client
Preview the MCP entry, then apply it.
The CLI registers the stdio server for OpenCode, Claude Code, Codex CLI, Cursor, or Gemini CLI. It defaults to user-wide iOS configuration; choose --scope project or --platform android when needed.
device-simulator-mcp install-mcp --client opencode
device-simulator-mcp install-mcp --client opencode --applyApplying updates only this server's entry and preserves other settings. Restart the AI client afterward. This registers MCP and does not install lifecycle hooks.
Built for local visual feedback