simulator-use vs MobileBuildMCP
Pick MobileBuildMCP for a wider Xcode workflow from one server: builds for the Simulator, devices and macOS, Swift packages, code coverage and LLDB debugging. (MobileBuildMCP workflows)
Pick simulator-use for driving the Simulator's screen: it reads and taps through its own long-lived engine on AXe's frameworks, where MobileBuildMCP asks its bundled AXe for each read and action. (simulator-use README, MobileBuildMCP docs: UI automation)
Measured on one Mac: simulator-use read 194 tokens per sign-in, MobileBuildMCP 1,561 (est.); simulator-use signed in in 3.50 s, MobileBuildMCP in 12.26 s.
Before version 2.7.1, MobileBuildMCP was called XcodeBuildMCP; its changelog for 2.7.1: "Renamed the project from XcodeBuildMCP to MobileBuildMCP." (MobileBuildMCP CHANGELOG)
Measured side by side
From the one-Mac benchmark of November 1, 2026: the same app and iPhone 17 Pro Simulator, one tool at a time, each through its own MCP server. Times are medians; tokens are estimates (characters / 4).
| MobileBuildMCP | simulator-use | |
|---|---|---|
| Signing in, step by step | 12.26 s | 3.50 s |
| Tokens read per sign-in (est.) | 1,561 | 194 |
| Sign-ins completed | 10 of 10 | 10 of 10 |
| Signing in, batched | no batched run | 2.87 s |
| Tokens read, batched (est.) | 179 | |
| Batched sign-ins completed | 10 of 10 | |
| Reading the screen (median) | 0.62 s | 0.19 s |
| Tapping a button (median) | 2.37 s | 0.68 s |
| Typing into a field (median) | 3.15 s | 1.14 s |
| Tool list in context (est.) | 6,193 | 2,443 |
| Setup its docs ask for | none | 0.12 s |
MobileBuildMCP 2.7.1, simulator-use 0.15.0. Every call is in bench/results/2026-11-01.
With Device Hub open
MobileBuildMCP reads and taps through a bundled AXe, and AXe's README says:
"Xcode 27 simulator automation uses Device Hub; Simulator.app is not required." (AXe README)
Its own changelog, for version 2.7.0: "UI automation tools now work fully with Xcode 27 simulators through Device Hub" (MobileBuildMCP CHANGELOG).
So MobileBuildMCP ran three times on the benchmark's Mac: with the Simulator headless like every tool, again with Device Hub open, and once more with Device Hub closed. The ranking uses the first run.
| Condition | Taps that reached the app | Typings shown | Sign-ins completed | Sign-in |
|---|---|---|---|---|
| Headless, the ranked run | 20 of 20 | 10 of 10 | 10 of 10 | 12.26 s |
| Device Hub open | 9 of 20 | 7 of 10 | 0 of 10 | none |
| Headless again, last of all | 20 of 20 | 10 of 10 | 10 of 10 | 17.97 s |
With Device Hub open, every tap still answered that it was done; the counts are what the app's own log saw. simulator-use is built on AXe's frameworks: its engine keeps one session open per Simulator instead of starting AXe for each call.
What each does
From each tool's own README, license and docs, read on October 31, 2026.
| MobileBuildMCP | simulator-use | |
|---|---|---|
| License | MIT (MobileBuildMCP LICENSE) | MIT (simulator-use LICENSE) |
| Builds the app | Yes, for the Simulator, devices and macOS (MobileBuildMCP README, MobileBuildMCP workflows) | Yes: builds the Xcode project, installs and launches it (app_run) (simulator-use README) |
| Runs tests | Yes (MobileBuildMCP README) | XCTest and XCUITest, case by case (tests_run) (simulator-use README) |
| Screen as text | Its tap targets, with refs (snapshot_ui) (MobileBuildMCP docs: UI automation) | One line per element: kind, label, #id, state and position (simulator-use README) |
| How it taps | By elementRef from its latest snapshot (MobileBuildMCP's tap tool) | By #id or label, or at @x,y (simulator-use README) |
| Cloud option | None in its README (MobileBuildMCP README) | A NoMac cloud iPhone (simulator-use cloud start), billed per minute (simulator-use README) |
| Needs besides Xcode | macOS 14.5, Xcode 16 and Node 18. Reads and taps through a bundled AXe (MobileBuildMCP README, MobileBuildMCP docs: UI automation) | Node 20. Its engine is built on AXe's frameworks, which it bundles (simulator-use README) |
Where simulator-use is better
- Typing is one call per field that reads the text back. MobileBuildMCP's refs belong to its latest snapshot and its tools say to refresh after layout changes, so in the benchmark it read the screen again after each typing (counted in its sign-in). (simulator-use README, MobileBuildMCP's tap tool)
- Signing in, step by step: 3.50 s against MobileBuildMCP's 12.26 s.
- Tokens read per sign-in (est.): 194 tokens against MobileBuildMCP's 1,561 tokens.
- Reading the screen: 0.19 s against MobileBuildMCP's 0.62 s.
- Tokens per screen read (est.): 72 tokens against MobileBuildMCP's 386 tokens.
- Tapping a button: 0.68 s against MobileBuildMCP's 2.37 s.
- Typing into a field: 1.14 s against MobileBuildMCP's 3.15 s.
- Tool list in the agent's context (est.): 2,443 tokens against MobileBuildMCP's 6,193 tokens.
- A tap's answer held the new status text in 20 of 20 taps, MobileBuildMCP's in 0 of 20.
A measured difference is listed when it is 5% or more.
Switching
Add simulator-use to Claude Code with one line (other clients: install):
The calls each made in the benchmark, step for step:
| MobileBuildMCP | simulator-use | |
|---|---|---|
| Setup | none | device_use {"device":"<udid>"} |
| Read the screen | snapshot_ui {} | ui_look {} |
| Tap a button | tap {"elementRef":"e58"} | ui_act {"steps":["tap #signIn"]} |
| Type into a field | type_text {"elementRef":"e33","text":"gary@example.com","replaceExisting":true} | ui_act {"steps":["fill #email gary@example.com"]} |
| Several steps in one call | none | ui_act {"steps":["fill #email gary@example.com","fill #password secret1","tap #signIn"]} |
| Build, install and launch | build_run_sim (MobileBuildMCP's tool list, as the benchmark recorded it) | app_run (simulator-use README) |
| Run the tests | test_sim (MobileBuildMCP's tool list, as the benchmark recorded it) | tests_run (simulator-use README) |
Sources
Read on October 31, 2026. The measured numbers: benchmarks and the raw results.