simulator-use

The most token-efficient iOS Simulator tool for agents.

Eight tools signed in to the same app on the same iPhone 17 Pro Simulator, on one Mac, each through its own MCP server (AXe, which has none, through its command line). simulator-use read 194 tokens per sign-in: 3.4x fewer than the next tool, 66x fewer than Xcode MCP and 569x fewer than AXe. It also signed in fastest: 3.50 s step by step and 2.87 s batched. Every call was timed and saved, failures included.

Leaderboard

All on one Mac, one tool at a time. Ranked by what the agent reads back over the whole sign-in (read the screen, type the email, type the password, tap Sign In, read the screen to see "Welcome"), since every token of it goes through the model; ties by time. Median of 10 runs, each on a freshly started app. Sign-in times step by step and batched are in The whole sign-in.

ToolTokens read (est.)Sign inSigned inRead the screenTapTool list tokens (est.)
1simulator-use 0.15.01943.50 s10 of 100.19 s0.68 s2,443
2agent-device 0.21.356646.85 s10 of 100.05 s0.88 s47,406
3mobile-mcp 1.0.159816.97 s10 of 100.42 s0.77 s7,129
4MobileBuildMCP 2.7.11,56112.26 s10 of 100.62 s2.37 s6,193
5Maestro MCP 2.12.02,9879.19 s10 of 100.13 s1.58 s3,063
6Argent 0.31.07,1296.63 s10 of 100.19 s0.66 s42,531
7Xcode MCP 27.0 (27A266a)12,7323.58 s10 of 100.09 s0.71 s19,620
8AXe 1.8.0110,3199.21 s10 of 100.86 s1.72 snone (CLI)

The runs went in this order: simulator-use, AXe, MobileBuildMCP, mobile-mcp, agent-device, Argent, Xcode MCP, then the second runs under Not ranked here, then Maestro MCP and AXe's last run: their first tries stopped before any call, with the Simulator found shut down after its reboot. Tokens are estimates: characters / 4 for text (no Anthropic API key was set for this run), width * height / 750 for an image.

simulator-use against each tool, one page each: compare.

Read the screen

The tool's own screen read, 20 times on the unchanged sign-in screen, after one warm-up read.

ToolMedianp90Tokens (est.)Showed the screen
agent-device 0.21.350.05 s0.05 s13120 of 20
Xcode MCP 27.0 (27A266a)0.09 s0.09 s2,41020 of 20
Maestro MCP 2.12.00.13 s0.14 s1,11620 of 20
simulator-use 0.15.00.19 s0.25 s7220 of 20
Argent 0.31.00.19 s0.21 s65820 of 20
mobile-mcp 1.0.150.42 s0.42 s37520 of 20
MobileBuildMCP 2.7.10.62 s0.70 s38620 of 20
AXe 1.8.00.86 s0.92 s44,86920 of 20

Tap a button

Sign In with empty fields, 20 times, each after a fresh start of the app and an untimed read. The app's own log confirms each tap. "Shows the result" counts answers that hold the new status text, "Invalid email or password", in the answer itself or in the file it names for the agent to open.

ToolMedianp90Shows the resultTokens (est.)Landed
Argent 0.31.00.66 s0.74 s20 of 2064720 of 20
simulator-use 0.15.00.68 s0.81 s20 of 201720 of 20
Xcode MCP 27.0 (27A266a)0.71 s0.77 s20 of 202,40220 of 20
mobile-mcp 1.0.150.77 s0.79 s0 of 20620 of 20
agent-device 0.21.350.88 s1.26 s20 of 203820 of 20
Maestro MCP 2.12.01.58 s1.60 s0 of 205120 of 20
AXe 1.8.01.72 s1.88 s0 of 201820 of 20
MobileBuildMCP 2.7.12.37 s2.45 s0 of 208820 of 20

Type into a field

gary@example.com into Email, 10 times, each on a fresh app: the tool's fill call, or a tap on the field and a type call where that is its way. The tool's next read must show the text.

ToolMedianp90CallsTokens (est.)Text shown
Xcode MCP 27.0 (27A266a)1.13 s1.15 s12,57910 of 10
simulator-use 0.15.01.14 s1.19 s11410 of 10
AXe 1.8.01.98 s2.10 s21810 of 10
agent-device 0.21.352.48 s2.52 s116710 of 10
mobile-mcp 1.0.152.52 s2.54 s21310 of 10
MobileBuildMCP 2.7.13.15 s3.33 s19310 of 10
Argent 0.31.03.58 s3.62 s22,19010 of 10
Maestro MCP 2.12.03.62 s4.00 s15110 of 10

The whole sign-in

Step by step, one call per action; and batched, the three actions in the tool's own batch or sequence call where it has one. Signed in means the final read showed "Welcome, gary@example.com" and the app logged the sign-in.

ToolStep by stepTokens (est.)Signed inBatchedTokens (est.)Signed in
simulator-use 0.15.03.50 s19410 of 102.87 s17910 of 10
Xcode MCP 27.0 (27A266a)3.58 s12,73210 of 10no batched run
Argent 0.31.06.63 s7,12910 of 104.37 s2,97110 of 10
agent-device 0.21.356.85 s66410 of 105.99 s32710 of 10
mobile-mcp 1.0.156.97 s98110 of 106.97 s1,03010 of 10
Maestro MCP 2.12.09.19 s2,98710 of 107.56 s2,88510 of 10
AXe 1.8.09.21 s110,31910 of 104.63 s110,2738 of 10
MobileBuildMCP 2.7.112.26 s1,56110 of 10no batched run

Not ranked here

The second runs. AXe and MobileBuildMCP ran again with Device Hub open, because AXe's README says: "Xcode 27 simulator automation uses Device Hub; Simulator.app is not required." With Device Hub open, their taps mostly did not reach the app. Run once more at the end, with Device Hub closed, both passed again. So on this Mac the headless runs, which every tool had, are the ones ranked.

ToolConditionWhat happened
AXe 1.8.0Second run; Device Hub opensigned in 0 of 10; taps that reached the app 6 of 20; typings shown 3 of 10; screen reads 20 of 20 (median 0.85 s); batched sign-ins 1 of 10
MobileBuildMCP 2.7.1Second run; Device Hub opensigned in 0 of 10; taps that reached the app 9 of 20; typings shown 7 of 10; screen reads 20 of 20 (median 0.62 s)
MobileBuildMCP 2.7.1Third run; Simulator headless againsign-in 17.97 s; signed in 10 of 10; taps that reached the app 20 of 20; typings shown 10 of 10; screen reads 20 of 20 (median 0.84 s)
AXe 1.8.0Third run; Simulator headless againsign-in 5.91 s; signed in 10 of 10; taps that reached the app 20 of 20; typings shown 10 of 10; screen reads 20 of 20 (median 0.62 s); batched sign-ins 9 of 10

Before the first call

What the server's tool list and instructions cost an agent's context in every session, before it does anything.

ToolToolsDefinitionsInstructionsTokens in all (est.)
AXe 1.8.0CLInone
simulator-use 0.15.0122,0753682,443
Maestro MCP 2.12.0102,5525113,063
MobileBuildMCP 2.7.1365,6165776,193
mobile-mcp 1.0.15356,8522777,129
Xcode MCP 27.0 (27A266a)5319,6081219,620
Argent 0.31.07742,27725442,531
agent-device 0.21.356246,99840847,406
ToolSetup its docs ask for
AXe 1.8.0none
MobileBuildMCP 2.7.1none
simulator-use 0.15.00.12 s
Maestro MCP 2.12.00.59 s
Xcode MCP 27.0 (27A266a)4.21 s
mobile-mcp 1.0.1516.33 s
agent-device 0.21.3534.72 s
Argent 0.31.083.92 s

Setup is what a tool's instructions say to do before the first action (open a session, pick or boot the device); its time is not in any number above.

What each tool is

From each tool's own README, license and docs, read on October 31, 2026; the sources are linked in each row.

ToolLicenseBuilds the appRuns testsScreen as textCloud optionSources
simulator-useMITYes, Xcode projects (app_run)XCTest and XCUITest, case by caseOne line per elementNoMac's cloud iPhoneREADME, LICENSE
AXeMITNoNoThe accessibility tree as JSONNone in its docsREADME, LICENSE, docs
MobileBuildMCPMITYes, for the SimulatorYes, on the SimulatorTap targets with refsNone in its READMEREADME, LICENSE
mobile-mcpApache 2.0; built on mobilecli, which is under the Functional Source License 1.1No; installs an .app, .ipa, .apk or .zipNone in its READMEOne line per element, with refsMobile Next Cloud, real iOS and Android devicesREADME, LICENSE, mobilecli LICENSE
agent-deviceMITNo; installs a built appReplays its own .ad scriptsSnapshots with refs, and diffs after actionsA remote proxy, or device clouds (BrowserStack, AWS Device Farm, TestMu AI, Limrun)README, LICENSE
ArgentApache 2.0 source; its simulator-server and ax-service binaries are proprietaryReact Native projectsRecords and replays its own e2e testsAn element tree, and a screenshot after each actionArgent CloudREADME, LICENSE, tools
Maestro MCPApache 2.0NoMaestro flowsA compact JSON view hierarchyMaestro Cloud runs flowsREADME, MCP docs
Xcode MCPPart of XcodeYes (BuildProject)Yes (RunAllTests, RunSomeTests)A UI hierarchy file per interaction, by pathNone in its docsApple docs, Xcode 27 notes, its tool list

What each tool needs

Every tool here needs a Mac with Xcode and an iOS Simulator runtime for the iOS Simulator. Quoted needs come from the sources above.

ToolVersion testedHow it was runNeeds besides Xcode
simulator-use0.15.0simulator-use mcpNode 20. Its engine is built on AXe's frameworks, bundled; "there is no test runner to build"
AXe1.8.0the axe command, one process per step (it has no MCP server)macOS 14 or later. "Xcode 27 simulator automation uses Device Hub; Simulator.app is not required"
MobileBuildMCP2.7.1mobilebuildmcp mcp with its ui-automation workflow on (off by default)macOS 14.5, Xcode 16, Node 18. Reads and taps through its bundled AXe (its docs)
mobile-mcp1.0.15its npm package's server (npx @mobilenext/mobile-mcp in its README)Node 20 and the Xcode command line tools. On iOS, mobilecli's on-device agent "is required for touch input ... and UI tree inspection" (mobilecli README)
agent-device0.21.35agent-device mcpNode 22.12. "A local accessibility bridge for iOS Simulator snapshots and XCTest for iOS interactions"
Argent0.31.0argent mcpNode 20.12 (its docs). Software Mansion's proprietary simulator-server and ax-service binaries
Maestro MCPMaestro 2.12.0maestro mcpJava 17. It "installs and communicates with a small companion driver app on the device" (its docs)
Xcode MCPXcode 27.0 (27A266a)xcrun mcpbridge, headlessXcode 27 with sudo xcrun mcp-server enable (Xcode 27 release notes), or Xcode open with "Allow external agents to use Xcode tools" turned on

How each tool was driven

Each tool's own calls, chosen from its README, its tool descriptions or the hints in its answers. The code is in bench/tools.

Method

Every run was on one Mac, one tool at a time, with every other tool's processes ended and the Simulator shut down and booted again before it. AXe and MobileBuildMCP ran a second time with Device Hub open. The harness speaks MCP over stdio to the tool's own server, as an agent's client does, and times each call from the request sent to the answer received (AXe has no MCP server, so its command ran once per step, timed from start to exit). Every tool used its own read, its own way to tap and type (by id where it has one, at coordinates where that is its way), its own settle and verify options, and the setup its docs or its own hints ask for. A tap or a sign-in counts only when the app's own log shows it, a check that uses no accessibility; a step that failed is reported, never retried.

Tokens are what the agent reads back: the answer's text as characters / 4 (no Anthropic API key was set for this run; the harness counts with Anthropic's token counting API when one is), an image as width * height / 750, and for Xcode the hierarchy file its answer points to, which its own skill says to read after every interaction. Medians are the middle value; p90 is the 90th percentile by nearest rank.

MacApple M5 Pro (Virtual), 6 cores, 8 GB of memory (VirtualMac2,1, a NoMac Session Mac)
macOS26.6.2 (25G83)
XcodeXcode 27.0 (27A266a)
SimulatoriPhone 17 Pro, iOS 27.0 (24A434), booted with simctl; Device Hub closed unless a row says otherwise
Node24.20.0
Date2026-11-01
Tokensestimates: text as characters / 4 (no Anthropic API key was set for this run), images as width * height / 750

The harness and every call it made: bench, with the raw results in bench/results/2026-11-01 (each file records its Mac, Simulator, versions and whether Device Hub was open). bash bench/setup.sh, then bash bench/run-all.sh, runs it again on any Mac with Xcode; node bench/summarize.mjs and node bench/page.mjs turn the results into these tables.