simulator-use vs Maestro MCP
Pick Maestro if you want tests as Maestro flows: YAML files kept in the repo and run locally or on Maestro Cloud, on Android, iOS and web. (Maestro README, Maestro docs: Maestro MCP)
Pick simulator-use to build the app and run its XCTest and XCUITest cases, and to read and act on the screen with single calls instead of flows. (simulator-use README, Maestro docs: build your app for the cloud)
Measured on one Mac: simulator-use read 194 tokens per sign-in, Maestro MCP 2,987 (est.); simulator-use signed in in 3.50 s, Maestro MCP in 9.19 s.
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).
| Maestro MCP | simulator-use | |
|---|---|---|
| Signing in, step by step | 9.19 s | 3.50 s |
| Tokens read per sign-in (est.) | 2,987 | 194 |
| Sign-ins completed | 10 of 10 | 10 of 10 |
| Signing in, batched | 7.56 s | 2.87 s |
| Tokens read, batched (est.) | 2,885 | 179 |
| Batched sign-ins completed | 10 of 10 | 10 of 10 |
| Reading the screen (median) | 0.13 s | 0.19 s |
| Tapping a button (median) | 1.58 s | 0.68 s |
| Typing into a field (median) | 3.62 s | 1.14 s |
| Tool list in context (est.) | 3,063 | 2,443 |
| Setup its docs ask for | 0.59 s | 0.12 s |
Maestro MCP 2.12.0, simulator-use 0.15.0. Every call is in bench/results/2026-11-01.
What each does
From each tool's own README, license and docs, read on October 31, 2026.
| Maestro MCP | simulator-use | |
|---|---|---|
| License | Apache 2.0 (Maestro LICENSE) | MIT (simulator-use LICENSE) |
| Builds the app | No; its flows run on an app you build (Maestro docs: build your app for the cloud) | Yes: builds the Xcode project, installs and launches it (app_run) (simulator-use README) |
| Runs tests | Maestro flows (YAML) (Maestro README, Maestro docs: Maestro MCP) | XCTest and XCUITest, case by case (tests_run) (simulator-use README) |
| Screen as text | A compact JSON view hierarchy (Maestro docs: Maestro MCP) | One line per element: kind, label, #id, state and position (simulator-use README) |
| How it taps | tapOn by text or id selectors in a flow (Maestro's inspect_screen tool) | By #id or label, or at @x,y (simulator-use README) |
| Cloud option | Maestro Cloud runs flows (Maestro docs: Maestro MCP) | A NoMac cloud iPhone (simulator-use cloud start), billed per minute (simulator-use README) |
| Needs besides Xcode | Java 17. It installs a small companion driver app on the device (Maestro README, Maestro docs: how Maestro works) | Node 20. Its engine is built on AXe's frameworks, which it bundles (simulator-use README) |
Where simulator-use is better
- Builds the Xcode project and runs its XCTest and XCUITest cases. (simulator-use README)
- No Java needed; Maestro needs Java 17. (simulator-use README, Maestro README)
- Signing in, step by step: 3.50 s against Maestro MCP's 9.19 s.
- Tokens read per sign-in (est.): 194 tokens against Maestro MCP's 2,987 tokens.
- Signing in, batched: 2.87 s against Maestro MCP's 7.56 s.
- Tokens per screen read (est.): 72 tokens against Maestro MCP's 1,116 tokens.
- Tapping a button: 0.68 s against Maestro MCP's 1.58 s.
- Typing into a field: 1.14 s against Maestro MCP's 3.62 s.
- Tool list in the agent's context (est.): 2,443 tokens against Maestro MCP's 3,063 tokens.
- Setup its docs ask for: 0.12 s against Maestro MCP's 0.59 s.
- A tap's answer held the new status text in 20 of 20 taps, Maestro MCP'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:
| Maestro MCP | simulator-use | |
|---|---|---|
| Setup | list_devices {} | device_use {"device":"<udid>"} |
| Read the screen | inspect_screen {"device_id":"<udid>"} | ui_look {} |
| Tap a button | run {"device_id":"<udid>","yaml":"appId: dev.simtap.demo
---
- tapOn:
id: "signIn""} | ui_act {"steps":["tap #signIn"]} |
| Type into a field | run {"device_id":"<udid>","yaml":"appId: dev.simtap.demo
---
- tapOn:
id: "email"
- inputText: "gary@example.com""} | ui_act {"steps":["fill #email gary@example.com"]} |
| Several steps in one call | run {"device_id":"<udid>","yaml":"appId: dev.simtap.demo
---
- tapOn:
id: "email"
- inputText: "gary@example.com"
- tapOn:
id: "password"
- inputText: "secret1"
- tapOn:
id: "signIn""} | ui_act {"steps":["fill #email gary@example.com","fill #password secret1","tap #signIn"]} |
Sources
Read on October 31, 2026. The measured numbers: benchmarks and the raw results.