AI-powered E2E testing for 10 platforms. 253 MCP tools. Zero config. Works with Claude, Cursor, Windsurf, Copilot. Test Flutter, React Native, iOS, Android, Web, Electron, Tauri, KMP, .NET MAUI — all from natural language.
$ npx -y skills add ai-dashboad/flutter-skill --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: ai-dashboad/flutter-skill
What's inside
https://github.com/user-attachments/assets/d4617c73-043f-424c-9a9a-1a61d4c2d3c6
One prompt. 28 AI-driven actions. Zero test code. The AI explores a TikTok clone, navigates tabs, scrolls feeds, tests search, fills forms — all autonomously.
Writing E2E tests is painful. Maintaining them is worse. flutter-skill takes a different approach:
You: "Test the checkout flow with an empty cart, then add 3 items and complete purchase"
Your AI agent handles the rest — screenshots, taps, text entry, assertions, navigation.
No Page Objects. No XPath. No brittle selectors. Just plain English.
1. Install (30 seconds)
npm install -g flutter-skill
2. Add to your AI (copy-paste into MCP config)
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": ["server"]
}
}
}
Works with Claude Desktop, Cursor, Windsurf, Copilot, Cline, OpenClaw — any MCP-compatible agent.
3. Add to your app (2 lines for Flutter)
import 'package:flutter_skill/flutter_skill.dart';
void main() {
if (kDebugMode) FlutterSkillBinding.ensureInitialized();
runApp(MyApp());
}
4. Test — just talk to your AI:
"Launch my app, explore every screen, and report any bugs"
That's it. Zero configuration. Zero test code. Works in under 60 seconds.
| Method | Command |
|---|---|
| npm | npm install -g flutter-skill |
| Homebrew | brew install ai-dashboad/flutter-skill/flutter-skill |
| Scoop | scoop install flutter-skill |
| Docker | docker pull ghcr.io/ai-dashboad/flutter-skill |
| pub.dev | dart pub global activate flutter_skill |
| VSCode | Extensions → "Flutter Skill" |
| JetBrains | Plugins → "Flutter Skill" |
| Agent Skill | npx skills add ai-dashboad/flutter-skill |
| Zero-config | flutter-skill init (auto-detects & patches your app) |
Works with any MCP-compatible AI tool. One config line:
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": ["server"]
}
}
}
| Platform | Config File | Status |
|---|---|---|
| Cursor | .cursor/mcp.json | ✅ |
| Claude Desktop | claude_desktop_config.json | ✅ |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | ✅ |
| VSCode Copilot | .vscode/mcp.json | ✅ |
| Cline | VSCode Settings → Cline → MCP | ✅ |
| OpenClaw | Skill or MCP config | ✅ |
| Continue.dev | .continue/config.json | ✅ |
For standalone browser automation, CI/CD pipelines, or remote access:
# Start server
flutter-skill serve https://your-app.com
# Use CLI client commands
flutter-skill nav https://google.com
flutter-skill snap # Accessibility tree (99% fewer tokens)
flutter-skill screenshot /tmp/ss.jpg
flutter-skill tap "Login"
flutter-skill type "hello@example.com"
flutter-skill eval "document.title"
flutter-skill tools # List all available tools
| Command | Description |
|---|---|
nav <url> | Navigate to URL |
snap | Accessibility tree snapshot |
screenshot [path] | Take screenshot |
tap <text|ref|x y> | Tap element |
type <text> | Type via keyboard |
key <key> [mod] | Press key |
eval <js> | Execute JavaScript |
title | Get page title |
text | Get visible text |
hover <text> | Hover element |
upload <sel> <file> | Upload file |
tools | List tools |
call <tool> [json] | Call any tool |
Supports --port=N, --host=H flags and FS_PORT/FS_HOST env vars.
server (MCP stdio) | serve (HTTP) | |
|---|---|---|
| Use case | IDE / AI agent integration | CLI / automation / CI/CD |
| Protocol | MCP (JSON-RPC over stdio) | HTTP REST |
| Tools | 253 (dynamic per page) | 246 (generic) |
| Browser | Auto-launches Chrome | Connects to existing Chrome |
| Best for | Cursor, Claude, VSCode | OpenClaw, scripts, pipelines |
Full CLI client reference: docs/CLI_CLIENT.md
Most testing tools work on 1-2 platforms. flutter-skill works on 10.
| Platform | SDK | Test Score |
|---|---|---|
| Flutter (iOS/Android/Web) | flutter_skill | ✅ 188/195 |
| React Native | sdks/react-native | ✅ 75/75 |
| Electron | sdks/electron | ✅ 75/75 |
| Tauri (Rust) | sdks/tauri | ✅ 75/75 |
| Android (Kotlin) | sdks/android | ✅ 74/75 |
| KMP Desktop | sdks/kmp | ✅ 75/75 |
| .NET MAUI | sdks/dotnet-maui | ✅ 75/75 |
| iOS (Swift/UIKit) | sdks/ios | ✅ 19/19 |
| Web (any website) | sdks/web | ✅ |
| Web CDP (zero-config) | No SDK needed | ✅ 141/156 |
Total: 656/664 tests passing (98.8%) — each platform tested against a complex social media app with 50+ elements.
Real benchmarks from automated test runs against a complex social media app:
| Operation | Web (CDP) | Electron | Android |
|---|---|---|---|
connect | 93 ms | 55 ms | 103 ms |
tap | 1 ms | 1 ms | 2 ms |
enter_text | 1 ms | 1 ms | 2 ms |
inspect | 3 ms | 12 ms | 10 ms |
snapshot | 2 ms | 8 ms | 29 ms |
screenshot | 31 ms | 80 ms | 88 ms |
eval | 1 ms | — | — |
Token efficiency: snapshot() returns a structured element tree instead of an image — 87–99% fewer tokens than sending screenshots to your AI agent.
How fast is that? A tap takes 1–2 ms end-to-end. Browser automation tools like Playwright and Selenium typically take 50–100 ms for the same operation. That's 50–100× faster, because flutter-skill talks directly to the app runtime instead of going through WebDriver or CDP indirection.
Tested 15 MCP tools against production websites — 75/75 passed, zero timeouts:
| Site | Tools | Total Time | snapshot | screenshot | count_elements |
|---|---|---|---|---|---|
| YouTube | 15/15 ✅ | 6.9s | 43 ms | 30 ms | 4 ms |
| Amazon | 15/15 ✅ | 14.2s | 1 ms | 5 ms | 2 ms |
| 15/15 ✅ | 17.9s | 6 ms | 32 ms | 51 ms | |
| Hacker News | 15/15 ✅ | 4.8s | 53 ms | 188 ms | 1 ms |
| Wikipedia | 15/15 ✅ | 7.8s | 15 ms | 336 ms | 1 ms |
Total time includes page load. Tool execution is consistently sub-100ms even on heavy DOM sites.
| flutter-skill | Playwright MCP | Appium | Detox | |
|---|---|---|---|---|
| MCP tools | 253 | ~33 | ❌ | ❌ |
| Platforms | 10 | 1 (web) | Mobile | React Native |
| Setup time | 30 sec | Minutes | Hours | Hours |
| Test code needed | ❌ None | ✅ Yes | ✅ Yes | ✅ Yes |
| AI-native (MCP) | ✅ | ✅ | ❌ | ❌ |
| Self-healing tests | ✅ | ❌ | ❌ | ❌ |
| Monkey/fuzz testing | ✅ | ❌ | ❌ | ❌ |
| Visual regression | ✅ | ❌ | ❌ | ❌ |
| Network mock/replay | ✅ | ❌ | ❌ | ❌ |
| API + UI testing | ✅ | ❌ | ❌ | ❌ |
| Multi-device sync | ✅ | ❌ | Partial | ❌ |
| Accessibility audit | ✅ | ❌ | ❌ | ❌ |
| i18n testing | ✅ | ❌ | ❌ | ❌ |
| Performance monitoring | ✅ | ❌ | ❌ | ❌ |
| Natural language | ✅ | ❌ | ❌ | ❌ |
| Flutter support | ✅ Native | Partial | Partial | ❌ |
| Desktop apps | ✅ | ✅ | ❌ | ❌ |
| AI page understanding | ✅ AX Tree | ❌ Screenshots | ❌ | ❌ | | Boundary/security test | ✅ 13 payloads | ❌ | ❌ | ❌ | | Batch actions | ✅ 5+/call | 1/call | 1/call | 1/call |
flutter-skill is the only AI-native E2E testing tool that works across mobile, web, and desktop — with 7× more tools than the nearest competitor.
# 🤖 AI autonomous exploration — finds bugs automatically
flutter-skill explore https://my-app.com --depth=3
# 🐒 Monkey/fuzz testing — random actions, crash detection
flutter-skill monkey https://my-app.com --actions=100 --seed=42
# 🚀 Parallel multi-platform testing
flutter-skill test --url https://my-app.com --platforms web,electron,android
# 🌐 Zero-config WebMCP server — any website becomes testable
flutter-skill serve https://my-app.com
Most AI testing tools send screenshots to the LLM — each one costs ~4,000 tokens.
flutter-skill uses Chrome's Accessibility Tree to give your AI a compact semantic summary of any page:
// page_summary → ~200 tokens (vs ~4,000 for a screenshot)
{
"title": "Shopping Cart",
"nav": ["Home", "Products", "Cart", "Account"],
"forms": [{"input:Coupon Code": "text"}],
"buttons": ["Apply", "Checkout", "Continue Shopping"],
"features": {"search": true, "pagination": true},
"links": 47, "inputs": 3
}
Then batch multiple actions in one call:
// explore_actions → 5 actions per call (vs 5 separate tool calls)
{"actions": [
{"type": "fill", "target": "input:Coupon Code", "value": "SAVE20"},
{"type": "tap", "target": "button:Apply"},
{"type": "tap", "target": "button:Checkout"},
{"type": "fill", "target": "input:Email", "value": "test@example.com"},
{"type": "tap", "target": "button:Continue"}
]}
Result: Your AI agent tests faster, costs less, and understands pages better than screenshot-based tools.
| flutter-skill | Screenshot-based tools | |
|---|---|---|
| Tokens per page | ~200 | ~4,000 |
| Actions per call | 5+ | 1 |
| Understands semantics | ✅ roles, names, state | ❌ pixels only |
| Works with Shadow DOM | ✅ | ❌ |
screenshot — capture the screeninspect_interactive — all tappable/typeable elements with semantic refsfind_element / wait_for_elementget_elements — full element treetap / long_press / swipe / dragenter_text / set_text / clear_textscroll — all directionsgo_back / press_keybutton:Login, input:Emailtap(ref: "button:Submit")launch_app — launch with flavorshot_reload / hot_restartget_logs / get_errorsscan_and_connect — auto-find appsAI Explore: page_summary, explore_actions, boundary_test, explore_report
Launch & Connect: launch_app, scan_and_connect, connect_cdp, hot_reload, hot_restart, list_sessions, switch_session, close_session, disconnect, stop_app
Screen: screenshot, screenshot_region, screenshot_element, native_screenshot, inspect, inspect_interactive, snapshot, get_widget_tree, find_by_type, get_text_content, get_visible_text
Interaction: tap, double_tap, long_press, enter_text, set_text, clear_text, swipe, scroll_to, drag, go_back, press_key, type_text, hover, fill, select_option, set_checkbox, focus, blur, native_tap, native_input_text, native_swipe
Smart Testing: smart_tap, smart_enter_text, smart_assert (self-healing with fuzzy match)
Assertions: assert_text, assert_visible, assert_not_visible, assert_element_count, assert_batch, wait_for_element, wait_for_gone, wait_for_idle, wait_for_stable, wait_for_url, wait_for_text, wait_for_element_count
Visual Regression: visual_baseline_save, visual_baseline_compare, visual_baseline_update, visual_regression_report, visual_verify, visual_diff, compare_screenshot
Network Mock: mock_api, mock_clear, record_network, replay_network, intercept_requests, clear_interceptions, block_urls, http_request
API Testing: api_request, api_assert
Coverage & Reliability: coverage_start, coverage_stop, coverage_report, coverage_gaps, retry_on_fail, stability_check
Data-Driven: test_with_data, generate_test_data
Multi-Device: multi_connect, multi_action, multi_compare, multi_disconnect, parallel_snapshot, parallel_tap
Accessibility: accessibility_audit, a11y_full_audit, a11y_tab_order, a11y_color_contrast, a11y_screen_reader
i18n: set_locale, verify_translations, i18n_snapshot
Performance: perf_start, perf_stop, perf_report, get_performance, get_frame_stats, get_memory_stats
Session: save_session, restore_session, session_diff
Recording & Export: record_start, record_stop, record_export (Playwright, Cypress, XCUITest, Espresso, Detox, Maestro, +5 more), video_start, video_stop
Auth: auth_inject_session, auth_biometric, auth_otp, auth_deeplink
CDP Browser: navigate, reload, go_forward, get_title, get_page_source, eval, get_tabs, new_tab, switch_tab, close_tab, get_cookies, set_cookie, clear_cookies, get_local_storage, set_local_storage, clear_local_storage, generate_pdf, set_viewport, emulate_device, throttle_network, go_offline, set_geolocation, set_timezone, set_color_scheme
Debug: get_logs, get_errors, get_console_messages, get_network_requests, diagnose, diagnose_project, reset_app
dependencies:
flutter_skill: ^0.9.36
import 'package:flutter_skill/flutter_skill.dart';
void main() {
if (kDebugMode) FlutterSkillBinding.ensureInitialized();
runApp(MyApp());
}
npm install flutter-skill-react-native
import FlutterSkill from 'flutter-skill-react-native';
FlutterSkill.start();
npm install flutter-skill-electron
const { FlutterSkillBridge } = require('flutter-skill-electron');
FlutterSkillBridge.start(mainWindow);
// Swift Package Manager: FlutterSkillSDK
import FlutterSkill
FlutterSkillBridge.shared.start()
Text("Hello").flutterSkillId("greeting")
implementation("com.flutterskill:flutter-skill:0.8.0")
FlutterSkillBridge.start(this)
[dependencies]
flutter-skill-tauri = "0.8.0"
Add Gradle dependency — see sdks/kmp for details.
Add NuGet package — see sdks/dotnet-maui for details.
Just tell your AI what to test:
| Prompt | What happens |
|---|---|
| "Test login with wrong password" | Screenshots → enters creds → taps login → verifies error |
| "Explore every screen and report bugs" | Systematically navigates all screens, tests all elements |
| "Fill registration with edge cases" | Tests emoji 🌍, long strings, empty fields, special chars |
| "Compare checkout flow on iOS and Android" | Runs same test on both platforms, compares screenshots |
| "Take screenshots of all 5 tabs" | Taps each tab, captures state |
See CONTRIBUTING.md for guidelines.
git clone https://github.com/ai-dashboad/flutter-skill
cd flutter-skill
dart pub get
dart run bin/flutter_skill.dart server # Start MCP server
| 📦 pub.dev | 🧩 VSCode |
| 📦 npm | 🧩 JetBrains |
| 🍺 Homebrew | 📖 Docs |
| 🤖 Agent Skill | 📋 Changelog |
.dockerignore
.github/
FUNDING.yml
RELEASE_GUIDE.md
workflows/
ci.yml
devcontainer-feature.yml
docker.yml
pages.yml
release.yml
skill-review.yml
snap.yml
.gitignore
.pubignore
analysis_options.yaml
assets/
convert.html
demo-cover.jpg
demo-teaser.gif
demo.gif
description-intellij.html
explore-demo.gif
icon-128.png
icon-256.png
icon-512.png
icon.svg
social-preview.jpg
bin/
flutter_skill.dart
server.dart
CHANGELOG.md
CLAUDE.md
CONTRIBUTING.md
dart_test.yaml
Dockerfile
docs/
ARCHITECTURE.md
assets/
alipay.jpg
wechat-pay.jpg
AUTO_FIX_IMPROVEMENTS.md
ci-templates/
github-actions.yml
gitlab-ci.yml
CLEANUP_SUMMARY.md
CLI_CLIENT.md
cli-server-commands.md
COMMUNICATION_FLOW.md
continue-dev.md
CROSS_PLATFORM_VERIFICATION.md
FLUTTER_3X_COMPATIBILITY.md
FLUTTER_3X_FIX.md
IDE_SETUP.md
MULTI_APP_SELECTION.md
MULTI_SIMULATOR_TESTING.md
PLUGIN_TESTING_GUIDE.md
prompts/
flutter-testing.md
tool-priority.md
PUBLISHING.md
QUICK_REFERENCE_WEB.md
releases/
MULTI_SESSION_IMPLEMENTATION_REPORT.md
RELEASE_NOTES_v0.3.1.md
RELEASE_NOTES_v0.4.0.md
v0.3.2_AUTO_VM_SERVICE.md
research/
DTD_PROTOCOL_DETAILS.md
DTD_PROTOCOL_RESEARCH.md
DTD_VS_VMSERVICE_PORTS.md
PROTOCOL_INTEGRATION_EXAMPLE.md
ROADMAP.md
site/
index.html
SMART_DISCOVERY.md
SMART_SELECTION.md
SPONSORSHIP_SETUP.md
test_auto_fix.md
TEST_INDICATORS_DESIGN.md
testing/
MULTI_SESSION_TESTS.md
TESTING_REPORT_v0.4.1.md
TOOL_PRIORITY_SETUP.md
TROUBLESHOOTING.md
TWITTER_SETUP.md
ui/
UI_IMPLEMENTATION_ROADMAP.md
UI_MOCKUPS.md
UI_MULTI_SESSION_DESIGN.md
UI_UX_DESIGN_GUIDE.md
USAGE_GUIDE.md
WEB_OPTIMIZATION.md
example/
example.dart
examples/
demo_indicators/
package.json
quick_demo.sh
QUICK_START.md
README.md
run_demo.js
test_indicators_demo.dart
test_app/
.gitignore
.metadata
analysis_options.yaml
lib/
main.dart
pubspec.yaml
README.md
test/
widget_test.dart
install.ps1
install.sh
intellij-plugin/
build.gradle.kts
debug.sh
gradle/
wrapper/
gradle-wrapper.jar
gradle-wrapper.properties
gradlew
gradlew.bat
install_local.sh
README.md
reload.sh
scripts/
debug.sh
install_local.sh
reload.sh
settings.gradle.kts
src/
main/
kotlin/
com/
aidashboad/
flutterskill/
actions/
Actions.kt
AiToolDetector.kt
FlutterProcessListener.kt
FlutterSkillService.kt
FlutterSkillStartupActivity.kt
FlutterSkillToolWindowFactory.kt
McpConfigManager.kt
model/
ActivityEntry.kt
UIElement.kt
NativeBinaryManager.kt
SessionManager.kt
StatusBarWidget.kt
ui/
AiEditorsCard.kt
CardComponent.kt
ConnectionStatusCard.kt
FlutterSkillColors.kt
InteractiveElementsCard.kt
NewSessionDialog.kt
QuickActionsCard.kt
RecentActivityCard.kt
SessionTabBar.kt
UpdateChecker.kt
VmServiceClient.kt
VmServiceScanner.kt
resources/
icons/
flutter_skill.svg
META-INF/
plugin.xml
pluginIcon.svg
terminal-support.xml
test/
kotlin/
com/
aidashboad/
flutterskill/
SessionManagerTest.kt
lib/
flutter_skill_semantic_refs.dart
flutter_skill_web_interop.dart
flutter_skill_web_stub.dart
flutter_skill.dart
src/
bridge/
bridge_protocol.dart
bridge.dart
cdp_appmcp_methods.dart
cdp_browser_methods.dart
cdp_driver.dart
device_presets.dart
web_bridge_listener.dart
web_bridge_proxy.dart
cli/
act.dart
ai_client.dart
client.dart
connect.dart
demo.dart
diff.dart
doctor.dart
explore.dart
init.dart
inspect.dart
launch.dart
monkey.dart
output_format.dart
ping_cmd.dart
plan.dart
quickstart.dart
report_error.dart
security.dart
serve.dart
server_cmd.dart
server.dart
setup_priority.dart
setup.dart
test_runner.dart
tool_handlers/
accessibility_deep_handlers.dart
api_handlers.dart
auth_handlers.dart
bf_assertions.dart
bf_batch.dart
bf_inspection.dart
bf_interaction.dart
bf_logging.dart
bf_navigation.dart
bf_screenshot.dart
bf_state.dart
bridge_flutter_handlers.dart
bug_report_handlers.dart
cdp_connection_handlers.dart
cdp_tool_handlers.dart
connection_handlers.dart
coverage_handlers.dart
cross_browser_handlers.dart
data_driven_handlers.dart
dev_tool_handlers.dart
diagnosis_handlers.dart
diff_handlers.dart
discovery_helpers.dart
explore_handlers.dart
fixture_handlers.dart
flutter_helpers.dart
i18n_handlers.dart
log_analysis_handlers.dart
multi_device_handlers.dart
native_handlers.dart
network_condition_handlers.dart
network_mock_handlers.dart
parallel_handlers.dart
performance_handlers.dart
plugin_handlers.dart
recording_handlers.dart
reliability_handlers.dart
report_handlers.dart
security_handlers.dart
self_healing_handlers.dart
session_handlers.dart
smart_wait_handlers.dart
tool_definitions.dart
visual_regression_handlers.dart
diagnostics/
error_reporter.dart
discovery/
bridge_discovery.dart
discovery.dart
dtd_service_discovery.dart
process_based_discovery.dart
quick_port_check.dart
unified_discovery.dart
drivers/
app_driver.dart
bridge_driver.dart
drivers.dart
flutter_driver.dart
native_driver.dart
web_bridge_driver.dart
engine/
skill_engine.dart
tool_registry.dart
flutter_skill_client.dart
protocol/
mcp_adapter.dart
server_registry.dart
skill_client.dart
skill_server.dart
LICENSE
native/
cdp-engine/
Cargo.toml
src/
cdp.rs
main.rs
ops.rs
pool.rs
server.rs
workflow.rs
ios-hid/
build.sh
fs_ios_bridge.m
fs-ios-bridge
packaging/
devcontainer-feature/
src/
flutter-skill/
devcontainer-feature.json
install.sh
README.md
homebrew/
flutter-skill.rb
README.md
npm/
bin/
cli.js
dart/
bin/
server.dart
lib/
flutter_skill.dart
src/
cli/
act.dart
inspect.dart
launch.dart
server.dart
setup.dart
flutter_skill_client.dart
pubspec.yaml
index.js
package.json
README.md
scripts/
build.js
check-dart.js
postinstall.js
scoop/
flutter-skill.json
winget/
AIDashboard.FlutterSkill.yaml
pubspec.lock
pubspec.yaml
README.md
scripts/
bump_version.dart
bump_version.sh
diagnose.sh
flutter_skill_wrapper.sh
install_prompts.sh
install_tool_priority.sh
publish.sh
release.sh
setup_test_environment.sh
sync_docs.dart
test_mcp_tools.sh
verify_auto_priority.sh
sdks/
android/
build.gradle.kts
README.md
src/
main/
java/
com/
flutterskill/
FlutterSkillBridge.kt
ViewTraversal.kt
TEST_REPORT.md
cpp/
CMakeLists.txt
examples/
main.cpp
include/
flutter_skill/
bridge.h
README.md
src/
automation_linux.cpp
automation_macos.mm
automation_windows.cpp
bridge.cpp
json_rpc.h
sha1.h
websocket.h
tests/
CMakeLists.txt
real_integration_test.py
test_bridge.cpp
test_json_rpc.cpp
test_runner.h
test_websocket.cpp
dotnet-maui/
FlutterSkill.csproj
FlutterSkillBridge.cs
MauiBridge.cs
README.md
TestRunner.cs
electron/
flutter-skill-electron.js
package-lock.json
... 1600 moreShowing a partial view of a very large repo.
FAQ
flutter-skill is a Claude Code plugin with 1 hand-picked skill for testing work, indexed on Flowy. Install it with the command on its page. It includes e2e-testing. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.