flutter-skill

End-to-end testing of running Flutter, mobile, desktop and web apps driven through MCP tools

By AI Dashboard Local · stdio TestingBrowser automationDeveloper tools

42 popularity score ★ 402 ↓ 173/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
npm install -g flutter-skill
Claude CodeTerminal
claude mcp add flutter-skill -- flutter-skill server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "flutter-skill": {
      "command": "flutter-skill",
      "args": [
        "server"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "flutter-skill": {
      "command": "flutter-skill",
      "args": [
        "server"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "flutter-skill": {
      "type": "stdio",
      "command": "flutter-skill",
      "args": [
        "server"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.flutter-skill]
command = "flutter-skill"
args = ["server"]
Gemini CLITerminal
gemini mcp add --scope user flutter-skill flutter-skill -- server
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

FirstTerminal
git clone https://github.com/ai-dashboad/flutter-skill
cd flutter-skill
dart pub get
Claude CodeTerminal
claude mcp add flutter-skill -- dart run '<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart' server
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "flutter-skill": {
      "command": "dart",
      "args": [
        "run",
        "<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart",
        "server"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "flutter-skill": {
      "command": "dart",
      "args": [
        "run",
        "<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart",
        "server"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "flutter-skill": {
      "type": "stdio",
      "command": "dart",
      "args": [
        "run",
        "<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart",
        "server"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.flutter-skill]
command = "dart"
args = ["run", "<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart", "server"]
Gemini CLITerminal
gemini mcp add --scope user flutter-skill dart -- run '<ABSOLUTE_PATH_TO_CLONE>/bin/flutter_skill.dart' server

Settings 2

FLUTTER_SKILL_AUTO_REPORT Optional: Set to false to stop the server opening a pre-filled GitHub issue or filing one when a critical error occurs.
GITHUB_TOKEN Optional: If present, critical errors are filed as GitHub issues with this token instead of opening a browser page.

What it does

flutter-skill is a local MCP server, written in Dart and shipped as an npm package, that connects an assistant to an app while it runs, so the assistant can test it by hand: look at the screen, tap, type, scroll, check what appears and report what broke. You describe the test in plain language; no test scripts are written.

It reaches the app in one of two ways. Native and cross-platform apps (Flutter on iOS, Android and web, React Native, Electron, Tauri, Android/Kotlin, iOS/Swift, KMP Desktop and .NET MAUI) must include the project's small SDK, which opens a bridge the server talks to. Websites need no SDK: the server drives Chrome over the DevTools protocol, launching it when asked. Beyond taps and text entry, its tools cover screenshots and accessibility-tree snapshots, assertions and waits, visual baselines and diffs, network mocking and recording, plain HTTP and API checks, accessibility and locale checks, performance stats, several devices at once, and exporting a recorded session as Playwright, Cypress, Espresso, XCUITest or other test code.

The README counts 253 tools in MCP mode, but the list is not fixed: in v0.9.36 the server answers tools/list from the current connection and tells the client to refresh the list after connect_cdp, launch_app, scan_and_connect or disconnect succeeds, so an assistant sees a short list until it connects to an app (lib/src/cli/server.dart). The same package also has an HTTP `serve` mode and CLI commands (explore, monkey, test) for scripts and CI; this page covers the stdio `server` mode.

What it needs

RuntimeNode.js 16+

Node.js 16 or newer for the npm package. The npm postinstall step downloads a native binary for macOS, Linux x64 or Windows x64; when no binary is present the launcher falls back to `dart run`, which needs the Dart or Flutter SDK on PATH. Chrome to test websites. To test a native app, add the platform's flutter-skill SDK to it (for Flutter, the flutter_skill package started in debug mode) and run it on a device, emulator or desktop.

Limits

In v0.9.36 only one MCP server runs at a time: a second one exits while the lock file ~/.flutter_skill.lock is held, which matters if several clients or windows start it (lib/src/cli/server.dart). Native apps can be driven only after the SDK is built into them; websites through Chrome need no SDK. The tool total is counted in the README; tools/list changes with what is connected. The MCP registry entry still describes v0.8.x ("8 platforms, 40+ tools"), not the current package. The README's platform test scores come from the makers' own test app.

Who it suits

Suits a developer who wants an assistant to try out a Flutter or other cross-platform app, or a website, on their own machine, and to turn a session into recorded test code, without writing tests first. It runs locally and needs no account. Pick something else for web-only browser work if you want a smaller tool set without an SDK step, or if you need several clients connected at once (one server instance at a time). Teams that want no files written outside the project should note what the npm install adds to the home folder.

Tools 57 of 253

launch_app
Start an app, with an optional flavor, and connect to it
scan_and_connect
Find running apps with the SDK and connect to one
connect_cdp
Connect to Chrome over the DevTools protocol, launching it if asked
hot_reload
Hot-reload a running Flutter app
hot_restart
Hot-restart a running Flutter app
list_sessions
List the apps currently connected
switch_session
Make another connected app the active one
disconnect
Drop the connection to the app
stop_app
Stop the launched app
screenshot
Capture the current screen as an image
snapshot
Return a compact element tree instead of an image
inspect_interactive
List tappable and typeable elements with stable refs
get_widget_tree
Return the Flutter widget tree
find_element
Locate one element on screen
get_visible_text
Return the text currently shown
page_summary
Summarise a page's navigation, forms and buttons in few tokens
explore_actions
Run a batch of several UI actions in one call
boundary_test
Fill inputs with edge-case and attack-style values
tap
Tap an element by text, ref or coordinates
long_press
Press and hold an element
swipe
Swipe across the screen
drag
Drag from one point or element to another
enter_text
Type text into a field
clear_text
Empty a text field
scroll_to
Scroll until an element is visible
go_back
Navigate back
press_key
Send a key press
smart_tap
Tap with fuzzy matching when the exact target has changed
assert_text
Check that given text is shown
assert_visible
Check that an element is visible
wait_for_element
Wait until an element appears
visual_baseline_save
Store a screenshot as the reference image
visual_baseline_compare
Compare the screen with its stored reference
mock_api
Answer matching network calls with a canned response
record_network
Record the app's network traffic
replay_network
Replay recorded traffic
http_request
Send an HTTP request
api_request
Call an API endpoint for an API-level check
coverage_report
Report which screens and elements were exercised
multi_connect
Connect to several devices to act on them together
accessibility_audit
Check the screen for accessibility problems
set_locale
Switch the app's language and region
perf_report
Report frame and memory performance figures
save_session
Save login and app state to restore later
record_start
Start recording actions as a test
record_export
Export recorded steps as Playwright, Cypress, Espresso or other test code
auth_otp
Supply a one-time code during a sign-in flow
navigate
Open a URL in the connected browser
eval
Run JavaScript in the page
get_cookies
Read the page's cookies
set_local_storage
Write a value to the page's local storage
generate_pdf
Save the page as a PDF
emulate_device
Emulate a phone or tablet viewport
throttle_network
Slow the browser's network to test poor connections
get_logs
Return the app's log output
get_errors
Return errors the app has raised
diagnose
Check the connection and setup for problems

Similar servers