/ Directory / Playground / iOS Simulator MCP
● Community joshuayoes ⚡ Instant

iOS Simulator MCP

by joshuayoes · joshuayoes/ios-simulator-mcp

Drive xcrun simctl + idb from Claude — boot a sim, install your .app, tap, type, screenshot, record video, all without flipping to Xcode.

iOS Simulator MCP wraps Apple's xcrun simctl plus Facebook's idb to let Claude operate the iOS Simulator. Perfect for UI test loops, bug repro, and screenshot/video capture for issue tickets — exactly the kind of work where flipping between Xcode and chat is tedious.

Why use it

Key features

Live Demo

What it looks like in practice

ios-simulator-mcp.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "ios-simulator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "ios-simulator-mcp"
      ]
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "ios-simulator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "ios-simulator-mcp"
      ]
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "ios-simulator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "ios-simulator-mcp"
      ]
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "ios-simulator-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "ios-simulator-mcp"
      ]
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "ios-simulator-mcp",
      "command": "npx",
      "args": [
        "-y",
        "ios-simulator-mcp"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "ios-simulator-mcp": {
      "command": {
        "path": "npx",
        "args": [
          "-y",
          "ios-simulator-mcp"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add ios-simulator-mcp -- npx -y ios-simulator-mcp

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use iOS Simulator MCP

Generate App Store screenshots across devices

👤 iOS devs preparing a release ⏱ ~25 min intermediate

When to use: You need 6.5", 6.7", iPad screenshots in light + dark, fast.

Prerequisites
  • Xcode + simctl — Standard Xcode install
  • idb installedbrew tap facebook/fb && brew install idb-companion
  • .app bundle builtxcodebuild -scheme YourApp -destination 'platform=iOS Simulator' build
Flow
  1. Setup devices
    Boot iPhone 15 Pro Max and iPad Pro 13-inch sims. List them when ready.✓ Copied
    → list_simulators shows both Booted
  2. Set status bar
    Set status bar to 9:41, full battery, full signal on both. App Store style.✓ Copied
    → status_bar_set succeeds; clean look
  3. Install + screenshots
    Install MyApp.app on both. Launch, navigate Home → Profile → Settings, screenshot each in light and dark mode. Save under /screenshots/<device>/<mode>/.✓ Copied
    → Folder per device, with light + dark variants of each screen

Outcome: Full App Store screenshot pack in ~10 min, no manual capture.

Pitfalls
  • Sim boots but app crashes on launch — Pull simctl log; check for missing entitlements
  • Dynamic Island content covers status bar tweaks — On Pro Max, status_bar_set still applies under DI
Combine with: filesystem

Capture a clean repro video for a UI bug

👤 iOS devs / QA ⏱ ~10 min beginner

When to use: Bug only repros in the sim; you want a video for the ticket.

Flow
  1. Start recording
    Boot iPhone 15. Install build.app. Start screen recording.✓ Copied
    → record_video_start returns recording id
  2. Reproduce
    Open the app. Tap Profile, then the Edit pencil. Type 'Test' in the name field. Tap Save. Wait 2 seconds.✓ Copied
    → Sequence executed; bug visible if it repros
  3. Stop and attach
    Stop recording, save as bug-1234.mov in /tickets/.✓ Copied
    → MOV saved

Outcome: Repro video ready to attach to the ticket.

Pitfalls
  • Tap missed because layout differs from expected — Use describe_ui first to find current frames
Combine with: filesystem · github

Run a smoke test loop after each rebuild

👤 iOS devs in a tight build/test cycle ⏱ ~15 min intermediate

When to use: You're iterating on a screen and want a 30-second smoke test after every rebuild.

Flow
  1. Rebuild + reinstall
    Run xcodebuild for scheme MyApp Debug, then reinstall on the booted sim.✓ Copied
    → Install succeeds with new bundle
  2. Drive smoke path
    Open app, sign in with test account, navigate to the screen I'm working on, screenshot.✓ Copied
    → Screenshot looks right; no crashes in the log

Outcome: Faster build/test cycle without manual tapping.

Pitfalls
  • Sign-in flow has a captcha — Use a captcha-bypass build or stub the auth flow

Combinations

Pair with other MCPs for X10 leverage

ios-simulator-mcp + filesystem

Save screenshots into your repo

Capture screenshots for all main screens, save to /design/screenshots/.✓ Copied
ios-simulator-mcp + github

Open a bug issue with a repro video

Record the bug, then file a GitHub issue attaching the MOV and reproducer steps.✓ Copied
ios-simulator-mcp + xcodebuildmcp

Build and immediately run smoke test

XcodeBuild: build Debug. Sim: install + launch + screenshot.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
list_simulators (none) First step free
boot_simulator device_id: str Power on a sim free
install_app device_id, path: str (.app) Push a build free
launch_app device_id, bundle_id: str Open the app free
tap device_id, x, y Tap a coordinate free
type_text device_id, text: str Enter text free
screenshot device_id, path? Capture state free
record_video_start device_id, path: str Begin video free
record_video_stop recording_id End video free
describe_ui device_id Find tap coordinates free
status_bar_set device_id, time, battery, signal Clean App Store screenshots free

Cost & Limits

What this costs to run

API quota
None — local
Tokens per call
100–800; screenshots referenced by path, not embedded
Monetary
Free OSS
Tip
Use describe_ui to find tap coords once instead of guessing repeatedly

Security

Permissions, secrets, blast radius

Minimum scopes: execute simctl + idb
Credential storage: None — but app data in sim is yours
Data egress: Local only
Never grant: root / kernel access

Troubleshooting

Common errors and fixes

idb not found

brew tap facebook/fb && brew install idb-companion; also pip install fb-idb

Verify: idb list-targets
Tap doesn't land

Use describe_ui; coords differ across device sizes; element might be in a sheet

Sim booted but stays black

Sim shutdown + reset; sometimes Xcode runtime needs re-download

Recording corrupts

Use simctl io recordVideo directly; idb's wrapper occasionally fails on macOS sleep

Alternatives

iOS Simulator MCP vs others

AlternativeWhen to use it insteadTradeoff
XcodeBuildMCP (Sentry)You want build + sim in one MCPHeavier; broader scope
MaestroYou want a full UI testing DSLNot LLM-driven by default
Xcode Cloud / FastlaneProduction CIDifferent layer; not interactive

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills