Skip to main content

app_record

This tool on every surface: CLI · MCP · Python · JavaScript · Go · Java · .NET

Record the screen to a video: start, stop with a path to save it, or omit the action to ask whether a recording is running. The saved file is checked by what it holds — its frame count and duration, read from its own header — and a recorder that could not finish is reported, not saved as if it had. Android records a frame only when the screen changes, so a still screen is one frame; that is not a failure. One recording per device; ending the session finishes and discards it. A real iPhone records WebDriverAgent's screen stream, about ten frames a second at full size.

Changes the device, the app or the session: readOnlyHint is false.

Arguments​

NameTypeRequiredWhat it is
actionstring: start, stopstart or stop. Omit to ask whether a recording is running.
devicestringDevice serial to target, e.g. "emulator-5554". Omit when only one device is running.
driverstring: uiautomator2, uiautomator, wdaDriver to use: "uiautomator2" (default for Android; fast, installs a server APK on first use), "uiautomator" (Android, installs nothing, slower, cannot type), or "wda" (WebDriverAgent: iOS simulators and iPhones).
pathstringWhere to save the video, on stop — an .mp4 on this machine.
return_databooleanOn stop without a path: return the video, base64, instead of saving it — for a daemon on another machine; the CLI and pipe ask for it and save it where the caller said.

Examples​

Each is the arguments of a tools/call request; the first is shown whole.

Start recording the screen​

{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "app_record",
"arguments": {
"action": "start"
}
}
}

On an Android 15 emulator the answer's text was:

recording — stop it with action "stop" and a path

Stop, and save the video​

{
"action": "stop",
"path": "flow.mp4"
}

On an Android 15 emulator the answer's text was:

saved …/flow.mp4: 54 frames, 1.605s of video, recorded over 1.705s