关于 flutter-mcp
flutter-mcp 是面向 Agent 的技能指南,用于通过 flutter-mcp-toolkit MCP 服务驱动运行中的 Flutter 应用。它规定了调用前检查、工具命名、交互步骤和错误处理,并强调用截图验证界面变更。
主要功能
- 01调用前诊断运行环境
- 02使用 fmt_ 前缀调用工具
- 03按快照引用执行界面交互
- 04提供错误代码恢复指引
- 05通过前后截图核验界面
适用场景
- 01检查运行中应用的界面
- 02执行点击、输入或滚动操作
- 03验证代码修改是否生效
MCP 相关
该技能指导 Agent 通过 flutter-mcp-toolkit MCP 服务操作 Flutter 应用,使用 fmt_ 前缀工具检查界面、交互、读取状态及热重载。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ arenukvern/ mcp_flutter --skill flutter-mcp安装后在 Claude Code 中输入/flutter-mcp确认已加载。
详细介绍
Flutter MCP
Agent 通过 flutter-mcp-toolkit MCP 服务入口操控正在运行的 Flutter 应用的黄金路径。旧配置可能会对同一个二进制使用旧版 flutter-inspector mcpServers 注册 ID(该 ID 不是 Claude 子 Agent flutter-mcp-toolkit-runtime)。
何时使用
- 用户提到正在运行的 Flutter 应用(调试模式),并希望检查、截图、交互或热重载。
- 用户粘贴了 VM 服务 URI(
ws://127.0.0.1:8181/.../ws),或提到端口 8181。 - 你需要运行时证据(操作前后的截图)来确认代码修改已生效。
预检(始终先执行)
执行任何依赖 VM 的调用之前:
- 调用
doctor(或运行flutter-mcp-toolkit doctor --json)——解析环境、端口和应用可访问性。 - 确认目标上存在所需的工具包扩展:
ext.mcp.toolkit.app_errorsext.mcp.toolkit.view_detailsext.mcp.toolkit.view_screenshotsext.mcp.toolkit.inspect_widget_at_point
如果缺少扩展,请停止并报告插桩缺失问题——不要猜测:
- 将
mcp_toolkit添加到pubspec.yaml。 - 确保在
runApp之前运行MCPToolkitBinding.instance..initialize()..initializeFlutterToolkit();。 - 执行热重启(而非热重载)——热重载通常不足以注册扩展。
工具命名(v3.0.0+)
所有 MCP 工具都使用 fmt_ 能力前缀
(fmt_tap_widget、fmt_hot_reload_and_capture 等)。在 tools/call 中必须使用此前缀。下文技能中的引用为便于阅读而省略了前缀——调用时请加上 fmt_。动态注册表主机工具
(fmt_list_client_tools_and_resources、fmt_client_tool、fmt_client_resource)也使用相同前缀,以保持调用入口一致。
交互循环(类似 Playwright)
fmt_semantic_snapshot→ 返回s_0..s_N引用和snapshot_id。fmt_tap_widget/fmt_enter_text/fmt_scroll/fmt_swipe/fmt_long_press/fmt_drag——对某个引用执行操作。始终传入snapshotId——如果树发生变化,你会收到结构化的stale_snapshot错误,而不是悄无声息地误触。fmt_reveal_search——针对屏幕外的语义目标,执行有界的快照/搜索/滚动,并返回新的ref和snapshotId。fmt_evaluate_dart_expression——直接读取状态(例如AgentState.instance.counter)。fmt_hot_reload_and_capture——代码修改后调用,一次性返回热重载状态、截图、新快照和错误。优先使用此工具,而不是手动热重载后再单独截图。
错误封装约定
错误格式为 {code, message, details, descriptor, recovery}。应解析 error.descriptor(而非顶层对象)以获取机器可读的结构。严格模式的架构默认设置为 additionalProperties: false——未知参数会被拒绝。
常见代码及恢复方法:
connection_selection_required——使用arguments.connection.targetId重试,或传入从app.debugPort.wsUri获取的精确arguments.connection.uri。target_not_found——刷新目标,然后优先使用精确的arguments.connection.uri。stale_snapshot——重新调用fmt_semantic_snapshot,然后使用新的snapshotId输入重试操作。tool_not_found——确认使用了带前缀的名称(fmt_<tool>);v3.0.0 已移除不带前缀的旧名称。- 截图输出为空——确认服务启动时没有使用
--no-images。 - 缺少视图资源/工具——确认服务启动时没有使用
--no-resources。
视觉 QA
- 操作前后的截图是所有 UI 声明的证明材料。先用
fmt_capture_ui_snapshot(或某个visual://localhost/...资源)截图,然后修改,再调用fmt_hot_reload_and_capture并进行比较。 - 对每个报告的视觉问题,附上坐标以及
fmt_inspect_widget_at_point的输出。 - 在可用时,根据
fmt_get_app_errors的顶部堆栈帧(file、line、column)将缺陷对应到源代码。 - 除非用户明确要求,否则不要使用
fmt_debug_dump_*(服务必须以--dumps启动;该操作会消耗大量 Token)。
权限(macOS)
屏幕录制权限属于运行 flutter-mcp-toolkit 的进程(或 MCP 服务宿主)。如果视觉捕获被拒绝:
flutter-mcp-toolkit permissions status
flutter-mcp-toolkit permissions request
flutter-mcp-toolkit permissions open-settings
不可修改的应用
如果无法为目标应用添加检测(第三方二进制文件、受限环境),请报告 flutter-mcp 无法用于该应用。不要声称已成功检查截图、布局或错误。
相关内容
- 关于动态工具方面(在 Flutter 应用内部注册自定义 MCP 工具),请参阅
flutter-mcp-toolkit-custom-tools技能。 - 关于在 setup / inspect / control / debug 技能之间进行路由,请参阅
flutter-mcp-toolkit-guide。 - 关于以 Dart 代码形式纳入版本控制的可重复场景(不使用 MCP 进行构建/启动/附加/驱动/断言),请参阅
flutter-mcp-e2e-harness。