MCP server for verifying mobile app changes on iOS Simulators and Android Emulators
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 13 tools have clear verb-noun naming (list_, select_, install_, launch_, etc.) and detailed descriptions (100-300+ chars). Input schemas are properly typed with enums for platform selection. However, output schemas are not formally documented, responses are text-wrapped without structured field definitions. Error handling guidance is minimal. Tool descriptions excel at explaining prerequisites and dependencies (e.g., 'pin lasts for server session; pinned device going offline is an error'), which is excellent for agent planning. Parameter descriptions are thorough and include format hints (e.g., 'adb serial / simulator UDID'). Missing: explicit output schema documentation, error recovery guidance, and per-tool success/failure indicators for batch-like operations.
Verify the current screen against a baseline image (PNG). Compares pixel-by-pixel with configurable color and layout tolerances. Returns a pass/fail verdict and a diff image (when available). Baseline images live in .averi/baselines/ beside averi.yaml (or cwd if no config).
Capture the current screen as a baseline image for future assert calls. Saves to .averi/baselines/{platform}/{name}.png (created if missing). Overwrites existing baselines without warning.
Install an app build (.apk / .app bundle) on the booted device. Omit path to use the build path from averi.yaml (app.android.apk / app.ios.app), which is resolved relative to averi.yaml itself — no need to pre-absolutize it when the config sits in a subdirectory.
Launch an app by package name / bundle id. clearState wipes app data first (forces fresh login). Android: activity pins the entry point — without it (and without app.android.activity in averi.yaml) the launcher activity is picked arbitrarily, which opens LeakCanary instead of the app on debug builds that bundle it. intent exercises non-launcher entry points (share/SEND).
List available iOS simulators and Android emulators/devices with boot state. `active: true` marks the device the platform's tools currently target (pin one with select_device).
Output schemas not formally documented. Tools return text-wrapped responses without structured field definitions. LLMs cannot reliably extract typed fields for downstream tool chaining.
Error handling lacks recovery guidance. Tools do not return actionable error messages (e.g., 'Device offline. Available devices: [...]' or 'Selector not found. Try ui_snapshot() first to inspect the tree'). Agents cannot self-correct.
terminate_app description is too brief (75 chars). Does not explain when to use it vs launch_app with clearState=true, or whether it's idempotent/retryable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Open a deep link / universal link URL on the device.
Take a screenshot (PNG). Waits for the screen to be stable (two identical consecutive captures) before returning — inspect the image to verify UI state.
Scroll until a selector becomes visible (or timeout). Scrolls within the first scrollable ancestor of the selector's last known position, or the viewport if the selector is not yet in the tree. Returns the final tree and a summary of the scroll (direction, distance, attempts).
Pin which booted device subsequent tools target for a platform. Without a pin, tools use the first booted device adb/simctl lists — ambiguous when a phone, an emulator, and a watch are all connected. The pin lasts for the server session; a pinned device going offline is an error, never a silent fallback to another device.
Tap a UI element by selector (e.g. `id:login_button` or `text:"Sign In"`). Resolves the selector against the current tree, taps the first match, and waits for the screen to stabilize.
Force-stop an app.
Type text into the focused field. Clears the field first (both sides of the cursor) to handle mid-field taps.
Read the accessibility tree (UI hierarchy) from the device — the normalized tree all selectors run against. Waits for the screen to settle (one retry on 'no window yet' after a cold launch).
screenshot and ui_snapshot lack documented output structure. Agents cannot know what fields to expect (e.g., image dimensions, tree node count, stability metrics).
No confirmation/dry-run pattern for destructive operations (install_app, capture_baseline overwrite). Agents could accidentally overwrite baselines or install wrong builds without warning.