
Ios Sim Mcp
Drives the iOS Simulator through its accessibility tree instead of screenshots and pixel coordinates. Uses Facebook's idb to snapshot the UIView hierarchy with stable element refs, then lets you tap, type, swipe, and scroll at sub-200ms latency. Ships with an optional dylib you can inject into the running app for view introspection, URLSession network interception, and a JavaScript eval bridge that exposes UIKit internals. Built for LLM-driven UI automation where you want semantic selection (find by label or AXIdentifier, act by ref) rather than vision token overhead. Works with any booted simulator once idb and Bun are installed.
- tools
- 34
- transport
- STDIO
- last updated
- May 18, 2026
Tools
34 toolsPublic tool metadata for what this MCP can expose to an agent.
list_simulatorsList simulators with UDID, state, OS version
List simulators with UDID, state, OS version
No parameter schema in public metadata yet.
use_simulatorPick a specific UDID (auto-selected if only one is booted)
Pick a specific UDID (auto-selected if only one is booted)
No parameter schema in public metadata yet.
snapshotCapture the AX tree, assign refs e1..eN, return compact text rendering. Filters: interactive (default), actionable, all
Capture the AX tree, assign refs e1..eN, return compact text rendering. Filters: interactive (default), actionable, all
No parameter schema in public metadata yet.
findSearch the snapshot by id (AXUniqueId), label, labelContains, role, actionable
Search the snapshot by id (AXUniqueId), label, labelContains, role, actionable
No parameter schema in public metadata yet.
tapTap by {ref}, {id}, or {x,y}. Optional duration makes it a long-press
Tap by {ref}, {id}, or {x,y}. Optional duration makes it a long-press
No parameter schema in public metadata yet.
type_textType into the focused field. Optional {ref} or {id} taps-then-types. Auto-routes through paste when the dylib is loaded for byte-perfect input
Type into the focused field. Optional {ref} or {id} taps-then-types. Auto-routes through paste when the dylib is loaded for byte-perfect input
No parameter schema in public metadata yet.
paste_textByte-perfect text via UIPasteboard + first-responder paste:. Requires the dylib injected
Byte-perfect text via UIPasteboard + first-responder paste:. Requires the dylib injected
No parameter schema in public metadata yet.
view_treeWalk the running app's UIView hierarchy on the main thread, reporting class names, frames, alpha/hidden/interactive, text content and view-controller boundaries. Requires dylib injected
Walk the running app's UIView hierarchy on the main thread, reporting class names, frames, alpha/hidden/interactive, text content and view-controller boundaries. Requires dylib injected
No parameter schema in public metadata yet.
view_hit_testReturns the topmost view at (x,y) plus the full responder chain up to UIApplication. Requires dylib injected
Returns the topmost view at (x,y) plus the full responder chain up to UIApplication. Requires dylib injected
No parameter schema in public metadata yet.
network_startInstall/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
Install/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
No parameter schema in public metadata yet.
network_stopInstall/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
Install/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
No parameter schema in public metadata yet.
network_statusInstall/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
Install/remove an URLProtocol interceptor and swizzle URLSessionConfiguration to record HTTP requests. Requires dylib injected
No parameter schema in public metadata yet.
network_tailReturn the most recent N captured records, one line per request by default, or full with headers and body previews
Return the most recent N captured records, one line per request by default, or full with headers and body previews
No parameter schema in public metadata yet.
network_get_bodyFetch the full request or response body (up to max_body_bytes, default 256KB) for a specific record id
Fetch the full request or response body (up to max_body_bytes, default 256KB) for a specific record id
No parameter schema in public metadata yet.
network_clearDrop the ring buffer and all retained bodies
Drop the ring buffer and all retained bodies
No parameter schema in public metadata yet.
network_self_testFire an HTTP request from inside the app to verify the capture path end-to-end
Fire an HTTP request from inside the app to verify the capture path end-to-end
No parameter schema in public metadata yet.
network_stubRegister canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
Register canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
No parameter schema in public metadata yet.
network_stubsRegister canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
Register canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
No parameter schema in public metadata yet.
network_unstubRegister canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
Register canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
No parameter schema in public metadata yet.
network_unstub_allRegister canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
Register canned HTTP responses by URL substring (+ optional method) without forwarding; delay_ms simulates slow networks
No parameter schema in public metadata yet.
eval_jsRun arbitrary JavaScript in a persistent JSContext inside the injected app. Requires dylib injected
Run arbitrary JavaScript in a persistent JSContext inside the injected app. Requires dylib injected
No parameter schema in public metadata yet.
eval_js_resetDrop the JSContext and rebuild bridges on next eval, forgetting defined vars/fns
Drop the JSContext and rebuild bridges on next eval, forgetting defined vars/fns
No parameter schema in public metadata yet.
keyPress a key by name (RETURN, ESC, DELETE, TAB, SPACE, F1–F12, arrows) or raw HID code
Press a key by name (RETURN, ESC, DELETE, TAB, SPACE, F1–F12, arrows) or raw HID code
No parameter schema in public metadata yet.
buttonHardware button: HOME, LOCK, SIDE_BUTTON, SIRI, APPLE_PAY
Hardware button: HOME, LOCK, SIDE_BUTTON, SIRI, APPLE_PAY
No parameter schema in public metadata yet.
swipeSwipe between two refs/ids/points. Optional duration and delta
Swipe between two refs/ids/points. Optional duration and delta
No parameter schema in public metadata yet.
scrollReader-perspective scroll: down reveals content below. Optional anchor element
Reader-perspective scroll: down reveals content below. Optional anchor element
No parameter schema in public metadata yet.
launch_appLaunch by bundle id. Optional foreground_if_running terminates first
Launch by bundle id. Optional foreground_if_running terminates first
No parameter schema in public metadata yet.
terminate_appTerminate by bundle id
Terminate by bundle id
No parameter schema in public metadata yet.
screenshotPNG to disk or inline. Use sparingly, the AX tree is faster and richer
PNG to disk or inline. Use sparingly, the AX tree is faster and richer
No parameter schema in public metadata yet.
await_quiescentBlock until the AX-tree hash is identical for stable_ms (default 250) or timeout_ms (default 5000)
Block until the AX-tree hash is identical for stable_ms (default 250) or timeout_ms (default 5000)
No parameter schema in public metadata yet.
log_startStream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
Stream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
No parameter schema in public metadata yet.
log_tailStream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
Stream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
No parameter schema in public metadata yet.
log_stopStream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
Stream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
No parameter schema in public metadata yet.
log_clearStream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
Stream os_log into a 5000-line ring buffer. Filter by bundle_id substring, level, or NSPredicate
No parameter schema in public metadata yet.
Sponsors
Readme
ios-sim-mcp
An MCP server that drives the iOS Simulator the way Chrome's DevTools MCP drives a browser: semantic accessibility-tree snapshots with stable element refs, sub-200ms operations, and no screenshot-and-eyeball-coordinates loops.
Built because every existing iOS-simulator automation tool either crawls (Appium, screenshot-based agents) or requires pre-written scripts. This one lets an LLM drive a simulator interactively — find an element by label or ID, tap it by ref, wait for the UI to settle, repeat — at roughly the speed a human would.
Why this exists
Most existing iOS-sim MCPs work by taking a screenshot, asking the model to identify coordinates, then tapping pixels. That's slow (image bytes in context), expensive (vision tokens), and fragile (any layout shift breaks it).
Details
- Repository
- github.com/rmathew1973/ios-sim-mcp
- Category
- Mobile Development
- Package
ios-sim-mcp- Transport
- STDIO
- Registry
- MCP registry, active