agent-device mcp starts the official stdio MCP server. It is one entry point to the same runtime as the CLI and the typed Node.js API, so sessions, evidence and replay behave the same in all three.Give your agent eyes and hands. On the real app.
agent-device lets coding agents run, read and operate real iOS, Android, TV and desktop apps. Ask for a change, and your agent builds it, checks it on the device and brings back evidence you can review.
npm i -g agent-deviceImplement the onboarding screen, run it on the iOS simulator and Android emulator, and attach screenshots.
- agent-device
open MyApp --platform ios - agent-device
snapshot -i - agent-device
screenshot ./onboarding-ios.png - agent-device
open MyApp --platform android - agent-device
snapshot -i - agent-device
screenshot ./onboarding-android.png - agent-device
close
Add a contact named Ada in the iOS Contacts app, verify it saved, and attach evidence.
- agent-device
open Contacts --platform ios --save-script - agent-device
snapshot -i@e2 [button] "Add" - agent-device
record start - agent-device
press @e2 --settle+ @e7 [text-field] "First name" - agent-device
fill @e7 "Ada" --settle+ @e14 [text-field] "Ada" - agent-device
screenshot ./contact-form.png - agent-device
record stop - agent-device
close
Check whether this change causes unnecessary React Native re-renders.
- agent-device
open MyApp --platform ios - agent-device
react-devtools profile start - agent-device
fill 'id="catalog-search"' "tart" --delay-ms 100 - agent-device
react-devtools profile stopReact profile 8.3s: 8 commits, 1303ms rendering, 8 over 16ms (worst #6 188ms)1. memo-defeated ContactRow: memo bypassed on 480/480 updates - agent-device
react-devtools profile report ContactRow
Works with iOS, Android, HarmonyOS, tvOS, Android TV, Fire TV, Vega OS, macOS, Linux, Web, React Native, Expo, Flutter.
Used by teams at
Expensify
Shopify
MetaMask
Uniswap
Expo
T3 Code
TesterArmy
[01] Why agent-device
Agents write the code now. Verification is what slows shipping.
Coding agents turn out changes faster than anyone can check them on a phone. A mobile change only proves itself on a simulator or a device, and that is the one place agents could not go.
So the checking falls back on people: review rounds to ask whether it was run, QA passes on test builds, regressions found by users. agent-device moves that check to the agent, with evidence attached.
[02] The loop
Where agent-device fits in shipping with agents.
The same loop runs on every change. agent-device is the step where the agent checks its work on the real app, and leaves proof for the people who ship it.
- 01
Task
You, or an issue, describe the change.
- 02
Code
The agent writes and reviews the change.
- 03
Verify
The agent runs the app, checks the change on the device and records what it saw.
agent-device - 06
Feedback
Crashes, bugs and slow screens come back as the next task, with a repro.
agent-device - 05
Review and ship
People review proof instead of a description, and merge.
- 04
Evidence
Screenshots, video, logs and a replay script land on the pull request.
agent-device
[03] While the agent builds
It checks its own work. Before you see it.
Ask for a change and the agent runs it on the simulator, reads the screen, taps through the flow and fixes what it finds. You get a change that already ran, and fewer rounds of review.
An agent skill reproduces each bug, records before and after video, replays an .ad script, measures Sentry spans and profiles React renders, as evidence on the pull request.
- Screenshotcontact-form.png
screenshot - Videorecording.mp4
record stop - Replaycontacts.ad
--save-script
[04] On every pull request
Verification that runs itself. On every pull request.
Save a run that worked as an .ad script and replay it in CI with no model in the loop, or run a QA agent against each build. Reviewers get screenshots, logs and a JUnit report, on simulators or hosted devices.
context platform=ios timeout=60000
env APP_TARGET="Agent Device Tester"
open "${APP_TARGET}" --relaunch
click "label=\"Form\""
fill id="field-name" "Ada Lovelace"
fill id="field-email" "ada@example.com"
click id="submit-order"
wait "Order summary" 5000agent-device test ./workflows --reporter junit:./tmp/junit.xml[05] From production back to the agent
When something breaks, the agent brings a repro.
Hand the agent the crash or the slow screen. It reproduces it on the device, captures the logs and network from that moment, and profiles the renders, so the fix starts from evidence.
Debugging and profilingReact profile 8.3s: 8 commits, 1303ms rendering, 8 over 16ms (worst #6 188ms)
memo bypassed on 480/480 updates; new highlight (object) 480x, onSelect (function) 480x from ContactList
Fix wrap those props in useCallback/useMemo in ContactList
[06] Who uses it
In their repos, on their apps.
Expensify
An agent skill reproduces each bug, records before and after video, replays an
.adscript, measures Sentry spans and profiles React renders, as evidence on the pull request.T3 Code
Simulator and emulator support in T3 Code is built on agent-device.
TesterArmyThe mobile engine of the e2e testing agent,
@e2e-dev/mobile, runs on agent-device.
[07] Run anywhere
Same commands. Any device, anywhere.
Your agent keeps the same agent-device workflow when it leaves your laptop: replay in CI, run from Linux against a Mac that hosts the simulators, or drive hosted devices in a device cloud.
- 01
On your machine
Simulators, emulators and physical devices on your Mac or Linux box. Sessions follow your git worktree, so parallel agents don’t take over each other’s devices.
agent-device open MyApp --platform ios - 02
On every pull request
Replay saved
.adscripts withagent-device test, keep screenshots and logs as artifacts, and report to JUnit.agent-device test ./workflows - 03
On a device host
Run the agent on Linux or in a cloud workspace and execute on the Mac or Linux host that has the devices, through the remote proxy.
agent-device proxy --port 4310 - 04
On hosted devices
The same commands drive BrowserStack, AWS Device Farm, TestMu AI and Limrun devices through provider plugins.
agent-device connect limrun --platform ios
[08] Watch and learn
Closing the loop, from the people building it.
CallstackThe Missing QA Loop for Mobile AgentsInterview with Michał Pierzchała
Agent Conf 2026KeynoteMike Grabowski and Michał Pierzchała
next app devCon 2026Automating Mobile QA with Cloud AgentsMichał Pierzchała
React Summit 2026Giving AI Agents Hands: Mobile Feedback Loops with Agent DeviceMike Grabowski
Ship 26 LondonCloud agents that test mobile apps on real devicesVercel
CallstackAgent Device: AI agents meet mobile automationCallstack livestream
[09] FAQ
Frequently asked questions
- Is there an MCP server?
- Yes.
- Does it work with React Native, Expo, Flutter and native apps?
- Yes. It drives native iOS and Android apps and React Native, Expo and Flutter apps on supported targets. The commands and evidence vary by target;
agent-device capabilities --platformlists them. - How is it different from Appium, Detox or Maestro?
- With agent-device an agent reads the app and chooses each command at run time. Appium, Detox and Maestro run suites people write and maintain. agent-device complements them: save a run as an
.adscript or export it as strict Maestro YAML. - Can it run in CI?
- Yes. Record a run as an
.adscript, replay it in CI withagent-device test, and keep the screenshots and logs as artifacts. The EAS Workflows template is a working example. - Can I build my own agent or QA product on it?
- Yes. The typed Node.js client is a public surface over the same runtime, with AI SDK tools and an Eve integration on top. TesterArmy e2e and T3 Code build on it.
- Can several agents share one machine?
- Yes. Sessions are scoped to the git worktree, and device claims stop parallel agents from taking over each other’s simulators and emulators.
agent-device device statusshows who holds what.
Read more