An agent that taps, types and reads.
mobilerun runs an agent on a real phone that taps, types and reads any app. Pick the model that drives it per task: mobile-agent-fast, mobile-agent-thinking, or a Claude, Gemini, GPT or Kimi model. 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 |
| Pick the model | Pick the model per task with llmModel: mobile-agent-fast, mobile-agent-thinking, or a Claude, Gemini, GPT or Kimi model. Usage is billed from your credits, no provider key needed. | llmModel |
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', poll tasks.getStatus(task.id) 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
- Turn on recordingEnabled to keep a video of the whole run
- Screenshots, tool calls and typed output, kept as an audit trail
- See full observability →
import { TaskTrajectoryDecoderStream } from '@mobilerun/sdk/lib/trajectory-decoder-stream'
const res = await client.tasks.attach(task.id).asResponse() // live SSE
const events = res.body!
.pipeThrough(new TextDecoderStream())
.pipeThrough(new TaskTrajectoryDecoderStream())
.getReader()
while (true) {
const { done, value } = await events.read()
if (done) break
if (value.event === 'ScreenshotEvent') {
save((value.data as { url: string }).url) // what the agent just saw
}
} Pick the model, per task
- mobile-agent-fast for quick, repeatable taps and reads
- mobile-agent-thinking when a flow needs a plan before it acts
- Or pick a Claude, Gemini, GPT or Kimi model instead
- Every model drives real apps on a real device, step by step
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.
Which model drives the agent?+
How does one task run?+
How is agent usage billed?+
Also on the platform: real devices · observability · the framework · plans and credits
Give your agent a phone.
One API call runs the task on a real device, driven by the model you pick. Plug the same agent into your editor over MCP.