Flutter Driver MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| start_appC | Injects the harness and starts the Flutter app in test mode. |
| stop_appB | Stops the currently running Flutter app and cleans up. |
| pilot_hot_restartC | Performs a hot restart of the currently running app session started by this server. |
| list_devicesA | Lists available Flutter devices. Does NOT require a running app. |
| start_recordingA | Starts recording the screen of the running app's device. Recording begins capturing immediately with no warmup delay — proceed with interactions right away. Supports iOS Simulators (MP4), macOS Desktop (MOV), and Android devices/emulators (MP4, max 180s). Only one recording at a time. Auto-stops if stop_app is called or after 5 minutes. |
| stop_recordingA | Stops the current screen recording and finalizes the video file. Returns the file path, format, duration, and file size. Called automatically by stop_app if a recording is active. |
| tapB | Taps, long-presses, or double-taps a widget. Defaults to a normal tap. Use gesture to change. |
| enter_textA | Enters text into a widget found by the target string. By default, replaces existing text. Set clearFirst to explicitly clear and re-focus the field before typing. |
| get_textB | Returns the text content of a widget identified by the target string. |
| drag_and_dropC | Drags from a source widget to a target widget (or to an offset). |
| scrollB | Scrolls or swipes a widget. Use dx/dy for pixel-precise scrolling, or direction/distance for named swipe gestures. |
| scroll_until_visibleB | Scrolls a scrollable widget until a target widget is visible. |
| navigate_toA | Pushes a named route using Navigator.pushNamed. NOTE: Does NOT work with GoRouter or other custom routers — use tap() to navigate via on-screen elements instead. |
| go_backA | Pops the current route off the Navigator stack (like pressing the back button). |
| get_current_routeA | Returns the name of the currently active route on the Navigator stack. |
| press_keyC | Simulates a keyboard key press (e.g. enter, tab, escape, backspace, arrow keys). |
| assertA | Runs an assertion check on a widget. Use 'check' to specify the type: exists, not_exists, text_equals, text_contains, count, state, visible, or enabled. |
| screenshotB | Captures a screenshot. Without a target, captures the full app. With a target, captures a specific widget. |
| get_widget_treeC | Returns a JSON representation of the widget tree. |
| get_accessibility_treeC | Returns the accessibility (semantics) tree. |
| explore_screenC | Maps out interactive elements on the screen. |
| wait_forB | Waits for a widget to appear or disappear. Set gone=true to wait for disappearance (e.g. loading spinners). |
| simulate_backgroundB | Simulates the app going into the background and coming back to the foreground. |
| set_network_statusC | Simulates network connectivity changes. |
| intercept_networkC | Mocks a network response. Pass null for both to clear. |
| read_logsB | Reads the last N lines from the app's stdout/stderr. |
| batch_actionsA | Execute multiple actions in a single call. Each action is run sequentially with pumpAndSettle between them. Stops on first error. Supported tools: tap, enter_text, scroll, assert, wait_for, press_key, screenshot, get_text, explore_screen. |
| wait_for_animationA | Pumps frames for a specified duration without waiting for all animations to settle. Useful for hero transitions, page animations, or custom animation controllers where pumpAndSettle would time out. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 28 tools
Each tool targets a distinct operation: lifecycle (start/stop/restart), device management, gestures (tap/scroll/drag), navigation, inspection, and network simulation. The gesture tools are well differentiated (tap vs enter_text vs scroll vs drag_and_drop), and even similar ones like scroll vs scroll_until_visible have clearly distinct purposes. No meaningful overlap or ambiguity exists.
Tools follow a consistent verb_noun pattern (start_app, stop_app, get_text, wait_for, read_logs). Most names are descriptive and consistent, with minor deviations like 'assert' and 'intercept_network' mixing a bare verb style, and 'explore_screen' vs 'get_widget_tree' showing slight inconsistency in prefix style (explore vs get). Overall quite consistent.
At 28 tools, this is on the heavy side but justifiable given the breadth of a Flutter driver's surface: lifecycle, gestures, navigation, inspection, network, recording, and batching. Each tool earns its place and the count is appropriate for a comprehensive UI automation server, though slightly above the typical ideal range.
The surface is exceptionally complete for a Flutter driver: full app lifecycle (start/stop/restart), device listing, gesture primitives, navigation, text input, widget assertions, screenshots, widget/accessibility trees, network mocking, background simulation, log reading, recording, and batch operations. The batch_actions tool even fills the gap for multi-step efficiency without round trips. No obvious dead ends or missing operations.