simctl-mcp-server
Provides tools for managing iOS simulators, including device management (boot, shutdown, create, delete), app installation and launching, media capture, notifications, permissions, location settings, and UI appearance controls via Xcode's simctl command line tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@simctl-mcp-server List all available iOS simulators"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Prerequisites:
Python 3.13+
Xcode with Command Line Tools installed
uvx:
curl -LsSf https://astral.sh/uv/install.sh | sh
Run directly with uvx:
uvx simctl-mcp-server
Method 2: Local Development Installation
Prerequisites:
Python 3.13+
Xcode with Command Line Tools installed
Clone and install:
git clone https://github.com/nzrsky/simctl-mcp-server cd simctl-mcp-server pip install .Run the server:
simctl-mcp-server
Method 3: Build from Source
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
Install the MCP Extension from the VS Code marketplace
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": {}
}
}
}Restart VS Code to load the MCP server
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-serverWith uvx:
uvx simctl-mcp-serverAvailable Tools
Device Management
simctl_list_devices- List all simulators and their statessimctl_boot_device- Boot a simulatorsimctl_shutdown_device- Shutdown a simulatorsimctl_create_device- Create a new simulatorsimctl_delete_device- Delete simulators
App Management
simctl_install_app- Install an app (.app bundle or .ipa)simctl_launch_app- Launch an app with optionssimctl_terminate_app- Terminate a running app
Media & Screenshots
simctl_screenshot- Take screenshotssimctl_record_video- Record video (start recording)
Testing & Development
simctl_push_notification- Send push notificationssimctl_privacy_control- Manage app permissionssimctl_set_location- Set device location/GPSsimctl_status_bar_override- Override status bar appearancesimctl_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 toolssimctl_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
Scored across 15 tools
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.
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.
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.
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
Build, run, and inspect iOS apps in disposable hosted Simulators from cloud coding agents.
Cloud iPhone Simulators for AI agents: build the Xcode project, read the screen, tap by label, test.
Let your AI agent control real iPhones: screenshots, tap, swipe, type and open apps.
Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables interaction with iOS simulators by providing tools to inspect UI elements, control UI interactions, and manage simulators through natural language commands.1713,665 npm2,217MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive control of iOS simulators and real devices through AI assistants, supporting app management, UI automation, screenshots, media operations, and location simulation for iOS development and testing workflows.8MIT
- FlicenseAqualityCmaintenanceEnables 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-