open-mobile-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PATH | No | The system PATH, including the directory containing Maestro binaries. Often required on Windows. | |
| MAESTRO_HOME | No | The home directory for Maestro. Required on Windows to ensure Maestro binaries are found. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| device_listA | List connected active Android emulators and iOS simulators. |
| get_viewportA | Capture screenshot of a device. Returns the image (resized to ~800px width for efficiency) and metadata with both resized and original dimensions. Use originalWidth/originalHeight for coordinate calculations when tapping. For Android, if logicalWidth/Height are provided, they represent the UI coordinate system which may differ from the physical screenshot pixels. |
| get_semantic_hierarchyC | Get pruned, semantic UI hierarchy as JSON. |
| capture_diffA | Compare two base64 images and return diff percentage. |
| tap_on_elementA | 🥇 RECOMMENDED: Tap on a UI element by selector. Finds the element and taps its center automatically. Prefer over device_tap. If observing a log triggered by this tap, spawn the wait_for_log subagent BEFORE tapping. NOTE: text matching is exact — if an element renders with an emoji prefix (e.g. '🇫🇷 French A2'), passing 'French A2' will fail. Use get_semantic_hierarchy first to see the exact text, or use contentDescription/testId strategy instead. |
| device_tapA | ⚠️ Low-level: Tap at raw screen coordinates. Prefer tap_on_element for reliability. Use coordinates from the physical screenshot (originalWidth/originalHeight). On Android, this tool automatically scales coordinates if a display override (logical resolution) is detected. |
| device_typeC | Type text into the device. |
| device_swipeA | ⚠️ Low-level: Swipe from (x1,y1) to (x2,y2). Use this for custom gestures or when you need precise swipe control. Use coordinates from the physical screenshot (originalWidth/originalHeight). On Android, this tool automatically scales coordinates if a display override (logical resolution) is detected. |
| analyze_layout_healthC | Analyze the UI layout for performance or health issues (e.g. deep nesting). |
| device_pinchA | Perform a pinch gesture (two-finger zoom) on the device. Use 'out' to zoom in (fingers spread apart) and 'in' to zoom out (fingers come together). Works on real Android phones (no root needed) via UIAutomation MotionEvent injection. |
| device_press_keyB | Press a hardware or system key. Also accepts raw Android keycodes as numbers. |
| device_rotate_gestureA | Perform a two-finger rotation gesture (e.g. to rotate a map or image). Positive degrees = clockwise. Android only (uses UIAutomation, no root needed). |
| clear_app_dataA | Clear all data and cache for an app (equivalent to Settings → App → Clear Data). Resets the app to a fresh-install state. Useful for testing onboarding or reproducing first-launch bugs. |
| get_app_infoA | Get version, install date, SDK target, data directory, and granted/denied permissions for an installed app. Android only. |
| start_recordingC | Start screen recording on the device. Use an absolute path for localPath when stopping to ensure you can find the file. |
| stop_recordingA | Stop screen recording and save the file. Use an absolute path for localPath to ensure you can find the file. |
| run_maestro_flowC | Run a complex Maestro flow via YAML. |
| manage_bundlerB | Start, stop, or restart the Metro bundler. Platform logs (Android/iOS) auto-start by default. On Android, pass both deviceId and packageId to enable PID-based log filtering — this captures only your app's logs and eliminates all system/GMS noise. |
| get_network_logsA | Pull network-related logs from the device. For Android, filters logcat. For iOS, filters the internal log capture buffer (must be running via manage_platform_logs or manage_bundler). For Expo / React Native apps, all console.log output (including fetchApi network traces) is emitted under the 'ReactNativeJS' logcat tag — use filter 'ReactNativeJS' or leave default. For native Android HTTP clients use 'OkHttp'. Note: a recurring warning 'ReconnectingWebSocket: Couldn't connect to ws://:8081/inspector/network' is harmless — it means Metro bundler's DevTools WebSocket is not reachable from the device (Metro not running or port 8081 blocked). The app still works; start Metro via 'npx expo start' or 'npx react-native start' on the same network to silence it. |
| get_bundler_logsA | Get recent logs from Metro bundler, Android, or iOS. To wait for a specific line, use wait_for_log in a background subagent instead of polling. |
| wait_for_logA | Block until a log line matching a pattern appears, or timeout. Returns {matched, line, elapsed}. ALWAYS use via background subagent — never call directly or it blocks the whole conversation:
Spawn subagent BEFORE the action that triggers the log, not after. |
| stream_errorsA | Get recent error logs from Metro, Android, and iOS. To wait for a specific error, use wait_for_log(pattern: 'error|exception') in a background subagent instead of polling. |
| manage_platform_logsA | Manually start/stop platform log capture (optional - auto-starts with bundler). On Android, pass both deviceId and packageId to enable PID-based filtering — this captures only your app's logs and eliminates all system/GMS noise. Without packageId, falls back to ReactNative/AndroidRuntime tag filtering which may include unrelated system warnings. |
| run_doctorC | Run npx expo-doctor. |
| install_depsC | Install dependencies using npx expo install. |
| manage_app_lifecycleC | Launch, stop, install, or uninstall apps. |
| open_deep_linkC | Open a deep link or URL on the device. |
| get_screen_textB | Get all text visible on screen using OCR. |
| configure_ocrA | Set the default OCR language for the session. |
| find_elementA | Find UI elements by selector. Returns elements with pre-parsed coordinates (centerX, centerY, left, top, right, bottom, width, height) ready for use. For tapping, prefer tap_on_element which does find+tap in one step. |
| wait_for_elementC | Wait for a UI element to appear (polls every 1s). |
| get_element_imageC | Get a cropped screenshot of a specific UI element. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 32 tools
UI interaction tools like tap_on_element, device_tap, and find_element are differentiated by descriptions, but the logging cluster (manage_bundler, manage_platform_logs, get_bundler_logs, get_network_logs, stream_errors, wait_for_log) has substantial overlap in purpose and requires careful reading. get_semantic_hierarchy and get_screen_text also both retrieve visible content, though through different mechanisms.
Multiple conventions coexist: get_* for inspection, device_* for low-level actions, manage_* for lifecycle operations, and standalone verb phrases like tap_on_element and wait_for_log. The clusters are internally consistent, but the overall set mixes noun-first device_* names with verb-first action names, and device_list is a noun phrase rather than a verb_noun pattern.
32 tools is a heavy surface for a mobile testing server and exceeds the point where the toolset becomes hard to navigate. Several logging and UI inspection tools could reasonably be consolidated or split into sub-servers, even though most individual tools have a defined purpose.
The toolset covers core mobile testing workflows: device management, UI inspection and interaction, gestures, app lifecycle, logging, recording, deep links, and project tooling. Missing orientation control and a few native device actions are minor gaps that can be worked around with existing low-level gestures and commands.