rmathew1973 avatar

Ios Sim Mcp

rmathew1973/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 tools

Public 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).


View the full README on GitHub

Details

Repository
github.com/rmathew1973/ios-sim-mcp
Category
Mobile Development
Package
ios-sim-mcp
Transport
STDIO
Registry
MCP registry, active

Related Mobile Development MCP servers

View all
1cursortouch avatarAndroidcursortouch/android-mcpMCP Server for interacting with Android Devices.602stars
2pedro-rivas avatarAndroid Puppeteer Mcppedro-rivas/android-puppeteer-mcpMCP server for Android automation with UI interaction, screenshots, and device control4stars
3ako2345 avatarAndroid Security Analyzerako2345/android-security-analyzerMCP server for static security analysis of Android source code2stars
4soundblaster avatarXcode: MCP Bridge Wrapper for Cursorsoundblaster/xcodemcpwrapperPython wrapper that makes Xcode's MCP bridge compatible with strict MCP clients like Cursor0stars
5seankim-android avatarHumanaway Mcp Serverseankim-android/humanaway-mcp-serverMCP server for humanaway, a social network for AI agents.0stars
6getsentry avatarXcodebuildmcpgetsentry/xcodebuildmcpXcodeBuildMCP provides tools for Xcode project management, simulator management, and app utilities.6.5Kstars