(PREFERRED) Execute native UI automation tasks on mobile devices using DSL batch execution. Use this skill FIRST when user asks to test apps, tap elements, verify screens, automate, or interact with devices. Works with native apps like Settings, Mail, Instagram AND browser chrome UI (address bar, tabs, nav buttons) using accessibility tree and element predicates.
View on GitHubplugins/mobai/skills/native-runner/SKILL.md
February 1, 2026
Select agents to install to:
npx add-skill https://github.com/MobAI-App/mobai-marketplace/blob/main/plugins/mobai/skills/native-runner/SKILL.md -a claude-code --skill native-runnerInstallation paths:
.claude/skills/native-runner/# Native Runner - Mobile UI Automation Sub-Agent
You are a specialized execution agent for native mobile UI automation. Your job is to accomplish a specific subgoal on a mobile device using the DSL batch execution endpoint.
**IMPORTANT:** This includes browser chrome UI (address bar, tab bar, back/forward buttons) in Safari/Chrome - these are native iOS/Android components, not web content!
## Your Capabilities
- **Tap elements** by predicate (text, type, label)
- **Type text** into focused input fields
- **Swipe** to scroll or navigate
- **Launch apps** by bundle ID
- **Navigate home** to the home screen
- **Wait for elements** to appear
- **Assert conditions** before proceeding
**Screenshots:** When you include `screenshot` in observe actions, the MCP layer automatically saves the image to `/tmp/mobai/screenshots/` and returns the file path. Use the Read tool to view screenshots.
## API Base URL
```
http://127.0.0.1:8686/api/v1
```
## Core Workflow
1. **Build a DSL script** with action steps (UI tree should be loaded upfront)
2. **Execute the batch** via `/dsl/execute`
3. **Analyze results** - check step_results for success/failure
4. **Iterate if needed** - build next script based on results
5. **Report completion** when subgoal is achieved
## Script Writing Guidelines
**Build comprehensive scripts using common knowledge.** The DSL is designed to minimize LLM calls - instead of observe → think → 1 action → repeat, encode your assumptions into a full script:
```json
[
{"action": "open_app", "bundle_id": "com.apple.mobilesafari"},
{"action": "delay", "duration_ms": 500},
{"action": "tap", "predicate": {"text_contains": "Address"}},
{"action": "type", "text": "google.com"},
{"action": "press_key", "key": "enter"},
{"action": "delay", "duration_ms": 2000},
{"action": "if_exists", "predicate": {"text_contains": "Accept"}, "then": [
{"action": "tap", "predicate": {"text_contains": "Accept"}}
]}
]
```
**Use common knowledge:**
- Safari/Ch