Mobilerun Docs Reference
droidrun/mobilerun
Answers questions about Mobilerun, the LLM-agent framework for automating Android and iOS devices, by pointing the agent to the right page of its v5 documentation.
Interact with an iOS simulator, Android emulator, or Chromium (CDP) app using argent MCP tools.
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install bbplayer-app/BBPlayer argent-device-interact --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/argent-device-interact .claude/skills/argent-device-interact && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .claude/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interactType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install bbplayer-app/BBPlayer argent-device-interact --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/argent-device-interact .agents/skills/argent-device-interact && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .agents/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install bbplayer-app/BBPlayer argent-device-interact --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/argent-device-interact .cursor/skills/argent-device-interact && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .cursor/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/bbplayer-app/BBPlayer.git --path .agents/skills/argent-device-interact--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install bbplayer-app/BBPlayer argent-device-interact --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/argent-device-interact .gemini/skills/argent-device-interact && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .gemini/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install bbplayer-app/BBPlayer argent-device-interactInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/argent-device-interact .github/skills/argent-device-interact && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .github/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install bbplayer-app/BBPlayer argent-device-interact --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bbplayer-app/BBPlayer.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/argent-device-interact .opencode/skills/argent-device-interact && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "argent-device-interact" agent skill from https://github.com/bbplayer-app/BBPlayer/tree/dev/.agents/skills/argent-device-interact into .opencode/skills/argent-device-interact/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "argent-device-interact", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
argent-device-interactInteract with an iOS simulator, Android emulator, or Chromium (CDP) app using argent MCP tools.
Argent Device Interact is an agent skill from bbplayer-app/BBPlayer. Interact with an iOS simulator, Android emulator, or Chromium (CDP) app using argent MCP tools. Use when tapping UI elements, performing gestures, scrolling/swiping, typing text, pressing hardware buttons, launching apps, opening URLs, taking screenshots, waiting for an element to appear or disappear, or checking visible app state after interactions. Not for TV targets.
Its SKILL.md is about 6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/chromium.md`, `references/gesture-examples.md` and `references/secrets.md`).
It sits in Mobile, covering Mobile testing and debugging and MCP servers. It works with Android and iOS. The repository describes itself as: 一款简约、好用的 BiliBili 音乐播放器。 The licence is MIT.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1e1ae9f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
adbFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
APP_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Argent Device Interact loads about 6k tokens when it runs, and up to ~7.5k if it reads all its reference files. Until then it costs about 99 tokens; SKILL.md has 2,660 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found patterns that need a careful read before installing.
See `references/chromium.md` — tabs, cookies/storage.Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from bbplayer-app/BBPlayer at commit 1e1ae9f, republished under its MIT licence (© bbplayer-app). 2,660 words, ~6,035 tokens.
.claude/skills/argent-device-interact/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.All interaction tools below accept a udid parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, chromium-cdp-<port> → Chromium (CDP) app, anything else → Android adb serial). You use the same tool names on every platform.
Chromium (CDP) app = an Electron app or a Chromium-family browser (Chrome/Brave/Edge) exposing a Chrome DevTools Protocol endpoint. The same describe/tap/keyboard/screenshot surface drives it, but scrolling, tabs, cookies and storage differ — read references/chromium.md before driving a chromium target.
If you delegate simulator tasks to sub-agents, make sure they have MCP permissions.
Use list-devices to get a target id. Results are tagged with platform (ios, android, or chromium); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call boot-device with udid (iOS), avdName (Android), or electronAppPath (boots an Electron app as a chromium device). A Chromium browser already running with a CDP port shows up directly — no boot-device needed. See argent-ios-simulator-setup / argent-android-emulator-setup for full setup flow.
Load tool schemas before first use. Gesture tools (gesture-tap, gesture-swipe, gesture-pinch, gesture-rotate, gesture-custom) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use before calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.
run-sequence.gesture-swipe for lists/scrolling, not gesture-custom, unless you need non-linear movement. On Chromium use gesture-scroll instead — gesture-swipe is touch-only. Consider whether you need multiple swipes, if yes - use run-sequence. Pass momentum: false when the swipe should decelerate before ending for a precise movement.keyboard to enter text.--- Elements after action (describe) ---); call describe only when no fresh tree is available for the current screen. It works on any screen without app restart. Do not navigate from screenshot pixels on regular in-app screens unless the tree failed to expose a reliable target. Use native-describe-screen only when you need app-scoped UIKit properties.Never navigate to an app by tapping home-screen icons. Use launch-app or open-url — they are instant and reliable.
{ "udid": "<UDID>", "bundleId": "com.apple.MobileSMS" }Common IDs: com.apple.MobileSMS (Messages), com.apple.mobilesafari (Safari), com.apple.Preferences (Settings), com.apple.Maps, com.apple.Photos, com.apple.mobilemail, com.apple.mobilenotes, com.apple.MobileAddressBook (Contacts)
{ "udid": "<UDID>", "url": "messages://" }Common schemes: messages://, settings://, maps://?q=<query>, tel://<number>, mailto:<address>, https://... (Safari)
| Action | Tool | Notes |
|---|---|---|
| Multiple actions | run-sequence | Batch steps in one call (no intermediate screenshots) |
| Open an app | launch-app | Always — never tap home-screen icons |
| Restart an app | restart-app | Terminate and relaunch by bundle ID |
| Open URL/scheme | open-url | Web pages, deep links, URL schemes |
| Single tap | gesture-tap | Buttons, links, checkboxes |
| Scroll/swipe | gesture-swipe | Straight-line scroll or swipe |
| Scroll (Chromium) | gesture-scroll | Wheel-based; deltas are window fractions, positive deltaY = down |
| Drag (Chromium) | gesture-drag | Sliders, drag-and-drop, text selection |
| Long press | gesture-custom | Context menus, drag start |
| Drag & drop | gesture-custom | Complex drag interactions |
| Pinch/zoom | gesture-pinch | Two-finger pinch with auto-interpolation |
| Rotation | gesture-rotate | Two-finger rotation with auto-interpolation |
| Custom gesture | gesture-custom | Arbitrary touch sequences, optional interpolation |
| Hardware key | button | Home, back, power, volume, appSwitch, actionButton |
| Type text | keyboard | Every platform. Text or one named key per call, never both |
| Paste text | paste | Only where a user would paste (OTP code, long link). Sim/emu only |
| Rotate device | rotate | Orientation changes |
| Shake device | shake | Shake handlers (sim/emu only), Undo-typing prompt, RN dev menu |
| Wait for UI | await-ui-element | Block until an element is visible/hidden/exists/contains text |
| Wait for idle | await-screen-idle | Block until a non-empty screen tree stops changing |
IMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, always perform proper discovery first.
| App type | Discovery tool | What it returns |
|---|---|---|
| Target app discovery | describe | Accessibility element tree for the current device screen (iOS AX-service, Android uiautomator, or Chromium DOM walker) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or bundleId required |
| React Native | debugger-component-tree | React component tree with names, text, testID, and (tap: x,y) |
| App-scoped native | native-describe-screen | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires bundleId |
| Permission / system modal overlay | describe | describe detects system dialogs automatically and returns dialog buttons with tap coordinates. Fall back to screenshot only if describe does not expose the controls |
| Final visual fallback | screenshot | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots |
Point follow-up native diagnostics after you already have a candidate point:
native-user-interactable-view-at-point: deepest native view that would receive touch at a known raw iOS point; requires bundleIdnative-view-at-point: deepest visible native view at a known raw iOS point; requires bundleIddescribe Tool FailsRead the exact error and choose the action that matches it:
ax-service not available or daemon startup failure:
the ax-service daemon could not start. Check that the simulator is booted. Use screenshot as a temporary fallback, or use native-describe-screen with an explicit bundleId if the app has native devtools injected.describe returns an empty element list:
the screen may be blank, loading, or showing content without accessibility labels. Use screenshot to see what is visible, then retry after the content has loaded.describe succeeds but is not detailed enough for a React Native app:
use debugger-component-tree next.accessibilityIdentifier, viewClassName):
use native-describe-screen with an explicit bundleId. This requires native devtools (dylib) injection.native-user-interactable-view-at-point. Use native-view-at-point when you want the visually deepest view instead of the hit-test target.{ "udid": "<UDID>", "x": 0.5, "y": 0.5 }Coordinates: 0.0 = left/top, 1.0 = right/bottom.
Before tapping near the bottom of the screen in React Native apps, check that "Open Debugger to View Warnings" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.
{ "udid": "<UDID>", "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 }Swipe up (fromY > toY) = scroll content down. Default duration: 300ms. Optional: "durationMs": 500 for slower swipe.
"momentum" defaults to true (a natural flinging swipe). Pass "momentum": false for a momentum-free swipe: the finger decelerates into the end point, resulting in little to no fling. It needs durationMs of at least 150 and is rejected below it.
{ "udid": "<UDID>", "centerX": 0.5, "centerY": 0.5, "startDistance": 0.2, "endDistance": 0.6 }All values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. startDistance: 0.2 means fingers start 20% of the screen apart; endDistance: 0.6 means they end 60% apart. startDistance < endDistance = pinch out (zoom in). startDistance > endDistance = pinch in (zoom out). Defaults: angle: 0 (horizontal), durationMs: 300. Optional: "angle": 90 for vertical axis, "durationMs": 500 for slower pinch, "endCenterX"/"endCenterY" to let the centroid drift to a new center over the gesture (omitted = fixed center).
{
"udid": "<UDID>",
"centerX": 0.5,
"centerY": 0.5,
"radius": 0.15,
"startAngle": 0,
"endAngle": 90
}All positions and radii are normalized 0.0–1.0 (fractions of screen, not pixels). radius: 0.15 means each finger is 15% of the screen away from center. endAngle > startAngle = clockwise. Default duration: 300ms. Optional: "durationMs": 500 for slower rotation, and "radiusX"/"radiusY" (fractions of screen width/height; give both — they override radius) with radiusX·width = radiusY·height for a physically circular orbit — a single radius traces a physical ellipse on a non-square screen, coupling a slight pinch into the turn.
For long-press, drag-and-drop, and other complex sequences, see references/gesture-examples.md. Set "interpolate": 10 to auto-generate smooth intermediate Move events between keyframes.
{ "udid": "<UDID>", "button": "home" }Values: home, back, power, volumeUp, volumeDown, appSwitch, actionButton
{ "udid": "<UDID>", "text": "search query" }One call does one action. text and key are mutually exclusive, and a call that carries both is rejected with nothing typed. To type and then submit, send two keyboard steps in one run-sequence (§ 8) — { "text": "search query" }, then { "key": "enter" }. Two separate calls do the same work, but cost an extra round-trip.
Special keys: enter, escape, backspace, tab, space, arrow-up, arrow-down, arrow-left, arrow-right, f1–f12. Optional: "delayMs": 100 between keystrokes (default 50ms) — applies to the iOS simulator and Chromium; it is ignored on Android phones/tablets (typed via adb input text, no per-key cadence), on Vega, and on TV targets.
Typing secrets. To enter a credential without its plaintext ever entering your context, transcript, or logs, use a secret placeholder in text (works in keyboard, paste, run-sequence keyboard steps, and flow type steps):
{ "udid": "<UDID>", "text": "{{secret:APP_PASSWORD}}" }Where the value is read from, and the rules for using a placeholder — including not screenshotting the field afterwards — are in references/secrets.md. Read it before typing any credential.
{ "udid": "<UDID>", "text": "482913" }Puts text on the device clipboard (the host clipboard is untouched) and triggers the platform's paste shortcut. iOS simulator and Android emulator only; a TV target, a physical device, Chromium and Vega are rejected.
paste is not a faster keyboard. keyboard types the way a user types and stays the default for every text entry — a search query, a login, a form field. Reach for paste only where a real user would paste: a 2FA / OTP code copied from another app, a long link or token, or to test how the app handles pasted input. It also carries what keyboard can't type on a given platform (multi-line text, non-ASCII on Android), but that alone is not a reason to paste — ask whether the user would.
Tap the field first so it has focus; pasting with no focused field is a silent no-op, as with keyboard. text accepts the same {{secret:<NAME>}} placeholders as keyboard, with the same auto-screenshot skip.
{ "udid": "<UDID>", "orientation": "LandscapeLeft" }Values: Portrait, LandscapeLeft, LandscapeRight, PortraitUpsideDown
Never poll screenshot/describe in a loop to wait for something. Use await-ui-element: it blocks server-side on the same tree describe reads. It has no bare-timer mode by design — for a plain pause, use your own harness sleep.
{ "udid": "<UDID>", "condition": "visible", "selector": { "text": "Continue" } }The tool's own description carries the conditions, selector matching, defaults and return shape. What it does not tell you:
hidden check that succeeds immediately may be a false pass — its note then says the selector never matched anything at all. Treat that as a failed check and fix the selector; do not read it as "the element went away".ROOT container describe prints is never matched, so a role like AXGroup/html won't trivially "match the screen".role to a text role like StaticText — that skips a same-named button.text timeout the note quotes the text of the element the check actually read, so you can see which match it landed on.Use after launch/navigation and before a raw tap, when an early-painted element may still be moving:
{ "udid": "<UDID>", "timeoutMs": 3000, "minStableMs": 250 }On local iOS, Android, and Chromium, the tool waits for a non-empty describe tree to stop changing. Continue only when settled: true. Pair it with a destination-specific await-ui-element; stillness does not identify a screen.
Use it only for live diagnosis. Do not record it or put it in run-sequence. Flows use await: { idle: true }, which also compares pixels. This live tool can return during a presentation-layer animation.
Use the explicit screenshot tool only when:
describe did not expose reliable targets.When using screenshot for permission or native modal navigation:
describe.Allow, OK, Don't Allow, Not Now, or Continue.describe, native-describe-screen, or debugger-component-tree.Prefer the dialog over the Settings tool. When the app triggers its own permission prompt, answering it here is the real user path — do that. Reach for the
settings-permissionstool only when you can't get to the change through the app: pre-authorize/deny a permission before the app asks, re-enable one the user already denied (iOS won't re-prompt), or reset it so the prompt reappears. See theargent-settings-permissionsskill.
Optional rotation parameter: { "udid": "<UDID>", "rotation": "LandscapeLeft" } — rotates the capture without changing simulator orientation.
Screenshots are downscaled by default (30% of original resolution) to reduce context size. Use the normal downscaled screenshot for UI context and state checks. scale accepts values from 0.01 to 1.0, but do not use scale: 1.0 as a general readability or tapping aid.
Use full-resolution screenshots only when saving baseline/current PNG files for comparison. In that case, suppress the image block so the full-size PNG is not loaded into agent context:
{ "udid": "<UDID>", "scale": 1.0, "includeImageInContext": false }For visual regression checks, before/after screenshot comparisons, and detailed screenshot-diff parameter guidance, use the argent-screenshot-diff skill. Keep this skill focused on device interaction mechanics and screenshot capture.
| Problem | Solution |
|---|---|
| Screenshot times out | Restart the simulator-server via stop-simulator-server tool |
| No booted iOS simulator | Call boot-device with the iOS udid |
| No ready Android device | Call boot-device with avdName |
run-sequenceUse run-sequence to batch multiple interaction steps into a single tool call. Only one screenshot is returned — after all steps complete.
Do not use run-sequence when any step depends on observing the result of a previous step.
run-sequencegesture-tap, gesture-swipe, gesture-scroll, gesture-drag, gesture-custom, gesture-pinch, gesture-rotate, button, keyboard, paste, rotate, shake, tv-remote, await-ui-element
The udid is shared — do not include it in each step's args. Optional delayMs per step (default 100ms).
Add an await-ui-element step to gate a later tap on a screen transition (e.g. tap → wait for the next screen's button → tap it). If its condition is not met before the timeout, the sequence stops at that step and the following steps do not run — so a mistimed tap can't fire against a screen that never settled.
Scroll down three times:
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } }
]
}Type into a focused field and submit. This is the only way to mix text and a key, because one keyboard call cannot carry both:
{
"udid": "<UDID>",
"steps": [
{ "tool": "keyboard", "args": { "text": "hello world" } },
{ "tool": "keyboard", "args": { "key": "enter" } }
]
}Tap a known button, then scroll down:
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-tap", "args": { "x": 0.5, "y": 0.15 } },
{
"tool": "gesture-swipe",
"args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 },
"delayMs": 300
}
]
}Tap, wait for the next screen, then act on it — the await-ui-element step gates the tap after it:
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-tap", "args": { "x": 0.5, "y": 0.9 } },
{
"tool": "await-ui-element",
"args": { "condition": "visible", "selector": { "text": "Continue" } }
},
{ "tool": "gesture-tap", "args": { "x": 0.5, "y": 0.5 } }
]
}Prefer this over a fixed delayMs when a step depends on a screen transition: it adapts to real load time, and if the condition is not met before the timeout the sequence stops there so the next tap can't fire against a screen that never settled.
Stops on the first error (or unmet await-ui-element condition) and returns partial results.
adb reverse tcp:8081 tcp:8081 on the device before the RN app starts, or Metro won't be reachable from the device. See argent-metro-debugger for the full workflow. Re-run if the device restarts.reinstall-app on Android always installs with -g so runtime permissions are pre-granted on first launch — no flag to pass.describe throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to screenshot.reinstall-app: pass .apk absolute path on Android; .app directory on iOS.See references/chromium.md — tabs, cookies/storage.
(no iOS-only gotchas collected here yet — add them as they come up)
© bbplayer-app, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in .agents/skills/argent-device-interact of bbplayer-app/BBPlayer.
Open the folder on GitHubat commit 1e1ae9f
Argent Device Interact next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Argent Device Interact this skillbbplayer-app/BBPlayer | 1.1k | — | ~6k | Automated safety check: Warn | MIT | |
| Mobilerun Docs Referencedroidrun/mobilerun | 9.6k | — | ~943 | Automated safety check: Pass | MIT | |
| Appiumblokadaorg/blokada | 3.3k | — | ~3.5k | Automated safety check: Pass | MPL-2.0 | |
| Phoneagentrounak/PhoneAgent | 798 | — | ~2.2k | Automated safety check: Pass | MIT | |
| Simvynpranshuchittora/simvyn | 437 | — | ~938 | Automated safety check: Pass | MIT | |
| Mobile Automation with agent-devicenuclearpasta/react-native-drax | 714 | — | ~1.4k | Automated safety check: Pass | MIT |
droidrun/mobilerun
Answers questions about Mobilerun, the LLM-agent framework for automating Android and iOS devices, by pointing the agent to the right page of its v5 documentation.
blokadaorg/blokada
A skill your agent uses for dynamic inspection and navigation of the Blokada app through the repo-local Appium machine session.
rounak/PhoneAgent
Control a connected iPhone, iOS simulator, Android emulator, or Android device from macOS through PhoneAgent's JSON-RPC bridge.
pranshuchittora/simvyn
Operate iOS Simulators, Android Emulators, and connected mobile devices with Simvyn.
nuclearpasta/react-native-drax
Drives iOS and Android devices and simulators from the command line: open apps, snapshot the UI tree, tap, type, scroll, take screenshots and read UI info.
blokadaorg/blokada
A skill your agent uses for pulling recent Blokada app logs from a connected device, using the same share-log file exposed in Settings.
bbplayer-app/BBPlayer
Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript).
bbplayer-app/BBPlayer
Debug a JS runtime via CDP using argent debugger tools. An agent skill from bbplayer-app/BBPlayer.
bbplayer-app/BBPlayer
Optimizes a React Native app by profiling first to find real bottlenecks, then sweeping for mechanical issues.
bbplayer-app/BBPlayer
Propose multiple visual design variants for on-screen elements and let the human pick in the Argent Lens window.
bbplayer-app/BBPlayer
Create repeatable QA regression E2E tests as Argent flows from test cases, tickets, or acceptance criteria.
bbplayer-app/BBPlayer
Compare saved or live app screenshots with the argent screenshot-diff tool.
Categories
Interact with an iOS simulator, Android emulator, or Chromium (CDP) app using argent MCP tools. Argent Device Interact is an agent skill from bbplayer-app/BBPlayer. Interact with an iOS simulator, Android emulator, or Chromium (CDP) app using argent MCP tools.
Argent Device Interact fits situations like: tapping UI elements; performing gestures; scrolling/swiping; pressing hardware buttons.
Run `npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a claude-code`. Or copy the skill folder (.agents/skills/argent-device-interact in bbplayer-app/BBPlayer) into .claude/skills/argent-device-interact in your project. Claude Code loads it when a task matches its description.
Run `npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a codex`. Or copy the skill folder (.agents/skills/argent-device-interact in bbplayer-app/BBPlayer) into .agents/skills/argent-device-interact in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bbplayer-app/BBPlayer --skill argent-device-interact -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/argent-device-interact, .gemini/skills/argent-device-interact, .github/skills/argent-device-interact and .opencode/skills/argent-device-interact in your project.
Going by SKILL.md and its folder, Argent Device Interact needs the command-line tools its instructions call (adb) and credentials named APP_PASSWORD.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 1 warning(s): mentions a credentials file (ssh keys, cloud or package-manager tokens). Read the flagged lines before installing; the check is not a guarantee either way.
Argent Device Interact is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Argent Device Interact: Mobilerun Docs Reference (droidrun/mobilerun, 9.6k stars), Appium (blokadaorg/blokada, 3.3k stars), Phoneagent (rounak/PhoneAgent, 798 stars) and Simvyn (pranshuchittora/simvyn, 437 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
bbplayer-app (a GitHub organization) maintains it in bbplayer-app/BBPlayer, which has 1,126 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 6, 2026.
Source: bbplayer-app/BBPlayer on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.