An agent that taps, types and reads.
mobilerun runs an agent on a real phone that taps, types and reads any app. It ships as two agent models, fast and thinking, and it is driven by the LLM of your choice. One API call runs the task.
One call, a real run.
| Capability | What it does | In the API |
|---|---|---|
| Run a task | One API call drives the app: client.tasks.run({ deviceId, task }). Toggle reasoning, vision, maxSteps and stealth per call. | client.tasks.run |
| Structured output | Pass an outputSchema and the agent returns typed JSON, not a screenshot for you to parse. The task hands back the data you asked for. | outputSchema → JSON |
| Reads the screen | The agent reads the accessibility tree, not just pixels. Fewer tokens and cleaner steps than a vision-only run, with vision still there when a screen needs it. | a11y tree |
| Your LLM | Drive the agent with the LLM of your choice: Claude, Gemini, GPT, Kimi or Grok. Bring the key, keep the model call yours. | bring your own |
One sentence in, a real run out.
No flow to build, no selectors to maintain. Post the task, pick the model, get the run back. Attach to it for the live trajectory.
import Mobilerun from '@mobilerun/sdk'
const client = new Mobilerun() // reads MOBILERUN_CLOUD_API_KEY
const task = await client.tasks.run({
deviceId: 'dev_...',
task: 'Open DoorDash and reorder my usual',
})
console.log(task.status) // queued -> running -> completed It screenshots when it needs to look.
The agent reads the accessibility tree first, so most steps stay fast and cheap. When a screen needs eyes it takes a screenshot, and every shot is pinned to the step that produced it. Watch it live, or replay the whole run after.
Live view
- Attach to a running task and watch the device in real time
- Every step streams a screenshot as the agent takes it
- Step in by hand with tap, type and swipe when you need to
Step trajectory
- Each step is an event: queued, screenshot, tool call, result
- Click a step to see exactly what the agent saw and did
- No more guessing why a run failed on step 47
Replay & history
- Scrub the full recording once the run finishes
- Screenshots, tool calls and typed output, kept as an audit trail
- See full observability →
const stream = await client.tasks.attach(task.id) // live SSE
for await (const event of stream) {
if (event.type === 'ScreenshotEvent') {
save(event.screenshotUrl) // what the agent just saw
}
} Two agent models, one runtime
- mobile-agent-fast for quick, repeatable taps and reads
- mobile-agent-thinking when a flow needs a plan before it acts
- Both drive real apps on a real device, step by step
- The agent layer is ours, the LLM underneath stays yours
Same agent, in your editor
- A hosted MCP server plugs the agent into Claude Code, Cursor and VS Code
- Remote MCP at api.mobilerun.ai/v1/mcp, authorized with a Bearer key
- Same runtime, same real devices, from the tools you already use
- No local daemon to babysit, no setup to keep alive
Agents, common questions.
Do you ship your own LLM?+
What is the difference between fast and thinking?+
How does one task run?+
Why read the accessibility tree instead of pixels?+
Does the agent take screenshots?+
Can I run the agent from my editor?+
Also on the platform: real devices · observability · the framework · pricing
Give any LLM a phone.
One API call runs the task on a real device, driven by the LLM you choose. Plug the same agent into your editor over MCP.