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 SEP 28

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

Available components

0 this week 89 Trust /100
Trust breakdown (7 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 → Why this is hard to 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
  • 64 of 177 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 2 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 Management90
  • Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
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
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 9 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "restart-app" implies "terminate" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 74 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Argent MCP server?

Argent runs locally as an npm package, launched with npx -y @swmansion/argent. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @swmansion/argent

# add to Claude Code
claude mcp add software-mansion-argent -- npx -y @swmansion/argent
// .cursor/mcp.json
{
  "mcpServers": {
    "software-mansion-argent": {
      "command": "npx",
      "args": [
        "-y",
        "@swmansion/argent"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "software-mansion-argent": {
      "command": "npx",
      "args": [
        "-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"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "software-mansion-argent": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@swmansion/argent"
      ]
    }
  }
}
# add to Vellum
assistant mcp add software-mansion-argent -t stdio -c npx -a -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.

  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Sept 26 −3
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 +1
    • Stability: 0.97 → pass security
  • 22 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 17 Sept 26 +1
    • Stability: 0.97 → pass security
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 28 Sept 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 SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:9a4d02ec8f334d8901437f39d4a0096c986f6a161856ad915d49d88e42af6c50262d0c14af32be65fd4e0771c53a6c764973d275650e9723bc735214f

Background: How many MCP packages publish verified provenance →

Dependencies 177 packages
Packages resolved 177
Deprecated 1
Stale 63
Tree resolution Complete

Background: SBOMs and build attestations, explained →

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. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
react-profiler-analyze ~388

Analyze stored profiling data and return a markdown performance report. Returns { report, reportFile, hotCommitsTotal, hotCommitsShown, sessionFiles }. The report is structured around hot React commits (≥16ms absolute floor) with per-commit render cascades, root cause identification, and a top components table. Raw profiling data is saved to disk with a unique session timestamp for later reload via profiler-load. After presenting the report, ask the user whether to investigate further (drill-down with profiler-cpu-query / profiler-commit-query) or implement fixes and re-profile for comparison. Requires react-profiler-stop to have been called first. Optional annotations param: provide Array<{offsetMs, label}> to annotate commits with the user action that preceded them. Compute offsetMs = tapTimestampMs - startedAtEpochMs where tapTimestampMs is the timestampMs returned by the tap/swipe tool and startedAtEpochMs is returned by react-profiler-start. Use when the profiling session is complete and you need to interpret the collected data. Fails if react-profiler-stop has not been called or no profiling data is stored.

NameTypeReqDescription
annotationsarray–Optional list of user actions with their time offset from profiling start. Compute offsetMs = tapTimestampMs - startedAtEpochMs, where tapTimestampMs comes from the tap/swipe tool return value and st…
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
platformstring–Target platform
portnumber–Metro server port
project_rootstringyesAbsolute path to the RN project root for session context detection
rn_versionstring–React Native version (e.g. "0.73.4")

No output schema declared.

No examples provided.

react-profiler-component-source ~191

Find a React component's source via tree-sitter AST lookup: returns file path, line number, memoization status (isMemoized, hasUseCallback, hasUseMemo), and 50 lines of source for a named React component. Call this per-finding after react-profiler-analyze to inspect source before proposing a fix. Returns found: false if the component is not found in user-owned code (e.g. lives in node_modules). When several files define a component with the same name (e.g. platform variants like List.tsx and List.web.tsx), returns the primary match and lists the rest under otherMatches[] (file/line/col) — check it before assuming the returned file is the one you meant.

NameTypeReqDescription
component_namestringyesName of the React component to look up
project_rootstringyesAbsolute path to the RN project root

No output schema declared.

No examples provided.

react-profiler-cpu-summary ~225

Return a raw Hermes CPU flamegraph summary (top hotspot functions by self-time). FOR DEDICATED CPU INVESTIGATION ONLY — do NOT call this as part of a normal profiling session. Use react-profiler-analyze instead; it covers all React rendering performance analysis. Use when you specifically need to investigate JS CPU hotspots that are NOT tied to React rendering (e.g. regex slowness, cryptography, heavy computations). Call react-profiler-stop first. Reads directly from the stored cpuProfile. Returns a markdown table of the top hotspot functions with self-time, total-time, and location. Fails if react-profiler-stop has not been called or no CPU profile is stored.

NameTypeReqDescription
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
portnumber–Metro server port
react_onlyboolean–If true, only show React component functions (PascalCase names)
top_ninteger–Number of top hotspot functions to return (default 20)

No output schema declared.

No examples provided.

react-profiler-fiber-tree ~161

Inspect the React fiber tree and return a JSON representation of the component hierarchy. Use when tracing ancestry of a library component or checking for useMemoCache hook (confirms React Compiler is active on a component). Returns a nested JSON tree of fiber nodes with name, tag, actualDuration, selfBaseDuration, and children. Fails if the React DevTools hook is not present or no fiber roots have been committed yet.

NameTypeReqDescription
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
filterstring–Regex string to filter component names
max_depthinteger–Maximum tree depth to traverse (default 10)
portnumber–Metro server port

No output schema declared.

No examples provided.

react-profiler-renders ~142

Scan the live React fiber tree to collect component render counts and durations. Returns a markdown table of the top re-rendering components. No profiling session required — works on a live connected app. Use when you want a quick snapshot of render counts without a full profiling session. Fails if the React DevTools hook is not present in the runtime or the app is not connected.

NameTypeReqDescription
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
portnumber–Metro server port
top_ninteger–Number of top re-rendering components to return (default 20)

No output schema declared.

No examples provided.

react-profiler-start ~304

Start CPU profiling + React commit capture on the connected Hermes runtime. Delegates React commit capture to the in-app React DevTools backend (ri.startProfiling). If another tool-server already owns the session, returns { already_running: true, owner, stale, how_to_reclaim } without clobbering their data. Pass { force: true } to reclaim a fresh owner's session, but BEFORE OVERTAKING - ask the user for approval first, see relevant skill for guidance. Before calling this, ask the user if they also want native profiling (native-profiler-start) — recommend running both in parallel for a complete picture. After starting, ask the user to perform the interaction to profile, then call react-profiler-stop. Returns { started_at, startedAtEpochMs, hermes_version, detected_architecture } on success, or the already_running payload described above. Fails if the Hermes runtime is not reachable or the Metro CDP connection cannot be established.

NameTypeReqDescription
device_idstringyesDevice id from list-devices — the SAME id you passed to debugger-connect (iOS simulator UDID or Android serial).
forceboolean–Take over an active profiling session even when it is owned by another tool-server and still fresh. Set to true only when you know the prior owner is gone.
portnumber–Metro server port
sample_interval_usinteger–CPU sampling interval in microseconds (default 100)

No output schema declared.

No examples provided.

react-profiler-status ~160

Check the state of the React profiler session without side effects. Use after an interruption (debugger disconnect, unexpected error, agent pause) to decide whether to continue with react-profiler-stop, start a new session, or reconnect the debugger. Ownership is verified server-side against this tool-server's in-memory session — no token-threading is required. Returns { session_status, is_running, current_owner, … }. If this tool-server process restarted after react-profiler-start, status will report 'taken_over'; use react-profiler-start { force: true } to reclaim.

NameTypeReqDescription
device_idstringyesDevice logicalDeviceId from debugger-connect (iOS simulator UDID or Android logicalDeviceId).
portnumber–Metro server port

No output schema declared.

No examples provided.

react-profiler-stop ~240

Stop CPU profiling and collect the cpuProfile + React commit tree. Reads commit data from the in-app React DevTools backend. Stores results in the ReactProfilerSession for later use by react-profiler-analyze or react-profiler-cpu-summary. Call react-profiler-start first, then exercise the app, then call this. Returns { duration_ms, sample_count, fiber_renders_captured, total_react_commits, hot_commit_indices } summarizing the session. When any commit had fibers whose display name could not be resolved at stop time (typically transient components like modals/tooltips/animations that unmounted before stop), the response also includes { unattributed_ms, unattributed_fiber_count, unattributed_commit_count } — these quantify how much work is not accounted for in the per-component breakdown (the per-commit duration itself remains correct). Fails if no active profiling session exists or the CDP connection was lost during recording.

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

No output schema declared.

No examples provided.

reinstall-app ~262

Install or reinstall an app on the device. The previous installation (if any) is uninstalled first so app data and runtime permissions are cleared. Use for a full reinstall after rebuilding, or to start from a clean app state. Returns { reinstalled, bundleId }. Fails if the app path does not exist or the package does not match the platform (.app for iOS, .apk for Android, .vpkg for Vega).

NameTypeReqDescription
appPathstringyesPath to the app bundle. iOS: `.app` directory (e.g. ./build/.../MyApp.app). Android: `.apk` file (e.g. android/app/build/outputs/apk/debug/app-debug.apk). Vega: `.vpkg` file. Relative paths are resol…
bundleIdstringyesApp identifier that matches the bundle at `appPath`. iOS: bundle id (used to uninstall first). Android: package name (used to uninstall first; the install itself identifies the app from the APK). Veg…
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

restart-app ~197

Terminate then relaunch an app by bundle id / package name. Use when you need a clean in-memory state without a full reinstall. Also refreshes the native-devtools injection before the relaunch (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 { restarted, bundleId }. Fails if the app is not installed.

NameTypeReqDescription
activitystring–Android-only: relaunch a non-launcher Activity (e.g. `.SettingsActivity` or `com.example/com.example.SettingsActivity`). If omitted, the app's default launcher activity is used. Ignored on iOS.
bundleIdstringyesApp identifier. iOS: bundle id. Android: package name.
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

rotate ~98

Set the device orientation to Portrait, LandscapeLeft, LandscapeRight, or PortraitUpsideDown. Use to test layout in a different orientation. Re-run `describe` afterwards — frame coordinates change with the orientation. Returns { orientation }. Fails if the target device is not booted.

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

No output schema declared.

No examples provided.

run-sequence ~1,312

Execute multiple device interaction steps in a single call (iOS simulator, Android emulator, Apple TV / Android TV, or Chromium app). Use when you need sequential actions and do NOT need to observe the screen between them (e.g. scrolling multiple times, typing then pressing enter, rotating back and forth). Returns { completed, total, steps } with per-step results. Fails if an unrecognised tool name is used in a step (error returned at that step, execution stops). No screenshot is captured automatically — call screenshot separately after the sequence if needed. ONLY use this when every step is known in advance. If any step depends on the result of a previous one (e.g. tapping a menu item that only appears after a prior tap), use individual tool calls instead. Allowed tools and their args (udid is auto-injected, do NOT include it in args): gesture-tap: { x: number, y: number, clickCount?: number } [ios/android/chromium] gesture-swipe: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number } [ios/android] gesture-scroll: { x: number, y: number, deltaX?: number, deltaY?: number, durationMs?: number } [chromium only] gesture-drag: { fromX: number, fromY: number, toX: number, toY: number, durationMs?: number } [chromium only] gesture-custom: { events: [{ type: "Down"|"Move"|"Up", x: number, y: number, x2?: number, y2?: number, delayMs?: number }], interpolate?: number } [ios/android] gesture-pinch: { centerX: number, centerY: number, startDistance: number, endDistance: number, endCenterX?: number, endCenterY?: number, angle?: number, durationMs?: number } [ios/android] gesture-rotate: { centerX: number, centerY: number, radius?: number, radiusX?: number, radiusY?: number, startAngle: number, endAngle: number, durationMs?: number } [ios/android] button: { button: "home"|"back"|"power"|"volumeUp…

NameTypeReqDescription
stepsarrayyesOrdered list of interaction steps to execute sequentially
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, Vega serial, or Chromium id) — shared across all steps.

No output schema declared.

No examples provided.

screen-recording-start ~490

Start recording the device screen to a video file (h264 mp4, 30fps at the device's native resolution). By default stretches where the screen does not change are trimmed out (see trimStatic), so a long session with only brief activity comes back as a short clip instead of minutes of dead air. By default every tap, swipe, drag, pinch and rotate is drawn into the video as an on-screen touch marker (see showTouches), so the recording shows where each interaction landed. The recording keeps running across other tool calls (every result carries a reminder) until `screen-recording-stop` is called or timeLimitSeconds elapses — immediately after starting, set yourself a reminder/wakeup for the expected end of the recording so it is never left running. Use when the user wants a video of an interaction, animation, or app behavior — for a single still frame use `screenshot` instead. Returns { status: "recording", timeLimitSeconds, outputFile } — the video is retrieved later by `screen-recording-stop`, not by reading outputFile directly. Fails if a recording is already running on the device, the device is not booted, ffmpeg is not installed, or the platform cannot be recorded (tvOS, Chromium, Vega and remote simulators are unsupported).

NameTypeReqDescription
showTouchesboolean–Default true. Draw simulator-server's touch visualizer into the recording: a pulse marks each tap, a comet trail follows swipes and drags, and paired markers show two-finger pinch/rotate, so the vide…
timeLimitSecondsinteger–Auto-stop cap in seconds (default 180, max 600). Set it to slightly more than the interaction you plan to capture.
trimStaticboolean–Default true. Collapse stretches where the screen does not change: the first second of each still stretch is kept, then unchanged frames are dropped until something moves again, so a long recording w…
udidstringyesTarget device id from `list-devices` (iOS Simulator UDID or Android serial).

No output schema declared.

No examples provided.

screen-recording-stop ~199

Stop the screen recording started by `screen-recording-start` and retrieve the video: frame capture ends and ffmpeg finalizes the mp4. Also retrieves the video when the recording already ended on its own (time limit reached, capture process died) — call it even after the cap fired. Use when the interaction being captured is finished, or a tool-result note reminds you a recording is still running. Returns { video, durationMs, wallClockMs?, trimmedMs?, warning? }; video is a downloadable artifact materialized to a local path. When static-frame trimming removed dead air, durationMs is the trimmed video length and wallClockMs/trimmedMs report the real duration and how much was cut. Fails if no recording (running or finished-but-unretrieved) exists for the given udid.

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

No output schema declared.

No examples provided.

screenshot ~325

Capture a screenshot of the device screen (iOS simulator, Android emulator, Apple TV simulator, Vega, or Chromium app). Returns { image }; the MCP adapter renders it as a visible image unless the caller passed includeImageInContext: false. Use when you need a baseline image before an interaction or to inspect the current screen state after a delay. Fails if the simulator-server / emulator backend / Chromium CDP is not reachable for the given device.

NameTypeReqDescription
downscalerstring–Downscaling algorithm when scale<1 on Chromium. Defaults to lanczos3 (highest quality). Mirrors sim-server's wire enum.
includeImageInContextboolean–Default true. Set false only when capturing a full-resolution PNG (scale: 1.0) to save as a baseline/current for screenshot-diff — the file is still written, but the image bytes are not attached to t…
rotationstring–Orientation override for the screenshot (rotates the captured image after Page.captureScreenshot on Chromium).
scalenumber–Scale factor (0.01-1.0). Defaults to ARGENT_SCREENSHOT_SCALE env var, or 0.3 if unset for iOS/Android. On Chromium the default is 1.0 (no downscale); pass <1 to opt in. Downscaling on Chromium requir…
udidstringyesTarget device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id).

No output schema declared.

No examples provided.

screenshot-diff ~385

Compare two PNG screenshots and return a compact visual-diff summary. Accepts saved baseline/current PNG paths, or one saved PNG plus one live full-resolution capture from a device. Always provide udid so the simulator-server dependency can be resolved. Use when stable before/after screenshots exist and the expected result is pixel-visible: layout, spacing, color, typography, image/icon rendering, clipping, overflow, or text rendering. For live captures, set exactly one of captureBaseline or captureCurrent; use baselinePath + captureCurrent for the common visual-regression flow. Returns { summary, diffPath, contextDiffPath }. The summary uses normalized [0,1] screen locations matching describe coordinates; diffPath is the full-size diff image and contextDiffPath is a downscaled image for MCP/agent display. Ignores the fixed top status-bar band for both pixel and OCR text comparisons. Fails if the input sources are invalid, PNG files cannot be read, outputDir cannot be written, or the simulator-server / emulator backend is not reachable.

NameTypeReqDescription
baselinePathstring–Path to the baseline PNG file. Required unless captureBaseline is true.
captureBaselineboolean–Capture the baseline screenshot live at full resolution before diffing. Cannot be combined with captureCurrent.
captureCurrentboolean–Capture the current screenshot live at full resolution before diffing. Cannot be combined with captureBaseline.
currentPathstring–Path to the current PNG file. Required unless captureCurrent is true.
outputDirstring–Directory where diff artifacts should be written. Optional — defaults to a temp directory; the diff images are returned in the result either way.
rotationstring–Orientation override for live baseline/current captures.
udidstringyesTarget device id from `list-devices` (iOS UDID or Android serial).

No output schema declared.

No examples provided.

settings-permissions ~577

Grant, deny, or reset a runtime permission for an app without navigating the system Settings UI. Use during test setup to pre-authorize (or explicitly deny) a service before the app asks, or `reset` so the permission dialog appears again on next use. Always per-app: bundleId is required. Permissions: camera, microphone, photos, contacts, notifications, calendar, location, location-always, media-library, motion, reminders. iOS simulator: edits the simulator's TCC store, always per-app. `notifications` is not supported (no iOS equivalent). `reset` is per-app — a device-wide reset is a no-op for existing grants on recent iOS, so it is not offered. `grant location`/`location-always` needs the app already installed (location auth isn't stored in TCC and isn't applied to a bundle id until the app exists) — enforced on local simulators; a remote simulator can't be probed for install state, so ensure the app is installed there first. Other services can be granted before install. Android: changes the mapped `android.permission.*` runtime permissions (reset also best-effort clears the user-set permission flags). The app must be installed and declare them in its manifest; `reminders` has no Android equivalent. Some permission changes terminate the app if it is running (system behavior on both platforms) — set permissions before launching, or relaunch after. Returns { action, permission, bundleId, applied, skipped? }: `applied` lists the platform-level services/permissions actually changed; `skipped` (Android) lists mapped permissions the package manager rejected, e.g. ones the manifest doesn't declare. Fails if nothing could be applied.

NameTypeReqDescription
actionstringyes`grant` pre-authorizes the permission, `deny` refuses it, `reset` returns it to the not-yet-asked state so the app prompts on next use.
bundleIdstringyesApp to change the permission for — required for every action. iOS: bundle id (e.g. com.example.app). Android: package name. `reset` is per-app too: simctl's device-wide reset (no bundleId) silently l…
permissionstringyesThe permission to change. `notifications` is Android-only (iOS has no simctl service for it); `reminders` is iOS-only; `camera` works on Android and on iOS only when the target simulator's runtime mo…
udidstringyesTarget device id from `list-devices` (iOS simulator UDID or Android serial).

No output schema declared.

No examples provided.

stop-all-simulator-servers ~77

Stop all running simulator-server processes (iOS + Android), native devtools services, and Chromium CDP sessions, freeing their resources. Call this when your session ends or the user says they are done. Returns { stopped } — an array of URNs that were shut down. Fails silently if no servers are running.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

stop-metro ~111

Stop the Metro bundler process listening on a given port (default 8081). Use when ending a React Native session or when Metro must be restarted. Returns { stopped, port, pids }; stopped=false if no process is found on the port. Fails if the port lookup command times out or the process cannot be killed. This is DESTRUCTIVE — always ask the user for confirmation before calling this tool.

NameTypeReqDescription
portinteger–TCP port Metro is listening on (default 8081)

No output schema declared.

No examples provided.

stop-simulator-server ~105

Stop the transport session for a specific device (iOS / Android: simulator-server process; Chromium: CDP WebSocket) and free its resources. Use when you are done interacting with one device but want to keep others running. Returns { stopped, udid }. Fails silently if no session is open for the given id.

NameTypeReqDescription
udidstringyesTarget device id (iOS UDID, Android serial, or Chromium id) whose transport session to stop

No output schema declared.

No examples provided.

tv-remote ~464

Press a TV remote / D-pad button (or a whole path of them) on a TV device — Apple TV (tvOS), Android TV (leanback), or Vega (Fire TV). A TV is navigated with a directional remote, not touch — use this instead of gesture-tap/swipe (which do not apply on a TV). Move focus with up/down/left/right, confirm with select, go back with back/menu, exit with home, and use playPause/rewind/fastForward/next/previous/volumeUp/volumeDown/mute for the corresponding remote keys. (On the Apple TV simulator the media-transport and volume keys are rejected — its HID stack ignores them; they work on Android TV and Vega.) Single press: { button: "down" }. Repeat the same button: { button: "down", repeat: 3 }. Multi-step navigation: pass a path as { button: ["up","right","right","select"] } — it runs in one tool call, far cheaper than separate presses. Read the screen with `describe` before and after to see where focus landed. Returns { pressed, count }.

NameTypeReqDescription
button––A single TV-remote button, or a path of them run in one call. Buttons: up/down/left/right (D-pad), select (OK), back, home, menu, playPause, rewind, fastForward, next, previous, volumeUp, volumeDown,…
repeatinteger–Repeat the whole `button` value this many times (default 1). Compact for long same-button runs, e.g. { button: "down", repeat: 12 }.
udidstringyesTarget TV device id from `list-devices` (Apple TV, Android TV, or Vega).

No output schema declared.

No examples provided.

update-argent ~175

Apply a pending Argent update. Only call this tool when the user has explicitly consented to updating Argent in this conversation. Use when an update notification indicates a new version is available and the user agrees to update. By default updates the install serving this session; pass `target` to choose global/local/both. Returns { message } with the update status and version info. The tool server will restart automatically after the update. Fails if no update is available or an update is already in progress.

NameTypeReqDescription
targetstring–Which install to update. 'auto' (default) updates the install serving this session — the global PATH install or this project's local devDependency, whichever this server runs from. Pass 'global' / 'l…

No output schema declared.

No examples provided.

view-network-logs ~223

Retrieve captured network (HTTP) requests from the running app. Returns a paginated list of requests with method, URL, status, resource type, size, and duration. Each entry includes a requestId that can be passed to view-network-request-details for full details. On React Native (iOS / Android / Vega) interception is injected into the JS runtime — it captures fetch() calls. On Chromium it reads the browser's native CDP Network domain (the active tab; all request types). Use when inspecting outbound HTTP traffic or debugging API calls in the running app. Fails if the app is not connected (RN) or the device is not reachable (Chromium).

NameTypeReqDescription
device_idstringyesDevice id from list-devices (iOS simulator UDID or Android serial) — the same id used with debugger-connect.
pageIndex––Page index (0-based) or "latest" for the most recent page. Each page contains up to 50 entries.
portnumber–Metro server port (RN only; ignored on Chromium)

No output schema declared.

No examples provided.

view-network-request-details ~184

Get full details of a specific network request by its requestId (from view-network-logs). Returns request/response headers (sensitive headers redacted), status, timing, and optionally the response body. Large response bodies are truncated. Use when you need headers, body, or timing for a specific request after listing logs. Returns an error message string if the requestId is not found — use view-network-logs to get valid requestId values.

NameTypeReqDescription
device_idstringyesDevice id from list-devices (iOS simulator UDID or Android serial) — the same id used with debugger-connect.
includeBodyboolean–Whether to include the response body (if captured). Defaults to true.
portnumber–Metro server port
requestIdstringyesThe requestId from view-network-logs to get full details for

No output schema declared.

No examples provided.

Common questions

What is the Argent MCP server?

Argent is an MCP server listed in the public MCP registry as io.github.software-mansion/argent. Drive iOS Simulators, Android emulators, TVs and Electron/web apps from your coding agent. This page covers its npm package (@swmansion/argent).

Is the Argent MCP server safe to use?

Argent scores 89 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 28 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Argent MCP server expose?

Argent exposes 73 tools: list-devices, boot-device, launch-app, restart-app, reinstall-app, and 68 more. Their descriptions and schemas cost roughly 24,937 tokens of context every time the server is loaded.

Is the Argent MCP server still maintained?

Argent is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Argent MCP server under?

Argent declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.