screenshotLABSCO SUMMARY
Semantic refs are why it survives a redesign — the agent taps button:Submit, not a coordinate.
Selectors are where UI automation rots, and naming elements by role and label sidesteps most of it. The other thing this buys you is exploration: the agent can be told to walk every screen and report, rather than being handed a script, because it can read the interactive elements itself. Ten platforms from one tool is unusual — but most of them want a two-line SDK hook first.
What it is
An MCP server that connects an AI agent to a running application, exposing the widget or DOM tree and the interactions on it, across ten platforms.
What you get
- Seeing — screenshot, screenshot_element, inspect and get_widget_tree for the element tree, find_by_type, get_text_content, and wait_for_element / wait_for_gone
- Interacting — tap, double_tap, long_press, swipe, drag, enter_text, scroll_to and go_back, plus native_tap, native_input_text and native_swipe at the OS level
- Semantic references such as button:Login and input:Email, stable across UI changes, across seven roles: button, input, toggle, slider, select, link and item
- Controlling — launch_app, hot_reload, hot_restart, get_logs, get_errors and clear_logs, with scan_and_connect or connect_app to attach to a running app
- Sessions and checks — list_sessions and switch_session; assert_text, assert_visible, assert_not_visible and assert_element_count; get_performance and get_memory_stats
- Beyond the 38 in the usage guide, the README's full reference lists 253 tools, including AI-exploration calls such as page_summary and explore_actions
- Ten platforms from one tool: Flutter on iOS, Android and web, React Native, Electron, Tauri, Android, KMP Desktop, .NET MAUI, iOS, web, and web over CDP with no SDK at all
Requirements
npm install -g flutter-skill, then the flutter-skill server command in your MCP client config. Most platforms need a small SDK hook in the app — for Flutter that is two lines calling FlutterSkillBinding.ensureInitialized() in debug mode. Web over CDP needs no SDK. Also available through Homebrew, Scoop, Docker, pub.dev and IDE extensions; flutter-skill init auto-detects and patches your app.
Setup effort
One command — npm install -g flutter-skill
USE CASES
Testing a flow you never wrote tests for
Describe the flow in a sentence and let the agent tap, type and assert its way through.
Finding bugs you were not looking for
Point it at the app and ask it to explore every screen and report what breaks.
Checking a fix without a rebuild
Hot reload the running app and re-run the interaction.
Driving a website with nothing installed
Connect over CDP — the web path needs no SDK in the page.
38 tools
Listed in project docs. Your client may show a different list.
screenshot_elementinspectget_widget_treefind_by_typeget_text_contenttapdouble_taplong_pressenter_textswipescroll_todraggo_backnative_tapnative_input_textnative_swipeassert_textassert_visibleassert_not_visibleassert_element_countwait_for_elementwait_for_goneget_checkbox_stateget_slider_valueget_text_valuelaunch_appscan_and_connectconnect_apphot_reloadhot_restartlist_sessionsswitch_sessionget_logsget_errorsget_performanceget_memory_statsclear_logsBEFORE YOU INSTALL
What to know first
Tools you get
38 tools named in the project's documentation.
Requires
flutter-skill on PATH
Where it runs
All 5 documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
npm install -g flutter-skillMCP Clients
Cursor
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": [
"server"
]
}
}
}.cursor/mcp.json
Claude Desktop
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": [
"server"
]
}
}
}claude_desktop_config.json
Windsurf
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": [
"server"
]
}
}
}~/.codeium/windsurf/mcp_config.json
VS Code
{
"servers": {
"flutter-skill": {
"command": "flutter-skill",
"args": [
"server"
]
}
}
}.vscode/mcp.json
Continue
Save this as a .json file in the .continue/mcpServers/ folder — Continue picks up Claude Desktop / Cursor-format JSON files from there (the project's docs say .continue/config.json, which does not read mcpServers).
{
"mcpServers": {
"flutter-skill": {
"command": "flutter-skill",
"args": [
"server"
]
}
}
}