flutter-dev-mcp
Provides tools for Flutter development including testing (with compact summaries and detailed error retrieval), app lifecycle management (run, hot reload, hot restart, kill, logs), static analysis, building for various targets, dependency management, and code generation, all with output limits and sanitized inputs for agent use.
Click on "Deploy 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-dev-mcprun flutter analyze on the project"
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-dev-mcp
An MCP (Model Context Protocol) server that gives AI coding agents first-class Flutter development tools.
Why?
Flutter CLI tools are designed for humans, not agents. flutter test dumps hundreds of lines of output that overwhelm context windows. flutter run requires interactive terminal access for hot reload. flutter analyze produces unstructured text. This MCP server wraps the Flutter CLI into structured, agent-friendly tools with sensible output limits.
Key design decisions:
Test results are two-phase:
flutter_testreturns a compact summary of failures.flutter_get_resultfetches full error details for specific tests. This prevents a single test run from blowing the context window.All outputs are capped at 24KB to stay within typical tool response limits.
flutter runis managed: The server holds the process, exposes hot reload/restart/logs/kill as separate tools, so the agent doesn't need terminal access.Inputs are sanitized: All commands use array-based process spawning (no shell). Project paths are normalized and validated. Package names and device IDs are checked for flag injection.
Related MCP server: MTDevKit
Tools at a glance
Tool | Parameters | Description |
| project_dir, [test_path], [test_name], [extra_args] | Run tests and return a compact summary of failures only. Use |
| test_run_id, test_ids | Get full error details for specific test IDs from a previous |
| project_dir, [device], [is_debug], [dont_detach], [extra_args] | Start a Flutter app on |
| run_id | Hot reload a running app. |
| run_id | Hot restart a running app. |
| run_id | Kill a running app. Graceful shutdown, force-kills after 5s. |
| run_id | Get logs from a running app. Returns the most recent output, capped at 24KB. |
| project_dir | Run static analysis. Returns structured issues with severity, file, line, column, and rule name. |
| [wireless] | List available devices (simulators, emulators, physical). Skips wireless scan by default. |
| project_dir | Delete build artifacts. Useful when builds get into a bad state. |
| project_dir | Resolve and download dependencies. |
| project_dir, packages, [dev] | Add one or more packages. Supports |
| project_dir | Generate localization files from ARB files. |
| project_dir, target, [debug], [extra_args] | Build the app for a target platform (apk, ios, web, macos, etc.). |
| project_dir, [delete_conflicting] | Run |
Parameters in [brackets] are optional.
Install
Requires Node.js 18+ and Flutter SDK on your PATH.
npm install -g flutter-dev-mcpOr run directly with npx (recommended):
npx -y flutter-dev-mcpOptions
--limit-tools Only expose tools that provide significant benefit over
direct CLI usage (testing, app lifecycle, logs). Omits
analyze, devices, clean, pub get/add, gen-l10n, build,
and build_runner, which agents can run via shell.Configuration
Claude Code (CLI)
Easy: claude mcp add flutter-dev -- npx -y flutter-dev-mcp
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"flutter-dev": {
"command": "npx",
"args": ["-y", "flutter-dev-mcp"]
}
}
}Codex / Other agents
Any agent that supports MCP can use this server. Point it at the stdio transport:
npx -y flutter-dev-mcpThe server communicates over stdin/stdout using the MCP JSON-RPC protocol.
Tools
Testing
flutter_test
Run tests and get a summary of failures.
Parameter | Type | Required | Description |
| string | yes | Path to the Flutter project |
| string | no | Specific test file or directory |
| string | no | Filter by test name (plain string match) |
| string[] | no | Additional flags (e.g. |
Returns a test_run_id and an array of failed tests with short error excerpts. Pass the test_run_id to flutter_get_result for full details.
flutter_get_result
Get full error output for specific test IDs from a previous run.
Parameter | Type | Required | Description |
| number | yes | From a previous |
| number[] | yes | Test IDs to get details for |
Output is capped at 24KB total. If a single test exceeds that, its error is truncated. If multiple tests would exceed it, only tests that fit are returned.
App lifecycle
flutter_run
Start a Flutter app and get a run_id for subsequent commands.
Parameter | Type | Required | Default | Description |
| string | yes | Path to the Flutter project | |
| string | no |
| Device ID (e.g. |
| boolean | no |
| Debug mode (true) or release mode (false) |
| boolean | no |
| Wait for app to exit instead of returning after start |
| string[] | no |
| Additional flags (e.g. |
flutter_hot_reload
Trigger a hot reload on a running app.
Parameter | Type | Required | Description |
| number | yes | From a previous |
flutter_hot_restart
Trigger a hot restart on a running app.
Parameter | Type | Required | Description |
| number | yes | From a previous |
flutter_kill
Kill a running app. Sends q for graceful shutdown, force-kills after 5s.
Parameter | Type | Required | Description |
| number | yes | From a previous |
flutter_logs
Get logs from a running app. Returns the most recent output, capped at 24KB.
Parameter | Type | Required | Description |
| number | yes | From a previous |
Analysis
flutter_analyze
Run static analysis. Returns structured issues with severity, file location, and lint rule name.
Parameter | Type | Required | Description |
| string | yes | Path to the Flutter project |
flutter_devices
List available devices.
Parameter | Type | Required | Default | Description |
| boolean | no |
| Include wireless devices (slower) |
Build
flutter_build
Build the app for a target platform. Can take a long time for release builds.
Parameter | Type | Required | Default | Description |
| string | yes | Path to the Flutter project | |
| string | yes | Build target: | |
| boolean | no |
| Debug mode (true) or release mode (false) |
| string[] | no |
| Additional flags (e.g. |
Dependencies & codegen
flutter_pub_get
Resolve and download dependencies.
Parameter | Type | Required | Description |
| string | yes | Path to the Flutter project |
flutter_pub_add
Add packages to the project.
Parameter | Type | Required | Default | Description |
| string | yes | Path to the Flutter project | |
| string[] | yes | Package names (e.g. | |
| boolean | no |
| Add as dev dependency |
flutter_clean
Delete build artifacts. Useful when builds get into a bad state.
Parameter | Type | Required | Description |
| string | yes | Path to the Flutter project |
flutter_gen_l10n
Generate localization files from ARB files.
Parameter | Type | Required | Description |
| string | yes | Path to the Flutter project |
flutter_build_runner
Run dart run build_runner build for code generation (freezed, json_serializable, drift, etc.).
Parameter | Type | Required | Default | Description |
| string | yes | Path to the Flutter project | |
| boolean | no |
| Delete conflicting outputs before building |
Building from source
git clone <repo-url>
cd flutter-dev-mcp
npm install
npm run build
node dist/index.jsLicense
MIT
Available Tools
15 toolsflutter_analyzeA
Run static analysis on a Flutter project. Returns all errors, warnings, and info-level issues with file locations and rule names.
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the disclosure burden. It clearly describes the behavior: static analysis is run and all errors, warnings, and info-level issues are returned with file locations and rule names. It does not mention side effects or prerequisites, but for a static analysis tool non-mutation is reasonably inferable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the core purpose and output details with no filler. The main action is front-loaded and every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter tool with no output schema, and the description adequately covers both what the tool does and what it returns. Nothing essential is missing for an agent to decide whether to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: project_dir is already documented as 'Path to the Flutter project directory'. The description does not add additional parameter nuance, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Run static analysis'), a specific resource ('a Flutter project'), and the output it produces. This clearly distinguishes it from siblings like flutter_test and flutter_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it: when code quality/static analysis results are needed. However, it does not explicitly state when to choose this over alternatives or mention any exclusions or prerequisites, so the guidance is only implied rather than direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_buildB
Build a Flutter app for a target platform (e.g. apk, ios, web, macos). Can take a long time.
| Name | Required | Description | Default |
|---|---|---|---|
| debug | No | Build in debug mode (true) or release mode (false) | |
| target | Yes | Build target (e.g. 'apk', 'ios', 'web', 'macos', 'windows', 'linux', 'ipa', 'appbundle') | |
| extra_args | No | Additional flags to pass to flutter build (e.g. ['--simulator', '--flavor=dev']) | |
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It does warn that the operation 'can take a long time', which is useful, but it fails to disclose what the tool returns, where artifacts are written, whether the build runs asynchronously, or how failures surface. Given the sibling flutter_get_result and flutter_logs, this missing context is significant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The core action and target examples come first, followed by the practically important warning about long execution time. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite full parameter coverage, the description omits important operational context for a long-running build tool: what happens after completion, how to retrieve results, whether it is synchronous, and what prerequisites or failure modes exist. The warning about duration is helpful but not enough for an agent to fully anticipate the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 even though the description adds no parameter-level detail. The description's platform examples overlap with the schema's target parameter, but it does not add new meaning or clarify edge cases beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Build a Flutter app for a target platform', and gives concrete examples like apk, ios, and web. It is clearly distinct from run/test/analyze tools, but it does not explicitly differentiate itself from the similarly named sibling flutter_build_runner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you want a build artifact for a target platform rather than running or testing the app. However, it gives no explicit guidance about when not to use it or which sibling should be chosen instead, such as flutter_run for execution or flutter_build_runner for code generation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_build_runnerA
Run build_runner to generate code (freezed, json_serializable, drift, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes | Path to the Flutter project directory | |
| delete_conflicting | No | Delete conflicting outputs before building (usually what you want) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of explaining behavior. It only states that code is generated and does not disclose that build_runner may overwrite or delete existing generated/conflicting files, which is especially relevant given the delete_conflicting parameter defaults to true. No side effects, failure modes, or file-system consequences are mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately states the action and purpose. The parenthetical examples add useful context without any filler or unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema, the description is mostly sufficient, but it omits usage guidance and side-effect transparency. An agent would benefit from knowing that this is for regenerating serialization/model code after source changes and that conflicting outputs are deleted by default.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters have clear descriptions in the schema: project_dir is the Flutter project path and delete_conflicting explains its destructive effect. The main description adds no parameter-specific meaning, but it does not need to because the schema already documents the parameters adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Run build_runner') and names the resource and outcome ('generate code'), with concrete examples like freezed, json_serializable, and drift. This clearly distinguishes it from siblings like flutter_build by emphasizing code generation rather than building/running the app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for generating code from annotated model packages, so an agent can infer when it is appropriate. However, it does not explicitly state when to prefer this tool over alternatives, such as using flutter_build for actual app compilation, nor does it mention prerequisites like having build_runner configured as a dev dependency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_cleanA
Run flutter clean to delete build artifacts. Useful when builds get into a bad state.
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the core behavior: it deletes build artifacts, which is the main thing an agent needs to know. However, with no annotations provided, it does not mention secondary effects like removing .dart_tool or requiring a subsequent pub get before rebuilding, which would make the behavior more fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The action and use case are front-loaded, and every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool, the description is largely sufficient: it explains what the tool does, when to use it, and the single required argument is documented in the schema. It could be strengthened by noting the post-clean dependency refresh step, but that is not required for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so project_dir is already documented as the path to the Flutter project directory. The description adds no extra parameter details, which is acceptable because the schema covers the only parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run flutter clean') with a clear resource ('delete build artifacts'), which distinguishes it from sibling tools like flutter_test, flutter_run, or flutter_build. The 'bad state' trigger adds concrete context for the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case: 'Useful when builds get into a bad state.' It does not explicitly name alternatives or exclusions, but the trigger is specific enough for an agent to decide when cleaning is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_devicesA
List available Flutter devices (simulators, emulators, physical devices).
| Name | Required | Description | Default |
|---|---|---|---|
| wireless | No | Include wirelessly connected devices (slower, default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. The verb 'List' implies a read-only operation, and the schema notes that wireless scanning is slower. However, the description does not explicitly state that the tool has no side effects or that it is safe to call repeatedly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. The verb and resource are front-loaded, and the parenthetical adds useful specificity about what counts as a Flutter device.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity listing tool with one optional parameter and no output schema, the description is largely sufficient: it identifies the resource and categories. It could briefly note that the output contains device identifiers needed by sibling run/test commands, but that is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the single optional boolean 'wireless' fully documented in the schema. The tool description adds no parameter-level semantics beyond what the schema already provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('available Flutter devices'), and enumerates the categories: simulators, emulators, physical devices. This clearly distinguishes it from sibling tools like flutter_run or flutter_test, none of which are about listing devices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to call this tool versus alternatives. It does not mention that it should be used before flutter_run or flutter_test to select a target device, nor does it describe any exclusions or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_gen_l10nB
Generate localization files from ARB files.
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals that files are generated but does not mention potential side effects like overwriting existing generated files, requiring l10n configuration, or needing dependencies to be present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, direct sentence with no filler. The core action and input are stated efficiently and immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity with a single parameter, so this is minimally adequate. However, with no annotations and no output schema, the description omits practical context such as prerequisites and the fact that generated files may be written into the project, leaving the agent to infer these details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the only parameter is clearly described as the path to the Flutter project directory. The description adds no additional parameter detail, but the schema already provides sufficient meaning, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Generate') with a specific resource ('localization files') and source ('ARB files'). The description distinguishes this tool from the sibling Flutter commands, none of which mention localization generation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to run this tool versus alternatives, such as before a build or after modifying ARB files. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_get_resultA
Get full error details for specific test IDs from a previous flutter_test run. Output is capped at 24KB.
| Name | Required | Description | Default |
|---|---|---|---|
| test_ids | Yes | Array of test_id values to get full details for | |
| test_run_id | Yes | The test_run_id from a previous flutter_test call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does disclose the 24KB output cap, which is useful, and implies a read-only retrieval operation. However, it doesn't mention behavior for missing or invalid test IDs, truncation semantics beyond the cap, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero filler. The core purpose is front-loaded, and the important output-size constraint is included without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity retrieval tool with fully documented parameters and no nested objects, the description is mostly complete. It explains the source of the data, the scope of retrieval, and the output cap. The lack of an output schema is partially mitigated by the description's mention of 'full error details'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds no new parameter-specific semantics beyond what the schema states, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and identifies the exact resource: full error details for specific test IDs from a previous flutter_test run. This clearly distinguishes it from sibling tools like flutter_test (which runs tests) and flutter_logs (which presumably retrieves logs).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the usage context: this is for retrieving error details after a flutter_test run, using specific test IDs. It does not explicitly mention alternatives or when not to use it, but the context is strong enough for an agent to understand when it applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_hot_reloadB
Trigger a hot reload on a running Flutter app.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run_id from a previous flutter_run call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only names the operation without explaining side effects such as whether app state is preserved, whether the app must be in debug mode, or what happens if the run_id is invalid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence with no filler; the objective is stated immediately. It earns every word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, simple trigger tool, the description plus schema covers the basics. Still, with no annotations and no output schema, it leaves open what result to expect and does not distinguish hot reload from hot_restart, which are meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents run_id with 100% coverage, including its origin in a previous flutter_run call. The description adds no extra parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Trigger a hot reload') on a specific target ('a running Flutter app'), so an agent can tell what the tool does. It does not explicitly contrast itself with the sibling flutter_hot_restart, so sibling differentiation is left to the tool names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'on a running Flutter app' implies the tool should be used after a flutter_run session is active, and the run_id param reinforces this. However, there is no explicit guidance about when to choose hot reload over the sibling flutter_hot_restart or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_hot_restartC
Trigger a hot restart on a running Flutter app.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run_id from a previous flutter_run call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It does not explain side effects such as whether app state is reset, whether the operation returns a result, or what happens if the app is not running. It merely restates the operation name without adding observable behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence with no filler and the key action is front-loaded. Every word earns its place, and it is as concise as possible for what it says.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description needs to cover what happens when the tool is invoked, but it only names the action. An agent is left without knowledge of the tool's return value, side effects, or how the operation relates to flutter_hot_reload and flutter_kill, making it incomplete for a 1-parameter tool operating on a running app.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of the single parameter and already explains that run_id comes from a previous flutter_run call. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Trigger') and names the resource ('hot restart') and scope ('running Flutter app'), making the core purpose clear. However, it does not explicitly differentiate itself from the sibling tool flutter_hot_reload, so the distinction between restart and reload is left to the tool name and prior Flutter knowledge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage cue is that the app must be running, which is already part of the purpose. The description provides no guidance about when to prefer this tool over flutter_hot_reload, when not to use it, or what conditions must be true beyond having a run_id from a previous flutter_run call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_killA
Kill a running Flutter app.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run_id from a previous flutter_run call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does state the primary side effect—the running app is terminated—which is useful, but it does not mention failure modes, whether the operation is reversible, or what happens if the run_id is invalid or the app is already stopped. This is a moderate gap, not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler or redundant phrasing. Every word earns its place, and the core action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter kill tool with no output schema, the description plus the schema's run_id documentation is mostly sufficient. An agent knows what to kill and which run to reference. A small gap remains around expected failure behavior, but the tool is simple enough that this does not severely compromise usability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters and already documents run_id as 'The run_id from a previous flutter_run call'. Since the schema provides sufficient semantic meaning, the description does not need to add much. The description adds no new parameter detail, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Kill a running Flutter app' uses a specific verb and resource, and clearly distinguishes this tool from siblings like flutter_run and flutter_hot_reload. Even with only one sentence, an agent can identify exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than explicit: the tool only makes sense after a flutter_run call, and the run_id parameter references a previous flutter_run. No explicit guidance is given about when not to use it or how it compares to alternatives such as flutter_clean or hot restart, but the lifecycle context is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_logsA
Get logs from a running Flutter app. Returns the most recent logs, capped at 24KB.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The run_id from a previous flutter_run call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose a meaningful behavioral trait: logs are capped at 24KB and only the most recent logs are returned. However, it does not mention whether retrieval is read-only, what happens with invalid run_ids, or the output format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no filler. The core action is front-loaded, and the important 24KB cap is stated immediately after the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, low-complexity tool with one well-documented parameter and no output schema. The description covers the essential behavior and the result size cap. It could add more about when logs are available or how they are formatted, but nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single parameter run_id is already well documented as coming from a previous flutter_run call. The description itself adds no additional parameter semantics beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get logs from a running Flutter app.' It clearly identifies the tool's function and is distinct from siblings like flutter_get_result, flutter_test, or flutter_hot_reload, which address different concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after a Flutter app is running and that logs are retrieved, but it provides no explicit when-to-use guidance or comparison with alternatives such as flutter_get_result. The need for a run_id from flutter_run is only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_pub_addB
Add one or more packages to the project's dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
| dev | No | Add as dev dependency | |
| packages | Yes | Package names to add (e.g. ['http', 'provider']) | |
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral effects. It only states the action of adding packages, without mentioning that this modifies pubspec.yaml, triggers dependency resolution, may require network access, or can fail if a package is invalid. This is a significant transparency gap for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no redundant or extraneous content. It front-loads the action and resource clearly, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description is too thin. It does not explain side effects, expected results, or error conditions, which are essential for an agent to correctly invoke the tool and interpret the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with meaningful descriptions for all three parameters (dev, packages, project_dir). The description adds minimal semantic value beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Add one or more packages to the project's dependencies.' This clearly distinguishes it from sibling tools like flutter_pub_get, which fetches existing dependencies rather than adding new ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as flutter_pub_get, flutter_clean, or flutter_analyze. No conditions, exclusions, or contextual hints are given, leaving the agent to infer usage solely from the tool name and general knowledge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_pub_getB
Run flutter pub get to resolve and download dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions resolving and downloading dependencies, but does not disclose that the operation modifies pubspec.lock and .dart_tool/package_config.json, requires network access, or may be slow. For a mutating operation this is a significant omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no filler. It front-loads the command name and immediately states its purpose, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter tool, so the description is minimally viable. However, it lacks side-effect disclosure and usage context relative to sibling commands, which an agent would benefit from when deciding whether to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents project_dir with 100% coverage, so the baseline is 3. The description adds no additional parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Run'), resource ('flutter pub get'), and purpose ('resolve and download dependencies'), making the core function clear. It does not explicitly differentiate from sibling tools like flutter_pub_add or flutter_get_result, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool or when to prefer an alternative such as flutter_pub_add. The description simply states what the command does, leaving the agent to infer its place in a workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_runA
Start a Flutter app. Returns a run_id for use with hot_reload, hot_restart, and logs tools.
| Name | Required | Description | Default |
|---|---|---|---|
| device | No | Target device ID (e.g. 'chrome', 'macos', an emulator ID). Empty for default. | |
| is_debug | No | Run in debug mode (true) or release mode (false) | |
| extra_args | No | Additional flags to pass to flutter run (e.g. ['--flavor=dev', '--dart-define=KEY=VALUE']) | |
| dont_detach | No | If true, wait for the app to finish instead of returning immediately after start | |
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does disclose the key behavior of returning a run_id for subsequent development commands. However, it does not mention whether the app process stays running, how to stop it (e.g., flutter_kill), or any side effects, leaving some behavior implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The action is stated first and the return value / integration with sibling tools is second, giving the agent the most important information up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and no annotations, the description covers the essential output (run_id) and its role in the sibling-tool workflow, while the input schema covers all five parameters. It could add lifecycle detail such as background execution or stopping via flutter_kill, but the core usage loop is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the input schema (device, is_debug, extra_args, dont_detach, project_dir). The description adds no extra parameter semantics beyond tying run_id to the downstream tools, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Start') with a clear resource ('a Flutter app') and immediately distinguishes the tool from its siblings by noting it returns a run_id for hot_reload, hot_restart, and logs. This makes it easy for an agent to separate flutter_run from flutter_test, flutter_build, or the hot-reload tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear workflow context: start the app first, then use the returned run_id with hot_reload, hot_restart, and logs. It does not explicitly call out when not to use it or name alternatives, but the stated downstream integration gives enough context for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flutter_testA
Run flutter tests and return a summary of failed tests. Use flutter_get_result to get full error details for specific test IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| test_name | No | Filter tests by name (plain string match) | |
| test_path | No | Specific test file or directory to run (e.g. test/widget_test.dart) | |
| extra_args | No | Additional flags to pass to flutter test (e.g. ['--coverage', '--dart-define=KEY=VALUE']) | |
| project_dir | Yes | Path to the Flutter project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of behavioral disclosure. It reveals that the tool executes tests and returns only a summary of failed tests, not full errors, and it implies that the summary contains test IDs that can be used with flutter_get_result. It could additionally mention side effects such as builds or generated artifacts, but the core behavior is clearly conveyed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences deliver the essential information without filler. The first sentence states the action and output, and the second sentence provides the follow-up alternative. The most important behavioral detail is front-loaded, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a straightforward test-runner tool, the description is reasonably complete. The output is described as a summary, and the connection to flutter_get_result covers the follow-up path for full error details. The schema handles parameter semantics, and the problem of distinguishing from siblings is mostly solved by the explicit 'flutter tests' phrasing. A fully exhaustive comparison with every sibling is not necessary for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters (project_dir, test_name, test_path, extra_args) with meaningful descriptions. The tool description itself adds no parameter-level information beyond that, so the baseline score of 3 is appropriate. It neither obscures nor enriches the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Run flutter tests'. It also clearly identifies the output as 'a summary of failed tests' and points to flutter_get_result for full details, which distinguishes this tool from its closest sibling. This makes its purpose unambiguous within the provided sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: when you want to run Flutter tests and get a failure summary. It explicitly routes the agent to flutter_get_result for full error details, providing a direct alternative. It does not, however, mention when not to use this tool in favor of flutter_run or other related commands, though the phrase 'flutter tests' largely disambiguates that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v1.2.5- First observed
flutter_analyze - First observed
flutter_build - First observed
flutter_build_runner - First observed
flutter_clean - First observed
flutter_devices - First observed
flutter_gen_l10n - First observed
flutter_get_result - First observed
flutter_hot_reload - First observed
flutter_hot_restart - First observed
flutter_kill - First observed
flutter_logs - First observed
flutter_pub_add - First observed
flutter_pub_get - First observed
flutter_run - First observed
flutter_test
TDQS
Scored across 15 tools
Every tool targets a distinct Flutter workflow action: testing, result retrieval, running, hot reload/restart, killing, logs, analysis, devices, cleaning, pub operations, localization generation, code generation, and building. The complementary relationship between flutter_test and flutter_get_result is clearly described and should not cause confusion. No two tools appear to do the same thing.
All tools follow a consistent flutter_ prefix with lowercase snake_case naming. Most tools use an imperative verb or a recognizable Flutter CLI command, making the pattern predictable and easy to navigate. Even noun-style names like flutter_logs and flutter_devices fit the overall flutter_<command> convention.
Fifteen tools is at the upper end of the ideal range but every tool corresponds to a meaningful, non-redundant Flutter development capability. The count is well-scoped for a comprehensive Flutter development server without feeling bloated. Each tool earns its place by covering a distinct phase of the development workflow.
The tool surface covers the main Flutter lifecycle well: testing, running, hot reload/restart, logs, analysis, dependency management, code generation, localization, and building. Minor gaps exist such as no flutter_pub_remove, flutter_clean_list, or project scaffolding tool, but these are unlikely to block common agent workflows. The core development loop is fully supported.
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides AI agents with tools to build, deploy, and manage Flutter applications, including APK/AAB generation, keystore management, and CI/CD integration.91MIT
- FlicenseAqualityDmaintenanceAn MCP server that scaffolds Flutter projects from a custom clean-architecture Bitbucket template, enabling AI agents to create, list, and inspect Flutter projects via natural language.3-
- AlicenseBqualityDmaintenanceAn MCP server that lets AI agents see, tap, type, scroll, and assert inside live Flutter apps — no pre-written tests required.2819MIT
- FlicenseNot gradedqualityAmaintenanceAn MCP server that lets AI agents drive real mobile-app automation on connected devices, enabling natural-language test tasks, test case generation, and app/build management for Android and iOS.-