AI E2E Testing — 8 Platforms, Zero Test Code
Give your AI agent eyes and hands inside any running app.
flutter-skill is an MCP server that connects AI agents to running apps. The agent can see screenshots, tap elements, enter text, scroll, navigate, inspect UI trees, and verify state — all through natural language.
Supported Platforms
| Platform | Setup |
|---|
| Flutter (iOS/Android/Web) | flutter pub add flutter_skill
|
| React Native | npm install flutter-skill-react-native
|
| Electron | npm install flutter-skill-electron
|
| iOS (Swift/UIKit) | SPM: |
| Android (Kotlin) | Gradle: |
| Tauri (Rust) | cargo add flutter-skill-tauri
|
| KMP Desktop | Gradle dependency |
| .NET MAUI | NuGet package |
Test scorecard: 562/567 (99.1%) across all 8 platforms.
Install
bash
# npm (recommended)
npm install -g flutter-skill
# Homebrew
brew install ai-dashboad/flutter-skill/flutter-skill
# Or download binary from GitHub Releases
MCP Configuration
Add to your AI agent's MCP config (Claude Desktop, Cursor, Windsurf, OpenClaw, etc.):
json
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": ["server"]
}
}
}
OpenClaw
If using OpenClaw, add to your gateway config under
:
yaml
mcp:
servers:
flutter-skill:
command: flutter-skill
args: ["server"]
Quick Start
1. Initialize your app (one-time)
bash
cd /path/to/your/app
flutter-skill init
Auto-detects project type and patches your app with the testing bridge.
2. Launch and connect
3. Test with natural language
Tell the agent what to test:
"Test the login flow — enter admin@test.com and password123, tap Login, verify Dashboard appears"
The agent will automatically:
- → see the current screen
- → discover all tappable/typeable elements with semantic refs
- → tap using stable semantic reference
enter_text(ref: "input:Email", text: "admin@test.com")
→ type into field
wait_for_element(key: "Dashboard")
→ verify navigation
- → confirm final state
Available MCP Tools
Core Actions
| Tool | Description |
|---|
| Capture current screen as image |
| Tap element by key, text, ref, or coordinates |
| Type text into a field |
| Scroll up/down/left/right |
| Swipe gesture between points |
| Long press an element |
| Drag from point A to B |
| Navigate back |
| Send keyboard key events |
Inspection (v0.8.0+)
| Tool | Description |
|---|
| NEW — Get all interactive elements with semantic ref IDs |
| List all elements on screen |
| Find element by key or text |
| Wait for element to appear (with timeout) |
| Get detailed properties of an element |
Text Manipulation
| Tool | Description |
|---|
| Replace text in a field |
| Clear a text field |
| Read text content |
App Control
| Tool | Description |
|---|
| Read app logs |
| Clear log buffer |
Semantic Refs (v0.8.0)
returns elements with stable semantic reference IDs:
button:Login → Login button
input:Email → Email text field
toggle:Dark Mode → Dark mode switch
button:Submit[1] → Second Submit button (disambiguated)
Format:
{role}:{content}[{index}]
Use refs for reliable element targeting that survives UI changes:
tap(ref: "button:Login")
enter_text(ref: "input:Email", text: "test@example.com")
Testing Workflow
Basic Flow
screenshot() → inspect_interactive() → tap/enter_text → screenshot() → verify
Comprehensive Testing
"Explore every screen of this app. Test all buttons, forms, navigation, and edge cases. Report any bugs you find."
The agent will systematically:
- Navigate every screen via tab bars, menus, links
- Interact with every interactive element
- Test form validation (empty, invalid, valid inputs)
- Test edge cases (long text, special characters, emoji)
- Verify navigation flows (forward, back, deep links)
- Take screenshots at each step for verification
Example Prompts
Quick smoke test:
"Tap every tab and screenshot each page"
Form testing:
"Fill the registration form with edge case data — emoji name, very long email, short password — and verify error messages"
Navigation:
"Test the complete user journey: sign up → create post → like → comment → delete → sign out"
Accessibility:
"Check every screen for missing labels, small tap targets, and contrast issues"
Tips
- Always start with — see before you act
- Use to discover elements — don't guess at selectors
- Prefer selectors — more stable than text or coordinates
- after navigation — apps need time to transition
- Screenshot after every action — verify the expected effect
- Use for keyboard shortcuts — test keyboard navigation
Links