Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Argent

NPM · @SWMANSION/ARGENT · SCANNED AUG 13

Drive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agent

Available components

77 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 62 of 180 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to software-mansion/argent). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 25021 tokens (~342/item across 73 items; 73 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · @swmansion/argent

# add to Claude Code
claude mcp add software-mansion-argent -- npx -y @swmansion/argent
# add to Codex CLI
codex mcp add software-mansion-argent -- npx -y @swmansion/argent
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "software-mansion-argent": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@swmansion/argent"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add software-mansion-argent --command npx --arg -y --arg @swmansion/argent
# ~/.hermes/config.yaml
mcp_servers:
  software-mansion-argent:
    command: "npx"
    args: ["-y", "@swmansion/argent"]
// mcp.json
{
  "mcpServers": {
    "software-mansion-argent": {
      "command": "npx",
      "args": [
        "-y",
        "@swmansion/argent"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 12 Aug 26 0
    • Security disclosure: unverified → fail functional
  • 11 Aug 26 +2
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 10 Aug 26 75

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 13 Aug 2026 · Analysed npm/@swmansion/argent@0.19.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo software-mansion/argent
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/software-mansion/argent/.github/workflows/publish-npm.yml@refs/heads/main
Rekor log index 2348174598
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:9a4d02ec8f334d8901437f39d4a0096c986f6a161856ad915d49d88e42af6c50262d0c14af32be65fd4e0771c53a6c764973d275650e9723bc735214f
Dependencies 180 packages
Packages resolved 180
Deprecated 1
Stale 61
Tree resolution Complete
MCP tools · 73 exposed · ~24,937 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
await-screen-idle ~226

Block until the screen has rendered content and stopped changing, or a timeout elapses. Polls the same accessibility / DOM tree as `describe` every pollIntervalMs (default 200ms) until it has content and that content holds identical for minStableMs (default 250ms), or timeoutMs (default 3000ms) is reached. Returns { settled, waitedMs, polls } — settled=false means the screen never went still before the timeout. Use after a launch/navigation to wait for the UI to render before screenshotting or tapping.

NameTypeReqDescription
minStableMsintegerThe screen must hold the same content for at least this long to count as settled (default 250).
pollIntervalMsintegerHow often to re-read the tree (default 200).
timeoutMsintegerMax time to wait for the screen to settle before giving up (default 3000).
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, or Chromium id).

No output schema declared.

No examples provided.

await-ui-element ~685

Block until a UI element reaches an expected state or a timeout elapses, so you don't have to poll screenshot/describe yourself. Conditions: exists — the selector matches an element anywhere in the tree. visible — the selector matches an element with a non-zero on-screen frame. hidden — the selector matches nothing, or only a zero-area element (e.g. a spinner that disappeared). text — the first VISIBLE match in reading order (topmost, then leftmost; falling back to the first match overall if none is visible) contains expectedText (case-insensitive substring), or exactly matches it when textMatch is `equals`. A loose selector can match several elements; only that one is inspected, so if a different match is the one holding the text the wait still reports failure — narrow the selector to target it. The selector is { text?, identifier?, role? }; every provided field must match. text and role match as case-insensitive substrings of the element's label/value and role; identifier matches exactly (case-insensitive), also accepting the unqualified Android resource-id name ('submit' matches 'com.example.app:id/submit'). It polls the same accessibility / DOM tree as `describe` (iOS AXRuntime, Android uiautomator, Chromium CDP, Vega automation toolkit) every pollIntervalMs (default 400ms) until timeoutMs (default 5000ms). Returns { success: boolean, elapsed: number } — success=false means the condition never held before the timeout (a `note` then explains what was seen). Use this after a tap/navigation to wait for the next screen, or before tapping an element that appears asynchronously.

NameTypeReqDescription
bundleIdstringOptional iOS app bundle id, passed to the describe fallback (see `describe`). Ignored on Android / Chromium.
conditionstringyesWhat to wait for. `exists`: selector is anywhere in the tree. `visible`: selector is present with a non-zero on-screen frame. `hidden`: selector is absent or zero-area. `text`: the first visible matc…
expectedTextstringFor condition `text`: the string the first visible matched element (topmost in reading order; the first match overall if none is visible) must contain (default) or equal — see `textMatch`. Case-insen…
pollIntervalMsintegerHow often to re-check the tree (default 400).
selectorobjectyesElement to match (text / identifier / role).
textMatchstringFor condition `text`: how expectedText is compared. `contains` (default) is a case-insensitive substring; `equals` is a case-insensitive full-string match.
timeoutMsintegerMax time to wait for the condition before giving up (default 5000).
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, or Chromium id).

No output schema declared.

No examples provided.

boot-device ~798

Start an iOS simulator, launch an Android emulator, start a Vega (Fire TV) Virtual Device, or spawn an Electron app and wait until it is ready to accept interactions. Pick the platform by which argument you pass: 'udid' for an iOS simulator from list-devices, 'avdName' for an Android AVD (a serial is assigned automatically), 'vvdImage' for a Vega VVD (the 'vvdImage' of a vega device from list-devices, e.g. 'tv'), or 'electronAppPath' for an Electron app (a CDP remote-debugging port is picked automatically, or pass 'electronPort' to fix one). Use at the start of a session once you have picked a target. Returns a tagged payload: { platform: 'ios', udid, booted } or { platform: 'android', serial, avdName, booted } or { platform: 'vega', serial, vvdImage, booted } or { platform: 'chromium', id, port, pid, booted } (an Electron app boots as a Chromium/CDP device). Android boots take 2–10 minutes depending on machine and cold/warm state; the tool transparently hot-boots from the AVD's default_boot snapshot when usable and falls back to cold boot otherwise. Vega starts the single SDK-managed VVD via the vega CLI (~10s) and returns once it reports running. If an Android/Electron boot stage fails, the tool terminates the device it spawned so the next retry starts clean.

NameTypeReqDescription
avdNamestringAndroid: AVD name to launch a new emulator from (from `list-devices` → `avds[].name`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`.
bootTimeoutMsintegerAndroid/Vega: overall budget for the boot sequence. Default 480000 (8 min) on Android, 120000 (2 min) on Vega. Clamped to [30s, 15min]. Ignored on iOS.
electronAppPathstringElectron: path to the Electron app to launch. Either a packaged .app bundle / executable, or a project directory whose package.json points the Electron binary at the entry script. Mutually exclusive…
electronArgsarrayElectron-only: extra CLI arguments forwarded to the Electron binary after the app path.
electronPortintegerElectron-only: CDP remote-debugging port to expose. Defaults to a free port; the resulting device id is `chromium-cdp-<port>`.
forcebooleanShut down and re-boot the device even if already running.
headlessbooleaniOS only: boot the simulator core WITHOUT opening the Simulator.app GUI window. The device still streams via simulator-server; used by Argent Lens. Set the `ARGENT_SIMULATOR_NO_WINDOW` env var (1/tru…
udidstringiOS: simulator UDID to boot (from `list-devices`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`.
vvdImagestringVega (Fire TV): VVD image to boot — the `vvdImage` of a Vega device from `list-devices` (e.g. `tv`). Starts the single SDK-managed Vega Virtual Device. Provide exactly one of `udid`, `avdName`, `vvdI…

No output schema declared.

No examples provided.

button ~190

Press a device hardware button (iOS simulator, Android emulator or device). iOS sends a Down then Up event automatically; Android injects a single `adb` key event. Supported buttons depend on the platform: home, back, power, volumeUp, volumeDown, appSwitch, actionButton — buttons not present on the target platform (e.g. 'back' on iOS, 'actionButton' on Android) are rejected with a clear error. Use when you need to trigger hardware button events. Returns { pressed: buttonName }. Fails if the device backend is not reachable — the simulator-server for iOS, or `adb` for Android (Android presses are injected with `adb shell input keyevent`).

NameTypeReqDescription
buttonstringyesHardware button to press
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

chromium-cookies ~403

Read and write cookies of a Chromium (CDP) app (via the Network domain, so HttpOnly cookies are included). - action="get" (url?): list cookies, optionally restricted to given URLs (defaults to the active page). - action="set" (name, value, + url OR domain, optional path/secure/httpOnly/sameSite/expires): create or update a cookie. - action="delete" (name, + url/domain/path): remove a matching cookie. - action="clear": remove ALL browser cookies. Use when seeding an authenticated session before a flow (set the session cookie, then navigate) or asserting cookie state after one. Returns { cookies, count } for get, or a small status object ({ set } / { deleted } / { cleared }) otherwise. Fails if the device is not a Chromium (CDP) device, or set is missing name/value. Chromium-only.

NameTypeReqDescription
actionstringyesget: read cookies. set: create/update a cookie. delete: remove a named cookie. clear: remove all browser cookies.
domainstringset/delete: scope the cookie by domain (alt to url).
expiresnumberset: expiry as a Unix timestamp (seconds). Omit for a session cookie.
httpOnlybooleanset: mark HttpOnly.
namestringset/delete: cookie name.
pathstringset/delete: cookie path (default /).
sameSitestringset: SameSite policy.
securebooleanset: mark Secure.
udidstringyesChromium device id from `list-devices` (e.g. `chromium-cdp-9222`).
urlstringget: restrict to these URLs (defaults to the active page). set/delete: scope the cookie by URL.
valuestringset: cookie value.

No output schema declared.

No examples provided.

chromium-storage ~318

Read and write localStorage / sessionStorage of a Chromium (CDP) app's active page. - action="get": with `key`, returns that value; without `key`, returns all entries. - action="set" (key, value): write an entry. - action="remove" (key): delete an entry. - action="clear": empty the store. Set `store` to "local" or "session". Storage is per-origin, so it reflects the active tab's document. Use when seeding feature flags / auth tokens before a flow or asserting persisted app state after one. Returns { value } for a single key, { entries, count } for all, or a status object ({ set } / { removed } / { cleared }) otherwise. Fails if the device is not a Chromium (CDP) device, or set is missing key/value. Chromium-only.

NameTypeReqDescription
actionstringyesget: read one key (with `key`) or all entries. set: write `key`=`value`. remove: delete `key`. clear: empty the store.
keystringget (optional) / set / remove: the storage key.
storestringyesWhich Web Storage area: `local` (localStorage) or `session` (sessionStorage).
udidstringyesChromium device id from `list-devices` (e.g. `chromium-cdp-9222`).
valuestringset: the value to store.

No output schema declared.

No examples provided.

chromium-tabs ~427

List and switch the tabs / windows of a Chromium (CDP) app (an Electron app's BrowserWindows or a Chromium browser's tabs), and open or close them. - action="list": enumerate page targets with stable ids (`t1`, `t2`, …), title, url, and which is active. - action="select" (tab=<tabId|label>): make that tab the active one. The active tab is what describe / gesture-tap / screenshot / debugger-evaluate / open-url all operate on, so switch before driving a different tab. - action="new" (url?, label?): open a new tab/page and activate it. - action="close" (tab?=<tabId|label>): close a tab (defaults to the active one); if the active tab is closed, another live tab becomes active. Use when an app exposes multiple windows or tabs and you need to inspect or drive one other than the current page, or to open/close a page during a flow. tabIds are stable for the session and never reused. Returns { tabs: [{ tabId, targetId, title, url, active, label? }] }. Fails if the device is not a Chromium (CDP) device, or the requested tabId/label no longer matches a live tab. Chromium-only.

NameTypeReqDescription
actionstringyeslist: enumerate tabs/windows. select: make a tab active (every other tool then acts on it). new: open a tab. close: close a tab.
labelstring`new` only: a memorable label usable interchangeably with the tabId.
tabstringTarget tab for `select` / `close`: a tabId like `t2` or a label. `close` defaults to the active tab.
udidstringyesChromium device id from `list-devices` (e.g. `chromium-cdp-9222`).
urlstring`new` only: URL to open (defaults to about:blank).

No output schema declared.

No examples provided.

debugger-component-tree ~412

Fetch the current screen of a running React Native app as a compact component text tree. Only shows on-screen components with unique positions — off-screen (scrolled) content, full-screen transparent wrappers, and implementation-detail components are pruned. Each visible component is listed with its name, text content, and normalized tap coordinates in [0,1] space (fractions of the screen, not pixels — same space as tap/swipe/gesture). This is the preferred element discovery tool for React Native apps. More information in argent-react-native-app-workflow skill. Workflow: 1. Call this tool to get the component tree. 2. Find the desired element by name, text, testID, or accessibilityLabel. 3. Use the (tap: x,y) coordinates directly with the tap tool. Call again after navigation or state changes since positions may shift. Set includeSkipped=true to see a summary of all filtered components. Use when you need tap coordinates for a React Native UI element. Returns a compact text tree with (tap: x,y) coords. Fails if Metro debugger is not connected.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial).
includeSkippedbooleanWhen true, appends a summary of all filtered components: total fiber count, JS-side skip counts by name, and TS-side filter pass removals. Useful for understanding what was pruned from the tree.
maxNodesnumberMaximum total nodes to include. When exceeded, intermediate single-child wrapper chains are collapsed to preserve both root structure and leaf elements. Default: no limit.
onScreenOnlybooleanWhen true (default), only components visible on screen are returned. Set to false to include all mounted components including those scrolled off-screen. Useful when you need to understand the full pa…
portnumberMetro server port

No output schema declared.

No examples provided.

debugger-connect ~267

Connect to a JS runtime CDP debugger. iOS / Android / Vega: connects to Metro's CDP endpoint on the given port. Chromium: re-uses the page CDP session opened by boot-device — port is ignored. Returns connection info including port, projectRoot (empty on Chromium and on legacy Metro, e.g. Vega), deviceName, appName, logicalDeviceId (absent on Vega), and isNewDebugger. If already connected, returns the existing connection. Use when starting a debug session or before calling other debugger-* tools. Fails if the runtime is unreachable (Metro down, or Chromium CDP terminated).

NameTypeReqDescription
device_idstringyesDevice id from list-devices: iOS simulator UDID, Android serial, Vega serial (amazon-...), or Chromium device id (chromium-cdp-<port>). Pass this SAME id as device_id to every subsequent debugger-* c…
portnumberMetro server port (ignored for Chromium — its CDP port is encoded in device_id)

No output schema declared.

No examples provided.

debugger-evaluate ~223

Execute arbitrary JavaScript in the app's JS runtime via CDP — Hermes on iOS / Android / Vega, V8 on Chromium. Returns the evaluation result as a JSON-serializable value, along with deviceName, appName, and logicalDeviceId for context. Use when you need to read app state, call app functions, or test logic at runtime. The result is serialized by value, so cyclic objects (many RN runtime values — fiber nodes, navigation refs, global — are cyclic) fail with a serialization error rather than returning silently. Fails if the expression throws or the runtime is not connected.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also re…
expressionstringyesJavaScript expression to evaluate in the app runtime
portnumberMetro server port (ignored for Chromium)

No output schema declared.

No examples provided.

debugger-inspect-element ~431

Inspect the React component hierarchy at a screen coordinate (x, y). Returns components from the tapped element upward through its parent hierarchy, each with its source file:line and a code fragment. The first items (lowest indices) are the most specific — the exact component under the tap point and its direct parents. Higher indices are broader context (page, navigator). Default shows 35 items which covers all app-specific code; use maxItems=70+ to also see the navigation/screen structure. Uses getInspectorDataForViewAtPoint + _debugStack + Metro /symbolicate. Set resolveSourceMaps to false to skip symbolication and get raw bundled locations instead. Set includeSkipped=true to see filtered items annotated with skip reasons. Use when you need the source file and line for a component at a tap coordinate. Fails if the app is not connected or the coordinate is outside the screen.

NameTypeReqDescription
contextLinesnumberLines of source context to include around the component definition
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial).
includeSkippedbooleanWhen true, items that would normally be filtered are kept in the response with skipped=true and a skipReason. Useful for understanding what was pruned.
maxItemsnumberMaximum number of hierarchy items to return, counted from the bottom (most specific component first). The hierarchy walks from the tapped element up to the root — the first items are the most relevan…
portnumberMetro server port
resolveSourceMapsbooleanWhen true, resolves bundled frame locations to original source files via Metro symbolication and includes a code fragment. When false, returns the raw bundled frame info (file, line, column) without…
xnumberyesLogical X coordinate on device screen
ynumberyesLogical Y coordinate on device screen

No output schema declared.

No examples provided.

debugger-log-registry ~175

Get a summary of all console logs captured from the app's JS runtime. Returns the log file path, entry counts by level, and message clusters (grouped by similarity). Works against Hermes (iOS / Android / Vega) and V8 (Chromium). Use when investigating warnings, errors, or unexpected output — call this first for an overview, then read the returned file for details. Returns empty stats if no log data has been captured yet.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also re…
portnumberMetro server port (ignored for Chromium)

No output schema declared.

No examples provided.

debugger-reload-metro ~127

Restart the Metro JS bundle in the connected React Native app without restarting the native process. Use when you want to apply code changes or reset JS state. Returns { reloaded, port, method, deviceName, appName, logicalDeviceId } indicating which reload path was used and which device/app was targeted. Fails if Metro is not running on the given port.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial).
portnumberMetro server port

No output schema declared.

No examples provided.

debugger-status ~185

Get JS runtime debugger connection status and diagnostic info. Use when you need to verify connectivity before using other debugger tools. Returns port, projectRoot (empty on Chromium and on legacy Metro, e.g. Vega), deviceName, appName, logicalDeviceId (absent on Vega), isNewDebugger (false on the legacy inspector), connected flag, loadedScripts count, and sourceMapReady (always true — waits for pending source maps before returning; no-op on Chromium). Fails if the runtime is unreachable.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID, Android serial, Vega serial, or Chromium device id). The logicalDeviceId debugger-connect returns also re…
portnumberMetro server port (ignored for Chromium)

No output schema declared.

No examples provided.

describe ~596

Get the accessibility / DOM element tree for the current screen. On iOS, uses the AXRuntime accessibility service to inspect whatever is currently visible — including system dialogs, permission prompts, and any foreground app content. On Android, runs `uiautomator dump`. On Chromium, walks the renderer's DOM via Chrome DevTools Protocol — every visible element with its ARIA role, accessible name, and bounding rect (normalized to 0–1). On Vega (Fire TV), reads the on-device automation toolkit (`getPageSource`); each element carries `[focused]`/`[selected]` so you can see where the D-pad cursor is, then move it with the `tv-remote` tool (Vega is remote-driven, not touch). If describe returns an empty tree on Vega, relaunch the foreground app (the toolkit attaches at launch) and try again. When a system dialog is visible, describe returns the dialog's interactive elements (buttons, text) with tap coordinates. When no dialog is present, it returns the foreground app's accessible elements. Returns `{ description, source }` where `description` is a text rendering of the UI tree — one line per element with its role, label/value/id, interactivity flags, and frame. Frame coordinates are normalized [0,1] fractions of the screen / window width/height (not pixels) — the same space as gesture-tap / gesture-swipe / gesture-pinch. To tap an element use the centre of its frame: `tap_x = frame.x + frame.width / 2`, `tap_y = frame.y + frame.height / 2`. The same formula appears in the response header so it can be applied to a line in isolation. For app-scoped inspection with full UIKit properties (accessibilityIdentifier, viewClassName), use native-describe-screen with an explicit bundleId instead (iOS only). For React Native apps, debugger-component-tree returns React component names with tap coordinates. On a TV target (Apple TV / Android TV — a `list-devices` entry with runtimeKind 'tv') this returns the focus-driven view instead: the currently FOCUSED element and the list o…

NameTypeReqDescription
bundleIdstringOptional app bundle ID. Used as a target hint on iOS when the AX-service returns no elements and the describe tool falls back to native-devtools inspection. If omitted, the fallback auto-detects the…
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id).

No output schema declared.

No examples provided.

dismiss-update ~72

Clear the Argent update notification for the given number of hours. Use when the user asks to postpone or silence update reminders. Returns { message } confirming the suppression duration. Fails if the hours value is negative or the suppression state cannot be persisted.

NameTypeReqDescription
hoursnumberyesNumber of hours to suppress the update notification

No output schema declared.

No examples provided.

flow-add-echo ~90

Record an echo step in the active flow. Echo steps print a message when the flow is replayed — useful as labels between tool calls. Use when you want to annotate a recorded flow with a human-readable label or checkpoint message. Returns { message, flowFile }. Fails if no active flow recording is in progress.

NameTypeReqDescription
messagestringyesMessage to echo when the flow is replayed

No output schema declared.

No examples provided.

flow-add-step ~243

Execute a tool call and record it as a step in the active flow. Use when recording a flow with flow-start-recording and you want to run and capture each action. A coordinate `gesture-tap` is recorded as a portable `tap: { selector }` step when the tapped element has stable text/identifier (otherwise coordinates are kept with a warning); a `restart-app` is recorded as a `launch` step (record one FIRST to make the flow a self-contained e2e flow). Returns { message, toolResult, flowFile } on success. If it fails an error is returned and nothing is recorded. If a step was recorded by mistake, edit the .yaml file directly to remove it.

NameTypeReqDescription
argsstringTool arguments as a JSON string, e.g. '{"udid": "ABC", "x": 0.5, "y": 0.3}'. Omit for tools with no arguments.
commandstringyesMCP tool name (e.g. "tap", "screenshot", "launch-app")
delayMsintegerMilliseconds to sleep before executing this step during replay.

No output schema declared.

No examples provided.

flow-execute ~1,113

Run a saved flow from the .argent/flows/ directory, or an explicit boundary-managed flow_path. Steps run in order: `launch` starts an app from scratch (terminate + relaunch) and waits until it is ready; `tool` calls dispatch through the registry; `tap`/`long-press`/`type` resolve a selector to an element and act on it (`tap: { on, times: 2 }` double-taps; `long-press: { on, duration }` presses and holds; `tap`/`long-press` alternatively take a raw normalized point — bare `{ x, y }` or `on: { x, y }`; any selector may scope its matches geometrically, the CSS combinators read off frames: `within: <selector>` (descendant — inside that container's frame), `after: <selector>` (CSS `~` — following it in reading order), `next: <selector>` (CSS `+` — the nearest such follower, which unlike CSS reaches past a non-matching neighbour rather than failing), plus `any: true` (CSS `*` — legal only WITH a scope and never beside text/id/role). Scopes nest to disambiguate — `within: { id: card, within: { id: list } }` reads "inside card inside list", each container's frame inside the next); `scroll-to` scrolls (momentum-free) until a target is visible; `pinch` zooms (`pinch: { on?, scale }` — scale > 1 in, < 1 out; screen center when `on` is omitted); `rotate` is the two-finger rotation gesture (`rotate: { on?, by }` — degrees, + clockwise, within ±3000°; screen center when `on` is omitted; distinct from the `rotate` tool, which changes device orientation); `await` waits for a UI condition; `wait` pauses for a fixed number of milliseconds; `assert` checks one now; `snapshot` diffs a screenshot — or, with `cropOn: <selector>`, one element's cropped region — against a stored baseline (a missing baseline fails the step — set updateBaselines to adopt the current screen; a cropped element whose size drifted fails on dimensions); `echo` annotates; `run` executes another flow inline — a YAML path resolved against the directory of the flow file that references it (co-located runs only). A `…

NameTypeReqDescription
devicestringDevice id to run against (iOS UDID, Android/Vega serial, Chromium id). Auto-detected when omitted.
flow_filestringPath to the flow .yaml as readable by the tool-server. Internal — the argent client derives it from project_root and name automatically; leave unset.
flow_pathstringAbsolute path to a co-located flow .yaml on the client and tool server's shared filesystem. This must be supplied through the file-input boundary. For remote execution, pass name + project_root inste…
namestringName of a saved flow to run from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.
platformstringRestrict auto-detection to this platform when several devices are booted.
prerequisiteAcknowledgedbooleanSet to true to confirm the execution prerequisite has been met. Required (LLM path) when a fragment defines an executionPrerequisite.
project_rootstringyesAbsolute path to the calling agent's project root — the cwd it is working in. With name, the saved flow is read from `.argent/flows/<name>.yaml` under this root; with flow_path, the flow, its run: si…
updateBaselinesbooleanWrite/refresh screenshot baselines for `snapshot` steps instead of diffing against them.

No output schema declared.

No examples provided.

flow-finish-recording ~73

Finish recording the active flow. Returns a summary of all recorded steps and the final YAML content. Use when you have added all desired steps and want to finalize the flow file. Fails if no active flow recording is in progress. You can still edit the .yaml file directly afterwards to remove or reorder steps.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

flow-read-prerequisite ~337

Read the execution prerequisite of a flow without running it — a saved flow from the .argent/flows/ directory, or an explicit boundary-managed flow_path. Returns the prerequisite description so you can verify the required state is met before calling flow-execute. Use when you need to check what app/simulator state is required before executing a flow; pass the same flow source (name or flow_path) you will pass to flow-execute, so the prerequisite you read is the contract of the flow that will actually run. Fails if the flow file does not exist.

NameTypeReqDescription
flow_filestringPath to the flow .yaml as readable by the tool-server. Internal — the argent client derives it from project_root and name automatically; leave unset.
flow_pathstringAbsolute path to a co-located flow .yaml on the client and tool server's shared filesystem. This must be supplied through the file-input boundary. Pass the same flow source here as to flow-execute, s…
namestringName of a saved flow to inspect from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set.
project_rootstringyesAbsolute path to the calling agent's project root — the cwd it is working in. With name, the saved flow is read from `.argent/flows/<name>.yaml` under this root; with flow_path, the prerequisite is r…

No output schema declared.

No examples provided.

flow-start-recording ~346

Start recording a new flow. Creates a .yaml file in the .argent/flows/ directory. Use when you want to capture a reusable sequence of device interactions for later replay. Returns { message, flowFile, savedTo } and optionally { previousFlow } if a prior recording was abandoned. Fails if the .argent/flows/ directory cannot be created or the flow file cannot be written. After starting, use flow-add-step to append tool calls — each step is executed LIVE so you can verify it works before it gets recorded. For a self-contained e2e flow, record a restart-app of the app under test as the FIRST step (captured as the flow's `launch` step); for a reusable fragment, skip that and pass executionPrerequisite instead. Use flow-add-echo to add labels. Call flow-finish-recording when done. If a recorded step turns out to be wrong, you can edit the .yaml file directly to remove or reorder steps.

NameTypeReqDescription
executionPrerequisitestringFragments only: the app/device state assumed on entry (e.g. "Settings app open on General page"). For a self-contained e2e flow, omit this and record a `restart-app` as the first step instead — it is…
namestringyesName for this flow (e.g. "settings-explore")
project_rootstringyesAbsolute path to the project root directory (the directory that contains or should contain `.argent/flows/`). The flow file is created at `<project_root>/.argent/flows/<name>.yaml`.

No output schema declared.

No examples provided.

gather-workspace-data ~314

Fetch a structured snapshot of a mobile app project's workspace. Returns package.json contents, metro/babel config text, app.json, eas.json, tsconfig, platform directory presence (ios/, android/), presence of android/gradlew (android_has_gradle), iOS .xcworkspace name and Podfile presence, lockfile type, .env file keys (no values), installed CLI tool versions, scripts/ directory listing, husky hooks, CI config type, Makefile targets, lint-staged config, and a list of detected config files. DO NOT RUN THIS TOOL IF YOU ARE THE MAIN AGENT AND THIS TASK CAN BE DELEGATED TO A SUBAGENT. If you are a subagent tasked with exploring the project environment, run this as the first step. The snapshot provides the raw data needed to determine the project type (React Native, Expo, Flutter, native iOS/Android, or other), build commands, startup scripts, platform support, package manager, and QA tooling. Follow up with Read/Glob/Grep for deeper exploration of anything the snapshot surfaces. Use when you need to inspect project configuration without manually reading multiple files. Returns partial data if workspacePath does not exist or is not readable; missing items are represented as null or empty collections. Fails if the workspacePath is not an absolute path or the directory cannot be accessed.

NameTypeReqDescription
workspacePathstringyesAbsolute path to the project root directory to inspect (e.g. /Users/dev/MyApp)

No output schema declared.

No examples provided.

gesture-custom ~505

Send a sequence of touch events for complex gestures. Use for: long press, drag-and-drop, custom scroll, pinch (second touch point). For simple taps use the gesture-tap tool. For straight-line scrolling use the gesture-swipe tool. For pinch gestures use gesture-pinch. For rotation gestures use gesture-rotate. All x/y values are normalized 0.0–1.0 (screen fractions, not pixels). delayMs controls the delay before each event (default 16ms ≈ 60fps). Set interpolate to auto-generate smooth intermediate Move events between your keyframes. Returns { events: number } with the total count of events dispatched. Fails if the target device is not booted or an event type is invalid. Example long-press at center: [{"type":"Down","x":0.5,"y":0.5},{"type":"Up","x":0.5,"y":0.5,"delayMs":800}] Example smooth scroll down: [{"type":"Down","x":0.5,"y":0.7}, {"type":"Move","x":0.5,"y":0.6},{"type":"Move","x":0.5,"y":0.5},{"type":"Move","x":0.5,"y":0.4}, {"type":"Up","x":0.5,"y":0.3}] Example pinch-to-zoom (with interpolate:10 for smoothness): events: [{"type":"Down","x":0.4,"y":0.5,"x2":0.6,"y2":0.5}, {"type":"Up","x":0.2,"y":0.5,"x2":0.8,"y2":0.5}] interpolate: 10

NameTypeReqDescription
eventsarrayyesSequence of touch events; x/y (and optional second touch) are normalized 0.0–1.0, not pixels
interpolatenumberNumber of intermediate Move events to auto-insert between each pair of consecutive events. Smooths out gestures by linearly interpolating both primary (x,y) and secondary (x2,y2) coordinates. The del…
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

gesture-drag ~322

Press the left mouse button at a start point, move to an end point, and release — a desktop mouse drag in a Chromium app. All positions are normalized 0.0–1.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe. Interpolates mouse-move events at ~60fps over durationMs for a natural drag. Use for slider thumbs, drag-and-drop, text selection, or draggable UI elements. Dragging never scrolls content on desktop — use gesture-scroll for lists/pages. Chromium only — on iOS/Android use gesture-swipe. Returns { dragged: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.

NameTypeReqDescription
durationMsnumberTotal drag duration in milliseconds (default 300), interpolated at ~60fps.
fromXnumberyesPress x: normalized 0.0–1.0 (fraction of window width, not pixels).
fromYnumberyesPress y: normalized 0.0–1.0 (fraction of window height, not pixels).
toXnumberyesRelease x: normalized 0.0–1.0 (not pixels; same space as tap).
toYnumberyesRelease y: normalized 0.0–1.0 (not pixels; same space as tap).
udidstringyesTarget Chromium device id from `list-devices` (chromium-cdp-<port>).

No output schema declared.

No examples provided.

gesture-pinch ~587

Execute a pinch-to-zoom gesture by moving two fingers toward or away from a center point to change the scale of on-screen content. All positions and distances are normalized 0.0–1.0 (fractions of screen width/height, not pixels)—same coordinate space as gesture-tap and gesture-swipe. startDistance > endDistance = pinch in (zoom out). startDistance < endDistance = pinch out (zoom in). Typical values: startDistance 0.2, endDistance 0.6 for a zoom-in pinch at screen center. Auto-generates interpolated frames at ~60fps. The angle parameter controls the axis (0 = horizontal, 90 = vertical). Optional endCenterX/endCenterY drift the centroid linearly over the gesture (omitted = fixed center). Use when you need to zoom in or out on a map, image, or zoomable view. Returns { pinched: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.

NameTypeReqDescription
anglenumberAxis angle in degrees along which the fingers are placed (default 0 = horizontal).
centerXnumberyesCenter of pinch, horizontal: normalized 0.0–1.0 (fraction of screen width, not pixels)
centerYnumberyesCenter of pinch, vertical: normalized 0.0–1.0 (fraction of screen height, not pixels)
durationMsnumberTotal gesture duration in milliseconds (default 300)
endCenterXnumberFinal horizontal center of the pinch: normalized 0.0–1.0. When set, the centroid drifts linearly from centerX to endCenterX over the gesture (e.g. to keep expanding fingers on-screen near an edge). O…
endCenterYnumberFinal vertical center of the pinch: normalized 0.0–1.0. When set, the centroid drifts linearly from centerY to endCenterY over the gesture. Omit for a fixed center.
endDistancenumberyesFinal distance between the two fingers: normalized 0.0–1.0 (fraction of screen, not pixels). E.g. 0.6 = fingers 60% of screen apart. Use a larger endDistance than startDistance to pinch out (zoom in).
startDistancenumberyesInitial distance between the two fingers: normalized 0.0–1.0 (fraction of screen, not pixels). E.g. 0.2 = fingers 20% of screen apart. Use a larger startDistance than endDistance to pinch in (zoom ou…
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

gesture-rotate ~605

Send a two-finger circular arc gesture to rotate on-screen content by a specified angle. Two fingers are placed opposite each other at a fixed radius from the center, then swept from startAngle to endAngle degrees. All positions and radii are normalized 0.0–1.0 (fractions of screen width/height, not pixels)—same coordinate space as gesture-tap and gesture-swipe. endAngle > startAngle = clockwise rotation. Typical values: radius 0.15, startAngle 0, endAngle 90 for a 90° clockwise turn. A single radius applies to both axes, so on a non-square screen it traces a physical ellipse (finger separation varies through the turn); pass radiusX+radiusY (fractions of width/height with radiusX·width = radiusY·height) for a physically circular orbit instead. Auto-generates interpolated frames at ~60fps. Unlike gesture-pinch which moves fingers linearly to zoom, this orbits fingers in an arc to change orientation. Use when you need to rotate a map, image picker, or any rotateable UI element. Returns { rotated: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.

NameTypeReqDescription
centerXnumberyesCenter of rotation, horizontal: normalized 0.0–1.0 (fraction of screen width, not pixels)
centerYnumberyesCenter of rotation, vertical: normalized 0.0–1.0 (fraction of screen height, not pixels)
durationMsnumberTotal gesture duration in milliseconds (default 300)
endAnglenumberyesEnding angle in degrees. endAngle > startAngle = clockwise.
radiusnumberDistance from center to each finger: normalized 0.0–1.0 (fraction of screen, not pixels). E.g. 0.15 = fingers placed 15% of screen away from center. One value for both axes, so on a non-square screen…
radiusXnumberPer-axis finger distance, horizontal: normalized 0.0–1.0 fraction of screen WIDTH. Give both radiusX and radiusY (they override radius) with radiusX·screenWidth = radiusY·screenHeight for a physicall…
radiusYnumberPer-axis finger distance, vertical: normalized 0.0–1.0 fraction of screen HEIGHT. Always paired with radiusX — see radiusX.
startAnglenumberyesStarting angle in degrees (0 = right, 90 = down)
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

gesture-scroll ~367

Scroll content in a Chromium app by dispatching mouse-wheel events at a point. Anchor x/y are normalized 0.0–1.0 (fractions of the window, not pixels), same coordinate space as gesture-tap and describe. Deltas are fractions of the window too: deltaY 0.5 scrolls down half a window; negative scrolls back up. Use when content is below/above the fold (describe shows off-screen elements with zero height) or a list needs scrolling. Chromium only — on iOS/Android use gesture-swipe. Returns { scrolled: true, timestampMs }. Fails if the Chromium CDP session is not reachable for the given device.

NameTypeReqDescription
deltaXnumberHorizontal scroll distance as a fraction of the window width (e.g. 0.5 = half a window). Positive scrolls content right (reveals content to the right).
deltaYnumberVertical scroll distance as a fraction of the window height (e.g. 0.5 = half a window). Positive scrolls content down (reveals content below), like rolling a mouse wheel toward you.
durationMsnumberSpread the scroll over this many milliseconds in wheel-event steps (default 300) so scroll handlers fire progressively.
udidstringyesTarget Chromium device id from `list-devices` (chromium-cdp-<port>).
xnumberyesAnchor x: normalized 0.0–1.0 (fraction of window width, not pixels). The wheel events land here — put it over the element you want to scroll.
ynumberyesAnchor y: normalized 0.0–1.0 (fraction of window height, not pixels).

No output schema declared.

No examples provided.

gesture-swipe ~380

Execute a smooth swipe / drag touch gesture between two points on the device (iOS simulator or Android emulator). All from/to positions are normalized 0.0–1.0 (fractions of screen width/height, not pixels), same as gesture-tap. Generates interpolated Move events for a natural feel (~60fps). Swipe up (fromY > toY) to scroll content down. Use when you need to scroll a list, dismiss a modal, drag an element, or navigate between pages. Not supported on Chromium — use gesture-scroll there instead. Pass settle:true for a momentum-free swipe that lands exactly where the finger lifts (no fling), when you need a deterministic scroll distance. Returns { swiped: true, timestampMs }. Fails if the simulator-server / emulator backend is not reachable for the given device.

NameTypeReqDescription
durationMsnumberTotal gesture duration in milliseconds (default 300)
fromXnumberyesStart x: normalized 0.0–1.0 (not pixels; same as tap)
fromYnumberyesStart y: normalized 0.0–1.0 (not pixels; same as tap)
settlebooleanMomentum-free swipe: decelerate into the end point (ease-out) so the OS reads ~0 release velocity and applies little to no fling. Use for scroll-to-element loops; default false (a natural flinging sw…
toXnumberyesEnd x: normalized 0.0–1.0 (not pixels; same as tap)
toYnumberyesEnd y: normalized 0.0–1.0 (not pixels; same as tap)
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

gesture-tap ~390

Press the device screen (iOS simulator, Android emulator, or Chromium app) at normalized coordinates: x and y are fractions of screen width and height in 0.0–1.0 (not pixels). Sends a Down event followed by an Up event at the same point. For Chromium, this dispatches a CDP mouse-press/release on the renderer. Set clickCount: 2 for a double-tap / double-click — the taps are dispatched as one gesture with proper click counting, which two separate tap calls cannot guarantee. Use when you need to tap a button, link, or any tappable element on the screen. Returns { tapped: true, timestampMs }. Fails if the simulator-server / emulator backend / Chromium CDP is not reachable for the given device. Before tapping, determine the correct coordinates by using discovery tools — pick by platform: iOS / Android use `describe`, `native-describe-screen`, or `debugger-component-tree`; Chromium uses `describe` (the DOM walker), since the native and RN-specific discovery tools don't apply. More information in `argent-device-interact` skill

NameTypeReqDescription
clickCountintegerNumber of taps/clicks dispatched as ONE multi-tap gesture (2 = double-tap / double-click). The taps land inside the OS double-tap window; on Chromium each click carries an escalating CDP clickCount s…
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, or Chromium id).
xnumberyesNormalized horizontal position 0.0–1.0 (left=0, right=1), not pixels
ynumberyesNormalized vertical position 0.0–1.0 (top=0, bottom=1), not pixels

No output schema declared.

No examples provided.

keyboard ~794

Type text or press special keys on the device (iOS simulator, Android emulator or device, Chromium app, Vega Virtual Device, or Apple TV / Android TV) using keyboard events. Use when you need to enter text or trigger a named key such as enter, escape, or arrow keys. On Vega and Apple TV / Android TV, prefer the remote tools for D-pad navigation; use keyboard to type into a focused text field (e.g. a search or login box). Returns { typed: string, keys: number }. Fails if an unsupported key name is provided or the device's input backend is not reachable. - text: types a string (supports uppercase, digits, common punctuation). To type a credential, use `{{secret:<NAME>}}` — resolved server-side from the `ARGENT_SECRET_<NAME>` env var or an argent secrets file (`.argent/secrets.env` in the project, `~/.argent/secrets.env`, or an `ARGENT_SECRET_`-prefixed key in the project's `.env`/`.env.local`), so the plaintext never enters agent context; the result echoes the placeholder, not the value, and the after-typing auto-screenshot is skipped. - key: presses a single named key (enter, escape, backspace, tab, arrow-up/down/left/right, f1–f12) — NOT supported on TV targets; move focus with `tv-remote` instead. On a TV target (runtimeKind 'tv') only `text` applies — focus a text field first (with `tv-remote`), then type into it (injected HID keyboard on Apple TV, `adb input text` on Android TV). Provide text, key, or both — when both are given, the text is typed first and the key is pressed after it (text + key:"enter" types and submits).

NameTypeReqDescription
delayMsnumberDelay in ms between key presses (default 50). Ignored on Android phones/tablets (typed via `adb input text`, which has no per-key cadence), on Vega (text/keys injected in a single shot), and on TV ta…
keystringNamed key to press: enter, escape, backspace, tab, space, arrow-up, arrow-down, arrow-left, arrow-right, f1–f12. When combined with `text`, the key is pressed AFTER the text is typed (so text + enter…
textstringText to type character by character. Handles uppercase and common punctuation. To type a credential without its plaintext ever entering your context, use a secret placeholder: `{{secret:<NAME>}}` — e…
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id).

No output schema declared.

No examples provided.

launch-app ~429

Open an app by its bundle id (iOS) or package name (Android), or confirm the running renderer (Chromium). Use when starting any app — prefer this over tapping home-screen / launcher icons. Also prepares the native-devtools injection before the app starts (the iOS slice on iOS, the tvOS slice on Apple TV); on tvOS, interaction is focus-driven — use the tv-* tools rather than coordinate taps. Returns { launched, bundleId }. Fails if the app is not installed on the target device (iOS / Android). For Chromium, the app is already running behind a CDP port; this call simply refreshes the cached viewport and acknowledges the bundleId tag. To change the visible route, use `open-url`. On Vega (Fire TV), pass the interactive component app id from manifest.toml (e.g. com.example.app.main) as bundleId. Common iOS bundle ids: com.apple.MobileSMS, com.apple.mobilesafari, com.apple.Preferences, com.apple.Maps, com.apple.camera, com.apple.Photos, com.apple.mobilemail, com.apple.mobilenotes, com.apple.MobileAddressBook Common Android packages: com.android.settings, com.android.chrome, com.google.android.apps.maps, com.google.android.gm, com.android.vending, com.google.android.dialer, com.google.android.apps.messaging

NameTypeReqDescription
activitystringAndroid-only: fully-qualified Activity name (e.g. `.MainActivity` or `com.example/com.example.MainActivity`). If omitted on Android, the app's default launcher activity is used. Ignored on iOS / Chro…
bundleIdstringyesApp identifier. iOS: bundle id (e.g. com.apple.MobileSMS). Android: package name from build.gradle `applicationId` (e.g. com.android.settings). Chromium: arbitrary tag; the call is a no-op since the…
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, or Chromium id).

No output schema declared.

No examples provided.

list-devices ~509

List iOS simulators, Android emulators, connected physical Android devices, running Chromium apps, and Vega (Fire TV) devices in one place. Use at the start of a session to pick a target id ('udid' for iOS entries, 'serial' for Android/Vega entries, 'id' for Chromium) to pass to interaction tools, and to see which targets are already running. Returns { devices, avds } where each device carries a 'platform' discriminator ('ios', 'android', 'chromium', or 'vega'); 'avds' lists Android AVDs bootable via boot-device. A Vega VVD is listed under 'devices' whether running or stopped (state 'running'/'stopped'); start a stopped one with boot-device using its 'vvdImage'. Android entries also carry a 'kind' ('emulator' for a local AVD, 'device' for a physical phone connected over USB / wireless adb) — physical phones are detected from `adb devices` (any serial that is not an `emulator-*` one) and are driven through the same interaction tools as emulators; they do not need boot-device (just connect the phone with USB debugging authorised). TV targets are tagged with runtimeKind 'tv' (Apple TV simulators on iOS, Android TV / leanback devices on Android) — these are focus-driven, not touch-driven: use `describe` to read focus, `tv-remote` for remote presses (up/down/left/right/select/back/menu/home), and `keyboard` to type, rather than the coordinate/gesture tools. iOS simulators from an additional CoreSimulator device set (the 'ios.additionalDeviceSets' configuration — e.g. devices created by Radon IDE) are listed alongside default-set ones, tagged with their owning 'deviceSet' path; they are driven through the same tools by udid, but run headless (no Simulator.app window attaches to them). Chromium apps are discovered by probing CDP debugging ports (default 9222; extend via the ARGENT_CHROMIUM_PORTS=<comma-separated-ports> env var). They must already be running with --remote-debugging-port=<port> — use boot-device with electronAppPath to launch one. Booted/ready devices are l…

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

native-describe-screen ~239

Read the running app's native accessibility screen description via injected native devtools. Returns a flat list of accessibility leaf elements with: - raw native point-space frame and tapPoint - normalizedFrame and normalizedTapPoint relative to the app's main screen bounds - top-level screenFrame metadata - traits and optional labels/identifiers This is a low-level native inspection tool. The normalized fields are intended to help with backend migration work, but the public describe contract is still separate. Useful for evaluating or debugging the lower-level native data that powers the public describe tool. If status is restart_required: call restart-app then retry.

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
skipClassPrefixesarrayClass name prefixes to prune entire subtrees. For SwiftUI apps use ["_TtGC7SwiftUI"] to drop mangled SwiftUI generic type subtrees while keeping UIKit bridges.
skipClassesarrayExact UIView class names whose entire subtree should be pruned (e.g. ["UIImageView"] to drop image-heavy branches)
udidstringyesSimulator UDID

No output schema declared.

No examples provided.

native-devtools-status ~485

Check whether native devtools are connected to a specific app and whether the next launch is prepared for injection. Use when you need to verify native devtools readiness before calling native-full-hierarchy, native-describe-screen, or native-network-logs. Returns { envSetup, appRunning, connected, requiresRestart, nextLaunchWillBeInjected, injectable }: - envSetup: DYLD_INSERT_LIBRARIES is configured in the simulator's launchd environment - appRunning: the target bundle currently has a running UIKit process on the simulator - connected: the dylib is active in the current running process for this bundleId - requiresRestart: the app is already running but its current process does not have native devtools injected (always false for a non-injectable app) - nextLaunchWillBeInjected: if you launch this bundle now, native devtools env setup is already in place (always false for a non-injectable app) - injectable: whether native devtools can ever be injected into this app. Apple system apps (bundle ids under com.apple.) are platform binaries with library validation, so the dylib can never load into them. Call this before using app-scoped native hierarchy tools or native-network-logs. If injectable is false: this is a TERMINAL state — the app can never be injected. Do NOT restart/retry. Use the standard `describe` tool (its accessibility path reads the screen without injection) or `screenshot` (then interact by coordinate). Do not fall back to the native-devtools feature tools (native-describe-screen, native-find-views, native-full-hierarchy, native-network-logs, native-view-at-point, native-user-interactable-view-at-point) — they run the same injection precheck and fail with the same non-injectable error. If appRunning is false and nextLaunchWillBeInjected is true: use launch-app normally. If requiresRestart is true: call restart-app, then proceed with the native feature. Returns { status: "init_failed", message, attempts } instead when the simulator's native-devtools e…

NameTypeReqDescription
bundleIdstringyesBundle ID of the app to check (e.g. com.example.MyApp)
udidstringyesSimulator UDID

No output schema declared.

No examples provided.

native-find-views ~339

Search for specific UIViews in the running app by class name, accessibility identifier, label, tag, or React Native nativeID. Use when you need to locate a specific view by its properties without dumping the entire hierarchy. Returns { status: "ok", matches } with matching views including their frames, properties, optional ancestors, and optional children. Much more targeted than native-full-hierarchy. At least one of className, identifier, label, tag, or nativeID must be provided. Fails if native devtools are not connected, the app is not running, or status is restart_required (call restart-app then retry).

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
classNamestringUIView class name to match (exact, e.g. UIButton)
fieldsarrayView fields to include. Defaults: className, frame, hidden, alpha, identifier, label, nativeID, userInteractionEnabled, depth. Additional: pointer, tag, windowFrame, bounds, center, opaque, clipsToBo…
identifierstringAccessibility identifier to match (exact)
includeAncestorsbooleanInclude ancestor chain for each matched view (default true)
includeChildrenbooleanInclude child views for each matched view (default true)
labelstringAccessibility label to match (exact)
nativeIDstringReact Native nativeID prop to match (exact)
tagintegerUIView tag integer to match
udidstringyesSimulator UDID

No output schema declared.

No examples provided.

native-full-hierarchy ~384

Get the complete UIKit view tree for the running app. WARNING: Output can be extremely large (100KB–500KB+) for complex apps, especially those built with SwiftUI. Prefer native-find-views for targeted queries. Use skipClasses / skipClassPrefixes to prune SwiftUI internal subtrees and reduce output size. Use the fields param to request only the properties you need. Use when you need deep layout debugging, finding views with no accessibility labels, or verifying view structure not exposed through the accessibility tree. Returns { status: "ok", windows } with the full view hierarchy, or { status: "restart_required" } if the dylib is not injected. Fails if native devtools are not connected or the app is not running.

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
fieldsarrayView fields to include. Use EXACT names: className, frame, hidden, alpha, identifier, label, nativeID, userInteractionEnabled, depth, pointer, tag, windowFrame, bounds, center, opaque, clipsToBounds,…
maxDepthintegerMaximum recursion depth (default 8). Increase for deeper inspection, decrease to reduce output size.
skipClassPrefixesarrayClass name prefixes to prune entire subtrees. For SwiftUI apps use ["_TtGC7SwiftUI"] to drop mangled SwiftUI generic type subtrees while keeping _UIHostingView and UIKit bridges. Avoid broad prefixes…
skipClassesarrayExact UIView class names whose entire subtree should be pruned (e.g. ["UIImageView"] to drop image leaf nodes)
udidstringyesSimulator UDID

No output schema declared.

No examples provided.

native-network-logs ~202

Retrieve network requests captured at the native NSURLProtocol level. Unlike the JS-level network inspector (view-network-logs), this captures ALL network traffic from the app including native modules, Swift/Objective-C networking, and background transfers that bypass JS fetch. Use when you need to inspect native-level HTTP traffic that is invisible to JS fetch interception. Returns { status, count, events } where each event contains URL, method, status code, headers, and timing. Returns { status: "restart_required" } if the dylib is not injected - if this happens, call "restart-app" then retry. Fails if native devtools are not connected or the app is not running.

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
clearbooleanClear the log after reading
limitnumberMaximum number of events to return (most recent first)
udidstringyesSimulator UDID

No output schema declared.

No examples provided.

native-profiler-analyze ~210

Analyze exported native trace data and return an LLM-optimized markdown report. iOS: parses CPU time profile, UI hangs, and memory leaks from the exported XML files. Android: queries the Perfetto .pftrace via the in-process Perfetto trace-processor engine for CPU hotspots, UI hangs with jank reason + main-thread state breakdown, GC annotation, and an RSS-growth weak signal. Returns a structured markdown report with severity indicators, tables, and actionable suggestions. After presenting the report, ask the user whether to investigate further (drill-down with profiler-stack-query for hang stacks, CPU context, leak details) or implement fixes and re-profile. Call native-profiler-stop first to export the trace data. Use when you need to interpret a completed native profiling recording. Fails if native-profiler-stop has not been called first to export trace data.

NameTypeReqDescription
device_idstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

native-profiler-start ~469

Start native profiling on a booted device. iOS: Instruments via xctrace (CPU, hangs, memory). Android: Perfetto (CPU, jank, RSS-growth weak signal). Auto-detects the running app process unless app_process is explicitly provided. After starting, let the user interact with the app, then call native-profiler-stop. Use when you want to capture native CPU, hang, and memory data for a running app. Returns { status, pid, traceFile } confirming the recording has started. Fails if no app is running on the device, or the profiler cannot attach to the process.

NameTypeReqDescription
app_processstringiOS: the CFBundleExecutable or display name of the app to profile. Android: the app's package name. If omitted, auto-detects the currently running foreground app. Only provide this if auto-detection…
device_idstringyesTarget device id from `list-devices` (iOS UDID or Android serial).
malloc_stack_loggingbooleaniOS-only. When true, cold-launches the app under the profiler with Malloc Stack Logging enabled so memory leaks carry an allocation backtrace (responsible frame + library). Without it, leaks are stil…
template_pathstringiOS-only: path to an Instruments .tracetemplate file (defaults to bundled Argent template). Ignored on Android.

No output schema declared.

No examples provided.

native-profiler-stop ~170

Stop native profiling and export trace data. iOS: sends SIGINT to xctrace, waits for packaging, then exports CPU, hangs, and leaks XML. Android: sends SIGTERM to the perfetto daemon, polls /proc/<pid>, then `adb pull`s the .pftrace. Call native-profiler-start first. Use when the user has finished the interaction to profile and you need to export the trace. Returns { traceFile, exportedFiles, exportDiagnostics? }; traceFile is the raw trace bundle and exportedFiles the exports, all downloadable artifacts materialized to local paths. Fails if no active native-profiler-start session exists for the given device_id.

NameTypeReqDescription
device_idstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

native-user-interactable-view-at-point ~330

Inspect the deepest UIView at a raw native window point that would actually receive touch input. Unlike native-view-at-point, this respects userInteractionEnabled and is closer to UIKit hit-testing semantics. IMPORTANT: x and y are raw iOS window coordinates in points, NOT normalized [0,1] simulator tap coordinates. If status is restart_required: call restart-app then retry.

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
fieldsarrayView fields to include. Defaults: pointer, className, tag, frame, windowFrame, bounds, hidden, alpha, opaque, clipsToBounds, userInteractionEnabled, depth, identifier, label, layerName, nativeID. Add…
includeAncestorsbooleanInclude ancestor chain for the matched view (default true)
includeChildrenbooleanInclude child views for the matched view (default false)
maxDepthintegerMaximum depth for returned child/ancestor serialization (default 150)
skipClassPrefixesarrayClass name prefixes to prune entire subtrees
skipClassesarrayExact UIView class names whose entire subtree should be pruned
udidstringyesSimulator UDID
xnumberyesRaw X coordinate in the app window's native point space. NOT normalized [0,1] tap space.
ynumberyesRaw Y coordinate in the app window's native point space. NOT normalized [0,1] tap space.

No output schema declared.

No examples provided.

native-view-at-point ~335

Inspect the deepest visible UIView at a raw native window point. Unlike native-user-interactable-view-at-point, this ignores userInteractionEnabled, so it answers "what is visually here?" rather than "what would receive the touch?". IMPORTANT: x and y are raw iOS window coordinates in points, NOT normalized [0,1] simulator tap coordinates. If status is restart_required: call restart-app then retry.

NameTypeReqDescription
bundleIdstringyesBundle ID of the app
fieldsarrayView fields to include. Defaults: pointer, className, tag, frame, windowFrame, bounds, hidden, alpha, opaque, clipsToBounds, userInteractionEnabled, depth, identifier, label, layerName, nativeID. Add…
includeAncestorsbooleanInclude ancestor chain for the matched view (default true)
includeChildrenbooleanInclude child views for the matched view (default false)
maxDepthintegerMaximum depth for returned child/ancestor serialization (default 150)
skipClassPrefixesarrayClass name prefixes to prune entire subtrees
skipClassesarrayExact UIView class names whose entire subtree should be pruned
udidstringyesSimulator UDID
xnumberyesRaw X coordinate in the app window's native point space. NOT normalized [0,1] tap space.
ynumberyesRaw Y coordinate in the app window's native point space. NOT normalized [0,1] tap space.

No output schema declared.

No examples provided.

open-url ~299

Open a URL or URL scheme on the device. Use to navigate to a web page or deep-link into an app. On Chromium, this navigates the primary renderer to the given URL. Cross-platform schemes: https://, tel:, mailto:. iOS also: messages://, settings://, maps://. Android also: geo:, plus any app-specific deep link. Deep-linking caveat: an https:// link opens the native app only when an installed app is verified for the link's domain (iOS Universal Links / Android App Links) — otherwise it opens in the browser, and on iOS simulators it may open in Safari even when the owning app is installed. To reliably open an installed app, use its custom scheme (scheme://path) or launch-app with its bundle id. Returns { opened, url, note? }. note carries the deep-linking caveat when a web URL was opened on a native device. Fails if no app is registered to handle the URI (iOS/Android) or the renderer rejects the navigation (Chromium).

NameTypeReqDescription
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, or Chromium id).
urlstringyesURL or scheme to open (e.g. https://example.com, messages://, tel:555, geo:37.0,-122.0). For Chromium this navigates the renderer.

No output schema declared.

No examples provided.

profiler-combined-report ~137

Generate a cross-correlated report combining React Profiler and native profiler data. Maps native hangs to React commits using wall-clock time alignment. Requires both react-profiler-analyze and native-profiler-analyze to have been called first. Call this tool when both profilers were run in parallel on the same session. Returns a markdown report correlating hangs with React commits, memory leaks, and investigation hints. Fails if either react-profiler-analyze or native-profiler-analyze has not been called first.

NameTypeReqDescription
device_idstringyesiOS Simulator/device UDID or Android serial
portnumberMetro server port

No output schema declared.

No examples provided.

profiler-commit-query ~295

Query React commit data for iterative investigation of render performance. Requires react-profiler-stop to have been called first. Modes: - by_component: All commits where a specific component rendered, with causes and durations. - by_time_range: What happened in a specific time window. - by_index: Full detail dump of a single commit (all components, props changed, parent cascade). - cascade_tree: Parent-child cascade tree for a commit showing who triggered whom. Use when drilling into specific components or time windows after react-profiler-analyze. Returns a markdown table or tree of commit data matching the requested mode. Fails if react-profiler-stop has not been called or no commit data is stored.

NameTypeReqDescription
commit_indexintegerCommit index for by_index and cascade_tree modes
component_namestringComponent name for by_component mode
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
modestringyesQuery mode: by_component (commits for a component), by_time_range (commits in a window), by_index (full detail for one commit), cascade_tree (parent-child cascade for a commit)
portnumberMetro server port
time_range_msobjectTime range filter for by_time_range mode
top_nintegerMax results to return (default 20)

No output schema declared.

No examples provided.

profiler-cpu-query ~337

Query Hermes CPU profile data with targeted modes for iterative investigation. Requires react-profiler-stop (and ideally react-profiler-analyze) to have been called first. Modes: - top_functions: Global CPU hotspots ranked by self-time. Optional time_window_ms to filter. - time_window: CPU breakdown for a specific time range (e.g. during a slow commit or hang). - call_tree: For a given function_name, show its callees and optionally callers. - component_cpu: For a given component_name, aggregate CPU activity across all its commits. Use when investigating JS CPU hotspots or correlating CPU cost with specific components. Returns a markdown table of CPU hotspots, call tree, or per-component CPU breakdown. Fails if no CPU profile is stored — run react-profiler-stop first.

NameTypeReqDescription
component_namestringComponent name for component_cpu mode
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
function_namestringFunction name for call_tree mode
include_callersbooleanFor call_tree mode: also show callers of the function
modestringyesQuery mode: top_functions (global hotspots), time_window (CPU in a time range), call_tree (callers/callees of a function), component_cpu (CPU during a component's commits)
portnumberMetro server port
time_window_msobjectTime window filter for time_window mode (ms, performance.now clock)
top_nintegerNumber of results to return (default 15)

No output schema declared.

No examples provided.

profiler-load ~397

Fetch and restore a previously captured profiling session from disk into memory so query tools can operate on it. This is the disk-restore counterpart to react-profiler-stop/native-profiler-stop, which write data, and to the query tools (profiler-cpu-query, profiler-commit-query, profiler-stack-query), which read it. Use when you need to revisit past session data without capturing a new recording. Modes: - list: Show all available profiling sessions in the project's debug directory. - load_react: Load a React profiler session (CPU profile + commit tree) into memory. Requires session_id. - load_native: Re-parse native profiler XML files into memory. Requires session_id and device_id. For Android .pftrace restores, pass app_process for older sessions that do not have a metadata sidecar. Returns a summary of the loaded session or a session list for the list mode. Fails if the session_id is not found or required XML files are missing from disk.

NameTypeReqDescription
app_processstringAndroid package name to use when restoring older load_native .pftrace sessions that do not have a metadata sidecar.
device_idstringyesTarget device id from `list-devices`. Used to cache the loaded React session under the correct port+device key, and required to resolve the native profiler session for load_native.
modestringyeslist: show available sessions on disk. load_react: load a React profiler session into memory for query tools. load_native: re-parse native profiler XML files (xctrace on iOS) into memory for query to…
portnumberMetro port — the loaded React data is cached under this port for query tools (default 8081)
session_idstringTimestamp-based session identifier (e.g. '20250313-143022') from the list output. Required for load_react and load_native modes.

No output schema declared.

No examples provided.

profiler-stack-query ~375

Query native profiler trace data for iterative investigation of native performance. Requires native-profiler-stop → native-profiler-analyze to have been called first. Modes: - hang_stacks: Full CPU context during a specific hang (by hang_index). - function_callers: Who calls a specific native function and what it calls. - thread_breakdown: CPU time split by thread, optionally filtered. - leak_stacks: Memory leak details (iOS only), optionally filtered by object_type. Use when drilling into native hang stacks, thread CPU breakdown, or memory leaks after native-profiler-analyze. Returns a markdown report with native call stacks, thread weights, or leak details for the selected mode. Fails if native-profiler-analyze has not been run or no parsed trace data is in memory.

NameTypeReqDescription
device_idstringyesiOS Simulator UDID or Android serial.
function_namestringFunction name for function_callers mode
hang_indexinteger0-based index into the hang list for hang_stacks mode
modestringyesQuery mode: hang_stacks (full CPU context during a hang), function_callers (who calls a native function), thread_breakdown (CPU split by thread), leak_stacks (leak details by object type)
object_typestringObject type filter for leak_stacks mode
threadstringThread filter. thread_breakdown: case-insensitive substring match. function_callers: exact raw thread name (e.g. ".blueskyweb.app"), or "main" for the UI thread; omit to search ALL threads (each resu…
top_nintegerMax results to return (default 15)

No output schema declared.

No examples provided.