Flutter Driver MCP
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Flutter Driver MCPLaunch the Flutter app and tap the login button"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π§ͺ Flutter Driver MCP
An MCP server that lets AI agents see, tap, type, scroll, and assert inside live Flutter apps β no pre-written tests required.
Flutter Driver MCP bridges your LLM (Claude, Gemini, etc.) to a running Flutter application via Flutter's test framework + WebSocket, giving the agent full interactive control of the UI.
Now with screen recording! Record your app sessions as native video files (MP4/MOV) on iOS Simulators, macOS Desktop, and Android devices.
π‘ Why Flutter Driver MCP?
Zero-config injection. No changes to your app's source code. The harness is auto-injected at launch time β just point at a project path and go.
Focused, LLM-optimized toolset. 26 purpose-built tools instead of hundreds. Every tool description fits comfortably in an LLM context window without drowning the model in irrelevant options.
Suggestive errors. When a widget isn't found, the harness fuzzy-matches against the live widget tree and returns "Did you meanβ¦?" suggestions β dramatically reducing agent retry loops and wasted tokens.
Token-efficient inspection. Widget tree output strips Dart generics, flattens layout boilerplate (Container, Padding, SizedBoxβ¦), and omits heavyweight coordinate data by default. The agent sees only what matters.
Full WidgetTester power. Every interaction runs through Flutter's real test framework with pumpAndSettle() after each action β no timing hacks, no flaky coordinate-based taps.
β¨ What Can It Do?
Category | Tools |
Lifecycle |
|
Interaction |
|
Inspection |
|
Assertions |
|
Navigation |
|
Environment |
|
Utilities |
|
Unified Selectors
All interaction tools accept a simple target string instead of verbose JSON:
"#my_key" β find by Key
"text=\"Submit\"" β find by text
"type=\"Checkbox\"" β find by widget type
"tooltip=\"Back\"" β find by tooltip
"semanticsLabel=\"Username\"" β find by semantics label (hint text, accessibility label)Suggestive Errors
When a widget isn't found, the harness scans the tree and returns "Did you meanβ¦?" suggestions β dramatically reducing agent retry loops.
π Architecture
ββββββββββββββββ JSON-RPC/stdio ββββββββββββββββββββ WebSocket ββββββββββββββββββββ
β MCP Client β ββββββββββββββββββββΊ β Node.js Server β ββconnectsβββΊ β Dart Harness β
β (LLM Agent) β β (index.ts) β β (harness.dart) β
ββββββββββββββββ ββββββββββββββββββββ β inside Flutter β
β flutter_test β
ββββββββββββββββββββThe Node.js MCP server receives tool calls from any MCP-compatible client.
On
start_app, it injects a Dart harness into the project'sintegration_test/directory and launchesflutter run --machine.The harness starts a WebSocket server inside the app. The Node server connects to it and sends JSON-RPC commands.
All interactions (tap, scroll, assert, screenshot, etc.) execute inside the real Flutter test framework with full access to the widget tree.
Zero external dependencies. The harness only imports
dart:*core libraries andpackage:flutter_test(already in every Flutter project). No changes to yourpubspec.yaml, no entitlement edits, no setup steps.
π¦ Installation
You can run the server directly via npx in your MCP configuration without installing anything globally.
If you instead wish to install it globally:
npm install -g flutter-driver-mcpPrerequisites
Node.js β₯ 18
Flutter SDK on your
PATHAny Flutter project β no additional dependencies or setup required
π Usage
Claude Code
To add this server to Claude Code, run:
claude mcp add flutter-driver -- npx -y flutter-driver-mcpOther MCP clients (Desktop, IDEs, etc.)
Add the following to your MCP client configuration:
{
"mcpServers": {
"flutter-driver": {
"command": "npx",
"args": ["-y", "flutter-driver-mcp"]
}
}
}Quick start
Once your MCP client is connected, just tell the agent what you want β it'll figure out the tools:
"Launch my app at
/path/to/my_appon macOS and test the login flow"
"Verify the account creation flow is working"
"Take a screenshot and verify the home screen loaded"
The agent handles start_app, explore_screen, tap, assert, screenshot, etc. automatically. No need to spell out tool calls.
π§ Tool Reference
Lifecycle
Tool | Description |
| Injects the harness, launches the app via |
| Gracefully sends |
| Sends a full restart command to the running app (preserves session). |
| Lists available Flutter devices (simulators, emulators, physical, desktop). No running app required. |
| Starts recording the screen of the running app's device. Supports iOS Simulators (MP4), macOS Desktop (MOV), and Android (MP4, max 180s). Auto-stops after 5 minutes or on |
| Stops the current recording and finalizes the video file. Returns the file path, format, duration, and size. Called automatically by |
Interaction
Tool | Description |
| Taps, long-presses, or double-taps a widget. Set |
| Enters text into a |
| Scrolls or swipes a widget. Use |
| Drags from a source widget to a destination widget or custom pixel offset. |
| Scrolls a scrollable container until a target widget appears. |
| Polls until a widget appears (with timeout). Set |
| Simulates a keyboard key press (enter, tab, escape, backspace, arrow keys, etc.). |
Inspection
Tool | Description |
| Returns the full widget tree as JSON. Use |
| Returns the Semantics tree β compact, labels-focused, ideal for LLMs. Pass |
| Maps all interactive elements on the current screen using the native Semantics tree. Each element includes a |
| Returns the raw text string from a widget (supports |
| Captures a PNG screenshot. Without a |
Assertions
Tool | Description |
| Runs an assertion on a widget. Use |
Navigation & Environment
Tool | Description |
| Pushes a named route via |
| Pops the current route or dismisses modal overlays (bottom sheets, dialogs). Falls back to Escape key for overlays that aren't Navigator routes. |
| Returns the name of the currently active route β lets the agent know where it is. |
| Sends the app to background and brings it back after a duration. |
| Toggles WiFi on/off (macOS/iOS Simulator only). |
| Registers a mock HTTP response for a URL pattern. Pass null to clear. |
Utilities
Tool | Description |
| Returns the last N lines from the app's stdout/stderr. |
| Executes multiple actions in a single tool call (e.g. fill a form: 5Γ |
| Waits for all animations to finish before proceeding. |
π€ Using with the Official Dart/Flutter MCP Server
Flutter Driver MCP is complementary to the official Dart/Flutter MCP server. While there is some overlap in app interaction (like widget tree inspection), they serve distinct roles in a developer's workflow:
Feature | Official Dart MCP | Flutter Driver MCP |
Primary Focus | IDE productivity, code analysis & linting | Live AI-Driven E2E Testing |
Connectivity | Dart Tooling Daemon (DTD) | WebSocket to Injected Harness |
App Control | Hot reload/restart, workspace symbols | Mocking, backgrounding, network interception |
AI Discovery | Widget Tree (standard) | Semantics-first ( |
Assertions | Manual tree inspection by agent | On-device assertions ( |
Key Tools |
|
|
Use both together: the official server for deep code analysis, package management, and standard IDE features; use Flutter Driver MCP when you need the agent to live-test the app UI, simulate complex environment states, and verify behavior with high-level assertions.
Agent Instructions (Copy & Paste)
If you're using both servers in the same project, drop the following into your project's AGENTS.md (or equivalent instruction file) so your AI agent knows when to reach for which:
## MCP Server Usage Guide
This project has two MCP servers. Use the right one for the job:
### Official Dart/Flutter MCP Server
Use for **code-level** work β things you'd do in an IDE:
- Adding/removing packages (`pub add`, `pub remove`)
- Resolving symbols, finding definitions (`resolve_workspace_symbol`, `hover`)
- Running unit/widget tests (`run_tests`)
- Static analysis and formatting (`analyze_files`, `dart_fix`, `dart_format`)
- Hot reload/restart via DTD (`hot_reload`, `hot_restart`)
- Reading package source code (`read_package_uris`)
### Flutter Driver MCP Server
Use for **live UI** work β things a real user would do:
- Launching the app on a device (`list_devices`, `start_app`)
- Tapping, typing, scrolling, swiping, dragging (`tap` with `gesture`, `enter_text`, `scroll` with `direction`, `drag_and_drop`, `press_key`)
- Checking what's on screen (`explore_screen`, `get_widget_tree`, `screenshot`, `get_text`)
- Asserting UI state (`assert` with `check`: `exists`, `not_exists`, `text_equals`, `text_contains`, `count`, `state`, `visible`, `enabled`)
- Mocking network responses (`intercept_network`)
- Navigating (`navigate_to`, `go_back`, `get_current_route`)
- Simulating environment (`simulate_background`, `set_network_status`)
- Executing scoped waits (`wait_for` with `gone` flag)
### Key Rules
- **Hot restart**: Use `pilot_hot_restart` if the app was started via Driver's `start_app`.
Use the official `hot_restart` if working through DTD. Never mix them.
- **Optimal workflow**: Use the Official server to edit code β `pilot_hot_restart` to refresh β
Driver's `explore_screen` or `assert_exists` to verify the change rendered correctly.
- After any Driver interaction (`tap`, `enter_text`, etc.), the harness automatically
calls `pumpAndSettle()`. You don't need manual waits unless testing async network latency.π§ͺ Running Tests
The project includes comprehensive verification scripts:
# Build (includes Dart syntax verification)
npm run build
# Run the full integration test suite
npm run verify-integrationThe integration tests boot a real Flutter app (test_app/), exercise all major tools over JSON-RPC, and verify correct behavior.
π License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/funkyfunc/flutter-driver-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server