Skip to main content
Glama

podium-mcp

One baton. Every instrument.

A single MCP stdio endpoint with 51 tools for iOS (simulator + real) and Android device control, native UI automation, end-to-end flows, trustworthy assertions, React Native debugging, WebView DOM + network inspection, and a no-vision canvas/WebGL brain for Pixi/Konva/Fabric/Phaser/Three/Babylon (validated live in WebKit) — plus an experimental engine bridge for instrumented Unity/GL builds (AltTester) — one connection instead of half a dozen servers.

npm Glama mcp.so CI License: MIT

tools 51 tests 378 tokens ~5x cheaper canvas 6 live engines Node ≥22 TypeScript strict MCP stdio PRs welcome

One prompt → podium drives Safari live → types the URL → explores the profile → opens a repo. Footage captured on a live iPhone 16 Pro simulator.


A podium is where a maestro stands — one place to conduct the whole orchestra. This MCP server unifies eight capability sets behind a single stdio endpoint:

  • Device & app management — iOS simulators (simctl), real iPhones (devicectl), and Android (adb) behind one platform-tagged device model.

  • Native UI inspection & gestures — route through idb/mobilecli with a Maestro fallback (no per-gesture JVM spin-up).

  • End-to-end flows & batch automation — declarative Maestro flows, ordered action batches, and an engineer→QA flow exporter.

  • Trustworthy assertions — an oracle ladder (WebView-DOM › native a11y › Maestro) that returns falsifiable, evidenced verdicts and fails closed.

  • WebView DOM + network — resolve WKWebView DOM to tap coordinates, evaluate JS, drive navigation, and capture in-page HTTP traffic as JSON/HAR.

  • React Native debugging — Metro console logs, network requests, and in-app state over CDP, plus host/simulator crash reports.

  • Real devices — Android emulator/device via adb (gestures + uiautomator hierarchy); real iOS via devicectl lifecycle + an opt-in WebDriverAgent backend.

  • Canvas & game-engine automation, no vision — a canvas/WebGL brain drives Pixi/Konva/Fabric/Phaser/Three/Babylon UIs as addressable objects (validated live in WebKit). An experimental engine bridge drives Unity/GL via an AltTester-instrumented build (or a window.__podiumEngine WebGL bridge) — code-complete + mock-tested, not yet run against a live Unity build.

Rather than wiring several MCP servers into every client config, podium-mcp exposes everything behind one connection, with a shared execFile layer (no shell), consistent structured errors, automatic retry around Maestro's iOS-driver flakiness, and a single health-check tool to confirm what's available on the host.

Table of contents

Related MCP server: Xcode-Studio-MCP

Why

Driving a React Native app end-to-end usually means juggling several MCP servers — one for device/app control, one for UI flows, one for Metro/debugger logs, another for WebView inspection — each with its own config entry, quirks, and failure modes. podium-mcp collapses that into one server with:

  • a single execFile-based command runner (no shell — arguments are passed verbatim),

  • consistent structured errors (a tool never crashes the server),

  • automatic retry around Maestro's known iOS-driver flakiness,

  • graceful degradation when a toolchain (e.g. adb) is absent,

  • evidenced verdicts so an agent knows when a flow actually worked.

Benchmarks

Podium is built on two choices that make it fast and cheap: it drives UIs as structured data — never screenshots — and routes gestures through a native backend with no per-action JVM spin-up.

Token economics — no-vision is ~5× cheaper

A screenshot-driven agent sends an image to a vision model on every step. Podium returns a compact structured element list instead. On an equivalent 8-step mobile flow (1179×2556 screenshots vs ~20-element lists):

Approach

Per step

8-step flow

Screenshot / vision loop

~2,070 tokens

16,557 tokens

Podium — no-vision, structured

~390 tokens

3,117 tokens

Savings

5.3×

−13,440 tokens (−81%)

vision loop  ████████████████████████████████  16,557 tokens
Podium       ██████  3,117 tokens   (5.3× cheaper, −81%)

The gap compounds with every step — a 30-step session runs roughly 62k vs 12k input tokens. On top of per-step cost, the full 51-tool schema travels with every request (~3,612 tokens, ~71/tool); Podium keeps tool descriptions lean so the tool block never dominates the context window.

For canvas / WebGL UIs the advantage is structural, not just cheaper: the Canvas Brain addresses objects by name and text, where a screenshot-only agent must re-analyze pixels on every frame.

Speed — native-first gesture backend

Gestures route through idb / mobilecli instead of spinning up Maestro's JVM per action (measured on a live iPhone 16 Pro simulator):

Operation

Maestro (per-call JVM)

Podium native

Speedup

tap_on

~14.7 s

~0.6 s

~24×

inspect_screen

~8.9 s

~0.9 s

~10×

One connection, not six

All 51 tools — device & app control, UI automation, declarative Maestro flows, evidenced assertions, WebView DOM + network capture, React Native / Metro debugging, and no-vision canvas/WebGL automation (plus an experimental engine bridge for instrumented Unity/GL) — sit behind a single stdio endpoint, replacing the usual stack of half a dozen separate MCP servers.

Token figures are heuristic estimates (~4 chars/token; Anthropic's ~750 px/token image formula) — reproduce with npm run token-bench, or swap in the Anthropic count_tokens API for exact counts. Speed figures were measured on a live iPhone 16 Pro simulator (npm run benchmark).

Requirements

  • macOS with Xcode command-line tools (xcrun, simctl)

  • Node.js ≥ 22 (uses native fetch and WebSocket; .npmrc sets engine-strict=true)

  • mobilecli — bundled automatically as an npm dependency; the default native gesture + WebView backend (no separate install)

  • (optional) idb (idb + idb_companion) — preferred native gesture backend when both are present; auto-detected

  • (optional) Maestro on PATH (or at ~/.maestro/bin) — the run_flow engine and the gesture fallback path

  • (optional) a running Metro bundler for the metro_* debugging tools

  • (optional) Android SDK + adb — adb paths are detection-only and degrade gracefully when absent

Platform scope (v0.3.0): podium automates iOS simulators, real iPhones (devicectl lifecycle + opt-in WebDriverAgent), and Android emulators/devices (adb gestures + uiautomator hierarchy). device_list tags each target with its platform and the backend is selected per target. When a toolchain (e.g. adb) is absent, those paths degrade to an informative result instead of failing.

Install

No manual config — one-time marketplace setup, then install:

/plugin marketplace add github:hoainho/podium-mcp
/plugin install podium-mcp@podium

The plugin auto-starts the MCP server (all 51 tools) and ships five skills:

Skill

Invoke

What it does

Device info

/podium-mcp:device-info <UDID> [<BUNDLE_ID>]

Health check, screen size, orientation, app list

E2E flow

/podium-mcp:e2e <UDID> <BUNDLE_ID> [path or description]

Run or author a Maestro flow

Bug repro

/podium-mcp:bug-repro <UDID> <BUNDLE_ID> <description>

Video + logs + crash evidence capture

RN debug

/podium-mcp:rn-debug [UDID] [logs|apps|crash|all]

Metro logs, connected apps, crash reports

Canvas brain

/podium-mcp:canvas <UDID> <intent>

Inspect / resolve / tap canvas-WebGL UIs, no vision

npx (zero install)

{
  "mcpServers": {
    "podium": { "command": "npx", "args": ["-y", "podium-mcp"] }
  }
}

Manual (from source)

git clone git@github.com:hoainho/podium-mcp.git
cd podium-mcp
npm install
npm run build

Usage

Register the built server with any MCP client. Claude Code (.mcp.json):

{
  "mcpServers": {
    "podium": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/podium-mcp/dist/index.js"]
    }
  }
}

Quick manual smoke test over raw stdio (lists the 51 registered tools):

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' | node dist/index.js

Always call podium_health first to confirm which toolchain is available on the host.

Quick start (order of use)

  1. podium_health — confirm xcrun / maestro / native backend availability.

  2. device_list — pick a booted simulator udid.

  3. Read stateapp_list, app_state, screen_size, orientation_get.

  4. Drive the deviceapp_launch, then tap_on / input_text / swipe / press_key, plus set_location and orientation_set. Batch several with run_steps.

  5. Author & verifyinspect_screen to discover elements, run_flow for declarative checks, then assert_visible / validate_flow for an evidenced verdict.

  6. Inspect WebViewswebview_inspect → tap coordinates, webview_eval, webview_navigate, webview_network.

  7. Capture & debugscreenshot / record_startrecord_stop; metro_logs / metro_network / metro_state; crash_list / crash_get.

The 51 tools

Every tool returns structured JSON and never throws — failures come back as MCP tool errors. See docs/tool-catalog.md for the authoritative per-parameter reference.

Platform support (v0.3.0): the gesture / inspect / lifecycle tools below run on iOS simulators, real iPhones (devicectl + opt-in WebDriverAgent via PODIUM_WDA_URL), and Android (emulator/device via adb; hierarchy from uiautomator). device_list tags each device with its platform and the backend is selected per target.

Game engine — Unity / GL via AltTester, no vision · experimental (4)

Tool

Key params

Backing engine

Behavior

engine_inspect

udid, by?, value

AltTester (TCP) / WebGL CDP bridge

Lists engine objects (by name/path/component/text) with absolute screen coords — no screenshots

engine_tap

udid, by?, value

AltTester / CDP

Resolves the object and taps its screen coordinates

engine_swipe

udid, fromX/Y, toX/Y, durationMs?

AltTester / CDP

Swipe inside the engine view

engine_call

udid, by?, value, component, method, parameters?

AltTester / CDP

Invokes a C# component method by reflection (the engine analog of a DOM event handler)

Status: experimental. The wire shapes are unit-tested against mocks; the AltTester path has not yet been validated against a live Unity build (engine-smoke skips until an instrumented build is provided), and Unity-WebGL needs the app to expose window.__podiumEngine. Engine tools require an AltTester-instrumented build (dev/staging) or that WebGL bridge; on a non-instrumented build they fail closed with an actionable error — never a vision fallback. For canvas/WebGL apps using a JS framework, the canvas brain below is the validated path.

Canvas brain — Pixi/Konva/Fabric/Phaser/Three/Babylon, no vision (3)

Tool

Key params

Backing engine

Behavior

canvas_inspect

udid, by?, value?, webviewId?

injected scene-graph bridge (CDP eval)

Lists canvas objects with tap-ready CSS-px coords — no screenshots

canvas_resolve

udid, intent, webviewId?

bridge + semantic resolver

Maps a fuzzy intent ("close", "✕") to a ranked, evidenced target; fail-closed confidentEnough

canvas_tap

udid, intent, bundleId?, webviewId?

resolver + native tap

Resolves + taps the confident match at absolute screen coords (else fails closed)

Validated live: all six frameworks pass a Playwright-WebKit (≈ WKWebView) suite at DPR 1 + 3 (npm run test:canvas, 19 tests). Canvas tools require an inspectable WKWebView hosting a supported framework with its root reachable (commonly on window, or Pixi's __PIXI_APP__). No framework / no inspectable WebView → fails closed with an actionable error — never a vision fallback.

Diagnostics (1)

Tool

Key params

Backing engine

Behavior

podium_token_report

steps?, screenshotWidth?, screenshotHeight?, elementsPerStep?, toolCount?

token estimators

No-vision vs screenshot/vision-loop input tokens, the savings ratio, and the per-request tool-definition overhead

Health & toolchain (1)

Tool

Key params

Backing engine

Behavior

podium_health

which probes

Never fails; reports toolchain { xcrun, maestro, adb }, native backend, and platforms: [ios-sim, ios-real, android]

Device & simulator (6)

Tool

Key params

Backing engine

Behavior

device_list

simctl list -j + adb devices

Merged iOS inventory; adb absent → android: { available: false } (detection-only)

device_boot

udid

simctl boot

Idempotent — already-booted → alreadyBooted: true; waits up to 30 s

screen_size

udid

simctl io screenshot + sips

{ widthPx, heightPx } (real pixels)

orientation_get

udid

native query → screenshot heuristic

{ orientation, basis } (exact when native)

set_location

udid, latitude, longitude

simctl location set

Codifies the QA geo-spinner fix

open_url

udid, url

simctl openurl

Deep links + https://

Apps (6)

Tool

Key params

Backing engine

Behavior

app_install

udid, path (.app/.zip)

simctl install

Structured tool error

app_launch

udid, bundleId

simctl launch

Explicit 30 s timeout (cold RN launches no longer mis-report failure)

app_terminate

udid, bundleId

simctl terminate

Structured tool error

app_uninstall

udid, bundleId

simctl uninstall

Structured tool error

app_list

udid

simctl listapps + plutil

{ count, apps: [{ bundleId, name, type }] }

app_state

udid, bundleId

simctl listapps + launchctl

{ installed, running }exact bundle-id match

Capture (3)

Tool

Key params

Backing engine

Behavior

screenshot

udid, saveTo?

simctl io screenshot

Returns path + byteSize (no base64 bloat)

record_start

udid, saveTo? (.mp4)

detached simctl io recordVideo

{ ok, path, pid }; timestamped path + duration watchdog (PODIUM_MAX_RECORDING_MS); one per udid

record_stop

udid

SIGINT recorder + flush

{ ok, path, sizeBytes }

UI inspection & gestures (8)

Tool

Key params

Backing engine

Behavior

inspect_screen

udid, compact?

native flat AX list → maestro hierarchy

compact:true (default) returns only meaningful nodes

tap_on

udid, bundleId, text|id|x+y, double?, long?

native tap → Maestro fallback

text/id resolved via the element list; reports backend

input_text

udid, bundleId, text, submit?

native → Maestro fallback

reports backend

swipe

udid, bundleId, direction, start/end?

native → Maestro fallback

%/pixel overrides resolved vs logical screen size

press_key

udid, bundleId, key

native → Maestro fallback

back/power/tab are Android-only

orientation_set

udid, bundleId, value

native → Maestro fallback

PORTRAIT / LANDSCAPE_LEFT / LANDSCAPE_RIGHT / UPSIDE_DOWN

tap_with_fallback

udid, x, y, maxRetries?, offsetStep?

native tap + before/after oracle

For WebGL/Canvas overlays; no blind walk (offsetStep opt-in)

notification_bar_clear

udid, bundleId?

native tap + oracle

Dismisses the RN debug notification bar

Flows & batch automation (4)

Tool

Key params

Backing engine

Behavior

run_steps

udid, bundleId, steps[]

native backend (idb/mobilecli)

Ordered action batch in one call; per-step results

run_flow

udid + exactly one of yaml/files/dir(+tags), env?

maestro test

Exactly-one-of validated before exec; per-step pass/fail

export_flow

steps[], output path

flow generator

Exports a run_steps batch to a reusable Maestro flow (engineer→QA bridge)

cheat_sheet

bundled assets/maestro-cheat-sheet.yaml

Fully offline Maestro syntax reference

Assertions & verdicts — the oracle ladder (5)

Tool

Key params

Backing engine

Behavior

assert_visible

udid, text|id, …

oracle ladder (WebView-DOM › a11y › Maestro)

Evidenced pass/fail; reports which oracle proved it

assert_text

udid, text

oracle ladder

by-text shorthand for assert_visible

assert_not_visible

udid, text|id

oracle ladder

Fails closed — if absence can't be verified, it fails

wait_for_element

udid, text|id, timeoutMs?

oracle ladder (polling)

Polls until visible or times out

validate_flow

udid, flow + assertions

oracle ladder + flow run

Trustworthy, falsifiable verdict on whether a just-built flow works

WebView DOM & network (4)

Tool

Key params

Backing engine

Behavior

webview_inspect

udid, selector?, webviewId?, max?

mobilecli (CDP)

Resolves a CSS selector to DOM elements with absolute tapX/tapY

webview_eval

udid, expression, webviewId?

mobilecli (CDP)

Runs JS in the page context; gated by PODIUM_DISABLE_WEBVIEW_EVAL=1

webview_navigate

udid, action (goto/back/forward/reload), url?

mobilecli (CDP)

Drives WebView navigation

webview_network

udid, durationMs?, format (json/har)?, saveTo?, redact?, includeResources?

CDP + in-page fetch/XHR shim + Resource Timing

Captures in-WebView HTTP traffic; exports redacted JSON or HAR 1.2

React Native debugging — Metro CDP (4)

Tool

Key params

Backing engine

Behavior

metro_apps

port? (8081)

GET http://localhost:<port>/json

Differentiated errors (timeout vs not-running vs other)

metro_logs

wsUrl?/port?, durationMs?, maxLogs?

WebSocket + CDP Runtime.enable

Auto-discovers first app when URL omitted

metro_network

wsUrl?/port?, durationMs?, maxEntries?

CDP Network.enable

Requests (url/method/status/mimeType/ts)

metro_state

expression?/wsUrl?/port?, timeoutMs?

CDP Runtime.evaluate

Reads in-app state (default: globally-exposed Redux store)

Crash diagnostics (2)

Tool

Key params

Backing engine

Behavior

crash_list

processName?, sinceHours?, udid?

host + sim DiagnosticReports

Newest-first; tagged source: host | simulator

crash_get

id, udid?

same

Path-traversal-safe (basename only); truncates honestly

The oracle ladder — trustworthy assertions

"It works" is operationalized as a falsifiable, evidenced verdict — never "looks ok". Assertions and validate_flow resolve visibility through a three-rung ladder, using the strongest available signal:

  1. WebView DOM — when an inspectable WKWebView is present, query the real DOM.

  2. Native accessibility — the native AX element set (via idb/mobilecli).

  3. MaestroassertVisible/assertNotVisible as the fallback.

assert_not_visible fails closed: if absence can't be positively verified (e.g. a WebView is unreadable), it reports failure rather than a false pass. Every verdict names the oracle that produced it, so an agent can weight its confidence.

Native-first gesture backend

Imperative gestures (tap_on, input_text, swipe, press_key, orientation_set, run_steps) and inspect_screen route through the fastest available backend, probed once and cached (with a short negative-cache TTL so a backend that starts after launch is picked up):

  1. idb — when both idb and idb_companion are installed (native, fastest).

  2. mobilecli — the bundled npm dependency (prebuilt Go binary). Default; no install.

  3. Maestro fallback — when no native backend resolves, or for actions it can't express (double/long-press, UPSIDE_DOWN). The gesture generates a minimal flow with launchApp: { stopApp: false }, foregrounding the app without restarting so state is preserved.

Each result reports the backend it used. Set PODIUM_DISABLE_NATIVE=1 to force Maestro. Eliminating the per-gesture JVM spin-up cut tap_on ~14.7 s → ~0.6 s and inspect_screen ~8.9 s → ~0.9 s on an iPhone 16 Pro simulator. Run npm run benchmark for a full pass/fail sweep.

Maestro flakiness retry: when the fallback runs, its iOS driver intermittently fails with Failed to connect to 127.0.0.1:<port>. Flows retry up to 2× with 2 s / 5 s backoff and report the retries count; a persistent failure returns the raw output with remediation hints.

WebView & RN network introspection

Two distinct network layers, two tools:

  • metro_network captures requests on the RN/Hermes target via the CDP Network domain — the right tool for a native RN app's own fetch.

  • webview_network captures traffic inside a WKWebView: it injects a fetch/XHR recorder (rich — method/status/headers/body for calls after capture starts) and reads the browser's Performance Resource Timing buffer (includeResources, default on) — every request since navigation, including pre-capture ones (URL/timing/size). The merge yields a near-complete request list, exported as redacted JSON or HAR 1.2.

For an RN shell that hosts its UI in a WebView, the app's API calls run in the web layer — so metro_network sees nothing and webview_network is the tool to reach for. WebView tools require WKWebView.isInspectable = true (default in debug/staging builds; off in production); when none is found they return an actionable error.

Documented limits (by design, not bugs)

  • Canvas/WebGL needs a cooperating JS framework — the canvas brain automates Pixi/Konva/Fabric/Phaser/Three/Babylon UIs by selector when the app exposes its scene-graph root (validated live). A raw/custom WebGL canvas, an opaque/production build, or Unity without an AltTester / window.__podiumEngine bridge is not selector-addressable — fall back to tap_with_fallback with screenshot-derived coordinates, or instrument the build.

  • WebView tools are dev/QA only — production App Store builds typically set isInspectable = false; tools return an actionable error and fall back to coordinate taps.

  • WebView content-process memory is unreadable from the app sandbox (platform limit) — use indirect signals (memory warnings, process terminations).

  • Maestro text: matcher is full-string regex (IGNORE_CASE) — partial strings don't match; copy hierarchy text verbatim or anchor with .*.

  • Android requires adb on PATH — gestures / inspect / screenshot work once adb is present; when it's absent every Android path degrades to a structured "adb not found" result.

  • orientation_get is a screenshot-aspect heuristic when no native backend is present — iOS simulators expose no direct orientation query.

  • record_start/record_stop keep state in-process — serialize start → … → stop on one connection; one active recording per udid (a watchdog finalizes one that's never stopped).

Architecture

src/
  index.ts          # MCP server entry — registers every tool group, warms caches
  lib/
    exec.ts         # execFile-based runner (NO shell) + timeout/timedOut flag
    result.ts       # shared ok/error MCP content helpers
    simctl.ts       # xcrun simctl wrappers + device-list TTL cache
    native.ts       # gesture/inspect backend: idb → mobilecli → null (re-probe TTL)
    idb.ts          # idb gesture/inspect adapter
    gesture.ts      # unified native→Maestro executors (shared by screen + steps)
    oracle.ts       # the oracle ladder: WebView-DOM › a11y › Maestro
    maestro.ts      # Maestro engine: flow runner, idb retry, hierarchy
    export-maestro.ts # run_steps → reusable Maestro flow
    har.ts          # HAR 1.2 export for webview_network
    webview.ts      # mobilecli CDP — WebView list/inspect/eval/navigate/network
    metro.ts        # Metro CDP — app discovery, logs, network, state
    crash.ts        # DiagnosticReports crash listing/reading
    recording.ts    # detached screen recording lifecycle + watchdog (platform-aware)
    device-target.ts # DeviceTarget model + PlatformDriver registry (v0.3.0)
    drivers/        # per-platform lifecycle: ios-sim, android, ios-real
    adb.ts          # Android adb driver (list/install/launch/screenshot/wm size)
    adb-backend.ts  # adb gesture/inspect (input + uiautomator → AX elements)
    iosreal.ts      # real iOS via devicectl (list/install/launch) + capture
    wda.ts          # opt-in WebDriverAgent backend (/source + tap/swipe/keys)
    engine.ts       # no-vision engine client (AltTester + WebGL-in-WebView)
    engine-transport.ts # WebSocket transport for the AltTester bridge
    canvas-types.ts # Canvas Brain shared contract (CanvasObject, selectors)
    canvas-adapters.ts  # in-page bridge: detect + walk Pixi/Konva/Fabric/Phaser/Three/Babylon
    canvas-resolver.ts  # semantic "close brain": intent → ranked, evidenced target
    canvas-a11y.ts  # Flutter/ARIA fallback reader → CanvasObject (scaffolding, not wired — #9)
    canvas-vision.ts # opt-in vision fallback scaffolding (not wired — #9)
    token-report.ts # token estimators + no-vision vs vision-loop comparison
  tools/            # one file per group:
                    #   health, device, screen, steps, flow, assert, validate,
                    #   webview, debug, engine, canvas, token
assets/             # bundled offline Maestro cheat sheet + demo.gif
scripts/            # benchmark.ts, compare-mcps.ts, token-bench.mjs
e2e/                # smoke suites (smoke / full-smoke / webview-network-live / android-smoke / engine-smoke)
test/canvas-e2e/    # live Playwright-WebKit canvas bridge suite (6 frameworks)
docs/               # tool catalog, e2e transcript, roadmap, token-economics

Development & testing

npm run build       # tsc
npm run typecheck   # tsc --noEmit
npm test            # vitest run — 359 unit/integration tests (exec/network mocked, no sim needed)
npm run test:canvas # live canvas bridge suite in Playwright WebKit — 19 tests (run `npx playwright install webkit` first)
npm run benchmark   # spawn a fresh server over stdio and sweep the tool suite
node e2e/smoke.e2e.mjs        # real E2E against a booted simulator (macOS + Xcode)
node e2e/full-smoke.e2e.mjs   # drives the iOS-sim tool handlers (happy + structured-error paths)
node e2e/android-smoke.e2e.mjs # Android emulator/device smoke (story A3)
node e2e/engine-smoke.e2e.mjs  # AltTester engine smoke; skips without an instrumented build (story C4)

359 unit/integration tests across 31 files, plus 19 live canvas-bridge tests (378 total), all passing — including the v0.3.0 device-target registry, the Android adb driver + uiautomator parser, the AltTester engine client + WebGL bridge, the devicectl/WDA real-iOS parsers, plus the v0.2.0 oracle ladder, recording watchdog, gesture-parity, HAR export, WebView, and Metro paths.

Standards: TypeScript strict, no as any / @ts-ignore, no shell execution (all commands via lib/exec.ts), tools return structured errors instead of throwing. See CONTRIBUTING.md for the "add a new tool" checklist.

E2E on CI: the E2E (simulator) workflow boots a real iOS simulator on a macOS runner and runs the smoke suites nightly + on demand (not a PR gate — simulator runs are slow). full-smoke.e2e.mjs asserts the happy path where a target exists and the real structured-error path where a dependency is absent (a debug isInspectable app for WebView; a connected RN app for metro_*).

Roadmap & contributing

podium-mcp is production-ready for iOS/Android UI automation and no-vision canvas/WebGL (Pixi/Konva/Fabric/Phaser/Three/Babylon — validated live). The frontier, where a contributor can make a real dent, lives in open issues:

High-impacthelp wanted

  • #1 — validate the AltTester/Unity engine path against a live instrumented Unity build (the biggest gap to real Unity automation).

  • #2real-device WKWebView e2e for the canvas brain (today validated in Playwright WebKit).

  • #3Unity-WebGL adapter: auto-detect + a drop-in window.__podiumEngine bridge.

Good first issuesgood first issue

  • #4 — more canvas adapters (PlayCanvas, Cocos Creator, p5.js).

  • #5 — expose canvas_hittest / canvas_object_rect tools.

  • #7 — exact token counts via the Anthropic count_tokens API.

  • #6 — address Konva Group/Container targets.

Adding a tool follows one checklist in CONTRIBUTING.md: TypeScript strict, no shell, structured-errors-never-throw, a vitest test, and a row in the tool catalog. PRs welcome.

Releasing

server.json is the official MCP Registry manifest. Pushing a v* tag runs Publish to npm then Publish to MCP Registry (GitHub OIDC for the io.github.hoainho/* namespace — no long-lived token). Both workflows run typecheck → build → test as a gate first; the registry publish only succeeds once the matching npm version is live, and versions are immutable.

Prompt playbook & references

  • prompts/ — copy-paste prompts for e2e flows, test cases, feature verification, bug fixing, and device control. Each names the podium tools it drives and was validated on a real simulator. Start with prompts/README.md.

  • docs/tool-catalog.md — authoritative tool-by-tool reference.

  • docs/e2e-demo.md — a real transcript against a booted iPhone 16 Pro simulator running a production RN app.

Design ideas

  • One podium, one connection. A single server fronts every mobile capability so an agent configures one endpoint and discovers all 51 tools at once.

  • Safe by construction. Every external command runs through an execFile layer with an explicit argument array — never a shell string.

  • Never crash the conductor. Tools return structured results and errors instead of throwing; one bad call can't take the server down.

  • Degrade, don't fail. A missing toolchain (e.g. Android's adb) yields an informative result rather than a hard error.

  • Prove it, don't guess. Assertions return evidenced verdicts via the oracle ladder and fail closed when they can't verify.

Contributing

Contributions welcome — see CONTRIBUTING.md and the Code of Conduct. Use the issue templates for bugs and feature requests.

Security

Please report vulnerabilities privately per SECURITY.md — do not open a public issue. SECURITY.md also documents the webview_eval / run_flow trust boundary and the PII-in-transcript caveat.

License

MIT © 2026 hoainho

Available Tools

43 tools
app_installA

Installs an app on an iOS simulator. Accepts a path to a .app directory or a .zip archive.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
pathYesPath to the .app directory or .zip file to install

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so description carries full burden. It states installation but does not disclose whether it overwrites, checks for existing app, requires simulator booted, or handles errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no wasted words, front-loaded with the essential purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple tool, but lacks info on prerequisites, side effects, or success criteria, leaving gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter descriptions. Description adds no new meaning beyond stating accepted formats, which is already covered in the path parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it installs an app on an iOS simulator and specifies accepted formats (.app or .zip), distinguishing it from sibling tools like app_launch, app_list, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for installing apps, but no explicit guidance on when to use versus alternatives, prerequisites, or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_launchB

Launches an app on an iOS simulator by bundle ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
bundleIdYesApp bundle identifier (e.g. com.example.MyApp)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It fails to disclose side effects (e.g., does it reset app state?), prerequisites (simulator must be booted), or error conditions (app not found).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, well-structured sentence. No unnecessary words or repetition. Efficiently conveys core function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite low parameter complexity and no output schema, the description lacks important context for an action tool: prerequisites (simulator booted, app installed), potential errors, and behavior when conditions aren't met.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline 3. The description adds no extra meaning beyond what the schema already provides for 'udid' and 'bundleId'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (launch), target (app on iOS simulator), and key parameter (bundle ID). It distinguishes from sibling tools like app_install or app_terminate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives (e.g., app_install if app not installed, or device_boot if simulator not running). No prerequisites mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_listA

Returns the list of installed apps on a booted iOS simulator. Includes bundle ID, display name, and application type (User/System).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID (from device_list)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist. The description indicates a read-only operation and states the required condition (booted simulator). However, it doesn't disclose error handling or behavior when the simulator is not booted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. Front-loaded with the core action and includes key details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one parameter and no output schema, the description adequately covers the return fields and precondition (booted simulator). Could mention error scenarios but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter 'udid' with a description. The tool's description does not add additional meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Returns the list of installed apps on a booted iOS simulator' with specific fields. This distinguishes it from sibling tools like app_install, app_launch, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or alternatives guidance is provided. The usage is implied by the tool's purpose, but it doesn't mention when to choose app_list over other listing tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_stateA

Checks whether an app is installed and/or running on an iOS simulator. installed: exact bundle-id match against the parsed simctl listapps output; running: matches the launchctl UIKitApplication: label on a token boundary (no prefix false positives).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
bundleIdYesApp bundle identifier (e.g. com.example.MyApp)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses matching rules (exact bundle-id for installed, token boundary for running) and mentions no prefix false positives. However, does not disclose what the output looks like, error behavior, or any side effects. With no annotations, more detail would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose, second provides critical functional detail. No redundancy or filler. Front-loaded and highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose and matching logic, but omits description of return format or values. Since no output schema exists, the description should provide this information to be fully complete. Adequate but leaves a gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already describes both parameters concisely (udid and bundleId). Description adds no additional parameter-level semantics beyond the schema's own descriptions. Baseline score of 3 is appropriate given 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'checks' and resource 'app on iOS simulator'. Distinguishes from sibling tools like app_install or app_list by specifying it checks both installed and running states. The detailed matching criteria further clarify the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implied usage for checking app state, but no explicit guidance on when to use it versus alternatives like app_list or other inspection tools. No when-not-to-use or context provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_terminateB

Terminates a running app on an iOS simulator by bundle ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
bundleIdYesApp bundle identifier

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description only states the core action without disclosing side effects, requirements (e.g., simulator must be booted), or what happens if the app is not running.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no unnecessary words. Well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and two simple parameters, the description is adequate but lacks context about prerequisites (e.g., simulator must be running) or return behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. The description mentions bundleId but not udid, adding minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action 'terminates', the resource 'running app on iOS simulator', and the method 'by bundle ID'. It distinguishes the tool from siblings like app_install, app_launch, and app_uninstall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like app_uninstall or app_launch. The description implies it stops a running app but does not mention prerequisites or edge cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

app_uninstallB

Uninstalls an app from an iOS simulator by bundle ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
bundleIdYesApp bundle identifier to uninstall (e.g. com.example.MyApp)

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavioral traits. It only states the action 'uninstalls' without describing side effects, permissions, or consequences (e.g., data deletion, simulator state requirements). This is insufficient for an agent to predict side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no redundancy. It is front-loaded with the verb and key identifier. Slightly more detail could be added without sacrificing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema and annotations, the description is incomplete. It does not explain return values, error conditions, or behavioral context (e.g., whether the simulator must be booted). For a simple tool, some gaps are acceptable, but these omissions reduce completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear parameter descriptions for udid and bundleId. The tool description adds the context of uninstalling by bundle ID, which aligns with the schema but does not add significant new semantics. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Uninstalls), the resource (app from an iOS simulator), and the method (by bundle ID). It effectively distinguishes from sibling tools like app_install and app_terminate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like app_terminate, nor are there any preconditions or exclusions mentioned. The description is purely definitional.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assert_not_visibleA

Asserts an element/text is ABSENT. FAILS CLOSED: if absence cannot be verified (e.g. a WebView whose DOM is unreadable — native a11y is blind to web content), returns an 'unverifiable' error rather than a false pass. Passes only when a capable oracle confirms absence.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
textNoVisible text to match (native a11y / WebView innerText)
selectorNoCSS selector — WebView surfaces only
bundleIdNoApp bundle id for the Maestro fallback (native surface)
containsNoSubstring match for text (default false = exact full-string on native a11y). WebView innerText is always substring.
timeoutMsNoConfirmation budget (default 1500)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses critical behavioral trait: fails closed with an 'unverifiable' error instead of a false pass. Describes conditions for failure (e.g., WebView with unreadable DOM). No annotations provided, so description fully addresses behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each essential. First states purpose, second adds critical failure mode. No redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key behavioral nuances (fails closed, verification conditions) for a moderately complex tool with 6 parameters and no output schema. Slight gap: does not describe the success/error return format, but error behavior is implied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds context for some parameters (e.g., 'native a11y / WebView innerText' for text) but does not significantly augment beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool asserts an element/text is absent. Provides specific behavior (FAILS CLOSED) and distinguishes from sibling tools like assert_visible and assert_text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when the tool will fail (unverifiable absence) and passes only when a capable oracle confirms absence. Implicitly guides when to use vs alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assert_textA

Asserts the given text is visible on screen (by-text shorthand for assert_visible). Same oracle ladder + unverifiable handling.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
textYesVisible text to assert
bundleIdNoApp bundle id for the Maestro fallback (native surface)
containsNoSubstring match for text (default false = exact full-string on native a11y). WebView innerText is always substring.
timeoutMsNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It mentions 'Same oracle ladder + unverifiable handling', which hints at underlying behavior but does not fully disclose what happens on failure, side effects, or timing behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise, consisting of two sentences that are both informative and relevant. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple but lacks details like what happens on pass/fail, error messages, or clarification of 'unverifiable handling'. Without annotations or output schema, the description could be more complete, though it covers the core purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (80%), so the baseline is 3. The description does not add significant meaning beyond the schema; it provides high-level context (shorthand for assert_visible) but no parameter-specific details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'asserts' and the resource 'text visible on screen', and distinguishes itself as a shorthand for assert_visible. This differentiates the tool from its sibling assert_visible and provides a specific use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this is a shorthand for assert_visible, implying it is used when wanting to assert by text rather than other selectors. However, it does not explicitly state when not to use it or provide alternatives beyond the sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assert_visibleA

Asserts an element/text is visible, via the oracle ladder (WebView-DOM > native a11y > Maestro). Passes only when a capable oracle confirms presence; if the surface is a WebView whose DOM can't be read (isInspectable=false), returns an 'unverifiable' error instead of a false pass. Provide text (any surface) or selector (WebView).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
textNoVisible text to match (native a11y / WebView innerText)
selectorNoCSS selector — WebView surfaces only
bundleIdNoApp bundle id for the Maestro fallback (native surface)
containsNoSubstring match for text (default false = exact full-string on native a11y). WebView innerText is always substring.
timeoutMsNoPoll budget (default 3000)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the oracle ladder, the 'unverifiable' error for non-inspectable WebViews, and substring matching behavior for WebView innerText, all beyond what annotations (none provided) would cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three efficient sentences front-load the core action and add necessary detail without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers key behaviors and parameter guidance, but lacks explicit return value description or comparison with assert_text. No output schema exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value by explaining oracle ladder, error behavior, and clarifying that WebView text is always substring despite the 'contains' default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it asserts visibility of an element/text via a specific oracle ladder, differentiating it from siblings like assert_not_visible and assert_text.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context on when to use (text or selector) and describes behavior for unverifiable WebViews, but does not explicitly exclude alternatives or compare with assert_text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cheat_sheetA

Returns the bundled Maestro flow script cheat sheet (offline copy). Consult this before authoring unfamiliar Maestro commands, required args, nested properties, conditionals, or multi-screen flows.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it returns an offline copy of the cheat sheet. No annotations are provided, but the description implies a read-only operation with no side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that covers purpose and usage without any wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no parameters and no output schema, the description provides all necessary context: what it returns and when to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, and the description does not need to explain them. According to guidelines, zero parameters warrant a baseline of 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns a cheat sheet for Maestro flow scripts, specifying the content (commands, required args, nested properties, conditionals, multi-screen flows). This distinguishes it from all sibling tools which are action-oriented.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly advises consulting this before authoring unfamiliar Maestro commands, providing a clear when-to-use. It does not explicitly state when not to use, but the context of siblings implies it is for reference, not execution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crash_getA

Reads a crash report by its id (filename from crash_list). For .ips files returns a parsed JSON header and the report body (first ~8000 chars, truncated flag set if longer). Pass the same udid used for crash_list to also resolve sim-container reports. Path-traversal-safe.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCrash report filename (id from crash_list)
udidNoSimulator UDID — also looks in that sim's container DiagnosticReports

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description fully carries burden. Discloses truncation (first ~8000 chars, truncated flag), path-traversal safety, and optional udid resolution. Adds meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no fluff. Front-loaded with primary action, then adds necessary details. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description adequately explains output for .ips files and safety. With only 2 params, this is sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, but description adds value by clarifying 'id' is from crash_list and 'udid' enables sim-container resolution. Goes beyond mere schema repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'Reads' and resource 'crash report', links to sibling crash_list, and clearly identifies input as filename from that list. Purpose is unambiguous and well-differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to pass udid (to resolve sim-container reports) and describes truncation behavior for .ips files. Does not explicitly state when not to use, but context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

crash_listA

Lists crash reports (.ips/.crash) from ~/Library/Logs/DiagnosticReports — plus the simulator's own container DiagnosticReports when udid is given — sorted newest first. Filter by processName (case-insensitive substring) and/or sinceHours.

ParametersJSON Schema
NameRequiredDescriptionDefault
processNameNoCase-insensitive substring to filter by process name
sinceHoursNoOnly include crashes from the last N hours
udidNoSimulator UDID — also scans that sim's container DiagnosticReports

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses directories scanned, sorting order, filtering behavior. No annotations provided, but description fairly covers behavioral aspects for a list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences: first covers main function, second adds key filtering details. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes inputs and behavior adequately for a list tool. No output schema, but return format is implicit. Incomplete only in not describing output structure, but acceptable given sibling crash_get.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context about udid expanding search to simulator container and sorting order, beyond schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it lists crash reports from a specific directory, sorted newest first, with filtering. Distinguishes from sibling crash_get by focusing on listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use (to browse crashes) and filtering options, but no explicit mention of when not to use or alternatives beyond sibling tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_bootA

Boots an iOS simulator by UDID. Waits up to 30 seconds for the boot command to complete. Idempotent: booting an already-booted device returns ok with alreadyBooted:true.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID (from device_list)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important behavioral details: waits up to 30 seconds, idempotent behavior, and response with alreadyBooted:true. With no annotations, the description carries the full burden and does so well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no wasted words, front-loading the main action and then adding key details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains return behavior (alreadyBooted:true). Also covers timeout and idempotency, making it complete for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers param fully (100% coverage) but description adds no extra meaning beyond referencing 'from device_list', which is already in schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Boots an iOS simulator by UDID'), distinguishing it from sibling tools like device_list which lists devices.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context (30s wait, idempotent) but does not explicitly state when to use or when not to use this tool compared to siblings. However, given the sibling set focuses on other operations, this is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

device_listA

Returns a merged inventory of available iOS simulators (udid, name, state, runtime) plus any adb-detected Android devices. If adb is absent, the android section reports availability: false instead of failing. NOTE: Android entries are detection-only — podium's automation tools (tap/inspect/etc.) currently target iOS simulators.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavior: it returns a merged list, gracefully handles missing adb, and clarifies Android is detection-only. This covers key behavioral traits without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. Information is front-loaded with the main purpose, then caveats and limitations are added efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and no output schema, the description sufficiently explains what the tool returns (iOS and Android fields) and important caveats (adb handling, Android automation limitation). No further information is needed for correct use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so description does not need to add param meaning. Baseline 4 applies as schema coverage is 100% and no param details are required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a merged inventory of iOS simulators and Android devices, specifying included fields (udid, name, state, runtime) and handling of missing adb. This distinct purpose differentiates it from sibling tools which are automation actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises when to use (to list devices) and notes that Android entries are detection-only and not usable with podium's automation tools, providing context for Android limitations. It lacks explicit mention of alternatives for Android automation but is otherwise clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_flowA

Exports a run_steps action sequence to a reusable Maestro flow (the engineer→QA bridge). Selector-based steps (tapText by id/text, key, swipe-by-direction, waitFor, assertVisible, screenshot) transpile cleanly. The lossy steps — coordinate tap/swipe, focused-field type, regex tapText — are emitted as commented '# TODO[unstable]' lines plus a warnings[] list, never as silently divergent YAML. Fix the TODOs to make the flow durable regression.

ParametersJSON Schema
NameRequiredDescriptionDefault
bundleIdYesApp bundle id for the flow's appId header
stepsYesThe run_steps action array to transpile

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It explicitly discloses that lossy steps (coordinate tap/swipe, focused-field type, regex tapText) are emitted as commented '# TODO[unstable]' lines plus a warnings[] list, never silently excluded. This is excellent transparency about edge cases and output behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that is informative but slightly verbose with phrases like 'the engineer→QA bridge'. It front-loads the main purpose and is mostly clear, but could be more concise. Overall efficient with minimal waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the output format (commented lines for lossy steps, warnings list) and transpilation behavior for selector-based steps. It covers major behavioral aspects but does not mention prerequisites or limitations beyond what schema implies. Completeness is good but not perfect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters ('bundleId' and 'steps') are fully described in the input schema with detailed descriptions. The description adds no new parameter-specific information beyond what is already in the schema. With 100% schema coverage, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool exports a run_steps action sequence to a reusable Maestro flow, specifying it as an 'engineer→QA bridge'. This verb+resource combination is specific and distinguishes it from sibling tools like run_flow, run_steps, and validate_flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use: when you want to convert a run_steps sequence into a durable Maestro flow. It mentions that lossy steps become TODOs, hinting at needed remediation. It does not explicitly state when not to use or compare to alternatives, but the context makes it reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

input_textA

Types text into the currently-focused element via an ephemeral Maestro flow. Set submit:true to press Enter after typing. Note: Android does not support Unicode via inputText. WebView caveat: inputText injects at the native buffer level — React onChange/onChangeText never fires. For WebView forms use mobile-mcp mobile_type_keys (real keystroke simulation) instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdYesApp bundle identifier
textYesText to type
submitNoPress Enter after typing (default false)
timeoutMsNoFlow timeout in ms
noLaunchNoSkip the implicit launchApp attach step (default false). Set true when an open modal or navigation state must not be disturbed.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so description carries full burden. It discloses Android Unicode limitation, WebView caveat (React onChange not firing), and the ephemeral Maestro flow nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences covering core function, option, and two key caveats. No redundancy, each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool without output schema, the description covers purpose, usage guidelines, behavioral caveats, and parameter nuances completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds context beyond schema: explains noLaunch to avoid implicit launch, and that submit triggers Enter. Adds meaning to text and submit parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool types text into the currently-focused element, uses a specific verb 'types', and distinguishes from sibling tool mobile_type_keys for WebView forms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when to use an alternative: 'For WebView forms use mobile-mcp mobile_type_keys instead.' Also explains the submit parameter and the noLaunch parameter's purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_screenA

Returns the current view hierarchy for a booted iOS simulator (podium's target platform). Uses idb's flat accessibility tree when idb is installed (fast), else maestro hierarchy. Defaults to compact:true — a flattened list of only the nodes that carry text / accessibility labels / resource-ids (dramatically smaller than the raw tree). Pass compact:false for the full nested hierarchy. LIMITATION: WebView (WKWebView/WebView) content is opaque — the hierarchy shows a single WebView node with no children. Web-rendered buttons, inputs, and labels are invisible to this tool. For WebView apps, identify elements visually via screenshot then calculate logical-point coordinates (screenshot pixels ÷ device scale factor, typically ÷3 on 3× Retina).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID (from device_list)
compactNoReturn a flattened list of meaningful nodes only (default true). false = full nested tree.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors: the fallback between idb and maestro, the default compact mode behavior, and the WebView opacity limitation. No annotations are provided, but the description compensates well. It does not cover authentication or rate limits, but these are not critical for a read-only hierarchy tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, starting with the main purpose, then detailing parameters, and finally noting limitations. Every sentence serves a purpose, though it could be slightly more concise by removing redundant phrases like 'dramatically smaller'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of an output schema, the description adequately explains the output format (flattened list vs full tree) and the key limitation. It does not specify the exact format (e.g., JSON or XML), but for an agent, this is sufficient to understand what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds meaningful context beyond the schema: it explains the default value of compact (true), what the compact mode does (flattened list of meaningful nodes), and provides a practical size comparison. This helps the agent understand the impact of the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool returns the current view hierarchy for a booted iOS simulator, specifying the platform (podium's target platform) and the underlying methods (idb or maestro). This clearly distinguishes it from sibling tools like screenshot or screen_size, which deal with visual representations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on when to use compact:true vs false, and addresses the WebView limitation by advising an alternative approach (screenshot + coordinate calculation). It does not explicitly list when not to use the tool, but the context is clear enough for an agent to make correct decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

metro_appsA

Lists React Native apps currently connected to a Metro bundler inspector. Returns CDP-style targets (id, title, webSocketDebuggerUrl). Returns a structured error if Metro is not running on the given port.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNoMetro dev server port (default 8081)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of transparency. It mentions the return type and fields, and discloses the error case when Metro is not running. However, it does not detail other behavioral aspects such as side effects, rate limits, or authentication requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long, front-loaded with the primary action and return structure, and includes an important error condition. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and no output schema, the description covers the key aspects: what is listed, the specific fields returned (CDP-style targets with id, title, webSocketDebuggerUrl), and the error case. This is sufficient for an agent to understand usage and expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter 'port', which is fully described in the schema. The description adds minimal extra parameter information beyond mentioning 'given port' in the error condition, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Lists' and the resource 'React Native apps currently connected to a Metro bundler inspector,' and specifies the return fields (id, title, webSocketDebuggerUrl). While it does not explicitly distinguish from sibling tools like metro_logs or metro_network, the purpose is specific and distinct based on the resource and return type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. It only describes the basic function without any contextual usage advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

metro_logsA

Reads console logs from a React Native app via the Metro CDP debugger. If webSocketDebuggerUrl is omitted, auto-discovers via metro_apps and uses the first connected app. Reports which app was chosen. Pass saveTo to also write the console timeline to a file for evidence (e.g. attach to a bug).

ParametersJSON Schema
NameRequiredDescriptionDefault
webSocketDebuggerUrlNoCDP WebSocket URL from metro_apps. Omit to auto-discover.
portNoMetro port for auto-discovery (default 8081)
durationMsNoHow long to collect logs in milliseconds (default 3000)
maxLogsNoMaximum number of log entries to return (default 100, keeps most recent)
saveToNoOptional file path; writes the console timeline (one line per entry: [level ts] text) for evidence.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must bear the transparency burden. It discloses auto-discovery behavior, app selection reporting, and file saving. However, it omits prerequisites (e.g., app must be connected) and side effects, and does not detail output format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three sentences, front-loading the core purpose. Every sentence adds value without redundancy, making it efficient for agent consumption.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 optional parameters and no output schema, the description covers main functionality, auto-discovery, and save option. However, it lacks details on output format, error handling, and prerequisites, leaving some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining that omitting webSocketDebuggerUrl triggers auto-discovery and that saveTo writes a timeline file for evidence, which goes beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads console logs from a React Native app via Metro CDP debugger. It specifies the verb 'reads' and the resource 'console logs', distinguishing it from sibling tools like metro_network and metro_state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides guidance on using auto-discovery vs. providing a URL, and mentions the optional saveTo parameter for evidence. However, it does not explicitly compare this tool to siblings or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

metro_networkA

Captures network requests from a React Native app via the Metro CDP debugger (Network domain). If webSocketDebuggerUrl is omitted, auto-discovers via metro_apps and uses the first connected app. Pairs requestWillBeSent with responseReceived by requestId (method, url, status, headers, timing). format:'har' emits a valid HAR 1.2 log (HAR-lite — no response bodies yet) you can open in Chrome DevTools → Import HAR; pass saveTo to write the .har file. Sensitive headers (authorization/cookie/…) are REDACTED by default — set redact:false to keep them (don't commit unredacted HAR: it leaks tokens).

ParametersJSON Schema
NameRequiredDescriptionDefault
webSocketDebuggerUrlNoCDP WebSocket URL from metro_apps. Omit to auto-discover.
portNoMetro port for auto-discovery (default 8081)
durationMsNoHow long to capture network activity in milliseconds (default 3000)
maxEntriesNoMaximum request entries to return (default 100, keeps most recent)
formatNoOutput format: 'json' (default, structured entries) or 'har' (HAR 1.2 log).
saveToNoOptional file path to write the output (a .har file when format:'har').
redactNoMask sensitive headers (authorization/cookie/set-cookie/…). Default true.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses key behaviors: auto-discovery, request/response pairing by requestId, redaction of sensitive headers by default, and format differences. It warns about not committing unredacted HAR. Missing details on rate limits or what happens if no app is connected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat long but well-structured with front-loaded core purpose. Every sentence adds value: pairing, format, redaction, save. Could be slightly more concise, but information density is high.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (7 parameters, no output schema, no annotations), the description covers all parameters meaningfully, explains output (HAR-lite), and includes safety warnings. It lacks detailed structure of 'json' output but mentions method, url, status, headers, timing, which is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds substantial meaning beyond the schema: explains auto-discovery for webSocketDebuggerUrl, defaults for port/duration/maxEntries, that format 'har' emits HAR-lite, redact default true, and saveTo for writing files. This enriches understanding significantly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Captures network requests from a React Native app via the Metro CDP debugger (Network domain)', specifying the action and resource. It distinguishes from siblings like metro_apps (list apps) and webview_network (webview context), as seen in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: auto-discovery when webSocketDebuggerUrl omitted, pairing of requests, format options, and a warning not to commit unredacted HAR. However, it does not explicitly mention when not to use this tool versus alternatives like webview_network.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

metro_stateA

Reads app state from a React Native app by evaluating a JS expression in its runtime via the Metro CDP debugger (Runtime.evaluate, returnByValue). Default expression reads a globally-exposed Redux store; override expression to read any in-app value. The app must expose the value on a global the runtime can reach. Auto-discovers the ws via metro_apps when omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionNoJS expression to evaluate (default: a globally-exposed Redux store's getState()). e.g. "store.getState().user" or "globalThis.__APP_STATE__".
webSocketDebuggerUrlNoCDP WebSocket URL from metro_apps. Omit to auto-discover.
portNoMetro port for auto-discovery (default 8081)
timeoutMsNoEvaluation timeout in ms (default 5000)

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the use of Runtime.evaluate with returnByValue, auto-discovery, and the need for global exposure. However, it does not explicitly state whether the evaluation is read-only or note potential side effects from custom expressions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, each providing essential information. The first sentence states the core action and mechanism; the second explains customization; the third covers prerequisites and auto-discovery. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool that evaluates an expression and returns a value, the description covers key aspects: input parameters, default behavior, auto-discovery, and prerequisites. It lacks explicit mention of the output format but that is implicit. Error handling or failure modes are not discussed, but overall it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions. The tool description adds value by explaining the default expression behavior, auto-discovery for webSocketDebuggerUrl, and practical examples for expression. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads app state by evaluating a JS expression via Metro CDP debugger. It specifies the default expression (Redux store) and overridability. It distinguishes itself from siblings like metro_apps by mentioning auto-discovery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use (to read app state or any in-app value via expression override) and mentions auto-discovery via metro_apps. It does not explicitly state when not to use, but context and sibling differentiation are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notification_bar_clearA

Attempts to dismiss the React Native debug notification bar that sometimes appears at the bottom of the screen and intercepts taps. Taps the debug icons area at (50, 850) via the native backend (idb, else Maestro) and takes a before/after screenshot. NOTE: the (50,850) tap point is a device-specific heuristic, and 'cleared' is decided by a screenshot byte-size delta — a best-effort signal, not a guarantee (see tap_with_fallback caveat).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdNoApp bundle id for the Maestro fallback (ignored when idb is present). Auto-detected if omitted.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description fully carries the burden of behavioral disclosure. It details the tap location (50,850), the backend order (idb else Maestro), the screenshot comparison method, and explicitly notes the heuristic nature and potential unreliability. This is thorough and honest about limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with three sentences covering purpose, mechanism, and caveats. It is front-loaded with the primary action and structured logically. While every sentence earns its place, the note about the heuristic slightly extends the length; however, it is necessary for transparency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity and absence of an output schema, the description provides adequate context. It explains the tool's goal, method, and limitations (heuristic, device-specific). No return value is described, but that is acceptable without an output schema. The description could include a note about potential side effects (e.g., accidental taps), but overall it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes both parameters with 100% coverage. The description adds value by explaining that 'bundleId' is only used for the Maestro fallback and can be auto-detected, which provides context beyond the schema's 'App bundle id for the Maestro fallback' description. For 'udid', no additional meaning is added, but the overall contribution justifies above baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to dismiss the React Native debug notification bar. It specifies the action ('dismiss'), the target resource ('debug notification bar'), and the context ('appears at the bottom of the screen and intercepts taps'). This distinguishes it from sibling tools like tap_on or tap_with_fallback, which are generic tap actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (when the debug notification bar appears), but it does not provide explicit guidance on when not to use it or suggest alternatives. For example, it does not mention that other tools should be used for non-debug bars or general interactions. The context is clear but lacks comparative direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_urlA

Opens a URL on an iOS simulator (deep-links, https:// etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
urlYesURL to open on the simulator

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, description carries full burden. Basic action is clear but lacks details on side effects, error handling, or prerequisites. Neither sufficient nor misleading.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with key action and resource. No wasted words, efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple tool with 2 parameters, but missing contextual info like prerequisite (device boot), return values, or failure modes. Not fully comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameters (udid, url) with descriptions. Description adds no additional meaning beyond what the schema provides. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the action (opens) and resource (URL on iOS simulator), with examples of URL types (deep-links, https). Distinguishes from siblings like webview_navigate which is for webviews in app.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives. Does not mention that the simulator must be booted first or that webview URLs may need webview_navigate instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

orientation_getA

Returns the current orientation of a booted iOS simulator. Queries the native backend (mobilecli) when available for an exact answer; otherwise derives it from the screenshot aspect ratio.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses a fallback behavior (deriving orientation from screenshot when native backend is unavailable) and implies a read-only operation. It does not mention any side effects, return format, or error cases, but the disclosed fallback is a valuable behavioral trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. The purpose is front-loaded, and the fallback detail is provided efficiently. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 required param, no output schema), the description is mostly complete. It explains the fallback behavior, which is a key detail. However, it does not specify the format of the returned orientation (e.g., string like 'portrait' or 'landscape'), which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% description coverage with 'Simulator UDID'. The tool description does not add any additional meaning or constraints beyond that. Baseline 3 is appropriate as the schema already explains the parameter adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: retrieving the current orientation of a booted iOS simulator. The verb 'Returns' and specific resource 'current orientation' leave no ambiguity. The sibling tool 'orientation_set' implicitly differentiates the get vs set use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use or not use this tool versus alternatives. It explains the underlying method (native backend vs screenshot) but lacks guidance on prerequisites or when to prefer one over the other. The use case is implied but not explicitly contrasted with 'orientation_set'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

orientation_setA

Sets the screen orientation on an iOS simulator via an ephemeral Maestro flow. bundleId is required (Maestro needs it for the appId flow header). Valid values: PORTRAIT, LANDSCAPE_LEFT, LANDSCAPE_RIGHT, UPSIDE_DOWN

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdYesApp bundle identifier
valueYesTarget orientation: PORTRAIT | LANDSCAPE_LEFT | LANDSCAPE_RIGHT | UPSIDE_DOWN
timeoutMsNoFlow timeout in ms
noLaunchNoSkip the implicit launchApp attach step (default false). Set true when an open modal or navigation state must not be disturbed.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations; description mentions 'ephemeral Maestro flow' hinting at temporary change, but lacks detail on side effects, permissions, or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with no fluff, front-loading the action and adding key parameter detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema; description sufficiently covers purpose, parameters, and valid values for a simple setter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 5 parameters; description adds context that bundleId is required for Maestro appId header, enhancing beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it sets screen orientation on an iOS simulator via Maestro flow, with explicit valid values. Distinguishes from sibling orientation_get.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage context: set orientation vs get orientation from sibling. Does not explicitly state when-not or alternatives, but purpose is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

podium_healthA

Returns health status of the podium-mcp server and toolchain availability. Scope: podium's automation tools target iOS simulators (macOS + Xcode). adb is detected for visibility but Android devices are not yet automatable.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that it returns health status, mentions toolchain availability, and notes the limitation regarding Android devices. It does not describe the return format but adequately covers behavioral traits for a read-only health check.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences. The first sentence states the core functionality, and the second adds scope details. Every sentence adds value with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, no output schema, and no annotations, the description is fairly complete. It explains what the tool returns and its scope limitations. Could elaborate on 'toolchain availability' but is adequate for a simple health check.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters with 100% coverage, so the baseline is 4. The description adds context about the tool's purpose and scope, which is sufficient for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns health status of the server and toolchain availability. It also distinguishes itself from siblings by being a health check tool, while siblings are for app management, device control, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates when to use it (to check health status) and provides scope context (iOS simulators only). However, it does not explicitly state when not to use it or provide alternatives, though no sibling serves this purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

press_keyA

Presses a hardware or system key via an ephemeral Maestro flow on the iOS simulator. Note: back/power/tab are Android key events and have no effect on iOS — they remain in the enum for a future Android backend. Valid keys: enter, home, lock, backspace, volume up, volume down, back, power, tab

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdYesApp bundle identifier
keyYesKey to press
timeoutMsNoFlow timeout in ms
noLaunchNoSkip the implicit launchApp attach step (default false). Set true when an open modal or navigation state must not be disturbed.

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description reveals the mechanism ('ephemeral Maestro flow') and platform limitation (iOS only). It lists valid keys but does not disclose side effects (e.g., pressing home exits app) or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first states the core function, the second adds a critical caveat. It is front-loaded, concise, and contains no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters (3 required) and no output schema or annotations. The description covers the main behavior and a key platform limitation, but lacks details on error conditions, prerequisites (e.g., device must be booted), or what happens on failure. It is minimally complete for a simple action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the Android key caveat and the purpose of noLaunch, but does not elaborate on timeoutMs or other parameters beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Presses'), the resource ('hardware or system key'), and the context ('via an ephemeral Maestro flow on the iOS simulator'). It distinguishes from sibling tools (e.g., tap_on, swipe) by specifying it deals with hardware/system keys.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description warns that back/power/tab are Android key events with no effect on iOS, providing partial guidance on when not to use certain keys. However, it does not explicitly state when to use this tool vs. alternatives like tap_on or input_text.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_startA

Starts a screen recording on a booted iOS simulator. The recording runs in a detached background process. Call record_stop to finalize and retrieve the file.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
saveToNoDestination file path (must end .mp4). Defaults to a tmp file.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that recording runs in a detached background process, adding behavioral context beyond the schema. No annotations provided, so description carries burden well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with main action, zero waste. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description implies no immediate output; return file via record_stop. Complete enough given simplicity and sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with descriptions for both parameters. Description adds no extra meaning beyond schema defaults (e.g., saveTo default tmp file). Adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool starts a screen recording on a booted iOS simulator, with a specific verb and resource, distinguishing it from sibling record_stop.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance to call record_stop to finalize and retrieve the file, indicating proper usage sequence. Lacks explicit when-not-to-use, but sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_stopA

Stops the active screen recording for an iOS simulator. Sends SIGINT to flush the video file, waits for the file size to stabilize, and returns the path and size.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: sends SIGINT, waits for file size stabilization, returns path/size. However, does not mention behavior if no active recording or error cases. With no annotations, this is strong but not fully thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with the main purpose first. Every word adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the workflow and return value well for a simple tool. Lacks details on failure handling and idempotency, but overall sufficient given the tool's simplicity and lack of output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and describes 'udid' as 'Simulator UDID' adequately. The description adds no extra meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool stops an active screen recording for an iOS simulator, specifying the resource and action. It distinguishes from the sibling 'record_start' by being its counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage after starting a recording, but does not explicitly mention when not to use (e.g., if no active recording) or provide alternatives. Adequate but lacks guidance on preconditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_flowA

Execute one or more Maestro flows on a device. Provide exactly one of: yaml (inline YAML string), files (array of flow file paths), or dir (directory path). includeTags and excludeTags are only applicable when using dir. When to use: run_flow gives the full Maestro vocabulary (assertions, conditionals, loops, retries); for a simple sequence of taps/types prefer run_steps, and for one gesture use the individual tools. TRUST BOUNDARY: Maestro flows can run arbitrary JS (evalScript) and local files (runScript/files/dir), so treat run_flow input as locally-executable code.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID (from device_list)
yamlNoInline Maestro YAML flow string (preferred for exploration)
filesNoArray of .yaml flow file paths
dirNoDirectory containing .yaml flow files
includeTagsNoOnly run flows tagged with these tags (dir mode only)
excludeTagsNoExclude flows tagged with these tags (dir mode only)
envNoEnvironment variables passed to the flow
timeoutMsNoFlow timeout in milliseconds (default 120 000)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses a critical trust boundary: flows can run arbitrary JS and local files, alerting about security. It doesn't detail other behaviors like output or side effects, but the primary behavior is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is remarkably concise with no wasted words. It front-loads the core action and constraints, then adds usage guidance and a security note. Every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an execution tool with 8 parameters, the description covers input constraints well. It doesn't mention return values or error handling, but the tool likely outputs to stdout/logs, which may be assumed. The trust boundary note adds important context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value by explaining the mutual exclusivity of yaml/files/dir and applicability of tags only with dir. Also notes yaml is preferred for exploration. This goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool executes Maestro flows on a device, with specific verbs and resource. It distinguishes from sibling tools like run_steps and individual gesture tools by noting when each is appropriate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states to provide exactly one of yaml, files, or dir, and clarifies that includeTags/excludeTags only apply to dir. Provides clear guidance on when to use this tool vs run_steps or individual gesture tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_stepsA

Execute an ordered batch of UI actions in ONE call via the native backend (idb/mobilecli, sub-second; Maestro fallback per step). Eliminates per-gesture MCP round-trips for fast continuous flows (login, navigation, form fill). Step actions: tap {x,y} · tapText {text|id} · type {text,submit} · key · swipe · waitFor {text,timeoutMs} · assertVisible {text} · waitMs · screenshot. Prefer waitFor over waitMs to act the instant the UI is ready instead of sleeping. WebView note: web-rendered text is invisible to tapText — use tap {x,y} for it; type uses real keystrokes so React onChange fires. Stops at the first failed step unless stopOnError:false. bundleId is only needed for the Maestro fallback (auto-detected otherwise). When to use: pick run_steps for >2 known sequential gestures (login, navigation, form fill); use run_flow for Maestro assertions/conditionals/loops/retries; use the individual gesture tools (tap_on, swipe, …) for a single exploratory action.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID (from device_list)
bundleIdNoApp bundle id for Maestro fallbacks (auto-detected from the foreground app if omitted).
stepsYesOrdered list of actions to perform.
stopOnErrorNoStop at the first failed step (default true). false = run all and report each.
stepDelayMsNoOptional fixed delay inserted after every step (default 0).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses key behaviors: native backend with Maestro fallback, stops on first error unless stopOnError:false, bundleId auto-detection, WebView limitations for tapText, real keystrokes for type. No annotations present, so description carries full burden and meets it well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is well-structured and front-loaded with core purpose and value, followed by action list, tips, and usage guidance. Though lengthy, each sentence serves a purpose; could trim minor redundancies.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (many step types, no output schema), the description is comprehensive: covers all actions, edge cases (WebView), error behavior, and timing recommendations. No missing critical information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 5 parameters (100% coverage), so baseline 3. Description adds value with context: bundleId auto-detection, stepDelayMs optional, stopOnError default true, and succinct explanations for each action type in the steps array.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool executes an ordered batch of UI actions in one call for fast continuous flows, and distinguishes from siblings like run_flow and individual gesture tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use vs alternatives: use run_steps for >2 known sequential gestures, run_flow for assertions/retries, individual tools for single exploratory actions. Also includes best practices like preferring waitFor over waitMs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshotA

Takes a screenshot of an iOS simulator. Returns the saved file path and byte size. Does NOT return base64 to keep payload small. saveTo defaults to a .png file in os.tmpdir().

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
saveToNoDestination file path (must end .png or .jpg). Defaults to a tmp file.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses the output format and design decision to avoid base64, but omits details like whether it overwrites existing files, permissions needed, or if the simulator must be booted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, and every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains the return values (file path and byte size) and default behavior. It could mention error conditions or prerequisites, but is still mostly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds the default save location details (os.tmpdir()), which goes beyond the schema's 'Defaults to a tmp file.' This extra context helps the agent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool takes a screenshot of an iOS simulator, which is a specific verb+resource. Among siblings like inspect_screen, this tool uniquely captures a full screenshot image.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context (returns file path, not base64, default save location) but does not explicitly state when to use this tool versus alternatives like inspect_screen or tap_on. Usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screen_sizeA

Returns the pixel dimensions of a booted iOS simulator screen by taking a temp screenshot and reading its pixel dimensions with sips.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the internal behavior of taking a temporary screenshot and using sips to read dimensions, providing transparency beyond what annotations would cover. However, it does not mention potential side effects like temporary file creation or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, efficiently conveying the tool's purpose and method.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description is largely complete, but it omits the prerequisite of the simulator being booted and details about the return format or units of the dimensions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage for the only parameter (udid) with a basic description. The description adds no additional meaning or context for the parameter beyond what the schema already provides, so it meets the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('returns'), the specific resource ('pixel dimensions of a booted iOS simulator screen'), and the method. It distinguishes this tool from siblings like 'screenshot' by specifying that it extracts dimensions rather than capturing an image.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for getting screen dimensions but does not explicitly state when to use this tool versus alternatives (e.g., orientation_get). It lacks guidance on prerequisites (e.g., simulator must be booted) and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_locationA

Sets the simulated GPS location on a running iOS simulator. Codifies the QA geo-spinner fix: use this to unblock location-gated features during QA testing without moving the physical device.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
latitudeYesLatitude in decimal degrees
longitudeYesLongitude in decimal degrees

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses that the location is simulated and for testing, but lacks details on side effects (e.g., persistence, prerequisites). This moderate transparency is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, the first stating the action and the second providing context. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (setter, no output schema), the description covers purpose and usage context adequately. It could mention error handling (e.g., simulator not running), but overall it is sufficiently complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter schema coverage is 100%, so the schema already documents the three parameters. The description does not add new meaning beyond schema descriptions, meeting the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Sets the simulated GPS location on a running iOS simulator', providing a specific verb and resource. It also adds context about the QA use case, distinguishing it effectively from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('unblock location-gated features during QA testing without moving the physical device'), giving clear usage context. It does not mention explicit alternatives or when not to use, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

swipeA

Swipes in a direction or between two coordinates via an ephemeral Maestro flow. direction is always required; startX/startY/endX/endY are optional overrides expressed as percentage strings (e.g. '10%,50%') or pixel values.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdYesApp bundle identifier
directionYesSwipe direction
startXNoStart X (e.g. '10%' or '120')
startYNoStart Y
endXNoEnd X
endYNoEnd Y
timeoutMsNoFlow timeout in ms
noLaunchNoSkip the implicit launchApp attach step (default false). Set true when an open modal or navigation state must not be disturbed.

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description lacks behavioral traits like destructiveness, authorization requirements, rate limits, or side effects. It only mentions the flow is 'ephemeral' but does not elaborate on behavior beyond the action itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with two sentences. The first sentence states the action and mechanism, and the second details parameter requirements. No extraneous information, and important details are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description does not explain return values or outcomes (e.g., success/failure). It also omits prerequisites beyond required parameters. The description covers the basic gesture but is incomplete for edge cases or error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% parameter descriptions. The description adds value by clarifying that coordinate parameters are optional overrides and providing format examples (e.g., '10%,50%' or pixel values), enhancing understanding beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with the action 'Swipes in a direction or between two coordinates via an ephemeral Maestro flow,' which clearly identifies what the tool does and its mechanism. This distinguishes it from sibling tools like tap_on or press_key, which perform different gestures.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide guidance on when to use this tool vs alternatives, such as tapping or scrolling. It mentions direction is required and coordinates are optional overrides, but does not specify appropriate scenarios or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tap_onA

Tap, double-tap, or long-press an element on screen via an ephemeral Maestro flow. Target by text (regex), accessibility id, or absolute x/y coordinates. bundleId is REQUIRED — Maestro needs it for the appId flow header. WebView caution: text/id selectors only resolve native accessibility nodes. Web-rendered elements inside WKWebView are invisible — tap_on will report COMPLETED but nothing is tapped. Use x+y coordinates instead for WebView content.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
bundleIdYesApp bundle identifier (e.g. com.example.MyApp). Required by Maestro.
textNoElement text or regex. Matches the FULL label/value case-insensitively (anchored ^…$); an invalid regex falls back to a substring match.
idNoAccessibility ID of the element
xNoX coordinate in logical points (numeric only; percent strings are not supported)
yNoY coordinate — required when x is provided
doubleNoUse doubleTapOn instead of tapOn
longNoUse longPressOn instead of tapOn
longDurationMsNoHold duration for long press in ms (max 10 000)
indexNoZero-based index when multiple elements match
timeoutMsNoFlow timeout in ms (default 30 000)
noLaunchNoSkip the implicit launchApp attach step (default false). Set true when an open modal or navigation state must not be disturbed.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral disclosure. It reveals that WebView taps report COMPLETED without effect, explains the noLaunch param to avoid disturbing modals, and notes required bundleId. While it covers key traits, it could be more explicit about state requirements and return behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph. It front-loads the main action and targeting methods, then adds critical warnings. Every sentence serves a purpose with no redundancy, achieving high efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers key aspects: action, targeting, required parameters, and a notable false-completion scenario. However, it lacks an explicit statement of return values or error handling, leaving a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining text matching behavior (anchored regex, fallback to substring), emphasizing bundleId necessity, and clarifying double/long press modes. This extra context raises the score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: tap, double-tap, or long-press on-screen elements via an ephemeral Maestro flow. It specifies targeting methods (text/regex, accessibility id, coordinates) and distinguishes from siblings by covering multiple tap modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance: bundleId is required, and WebView content requires coordinates as text/id selectors fail. However, it does not directly compare to sibling tools like tap_with_fallback or swipe, leaving some usage context implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tap_with_fallbackA

Sends a raw coordinate tap via the native backend (idb if installed, else a Maestro tapOn-point fallback). Useful for WKWebView game overlays where visual position differs from the DOM hit-test position. The Maestro fallback needs an app context: pass bundleId, or the foreground app is auto-detected. VERIFICATION: 'ok' is decided primarily by a change in the native accessibility element set before/after the tap (stable under animation/video). When no native backend is present it falls back to a screenshot byte-size delta (weak — animation can flip it). The result's oracle field reports which was used ('a11y-change' | 'screenshot-bytesize' | 'unverified'). For WebView-rendered targets the a11y tree won't change → oracle:'unverified'; confirm via webview_inspect. offsetStep defaults to 0 (tap the exact point); set it >0 only to deliberately probe nearby y-offsets on retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
xYesX coordinate in logical points
yYesY coordinate in logical points
bundleIdNoApp bundle id for the Maestro fallback (ignored when idb is present). Auto-detected if omitted.
maxRetriesNoMaximum tap attempts (default 3)
offsetStepNoOpt-in Y offset step in px applied per retry (default 0 = always tap the exact point; no blind walk).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the burden. It details fallback behavior, verification mechanisms, oracle field, conditions for each oracle type, and offsetStep behavior. Very transparent about potential issues like animation affecting screenshot verification.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense with information but every sentence adds value. It is front-loaded with the main purpose and fallback. Slightly long but justified by complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (fallback, verification, oracle) and no output schema, the description covers return value ('oracle' field) and all crucial aspects. It is complete for the tool's purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3). Description adds significant value beyond schema: explains bundleId auto-detection, offsetStep default behavior (no blind walk), maxRetries default, and verification context for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it sends a raw coordinate tap via native backend with fallback, specifies use for WKWebView game overlays where visual position differs from DOM hit-test, and distinguishes from sibling tools like 'tap_on'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context for when to use (WKWebView overlays) and mentions verification details. Lacks explicit 'when not to use' but points to alternative 'webview_inspect' for WebView targets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_flowA

Returns a trustworthy, evidenced verdict on whether a just-implemented flow works. Runs your visibility assertions through the oracle ladder (WebView-DOM > native a11y > Maestro; fail-closed on unverifiable) AND auto-checks app health: no recent crash, no error-level Metro logs, no failed (≥400) network requests. ok=true only when ALL assertions pass AND all applicable auto-checks are clean — never a bare 'looks ok'. State the expected outcome as assertions; this tool makes the AI's 'it works' auditable.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
assertionsNoExpected-outcome assertions (≥1 recommended)
bundleIdNoApp bundle id (Maestro fallback)
metroPortNoMetro port for log/network checks (default 8081)
sinceSecondsNoCrash-recency window in seconds (default 120)
checkCrashesNoAuto-check recent crashes (default true)
checkNetworkNoAuto-check failed network requests (default true)
checkLogsNoAuto-check error-level console logs (default true)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description thoroughly discloses the oracle ladder (WebView-DOM > native a11y > Maestro; fail-closed), the three health checks (crashes, Metro logs, network errors), and the strict condition for ok=true. No contradictions with annotations (none provided).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph that front-loads the purpose, then efficiently explains the mechanism and conditions. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description could be more explicit about the return format (e.g., JSON structure of verdict and evidence). However, it sufficiently covers inputs, process, and success criteria. Minor gap on error handling or timeout behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not add specific meaning to individual parameters beyond what the schema already provides; it only contextualizes their use in the overall process.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a verdict on whether a flow works, specifying the combination of visibility assertions and auto-checks. It uses specific verb 'validates' and distinguishes from simpler sibling tools like assert_visible by describing a higher-level, evidenced validation process.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises to 'State the expected outcome as assertions' and frames the tool as making the AI's work auditable, implying use after flow implementation. However, it lacks explicit guidance on when not to use or direct alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_elementA

Polls until an element/text is visible (via the oracle ladder), or fails on timeout. Use to act the instant the UI is ready instead of a blind sleep.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator UDID
textNoVisible text to match (native a11y / WebView innerText)
selectorNoCSS selector — WebView surfaces only
bundleIdNoApp bundle id for the Maestro fallback (native surface)
containsNoSubstring match for text (default false = exact full-string on native a11y). WebView innerText is always substring.
timeoutMsNoWait budget (default 10000)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries the burden. It mentions polling, timeout, and failure on timeout, but lacks details on return value, side effects, or the 'oracle ladder' behavior. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-loaded with the essential operation. No wasted words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity (6 params, no output schema, no annotations), the description plus detailed schema provide adequate completeness. Could add more context about surface-specific parameter usage, but overall sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all parameters. The description adds no extra nuance about parameter selection or usage beyond what the schema provides, meeting baseline expectations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it polls until an element/text is visible (specific verb and resource) and distinguishes from a blind sleep but does not differentiate from siblings like assert_visible.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use to act the instant the UI is ready instead of a blind sleep,' providing clear context. However, it does not mention when not to use it or alternatives (e.g., assert_visible).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webview_evalA

Evaluates a JavaScript expression in a WebView's page context and returns the result. Use it to read web-app state (location.href, store values, feature flags, on-screen balances) or to assert conditions against the live DOM. Requires the app's WKWebView to be inspectable (isInspectable=true) — on by default in debug/staging builds, frequently disabled in production App Store builds.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
expressionYesJavaScript expression to evaluate, e.g. "location.href" or "document.querySelectorAll('button').length"
webviewIdNoTarget WebView id. Omit to auto-select the first visible WebView.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states that the tool evaluates JS and returns results, and warns about inspectability requirements. However, it does not disclose potential side effects of JS evaluation, error handling, or whether the operation is synchronous. This is adequate but leaves some behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is succinct yet informative, consisting of two sentences that front-load the core functionality and then provide context on when it works. No extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description clarifies that the tool 'returns the result' and gives examples of use cases. It covers the key aspects of what the tool does and its limitations (inspectability). A minor gap is not describing error behavior for invalid expressions, but overall it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers all three parameters with descriptions, so schema coverage is 100%. The description does not add significant parameter-level detail beyond the schema, but it does provide example expressions which help illustrate usage. Baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Evaluates') and resource ('JavaScript expression in a WebView's page context'). It provides specific examples like location.href and DOM queries, and the tool is clearly distinguished from siblings such as webview_navigate and webview_inspect.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool ('read web-app state' or 'assert conditions against the live DOM') and notes a critical prerequisite (inspectable WKWebView) with context about build variants. It does not explicitly mention alternatives but the sibling list provides context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webview_inspectA

Lists embedded WebViews (WKWebView) on a booted simulator and, for the selected one, resolves a CSS selector to DOM elements WITH absolute on-screen tap coordinates. This is the answer to the 'WebView content is opaque' limitation of the coordinate tools: instead of eyeballing a screenshot, get tapX/tapY for a real DOM element and feed it straight into tap_on. Defaults to interactive elements when no selector is given. Requires the app's WKWebView to be inspectable (isInspectable=true) — on by default in debug/staging builds, frequently disabled in production App Store builds.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID (from device_list)
selectorNoCSS selector (default: 'button, a, input, textarea, [role=button]')
webviewIdNoTarget WebView id (from a prior call). Omit to auto-select the first visible WebView.
maxNoMaximum elements to return (default 100)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It explains that the tool lists WebViews, resolves a CSS selector, returns tap coordinates, defaults to interactive elements, and requires isInspectable=true. This is adequate for understanding the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that front-loads the main purpose and then provides context. It is informative without wasted sentences, though slightly lengthy. It earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and lack of output schema, the description covers the core functionality, prerequisites, default behavior, and what the tool returns. It is fairly complete for an agent to understand when and how to use it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining the overall purpose, how parameters interact (e.g., webviewId optional, max default), and the default selector for interactive elements.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists embedded WebViews and resolves a CSS selector to DOM elements with absolute on-screen tap coordinates. It distinguishes itself from coordinate tools by solving the 'WebView content is opaque' limitation, differentiating it from siblings like inspect_screen and tap_on.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly mentions when to use: for inspecting WebViews when coordinate tools fail due to opaque content. It notes the prerequisite that WKWebView must be inspectable. However, it does not explicitly mention alternatives for native UI or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webview_navigateA

Drives a WebView's navigation: goto a URL, or back / forward / reload. Requires the app's WKWebView to be inspectable (isInspectable=true) — on by default in debug/staging builds, frequently disabled in production App Store builds.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
actionYesNavigation action. 'goto' requires url.
urlNoDestination URL (required when action is 'goto')
webviewIdNoTarget WebView id. Omit to auto-select the first visible WebView.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the inspectable requirement, which is a key behavioral trait, and notes it's often disabled in production builds. However, it omits error handling or failure behaviors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficiently worded sentences with no unnecessary information. The core action and critical precondition are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a navigation tool with 4 parameters and no output schema, the description covers main actions and a key precondition. It lacks details on return values or error states, but is largely adequate given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds little beyond the schema: it repeats that 'goto' requires 'url' and mentions auto-selection of webviewId, but doesn't elaborate on parameter types or edge cases.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool drives WebView navigation with specific actions (goto, back, forward, reload) and distinguishes itself from sibling tools like webview_eval and webview_inspect by focusing on navigation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by listing actions and mentions a critical requirement (inspectable WKWebView), but does not explicitly state when to use this tool versus alternatives or exclude scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

webview_networkA

Captures HTTP traffic made INSIDE a WebView (fetch + XMLHttpRequest) and exports it as JSON or a redacted HAR 1.2 log. This is the network-debugging path for WebView-based apps — RN shells that host their UI in a WKWebView, where the API calls run in the web layer so metro_network (CDP Network domain) captures nothing. It injects a fetch/XHR recorder into the page, captures for durationMs while you drive the app, then returns request/response metadata (url, method, status, headers, timing). Only requests made AFTER capture starts are recorded. format:'har' emits a valid HAR 1.2 log (HAR-lite — no response bodies) openable in Chrome DevTools → Import HAR; pass saveTo to write the .har file. Sensitive headers (authorization/cookie/…) and request bodies are REDACTED by default — set redact:false to keep them (don't commit unredacted HAR: it leaks tokens). Requires the app's WKWebView to be inspectable (isInspectable=true) — on by default in debug/staging builds, frequently disabled in production App Store builds.

ParametersJSON Schema
NameRequiredDescriptionDefault
udidYesSimulator / device UDID
webviewIdNoTarget WebView id. Omit to auto-select the first visible WebView.
durationMsNoHow long to capture (ms) while you drive the app (default 5000)
formatNoOutput format: 'json' (default, structured entries) or 'har' (HAR 1.2 log).
saveToNoOptional file path to write the output (a .har file when format:'har').
redactNoMask sensitive headers (authorization/cookie/…) and request bodies. Default true.
includeResourcesNoAlso include the browser's retroactive Performance Resource Timing list — EVERY request the document made since navigation, including ones that fired before capture started (URL + timing + size, but no headers/body). Default true. Set false for fetch/XHR only (with full headers + bodies).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given no annotations, description fully discloses behavioral traits: injection mechanism, capture duration, recording only after start, redaction of sensitive data, HAR format validation, and inclusion of performance resource timing. Also warns about not committing unredacted HAR.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but every sentence adds value. Well-structured with clear main purpose first, then context, then parameter details. Could be slightly tighter, but no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no annotations and no output schema, description covers behavior, parameters, output format, side effects, prerequisites, and security warnings. Thoroughly explains the tool's role in the debugging workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds significant value beyond schema: explains default for redact, clarifies includeResources behavior, details format:'har' usage and saveTo, and provides context for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it captures HTTP traffic from WebView and exports as JSON or HAR. Distinguishes from sibling metro_network, which uses CDP and doesn't work for WebView-based apps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use (WebView-based apps like RN shells) and when not (metro_network instead). Also mentions requirements: WKWebView inspectable and debug/staging builds.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 43 tool updatesv0.2.0
    • First observedapp_install
    • First observedapp_launch
    • First observedapp_list
    • First observedapp_state
    • First observedapp_terminate
    • First observedapp_uninstall
    • First observedassert_not_visible
    • First observedassert_text
    • First observedassert_visible
    • First observedcheat_sheet
    • First observedcrash_get
    • First observedcrash_list
    • First observeddevice_boot
    • First observeddevice_list
    • First observedexport_flow
    • First observedinput_text
    • First observedinspect_screen
    • First observedmetro_apps
    • First observedmetro_logs
    • First observedmetro_network
    • First observedmetro_state
    • First observednotification_bar_clear
    • First observedopen_url
    • First observedorientation_get
    • First observedorientation_set
    • First observedpodium_health
    • First observedpress_key
    • First observedrecord_start
    • First observedrecord_stop
    • First observedrun_flow
    • First observedrun_steps
    • First observedscreen_size
    • First observedscreenshot
    • First observedset_location
    • First observedswipe
    • First observedtap_on
    • First observedtap_with_fallback
    • First observedvalidate_flow
    • First observedwait_for_element
    • First observedwebview_eval
    • First observedwebview_inspect
    • First observedwebview_navigate
    • First observedwebview_network

TDQS

A3.8/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose. App management, device operations, Metro debugging, WebView interactions, gestures, assertions, and utilities are all well-separated with no overlap.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with underscores, e.g., app_install, crash_list, webview_inspect. No mixed conventions.

Tool Count2/5

With 43 tools, the server has far more than the typical 3-15 well-scoped range. While each tool is specialized, the count feels excessive and may overwhelm agents.

Completeness4/5

The tool surface covers a broad spectrum of mobile test automation tasks: app lifecycle, device control, gestures, assertions, Metro debugging, WebView interaction, and network capture. Minor gaps exist (e.g., no tool for clearing app data), but overall it is very comprehensive.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    A Model Context Protocol server that enables scalable mobile automation through a platform-agnostic interface for iOS and Android devices, allowing agents and LLMs to interact with mobile applications using accessibility snapshots or coordinate-based interactions.
    23
    15,828
    6,336
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Unified MCP server for Xcode + iOS Simulator — build, deploy, screenshot, and interact with your iOS app from Claude Code, Cursor, or any MCP client. Built in Swift. Single binary. No Node/Python runtime required.
    6
    9
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    High-performance MCP server for iOS development and test automation. Gives AI coding assistants direct access to iOS simulators with sub-20ms screenshots, UI interaction, building, testing, and an intelligent operator mode.
    8
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hoainho/podium-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server