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.

iOS via serve-simAndroid via adbstdio transport
agent / device loop connected
platformiostargetA0F98A83-314C-4FCDtransportstdio
01device_capturecheckoutPNG returned
02device_tap0.52, 0.71input submitted
03device_typeemailinput sent
04device_captureafter-loginPNG returned
local onlyno remote service

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_capture

Return PNG by default, or request a smaller JPEG, resize, or crop.

device_step

Run known actions in order with one optional final screenshot. Bounded deadline and partial-completion reporting.

device_inspect

Fetch bounded iOS accessibility on demand through the opt-in persistent backend.

device_tap

Tap normalized coordinates from 0 to 1.

device_swipe

Move through a screen with one platform-neutral gesture.

device_type

Type into the focused control on either platform.

device_repair_input

Repair iOS Simulator input services. Restarts SpringBoard and closes running apps.

device_status

Show 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 benchmarks

Xcode 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-mcp

Uses serve-sim and the selected Simulator.

Android

DEVICE_PLATFORM=android
device-simulator-mcp

Uses 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 --apply

Applying 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

The device is yours. The screenshot stays yours.

Read the source