FLUTTER ECOSYSTEM

leancodepl/marionette_mcp

MCP 服务器使 AI 代理能够在运行时与 Flutter 应用交互 - 让它们检查控件、模拟点击、输入文本、滚动以及截取屏幕截图。

marionette_mcp 项目封面
Stars
446
Forks
50
最近推送(UTC)
2026年9月16日
项目状态
未归档
LeanCode GitHub avatar
GITHUB Organization

LeanCode ↗

We're a custom software studio that delivers end-to-end solutions for various industries. Experts in Flutter, .NET, and React.

语言DartC++CMakeSwiftCHTMLDockerfileKotlinObjective-C

此仓库发布的插件

所在榜单

原始 README

以下为英文项目原文快照,最新内容请访问 GitHub。

展开 / 收起项目 README
marionette_mcp

Marionette MCP

License marionette_mcp pub.dev badge

"Playwright MCP/Cursor Browser, but for Flutter apps"

Marionette MCP enables AI agents (Claude Code, Copilot, Cursor, Gemini CLI, and more) to inspect and interact with running Flutter applications. It connects your AI agent directly to a running app via the Model Context Protocol (MCP), so it can see the widget tree, tap elements, enter text, scroll, and capture screenshots for automated AI-driven smoke testing and interaction.

Marionette MCP keeps the surface area intentionally small. It exposes only a handful of high-signal actions and returns the minimum actionable data, which helps keep prompts focused and context sizes under control.

Learn more about Marionette MCP:

Demo

https://github.com/leancodepl/marionette_mcp_attachments/blob/master/promo.gif

Marionette MCP vs Flutter MCP

The official Dart & Flutter MCP server focuses on development-time tasks: searching pub.dev, managing dependencies, analyzing code, and inspecting runtime errors. It can also drive the UI, but it does so through Flutter Driver, which introduces extra instrumentation in your app. Marionette MCP focuses solely (and in an opinionated way) on runtime interaction: tapping buttons, entering text, scrolling, and taking screenshots, while requiring minimal changes to your app. Use Flutter MCP to build your app, use Marionette MCP to test and interact with it with minimal code changes.

Quick Start

[!NOTE] Your Flutter app must be prepared to be compatible with Marionette. The steps below are the short version — the Getting Started guide walks through each one.

  1. Prepare your app — add marionette_flutter and initialize MarionetteBinding in main.dart:

    flutter pub add marionette_flutter
    
    void main() {
      if (kDebugMode) {
        MarionetteBinding.ensureInitialized();
      } else {
        WidgetsFlutterBinding.ensureInitialized();
      }
      runApp(const MyApp());
    }
    
  2. Install the bridge — activate the MCP server (for the CLI alternative, see the CLI guide):

    dart pub global activate marionette_mcp
    
  3. Configure your AI tool — e.g. for Claude Code:

    claude mcp add --transport stdio marionette -- marionette_mcp
    

    Other tools (Cursor, Gemini CLI, Copilot, Antigravity): see Configuring your AI tool.

  4. Run your app in debug modeflutter run, then copy the VM service URI from the console (e.g. ws://127.0.0.1:9101/ws).

  5. Connect and interact — ask your agent to connect using that URI and start driving the app.

[!IMPORTANT] Standard Material widgets work out of the box. If your app uses a custom design system, configuration is required — otherwise the agent can't see or tap your custom buttons and fields. Start with the Production Setup Checklist.

What you can do

Once connected, an agent can drive your app with a small, focused toolset: inspect the widget tree (get_interactive_elements), tap / secondary_tap / double_tap / long_press / swipe / pinch_zoom / scroll_to, enter_text, press_back_button, take_screenshots, read get_logs, and hot_reload. Full list: MCP Tools.

Your app can also expose its own actions to the agent via Custom Extensions — navigate by route name, seed test data, toggle feature flags, and more.

Some real-world prompts:

"I implemented the Forgot Password screen — connect, navigate to login, tap 'Forgot Password', enter a valid email, submit, and check the logs that the API call fired."

"I refactored the routing. Run a smoke test: cycle through all bottom-nav tabs and verify each screen loads without exceptions in the logs."

"Investigate the unresponsive 'Clear Cache' button on Settings — find it via get_interactive_elements, tap it, and analyze the logs."

Documentation

Guide What's inside
Getting Started Zero-to-driving in 5 steps.
Flutter Setup The binding, debug-only init, the single-binding rule.
Configuration Custom design systems, production checklist, complete main.dart.
Log Collection Wire up get_logs (logging, logger, or custom).
Semantics Make custom-painted / rich content readable to agents.
MCP Tools Full tool reference + AI-tool configuration.
Custom Extensions Expose app-specific actions as agent tools via registerMarionetteExtension.
CLI Drive Marionette from any shell-capable agent.
Troubleshooting Common gotchas and limitations.

Packages

Package Role
marionette_flutter The binding you add to your Flutter app. Required.
marionette_mcp MCP server bridging AI agents to your running app.
marionette_cli CLI alternative for shell-only / restricted environments.
marionette_logging LogCollector adapter for the logging package.
marionette_logger LogCollector adapter for the logger package.

🛠️ Maintained by LeanCode

This package is built with 💙 by LeanCode. We are top-tier experts focused on Flutter Enterprise solutions.

Why LeanCode?
  • Creators of Patrol – the next-gen testing framework for Flutter.

  • Production-Ready – We use this package in apps with millions of users.

  • Full-Cycle Product Development – We take your product from scratch to long-term maintenance.


Need help with your Flutter project?

👉 Hire our team   •   Check our other packages