Elements are addressed by text, accessibility id or DOM selector, which is why the canvas and Rive support matters — those are exactly the surfaces where a screenshot-based agent is reduced to guessing at pixels, and here they come back as objects with coordinates. The assertion design is the other half: the ladder tries the most trustworthy oracle available and the absence check fails closed rather than reporting success it could not verify, so a passing flow means something. Start with the health check and the device list; which tools work depends on what is installed on the host.
One endpoint over the whole mobile toolchain. Device and app lifecycle, gestures, view hierarchies, Maestro flows, WebView DOM and network, React Native debugging over CDP, and canvas or game-engine UIs — routed to whichever backend is installed on the host.
- A device inventory across iOS simulators and adb-detected Android targets, each tagged with its platform, plus booting, app install, launch, terminate, uninstall and an installed-app list
- Screenshots saved to a path rather than returned inline, screen size, orientation read and set, deep links opened, simulated GPS location, and screen recording started and stopped as a background process
- The current view hierarchy, and gestures addressed by text, accessibility id or coordinates — tap, double-tap, long-press, type with optional submit, swipe by direction or between points, and hardware key presses
- Batched action sequences run in one call through the native backend, full Maestro flows run from inline YAML or files, and a recorded step sequence exported as a reusable flow — the hand-off from engineer to QA
- Assertions with an evidence trail through an oracle ladder of WebView DOM, then native accessibility, then Maestro: visible, absent, text present, and a poll that waits for an element — the absence check fails closed when it cannot verify
- A verdict tool that runs your assertions and reports whether a just-built flow actually works
- React Native debugging over the Metro inspector: connected apps, console logs, captured network requests, and app state read by evaluating an expression in the running JS runtime
- Crash reports listed and read from the host's diagnostic reports and the simulator's own container, with .ips files parsed
- WebView work: embedded WKWebViews listed and CSS selectors resolved to tap coordinates, JavaScript evaluated in page context, navigation driven, and in-page fetch and XHR traffic captured as JSON or a redacted HAR
- Canvas and WebGL UIs treated as elements rather than pixels — Pixi, Konva, Fabric, Phaser, Three and Babylon objects listed with tap-ready coordinates, a fuzzy intent resolved to a ranked evidenced target, and that target tapped
- Rive files inspected for their full inventory of artboards, animations, state machines, inputs and view-model properties, then driven — triggers fired, booleans and numbers set, text runs changed, events drained as the verification signal, and a whole ordered flow run in one call
- An experimental engine bridge for AltTester-instrumented Unity or GL builds: objects listed with screen coordinates, tapped, swiped between, and C# component methods invoked by reflection
- A whole intent plan executed in one closed-loop call, and a health check reporting which parts of the toolchain are actually present
macOS with the Xcode command-line tools, since iOS simulator control goes through xcrun and simctl, and Node.js 22 or newer. The default native gesture and WebView backend ships as a dependency, so there is nothing extra to install for the common path. Everything else is optional and detected: idb with its companion becomes the preferred gesture backend when present, Maestro on the PATH is what runs declarative flows and is the gesture fallback, a running Metro bundler is needed for the React Native tools, and the Android SDK with adb is detection-only — absent toolchains return an informative result rather than an error. Real iPhones go through devicectl with an opt-in WebDriverAgent backend, and the game-engine tools need an AltTester-instrumented development build. Call the health check first; it tells you which of these the host actually has. MIT.
One command — npx -y podium-mcp
