Argent
NPM · @SWMANSION/ARGENT · SCANNED AUG 13
Drive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agent
Available components
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.
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
claude mcp add software-mansion-argent -- npx -y @swmansion/argent
codex mcp add software-mansion-argent -- npx -y @swmansion/argent
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"software-mansion-argent": {
"type": "local",
"command": [
"npx",
"-y",
"@swmansion/argent"
],
"enabled": true
}
}
} openclaw mcp add software-mansion-argent --command npx --arg -y --arg @swmansion/argent
mcp_servers:
software-mansion-argent:
command: "npx"
args: ["-y", "@swmansion/argent"] {
"mcpServers": {
"software-mansion-argent": {
"command": "npx",
"args": [
"-y",
"@swmansion/argent"
]
}
}
} 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.
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 |
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.
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.
| Name | Type | Req | Description |
|---|---|---|---|
| minStableMs | integer | – | The screen must hold the same content for at least this long to count as settled (default 250). |
| pollIntervalMs | integer | – | How often to re-read the tree (default 200). |
| timeoutMs | integer | – | Max time to wait for the screen to settle before giving up (default 3000). |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | – | Optional iOS app bundle id, passed to the describe fallback (see `describe`). Ignored on Android / Chromium. |
| condition | string | yes | What 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… |
| expectedText | string | – | For 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… |
| pollIntervalMs | integer | – | How often to re-check the tree (default 400). |
| selector | object | yes | Element to match (text / identifier / role). |
| textMatch | string | – | For condition `text`: how expectedText is compared. `contains` (default) is a case-insensitive substring; `equals` is a case-insensitive full-string match. |
| timeoutMs | integer | – | Max time to wait for the condition before giving up (default 5000). |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| avdName | string | – | Android: AVD name to launch a new emulator from (from `list-devices` → `avds[].name`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`. |
| bootTimeoutMs | integer | – | Android/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. |
| electronAppPath | string | – | Electron: 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… |
| electronArgs | array | – | Electron-only: extra CLI arguments forwarded to the Electron binary after the app path. |
| electronPort | integer | – | Electron-only: CDP remote-debugging port to expose. Defaults to a free port; the resulting device id is `chromium-cdp-<port>`. |
| force | boolean | – | Shut down and re-boot the device even if already running. |
| headless | boolean | – | iOS 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… |
| udid | string | – | iOS: simulator UDID to boot (from `list-devices`). Provide exactly one of `udid`, `avdName`, `vvdImage`, or `electronAppPath`. |
| vvdImage | string | – | Vega (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`).
| Name | Type | Req | Description |
|---|---|---|---|
| button | string | yes | Hardware button to press |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | get: read cookies. set: create/update a cookie. delete: remove a named cookie. clear: remove all browser cookies. |
| domain | string | – | set/delete: scope the cookie by domain (alt to url). |
| expires | number | – | set: expiry as a Unix timestamp (seconds). Omit for a session cookie. |
| httpOnly | boolean | – | set: mark HttpOnly. |
| name | string | – | set/delete: cookie name. |
| path | string | – | set/delete: cookie path (default /). |
| sameSite | string | – | set: SameSite policy. |
| secure | boolean | – | set: mark Secure. |
| udid | string | yes | Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`). |
| url | string | – | get: restrict to these URLs (defaults to the active page). set/delete: scope the cookie by URL. |
| value | string | – | set: 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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | get: read one key (with `key`) or all entries. set: write `key`=`value`. remove: delete `key`. clear: empty the store. |
| key | string | – | get (optional) / set / remove: the storage key. |
| store | string | yes | Which Web Storage area: `local` (localStorage) or `session` (sessionStorage). |
| udid | string | yes | Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`). |
| value | string | – | set: 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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | list: enumerate tabs/windows. select: make a tab active (every other tool then acts on it). new: open a tab. close: close a tab. |
| label | string | – | `new` only: a memorable label usable interchangeably with the tabId. |
| tab | string | – | Target tab for `select` / `close`: a tabId like `t2` or a label. `close` defaults to the active tab. |
| udid | string | yes | Chromium device id from `list-devices` (e.g. `chromium-cdp-9222`). |
| url | string | – | `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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial). |
| includeSkipped | boolean | – | When 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. |
| maxNodes | number | – | Maximum total nodes to include. When exceeded, intermediate single-child wrapper chains are collapsed to preserve both root structure and leaf elements. Default: no limit. |
| onScreenOnly | boolean | – | When 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… |
| port | number | – | Metro 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).
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device 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… |
| port | number | – | Metro 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device 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… |
| expression | string | yes | JavaScript expression to evaluate in the app runtime |
| port | number | – | Metro 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.
| Name | Type | Req | Description |
|---|---|---|---|
| contextLines | number | – | Lines of source context to include around the component definition |
| device_id | string | yes | Device id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial). |
| includeSkipped | boolean | – | When true, items that would normally be filtered are kept in the response with skipped=true and a skipReason. Useful for understanding what was pruned. |
| maxItems | number | – | Maximum 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… |
| port | number | – | Metro server port |
| resolveSourceMaps | boolean | – | When 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… |
| x | number | yes | Logical X coordinate on device screen |
| y | number | yes | Logical 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device 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… |
| port | number | – | Metro 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial). |
| port | number | – | Metro 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Device 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… |
| port | number | – | Metro 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…
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | – | Optional 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… |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| hours | number | yes | Number 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.
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Message 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.
| Name | Type | Req | Description |
|---|---|---|---|
| args | string | – | Tool arguments as a JSON string, e.g. '{"udid": "ABC", "x": 0.5, "y": 0.3}'. Omit for tools with no arguments. |
| command | string | yes | MCP tool name (e.g. "tap", "screenshot", "launch-app") |
| delayMs | integer | – | Milliseconds 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 `…
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | – | Device id to run against (iOS UDID, Android/Vega serial, Chromium id). Auto-detected when omitted. |
| flow_file | string | – | Path 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_path | string | – | Absolute 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… |
| name | string | – | Name of a saved flow to run from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set. |
| platform | string | – | Restrict auto-detection to this platform when several devices are booted. |
| prerequisiteAcknowledged | boolean | – | Set to true to confirm the execution prerequisite has been met. Required (LLM path) when a fragment defines an executionPrerequisite. |
| project_root | string | yes | Absolute 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… |
| updateBaselines | boolean | – | Write/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.
| Name | Type | Req | Description |
|---|---|---|---|
| flow_file | string | – | Path 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_path | string | – | Absolute 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… |
| name | string | – | Name of a saved flow to inspect from `.argent/flows` (e.g. "settings-explore"). Omit when flow_path is set. |
| project_root | string | yes | Absolute 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.
| Name | Type | Req | Description |
|---|---|---|---|
| executionPrerequisite | string | – | Fragments 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… |
| name | string | yes | Name for this flow (e.g. "settings-explore") |
| project_root | string | yes | Absolute 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.
| Name | Type | Req | Description |
|---|---|---|---|
| workspacePath | string | yes | Absolute 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
| Name | Type | Req | Description |
|---|---|---|---|
| events | array | yes | Sequence of touch events; x/y (and optional second touch) are normalized 0.0–1.0, not pixels |
| interpolate | number | – | Number 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… |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| durationMs | number | – | Total drag duration in milliseconds (default 300), interpolated at ~60fps. |
| fromX | number | yes | Press x: normalized 0.0–1.0 (fraction of window width, not pixels). |
| fromY | number | yes | Press y: normalized 0.0–1.0 (fraction of window height, not pixels). |
| toX | number | yes | Release x: normalized 0.0–1.0 (not pixels; same space as tap). |
| toY | number | yes | Release y: normalized 0.0–1.0 (not pixels; same space as tap). |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | Axis angle in degrees along which the fingers are placed (default 0 = horizontal). |
| centerX | number | yes | Center of pinch, horizontal: normalized 0.0–1.0 (fraction of screen width, not pixels) |
| centerY | number | yes | Center of pinch, vertical: normalized 0.0–1.0 (fraction of screen height, not pixels) |
| durationMs | number | – | Total gesture duration in milliseconds (default 300) |
| endCenterX | number | – | Final 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… |
| endCenterY | number | – | Final 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. |
| endDistance | number | yes | Final 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). |
| startDistance | number | yes | Initial 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… |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| centerX | number | yes | Center of rotation, horizontal: normalized 0.0–1.0 (fraction of screen width, not pixels) |
| centerY | number | yes | Center of rotation, vertical: normalized 0.0–1.0 (fraction of screen height, not pixels) |
| durationMs | number | – | Total gesture duration in milliseconds (default 300) |
| endAngle | number | yes | Ending angle in degrees. endAngle > startAngle = clockwise. |
| radius | number | – | Distance 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… |
| radiusX | number | – | Per-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… |
| radiusY | number | – | Per-axis finger distance, vertical: normalized 0.0–1.0 fraction of screen HEIGHT. Always paired with radiusX — see radiusX. |
| startAngle | number | yes | Starting angle in degrees (0 = right, 90 = down) |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| deltaX | number | – | Horizontal 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). |
| deltaY | number | – | Vertical 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. |
| durationMs | number | – | Spread the scroll over this many milliseconds in wheel-event steps (default 300) so scroll handlers fire progressively. |
| udid | string | yes | Target Chromium device id from `list-devices` (chromium-cdp-<port>). |
| x | number | yes | Anchor 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. |
| y | number | yes | Anchor 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.
| Name | Type | Req | Description |
|---|---|---|---|
| durationMs | number | – | Total gesture duration in milliseconds (default 300) |
| fromX | number | yes | Start x: normalized 0.0–1.0 (not pixels; same as tap) |
| fromY | number | yes | Start y: normalized 0.0–1.0 (not pixels; same as tap) |
| settle | boolean | – | Momentum-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… |
| toX | number | yes | End x: normalized 0.0–1.0 (not pixels; same as tap) |
| toY | number | yes | End y: normalized 0.0–1.0 (not pixels; same as tap) |
| udid | string | yes | Target 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
| Name | Type | Req | Description |
|---|---|---|---|
| clickCount | integer | – | Number 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… |
| udid | string | yes | Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id). |
| x | number | yes | Normalized horizontal position 0.0–1.0 (left=0, right=1), not pixels |
| y | number | yes | Normalized 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).
| Name | Type | Req | Description |
|---|---|---|---|
| delayMs | number | – | Delay 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… |
| key | string | – | Named 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… |
| text | string | – | Text 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… |
| udid | string | yes | Target 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
| Name | Type | Req | Description |
|---|---|---|---|
| activity | string | – | Android-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… |
| bundleId | string | yes | App 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… |
| udid | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| skipClassPrefixes | array | – | Class name prefixes to prune entire subtrees. For SwiftUI apps use ["_TtGC7SwiftUI"] to drop mangled SwiftUI generic type subtrees while keeping UIKit bridges. |
| skipClasses | array | – | Exact UIView class names whose entire subtree should be pruned (e.g. ["UIImageView"] to drop image-heavy branches) |
| udid | string | yes | Simulator 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…
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app to check (e.g. com.example.MyApp) |
| udid | string | yes | Simulator 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).
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| className | string | – | UIView class name to match (exact, e.g. UIButton) |
| fields | array | – | View fields to include. Defaults: className, frame, hidden, alpha, identifier, label, nativeID, userInteractionEnabled, depth. Additional: pointer, tag, windowFrame, bounds, center, opaque, clipsToBo… |
| identifier | string | – | Accessibility identifier to match (exact) |
| includeAncestors | boolean | – | Include ancestor chain for each matched view (default true) |
| includeChildren | boolean | – | Include child views for each matched view (default true) |
| label | string | – | Accessibility label to match (exact) |
| nativeID | string | – | React Native nativeID prop to match (exact) |
| tag | integer | – | UIView tag integer to match |
| udid | string | yes | Simulator 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| fields | array | – | View fields to include. Use EXACT names: className, frame, hidden, alpha, identifier, label, nativeID, userInteractionEnabled, depth, pointer, tag, windowFrame, bounds, center, opaque, clipsToBounds,… |
| maxDepth | integer | – | Maximum recursion depth (default 8). Increase for deeper inspection, decrease to reduce output size. |
| skipClassPrefixes | array | – | Class 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… |
| skipClasses | array | – | Exact UIView class names whose entire subtree should be pruned (e.g. ["UIImageView"] to drop image leaf nodes) |
| udid | string | yes | Simulator 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| clear | boolean | – | Clear the log after reading |
| limit | number | – | Maximum number of events to return (most recent first) |
| udid | string | yes | Simulator 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| app_process | string | – | iOS: 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_id | string | yes | Target device id from `list-devices` (iOS UDID or Android serial). |
| malloc_stack_logging | boolean | – | iOS-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_path | string | – | iOS-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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | Target 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| fields | array | – | View fields to include. Defaults: pointer, className, tag, frame, windowFrame, bounds, hidden, alpha, opaque, clipsToBounds, userInteractionEnabled, depth, identifier, label, layerName, nativeID. Add… |
| includeAncestors | boolean | – | Include ancestor chain for the matched view (default true) |
| includeChildren | boolean | – | Include child views for the matched view (default false) |
| maxDepth | integer | – | Maximum depth for returned child/ancestor serialization (default 150) |
| skipClassPrefixes | array | – | Class name prefixes to prune entire subtrees |
| skipClasses | array | – | Exact UIView class names whose entire subtree should be pruned |
| udid | string | yes | Simulator UDID |
| x | number | yes | Raw X coordinate in the app window's native point space. NOT normalized [0,1] tap space. |
| y | number | yes | Raw 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.
| Name | Type | Req | Description |
|---|---|---|---|
| bundleId | string | yes | Bundle ID of the app |
| fields | array | – | View fields to include. Defaults: pointer, className, tag, frame, windowFrame, bounds, hidden, alpha, opaque, clipsToBounds, userInteractionEnabled, depth, identifier, label, layerName, nativeID. Add… |
| includeAncestors | boolean | – | Include ancestor chain for the matched view (default true) |
| includeChildren | boolean | – | Include child views for the matched view (default false) |
| maxDepth | integer | – | Maximum depth for returned child/ancestor serialization (default 150) |
| skipClassPrefixes | array | – | Class name prefixes to prune entire subtrees |
| skipClasses | array | – | Exact UIView class names whose entire subtree should be pruned |
| udid | string | yes | Simulator UDID |
| x | number | yes | Raw X coordinate in the app window's native point space. NOT normalized [0,1] tap space. |
| y | number | yes | Raw 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).
| Name | Type | Req | Description |
|---|---|---|---|
| udid | string | yes | Target device id from `list-devices` (iOS UDID, Android serial, or Chromium id). |
| url | string | yes | URL 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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | iOS Simulator/device UDID or Android serial |
| port | number | – | Metro 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.
| Name | Type | Req | Description |
|---|---|---|---|
| commit_index | integer | – | Commit index for by_index and cascade_tree modes |
| component_name | string | – | Component name for by_component mode |
| device_id | string | yes | Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId). |
| mode | string | yes | Query 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) |
| port | number | – | Metro server port |
| time_range_ms | object | – | Time range filter for by_time_range mode |
| top_n | integer | – | Max 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.
| Name | Type | Req | Description |
|---|---|---|---|
| component_name | string | – | Component name for component_cpu mode |
| device_id | string | yes | Device logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId). |
| function_name | string | – | Function name for call_tree mode |
| include_callers | boolean | – | For call_tree mode: also show callers of the function |
| mode | string | yes | Query 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) |
| port | number | – | Metro server port |
| time_window_ms | object | – | Time window filter for time_window mode (ms, performance.now clock) |
| top_n | integer | – | Number 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.
| Name | Type | Req | Description |
|---|---|---|---|
| app_process | string | – | Android package name to use when restoring older load_native .pftrace sessions that do not have a metadata sidecar. |
| device_id | string | yes | Target 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. |
| mode | string | yes | list: 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… |
| port | number | – | Metro port — the loaded React data is cached under this port for query tools (default 8081) |
| session_id | string | – | Timestamp-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.
| Name | Type | Req | Description |
|---|---|---|---|
| device_id | string | yes | iOS Simulator UDID or Android serial. |
| function_name | string | – | Function name for function_callers mode |
| hang_index | integer | – | 0-based index into the hang list for hang_stacks mode |
| mode | string | yes | Query 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_type | string | – | Object type filter for leak_stacks mode |
| thread | string | – | Thread 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_n | integer | – | Max results to return (default 15) |
No output schema declared.
No examples provided.