Skip to main content
Glama

SimCtl MCP Server

A Model Context Protocol (MCP) server that provides structured access to iOS Simulator management via xcrun simctl commands.

Installation

Method 1: Using uvx

  1. Prerequisites:

    • Python 3.13+

    • Xcode with Command Line Tools installed

    • uvx: curl -LsSf https://astral.sh/uv/install.sh | sh

  2. Run directly with uvx:

    uvx simctl-mcp-server

Method 2: Local Development Installation

  1. Prerequisites:

    • Python 3.13+

    • Xcode with Command Line Tools installed

  2. Clone and install:

    git clone https://github.com/nzrsky/simctl-mcp-server
    cd simctl-mcp-server
    pip install .
  3. Run the server:

    simctl-mcp-server

Method 3: Build from Source

  1. Build the wheel:

    python -m build --wheel
    pip install dist/simctl_mcp_server-0.1.0-py3-none-any.whl

Related MCP server: Shotter

Configuration

For Claude Desktop

Add to your ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "simctl": {
      "command": "simctl-mcp-server",
      "args": [],
      "env": {}
    }
  }
}

Or if using uvx:

{
  "mcpServers": {
    "simctl": {
      "command": "uvx",
      "args": ["simctl-mcp-server"],
      "env": {}
    }
  }
}

For VS Code with MCP Extension

  1. Install the MCP Extension from the VS Code marketplace

  2. Add server configuration to your VS Code settings (settings.json):

{
  "mcp.servers": {
    "simctl": {
      "command": "simctl-mcp-server",
      "args": [],
      "env": {}
    }
  }
}

Or if using uvx:

{
  "mcp.servers": {
    "simctl": {
      "command": "uvx",
      "args": ["simctl-mcp-server"],
      "env": {}
    }
  }
}
  1. Restart VS Code to load the MCP server

  2. Use the Command Palette (Cmd+Shift+P) and search for "MCP" commands to interact with the simulator tools

For Other MCP Clients

The server runs on stdio, so you can invoke it directly:

With installed package:

simctl-mcp-server

With uvx:

uvx simctl-mcp-server

Available Tools

Device Management

  • simctl_list_devices - List all simulators and their states

  • simctl_boot_device - Boot a simulator

  • simctl_shutdown_device - Shutdown a simulator

  • simctl_create_device - Create a new simulator

  • simctl_delete_device - Delete simulators

App Management

  • simctl_install_app - Install an app (.app bundle or .ipa)

  • simctl_launch_app - Launch an app with options

  • simctl_terminate_app - Terminate a running app

Media & Screenshots

  • simctl_screenshot - Take screenshots

  • simctl_record_video - Record video (start recording)

Testing & Development

  • simctl_push_notification - Send push notifications

  • simctl_privacy_control - Manage app permissions

  • simctl_set_location - Set device location/GPS

  • simctl_status_bar_override - Override status bar appearance

  • simctl_ui_appearance - Control light/dark mode

Usage Examples

Basic Device Operations

# List all devices
"List all available iOS simulators"

# Boot a specific device
"Boot the iPhone 15 Pro simulator"

# Create a new simulator
"Create a new iPhone 14 simulator named 'Test Device' with iOS 17.0"

App Testing

# Install and launch an app
"Install MyApp.app on the booted simulator and launch it"

# Take a screenshot
"Take a screenshot of the current simulator and save it to ~/Desktop/screenshot.png"

# Send a push notification
"Send a push notification with title 'Hello' and body 'Test message' to com.example.myapp"

UI Testing Setup

# Set up a controlled testing environment
"Set the simulator to dark mode, override the status bar to show full battery and strong WiFi, and set the time to 9:41 AM"

# Grant permissions for testing
"Grant photo library access to com.example.myapp on the booted simulator"

Location Testing

# Set specific location
"Set the simulator location to Apple Park (37.334606, -122.009102)"

# Clear location
"Clear the simulated location on the booted device"

Error Handling

The server includes comprehensive error handling:

  • Command failures: Returns detailed error messages from simctl

  • Missing Xcode: Detects when xcrun simctl is not available

  • Invalid parameters: Validates input parameters before execution

  • File operations: Handles temporary files for push notifications safely

Security Considerations

  • The server only exposes read and simulator management operations

  • No access to host file system beyond specified app paths

  • Push notification payloads are validated for structure

  • Privacy permission changes are explicit and logged

Development Notes

  • Built specifically for iOS development workflows

  • Optimized for common simulator management tasks

  • Structured output parsing for JSON responses

  • Support for both individual and batch operations

  • Compatible with Xcode 15+ simulator features

Available Tools

15 tools
simctl_boot_deviceA

Boot a simulator device.

Args: device: Device UDID, name, or 'booted' for current device arch: Architecture to use when booting (arm64 or x86_64)

Returns: Success message

Inputs: device (required), arch. Returns: result

simctl_create_deviceA

Create a new simulator device.

Args: name: Name for the new device device_type: Device type identifier (e.g., 'iPhone 15 Pro') runtime: Runtime identifier (e.g., 'iOS 17.0')

Returns: Created device information

Inputs: name (required), device_type (required), runtime. Returns: result

simctl_delete_deviceB

Delete simulator devices.

Args: devices: List of device UDIDs, names, or 'unavailable' to delete all unavailable devices

Returns: Success message

Inputs: devices (required). Returns: result

simctl_install_appA

Install an app on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device app_path: Path to .app bundle or .ipa file

Returns: Success message

Inputs: device (required), app_path (required). Returns: result

simctl_launch_appB

Launch an app on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device bundle_id: App bundle identifier wait_for_debugger: Wait for debugger to attach before launching console_mode: Console output mode (none, console, console-pty) args: Additional launch arguments

Returns: Launch result

Inputs: device (required), bundle_id (required), wait_for_debugger, console_mode, +1 more. Returns: result

simctl_list_devicesA

List available iOS simulators and their states.

Args: format: Output format (json or text). Defaults to json. filter: Optional filter term (e.g., 'available', 'iPhone', 'iOS 17')

Returns: List of available simulators

Inputs: format, filter. Returns: result

simctl_privacy_controlA

Control app privacy permissions on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device action: Privacy action (grant, revoke, reset) service: Privacy service (photos, camera, microphone, location, etc.) bundle_id: App bundle identifier (optional)

Returns: Success message

Inputs: device (required), action (required), service (required), bundle_id. Returns: result

simctl_push_notificationA

Send a push notification to a simulator device.

Args: device: Device UDID, name, or 'booted' for current device payload: Push notification payload as JSON object bundle_id: Target app bundle identifier (optional if specified in payload)

Returns: Success message

Inputs: device (required), payload (required), bundle_id. Returns: result

simctl_record_videoA

Start recording video of a simulator device.

Args: device: Device UDID, name, or 'booted' for current device output_path: Path where to save the video codec: Video codec (hevc, h264) display: Display to record (internal, external)

Returns: Recording start message

Inputs: device (required), output_path (required), codec, display. Returns: result

simctl_screenshotA

Take a screenshot of a simulator device.

Args: device: Device UDID, name, or 'booted' for current device output_path: Path where to save the screenshot format: Image format (png, jpeg) display: Display to capture (internal, external)

Returns: Success message

Inputs: device (required), output_path (required), format, display. Returns: result

simctl_set_locationA

Set or clear device location on a simulator.

Args: device: Device UDID, name, or 'booted' for current device action: Location action (set, clear, run) latitude: Latitude coordinate (required for 'set' action) longitude: Longitude coordinate (required for 'set' action) scenario: Location scenario (required for 'run' action)

Returns: Success message

Inputs: device (required), action (required), latitude, longitude, +1 more. Returns: result

simctl_shutdown_deviceB

Shutdown a simulator device.

Args: device: Device UDID, name, or 'booted' for current device

Returns: Success message

Inputs: device (required). Returns: result

simctl_status_bar_overrideB

Override status bar appearance on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device action: Status bar action (override, clear) time: Time to display (e.g., "9:41") data_network: Data network type (wifi, 3g, 4g, lte, lte-a, lte+, 5g, 5g+, 5g-uw) wifi_bars: WiFi signal strength (0-3) cellular_bars: Cellular signal strength (0-4) battery_level: Battery level percentage (0-100) battery_state: Battery state (charging, charged, discharging)

Returns: Success message

Inputs: device (required), action (required), time, data_network, +4 more. Returns: result

simctl_terminate_appA

Terminate an app on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device bundle_id: App bundle identifier

Returns: Success message

Inputs: device (required), bundle_id (required). Returns: result

simctl_ui_appearanceA

Get or set UI appearance (light/dark mode) on a simulator device.

Args: device: Device UDID, name, or 'booted' for current device appearance: UI appearance (light, dark). If not provided, returns current appearance.

Returns: Current or updated appearance

Inputs: device (required), appearance. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool targets a distinct simulator operation—device lifecycle, app management, interaction, and settings—with no overlap. Even similar actions like install, launch, and terminate are clearly differentiated.

    Naming Consistency5/5

    All tool names follow the 'simctl_verb_noun' pattern consistently (e.g., boot_device, install_app, set_location), using lowercase with underscores. The naming is predictable and readable.

    Tool Count5/5

    With 15 tools, the server is well-scoped for simulator control. Each tool covers a necessary operation without being excessive or sparse, fitting the typical 3-15 range for a focused domain.

    Completeness4/5

    The tool set covers core device and app lifecycle, plus common interactions like screenshots, push notifications, and privacy control. Missing advanced operations (e.g., device reset, file copy) are minor gaps.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to automate iOS Simulator interactions including device management, UI element interaction (tap, swipe, type), screenshot capture, and execution of YAML-defined navigation workflows.
      15 npm
      MIT
    • F
      license
      A
      quality
      C
      maintenance
      Enables control of the iOS Simulator using the xcrun simctl command-line utility. It allows users to manage devices, install and launch apps, send push notifications, and simulate device features like GPS location.
      12
      -