A Model Context Protocol (MCP) server that provides structured access to iOS Simulator management via xcrun simctl
commands.
-
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
-
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
- Build the wheel:
python -m build --wheel pip install dist/simctl_mcp_server-0.1.0-py3-none-any.whl
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": {}
}
}
}
- 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
The server runs on stdio, so you can invoke it directly:
With installed package:
simctl-mcp-server
With uvx:
uvx simctl-mcp-server
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
simctl_install_app
- Install an app (.app bundle or .ipa)simctl_launch_app
- Launch an app with optionssimctl_terminate_app
- Terminate a running app
simctl_screenshot
- Take screenshotssimctl_record_video
- Record video (start recording)
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
# 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"
# 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"
# 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"
# Set specific location
"Set the simulator location to Apple Park (37.334606, -122.009102)"
# Clear location
"Clear the simulated location on the booted device"
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
- 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
- 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