A MCP server with simple goal to debug Flutter apps by giving ability to AI coding assistants (Cline, Cursor, Claude etc..) tools to do analysis of widget trees, navigation, and layout issues.
See Architecture to understand how it works https://github.com/Arenukvern/mcp_flutter/blob/main/ARCHITECTURE.md
? A powerful Model Context Protocol (MCP) server that connects your Flutter apps with AI coding assistants like Cursor, Claude, and Cline.
This project is a work in progress and not all methods (mostly Flutter Inspector related) are implemented yet.
However, two methods are tested with Flutter:
screenshot
get_root_widget
Currently Flutter works with MCP server via forwarding server. Please see Architecture for more details.
Some of other methods are not tested - they may work or not. Please use with caution. It is possible that the most methods will be removed from the MCP server later to focus solely on Flutter applications and maybe Jaspr.
!!WARNING!!
ALL DUMPS TOOLS ARE VERY HEAVY OPERATION and can easily overload context window of AI agent. Please use them with extreme caution.
? Quick Start
Prerequisites
Node.js (v14 or later)
A Flutter app running in debug mode
One of: Cursor, Claude, or Cline AI assistant
Installing via Smithery
To install Flutter Inspector for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @Arenukvern/mcp_flutter --client claude
Installation from GitHub
For developers who want to contribute to the project or run the latest version directly from source, follow these steps:
Clone the repository:
git clone https://github.com/Arenukvern/mcp_flutter
cd flutter-inspector
Install and build dependencies:
make install
This command installs all necessary dependencies listed in package.json and then builds MCP server and forwarding server.
Start forwarding server:
make forward
Add DevTools Flutter Extension to Flutter App:
flutter pub add --dev devtools_mcp_extension
Start your Flutter app in debug mode
! Current workaround for security reasons is to run with --disable-service-auth-codes. If you know how to fix this, please let me know!
flutter run --debug --observatory-port=8181 --enable-vm-service --disable-service-auth-codes
?️ Add Flutter Inspector to your AI tool
Note for Local Development (GitHub Install):
If you installed the Flutter Inspector from GitHub and built it locally, you need to adjust the paths in the AI tool configurations to point to your local build/index.js file. Refer to the "Installation from GitHub" section for instructions on cloning and building the project.
The Flutter inspector tools will be automatically available
? What You Can Do (Hopefully)
Analyze Widget Trees: Get detailed information about your Flutter app's structure
Inspect Navigation: See current routes and navigation state
Debug Layout Issues: Understand widget relationships and properties
? Configuration Options
Environment Variables (.env)
# will be used for direct connections to the dart vm
DART_VM_PORT=8181
DART_VM_HOST=localhost
# will be used for this MCP server
MCP_SERVER_PORT=3535
MCP_SERVER_HOST=localhost
# will be used for the forwarding server
FORWARDING_SERVER_PORT=8143
FORWARDING_SERVER_HOST=localhost
# Logging configuration
LOG_LEVEL=critical
# Development configuration
NODE_ENV=development
Command Line Arguments
--port, -p # Server port
--stdio # Run in stdio mode (default: true)
--log-level # Set logging level (debug, info, notice, warning, error, critical, alert, emergency) according to https://spec.modelcontextprotocol.io/specification/2025-03-26/server/utilities/logging/#log-levels
--help # Show help
Port Configuration
All Flutter Inspector tools automatically connect to the default Flutter debug port (8181). You only need to specify a port if:
You're running Flutter on a different port
You have multiple Flutter instances running
You've configured a custom debug port
Example usage:
// Default port (8181)
{
"name": "debug_dump_render_tree"
}
// Custom port
{
"name": "debug_dump_render_tree",
"arguments": {
"port": 8182
}
}
? Troubleshooting
Connection Issues
Ensure your Flutter app is running in debug mode
Verify the port matches in both Flutter app and inspector
Check if the port is not being used by another process
AI Tool Not Detecting Inspector
Restart the AI tool after configuration changes
Verify the configuration JSON syntax
Check the tool's logs for connection errors
? Available Tools
All tools default to using port 8181 if no port is specified. You can override this by providing a specific port number.
Utility Methods (Not Direct RPC Calls)
These are helper methods that provide additional functionality beyond direct Flutter RPC calls:
get_active_ports: Lists all Flutter/Dart processes listening on ports
get_supported_protocols: Retrieves supported protocols from a Flutter app
get_vm_info: Gets detailed VM information from a running Flutter app
get_extension_rpcs: Lists all available extension RPCs in the Flutter app
Debug Methods (ext.flutter.debug*)
Direct RPC methods for debugging Flutter applications:
debug_dump_render_tree: Dumps the render tree structure
debug_dump_layer_tree: Dumps the layer tree for rendering analysis
debug_dump_semantics_tree: Dumps the semantics tree for accessibility analysis
For detailed implementation instructions, see the "Implementing New RPC Methods" section.
? Implementing New RPC Methods
Step-by-Step Guide
Add RPC Method Definition
// In src/index.ts, add to appropriate group in FlutterRPC
const FlutterRPC = {
GroupName: {
METHOD_NAME: createRPCMethod(RPCPrefix.GROUP, "methodName"),
// ... other methods
},
};
Add Tool Definition
// In ListToolsRequestSchema handler
{
name: "method_name",
description: "Clear description of what the method does",
inputSchema: {
type: "object",
properties: {
port: {
type: "number",
description: "Port number where the Flutter app is running (defaults to 8181)",
},
// Add other parameters if needed
paramName: {
type: "string", // or boolean, number, etc.
description: "Parameter description",
}
},
required: ["paramName"], // List required parameters
}
}
Implement Handler
// In CallToolRequestSchema handler
case "method_name": {
const port = handlePortParam();
// Get and validate parameters if any
const { paramName } = request.params.arguments as { paramName: string };
if (!paramName) {
throw new McpError(
ErrorCode.InvalidParams,
"paramName parameter is required"
);
}
// Call the RPC method
return wrapResponse(
this.invokeFlutterExtension(port, FlutterRPC.GroupName.METHOD_NAME, {
paramName,
})
);
}
Implementation Checklist
Method Definition
Add to appropriate group in FlutterRPC
Use correct RPCPrefix
Follow naming convention
Tool Definition
Add clear description
Define all parameters
Mark required parameters
Add port parameter
Document parameter types
Handler Implementation
Add case in switch statement
Handle port parameter
Validate all parameters
Add error handling
Use proper types
Return wrapped response
Testing
Verify method works in debug mode
Test with different parameter values
Test error cases
Test with default port
Example Implementation
// 1. Add RPC Method
const FlutterRPC = {
Inspector: {
GET_WIDGET_DETAILS: createRPCMethod(RPCPrefix.INSPECTOR, "getWidgetDetails"),
}
};
// 2. Add Tool Definition
{
name: "get_widget_details",
description: "Get detailed information about a specific widget",
inputSchema: {
type: "object",
properties: {
port: {
type: "number",
description: "Port number where the Flutter app is running (defaults to 8181)",
},
widgetId: {
type: "string",
description: "ID of the widget to inspect",
}
},
required: ["widgetId"],
}
}
// 3. Implement Handler
case "get_widget_details": {
const port = handlePortParam();
const { widgetId } = request.params.arguments as { widgetId: string };
if (!widgetId) {
throw new McpError(
ErrorCode.InvalidParams,
"widgetId parameter is required"
);
}
await this.verifyFlutterDebugMode(port);
return wrapResponse(
this.invokeFlutterExtension(port, FlutterRPC.Inspector.GET_WIDGET_DETAILS, {
widgetId,
})
);
}
Common Patterns
Parameter Validation
Always validate required parameters
Use TypeScript types for type safety
Throw McpError with clear messages
Error Handling
Use try-catch blocks for async operations
Verify Flutter debug mode when needed
Handle connection errors
Response Wrapping
Use wrapResponse for consistent formatting
Handle both success and error cases
Format response data appropriately
Port Handling
Use handlePortParam() for port management
Default to 8181 if not specified
Validate port number
Notes for AI Agents
When implementing methods from todo.yaml:
Follow the step-by-step guide above
Use the example implementation as a template
Ensure all checklist items are completed
Add proper error handling and parameter validation
Follow the common patterns section
Test the implementation thoroughly
For each new method:
Check the method's group (UI, DartIO, Inspector, etc.)
Determine required parameters from method name and context
Implement following the standard patterns
Add appropriate error handling
Follow the existing code style
Smithery Integration
The Flutter Inspector is registered with Smithery's registry, making it discoverable and usable by other AI tools through a standardized interface.