
iOS Simulator
STDIOMCP server for iOS simulator interaction, UI control, and element inspection
MCP server for iOS simulator interaction, UI control, and element inspection
A Model Context Protocol (MCP) server for interacting with iOS simulators. This server allows you to interact with iOS simulators by getting information about them, controlling UI interactions, and inspecting UI elements.
Security Notice: Command injection vulnerabilities present in versions < 1.3.3 have been fixed. Please update to v1.3.3 or later. See SECURITY.md for details.
https://github.com/user-attachments/assets/453ebe7b-cc93-4ac2-b08d-0f8ac8339ad3
This project has been featured and mentioned in various publications and resources:
get_booted_sim_id
Description: Get the ID of the currently booted iOS simulator
Parameters: No Parameters
ui_describe_all
Description: Describes accessibility information for the entire screen in the iOS Simulator
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; }
ui_tap
Description: Tap on the screen in the iOS Simulator
Parameters:
{ /** * Press duration in seconds (decimal numbers allowed) */ duration?: string; /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; /** The x-coordinate */ x: number; /** The y-coordinate */ y: number; }
ui_type
Description: Input text into the iOS Simulator
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; /** * Text to input * Format: ASCII printable characters only */ text: string; }
ui_swipe
Description: Swipe on the screen in the iOS Simulator
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; /** The starting x-coordinate */ x_start: number; /** The starting y-coordinate */ y_start: number; /** The ending x-coordinate */ x_end: number; /** The ending y-coordinate */ y_end: number; /** The size of each step in the swipe (default is 1) */ delta?: number; }
ui_describe_point
Description: Returns the accessibility element at given co-ordinates on the iOS Simulator's screen
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; /** The x-coordinate */ x: number; /** The y-coordinate */ y: number; }
ui_view
Description: Get the image content of a compressed screenshot of the current simulator view
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; }
screenshot
Description: Takes a screenshot of the iOS Simulator
Parameters:
{ /** * Udid of target, can also be set with the IDB_UDID env var * Format: UUID (8-4-4-4-12 hexadecimal characters) */ udid?: string; /** File path where the screenshot will be saved. If relative, it uses the directory specified by the `IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR` env var, or `~/Downloads` if not set. */ output_path: string; /** Image format (png, tiff, bmp, gif, or jpeg). Default is png. */ type?: "png" | "tiff" | "bmp" | "gif" | "jpeg"; /** Display to capture (internal or external). Default depends on device type. */ display?: "internal" | "external"; /** For non-rectangular displays, handle the mask by policy (ignored, alpha, or black) */ mask?: "ignored" | "alpha" | "black"; }
record_video
Description: Records a video of the iOS Simulator using simctl directly
Parameters:
{ /** Optional output path. If not provided, a default name will be used. The file will be saved in the directory specified by `IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR` or in `~/Downloads` if the environment variable is not set. */ output_path?: string; /** Specifies the codec type: "h264" or "hevc". Default is "hevc". */ codec?: "h264" | "hevc"; /** Display to capture: "internal" or "external". Default depends on device type. */ display?: "internal" | "external"; /** For non-rectangular displays, handle the mask by policy: "ignored", "alpha", or "black". */ mask?: "ignored" | "alpha" | "black"; /** Force the output file to be written to, even if the file already exists. */ force?: boolean; }
stop_recording
Description: Stops the simulator video recording using killall
Parameters: No Parameters
This MCP server allows AI assistants integrated with a Model Context Protocol (MCP) client to perform Quality Assurance tasks by making tool calls. This is useful immediately after implementing features to help ensure UI consistency and correct behavior.
After a feature implementation, instruct your AI assistant within its MCP client environment to use the available tools. For example, in Cursor's agent mode, you could use the prompts below to quickly validate and document UI interactions.
Verify UI Elements:
Verify all accessibility elements on the current screen
Confirm Text Input:
Enter "QA Test" into the text input field and confirm the input is correct
Check Tap Response:
Tap on coordinates x=250, y=400 and verify the expected element is triggered
Validate Swipe Action:
Swipe from x=150, y=600 to x=150, y=100 and confirm correct behavior
Detailed Element Check:
Describe the UI element at position x=300, y=350 to ensure proper labeling and functionality
Show Your AI Agent the Simulator Screen:
View the current simulator screen
Take Screenshot:
Take a screenshot of the current simulator screen and save it to my_screenshot.png
Record Video:
Start recording a video of the simulator screen (saves to the default output directory, which is `~/Downloads` unless overridden by `IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR`)
Stop Recording:
Stop the current simulator screen recording
This section provides instructions for integrating the iOS Simulator MCP server with different Model Context Protocol (MCP) clients.
Cursor manages MCP servers through its configuration file located at ~/.cursor/mcp.json
.
# Open with your default editor (or use 'code', 'vim', etc.) open ~/.cursor/mcp.json # Or use Cursor's command if available # cursor ~/.cursor/mcp.json
mcpServers
section with the iOS simulator server configuration:
Ensure the JSON structure is valid, especially if{ "mcpServers": { // ... other servers might be listed here ... "ios-simulator": { "command": "npx", "args": ["-y", "ios-simulator-mcp"] } } }
mcpServers
already exists.git clone https://github.com/joshuayoes/ios-simulator-mcp cd ios-simulator-mcp
npm install
npm run build
mcpServers
section, pointing to your local build:
Important: Replace{ "mcpServers": { // ... other servers might be listed here ... "ios-simulator": { "command": "node", "args": ["/full/path/to/your/ios-simulator-mcp/build/index.js"] } } }
/full/path/to/your/
with the absolute path to where you cloned the ios-simulator-mcp
repository.Claude Code CLI can manage MCP servers using the claude mcp
commands or by editing its configuration files directly. For more details on Claude Code MCP configuration, refer to the official documentation.
claude mcp add
command:
claude mcp add ios-simulator npx ios-simulator-mcp
claude mcp add
command, pointing to your local build:
Important: Replaceclaude mcp add ios-simulator --command node --args "/full/path/to/your/ios-simulator-mcp/build/index.js"
/full/path/to/your/
with the absolute path to where you cloned the ios-simulator-mcp
repository.Variable | Description | Example |
---|---|---|
IOS_SIMULATOR_MCP_FILTERED_TOOLS | A comma-separated list of tool names to filter out from being registered. | screenshot,record_video,stop_recording |
IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR | Specifies a default directory for output files like screenshots and video recordings. If not set, ~/Downloads will be used. This can be handy if your agent has limited access to the file system. | ~/Code/awesome-project/tmp |
{ "mcpServers": { "ios-simulator": { "command": "npx", "args": ["-y", "ios-simulator-mcp"], "env": { "IOS_SIMULATOR_MCP_FILTERED_TOOLS": "screenshot,record_video,stop_recording", "IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR": "~/Code/awesome-project/tmp" } } } }
MIT