Skip to content
Conduit

mcp server

ios-simulator-mcp

Tahul/ios-simulator-mcpcommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • Node.js 20 or newer
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "tahul-ios-simulator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@yaelg/ios-simulator-mcp"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 17, 2026

iOS Simulator MCP

A Model Context Protocol server for interacting with iOS simulators. Lets AI assistants inspect the accessibility tree, tap and type on the screen, take screenshots, record videos, and install or launch apps.

Forked from joshuayoes/ios-simulator-mcp and restructured: modular source, automated tests with bun:test, bun-based tooling, and bug fixes (device name parsing, recording process tracking, MCP stdio hygiene).

Prerequisites

Installation

Cursor

Add to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "ios-simulator": {
      "command": "bunx",
      "args": ["@yaelg/ios-simulator-mcp"]
    }
  }
}

Claude Code

claude mcp add ios-simulator -- bunx @yaelg/ios-simulator-mcp

npx @yaelg/ios-simulator-mcp works the same way if you prefer npm.

Tools

See the screen

ToolDescription
ui_snapshotCompact list of visible interactive/labeled elements with refs (e1, e2, ...) and point coordinates
ui_inspectSnapshot + screenshot in one call (refs and pixels together)
ui_viewCompressed screenshot returned inline as JPEG, downscaled to point resolution
ui_describe_allRaw accessibility tree as JSON (verbose — prefer ui_snapshot)
ui_describe_pointAccessibility element at given coordinates
ui_find_elementSearch the accessibility tree by label, identifier, or type
wait_for_elementPoll until an element appears (use after navigation instead of sleeping)

Act

ToolDescription
ui_tapTap by ref, label, or x/y coordinates; expect_appears/expect_gone verify the result
ui_typeInput text; pass ref/label to focus the field first
ui_swipeSwipe gesture
open_urlOpen https://, deep links, or exp:// dev-client URLs
expo_launchOne-call Expo launch: boot + wait for Metro + resolve deep link + open

Apps

ToolDescription
install_appInstall an app bundle (.app or .ipa)
launch_appLaunch by bundle identifier, returns the PID (EX_UPDATES_* env rejected)
terminate_appTerminate a running app
uninstall_appUninstall an app and its data
reset_appReset an app to a fresh-install state (terminate, privacy reset, uninstall, optional reinstall)
list_appsList installed apps with bundle id, name, and type
app_logsRecent console logs (JS errors, crashes) filtered by process

Device

ToolDescription
doctorPreflight: checks Xcode, idb, simulators, and Metro, and reports how to fix gaps
get_booted_sim_idGet the booted simulator's UDID (rarely needed — see below)
boot_simBoot a simulator by udid/name and wait until it is actually ready
select_default_devicePin a session default simulator so tools don't need udid
open_simulatorOpen the iOS Simulator application
set_permissionsGrant/revoke/reset privacy permissions (camera, location, ...)
push_notificationDeliver a simulated APNs push
set_locationSet the simulated GPS location
set_appearanceSwitch light/dark mode
status_barOverride time/battery/signal for clean screenshots
cleanup_sessionReset leftovers from previous sessions: orphaned recordings, temp files, status-bar/location overrides, running apps

Media

ToolDescription
screenshotInline downscaled JPEG by default; full-res to file with output_path
record_videoRecord video; pass duration_s for a self-stopping clip
stop_recordingStop an open-ended recording

All tools accept an optional udid; when omitted, the session default (select_default_device) or the currently booted simulator is used. The server also ships usage instructions via the MCP initialize response (including Expo/Metro guidance), which compatible hosts surface to the agent automatically.

Built for agents

  • Verify in the same call. ui_tap / ui_type / ui_swipe take expect_appears / expect_gone to confirm the screen changed, collapsing the act→snapshot→compare loop into one call.
  • Structured output. ui_snapshot, ui_inspect, list_apps, app_logs, doctor, and get_booted_sim_id return typed structuredContent alongside text, so follow-up calls don't re-parse prose.
  • Machine-readable errors. Failures carry a [CODE] (e.g. NO_BOOTED_SIM, METRO_UNREACHABLE, ELEMENT_NOT_FOUND) and a recovery hint in structuredContent.error, so an agent self-routes in one turn.
  • Preflight with doctor before a session to catch a missing idb, no booted device, or a down Metro.

Launching Expo apps

expo_launch is the reliable, one-call path for starting an Expo app on the simulator. It:

  1. boots a simulator if none is ready (and waits for the real Booted state — simctl boot returns early),
  2. waits for the Metro dev server to respond,
  3. asks Metro's /_expo/open endpoint for the exact deep link (dev client or Expo Go) instead of guessing the URL scheme, falling back to constructing it from the scheme + host,
  4. opens the link with simctl openurl (adding disableOnboarding=1 for dev-client first launch).

It never uses EX_UPDATES_* env vars (the source of expo-updates reload loops). Force a runtime with runtime: "custom" (dev build) or "expo" (Expo Go); point at a non-default server with metro_url.

Configuration

Environment variableEffect
IOS_SIMULATOR_MCP_FILTERED_TOOLSComma-separated list of tool names to disable (e.g. record_video,stop_recording)
IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIRDirectory for relative output paths (default: ~/Downloads)
IOS_SIMULATOR_MCP_IDB_PATHPath to a specific idb executable (default: idb from PATH)

Development

bun install        # install dependencies
bun test           # run the test suite
bun run lint       # eslint (@antfu/eslint-config)
bun run typecheck  # tsc --noEmit
bun run build      # bundle to dist/ with tsdown
bun run dev        # MCP inspector against src/index.ts

Releases follow the bumpp flow: bun run release bumps the version, tags, and pushes; the release workflow publishes to npm.

Documentation

License

MIT

↑↓ navigate openesc close