get_booted_sim_id
Get the ID of the currently booted iOS simulator
Drive the iOS Simulator from an agent — tap, type, swipe, read the accessibility tree, and record what happened.
LABSCO SUMMARY
What it takes off you is the describe-then-guess loop. The accessibility tree returns the elements a tap is aimed at, so the coordinates come from the screen rather than from an assumption — and a screenshot or a recording is one call away when a run has to be shown rather than described.
A simulator control server built on Facebook's IDB. It finds the booted simulator, describes what is on screen through the accessibility tree, drives the UI by coordinate, and captures the run as a screenshot or a video.
get_booted_sim_id, open_simulator)ui_describe_all, ui_describe_point, ui_find_element, ui_view)ui_tap, ui_type, ui_swipe)screenshot, record_video, stop_recording)install_app, launch_app, terminate_app, list_apps)open_url)macOS — iOS simulators exist nowhere else — with Xcode and its simulators installed, Node.js 20 or later, and Facebook's IDB tool. Every UI call takes a udid, which the booted-simulator call supplies. Three environment variables shape it: IOS_SIMULATOR_MCP_IDB_PATH when idb is not on the PATH, IOS_SIMULATOR_MCP_DEFAULT_OUTPUT_DIR for screenshots and recordings (~/Downloads otherwise, which matters when the agent's file access is restricted), and IOS_SIMULATOR_MCP_FILTERED_TOOLS to keep named tools out of the registered list entirely.
One command — npx -y ios-simulator-mcp
USE CASES
Describe the screen, act on what is actually there, and describe it again. Each step is checked against the accessibility tree rather than against a coordinate somebody wrote down last month.
Start recording, drive the steps, stop. What you attach to the ticket is the failure happening, not a description of it — and the output directory is configurable so the file lands where you can find it.
Install the bundle, launch it by bundle id, and screenshot the first screen. That is the smoke test, and it takes three calls.
Open the URL on the simulator rather than tapping through five screens to reach the one under test. It cuts the setup out of every run.
Search the tree by criteria instead of describing the whole screen and scanning it, or describe a single point when you want to know what is under a coordinate.
Filter out the tools you do not want registered — screen recording, for instance — with the filtered-tools variable. Removing them is more reliable than asking the model not to use them.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
get_booted_sim_idGet the ID of the currently booted iOS simulator
install_appInstalls an app bundle (.app or .ipa) on the iOS Simulator
launch_appLaunches an app on the iOS Simulator by bundle identifier
open_simulatorOpens the iOS Simulator application
record_videoRecords a video of the iOS Simulator using simctl directly
screenshotTakes a screenshot of the iOS Simulator
stop_recordingStops the simulator video recording using killall
ui_describe_allDescribes accessibility information for the entire screen in the iOS Simulator
ui_describe_pointReturns the accessibility element at given co-ordinates on the iOS Simulator's screen
ui_find_elementSearches the accessibility tree and returns elements matching the given criteria
ui_swipeSwipe on the screen in the iOS Simulator
ui_tapTap on the screen in the iOS Simulator
ui_typeInput text into the iOS Simulator
ui_viewGet the image content of a compressed screenshot of the current simulator view
BEFORE YOU INSTALL
14 tools when we connected. The documentation lists 17; terminate_app, open_url and list_apps read as recent additions and may be missing from an older published build. Deep-linking depends on open_url.
CONTEXT COST
Rated by the size of the 14 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
Clone this repository
git clone https://github.com/joshuayoes/ios-simulator-mcp
cd ios-simulator-mcpInstall dependencies (npm is the default; pnpm is also supported)
npm installBuild the project
npm run buildnpx -y ios-simulator-mcp{
"mcpServers": {
"ios-simulator": {
"command": "npx",
"args": [
"-y",
"ios-simulator-mcp"
]
}
}
}claude mcp add ios-simulator npx ios-simulator-mcp