Flutter MCP Toolkit について
Flutter MCP Toolkit は、デバッグ中の Flutter アプリやゲームを検査・操作する MCP サーバーです。セマンティックスナップショット、ウィジェット検索、アプリ側で定義したクライアントツールを AI クライアントに提供します。同じコアコマンドを実行できるコマンドライン CLI も含まれます。
主な機能
- 01セマンティックスナップショットとウィジェット検索
- 02ref ベースのタップ・入力・スクロール操作
- 03スクリーンショット、ビュー詳細、エラーの確認
- 04動的に登録されるクライアントツールとリソース
- 05同じ実行エンジンを使う CLI と JSON-RPC デーモン
活用シーン
- 01AI クライアントから実行中の Flutter UI を検査しウィジェットを特定する
- 02スクリプト化した操作で UI の問題を再現し、スクリーンショットで確認する
- 03コマンドラインや CI でランタイム検証を実行する
MCP 対応
本プロジェクトは MCP サーバーであり、fmt_ プレフィックスのツールと動的に登録されるクライアントツール・リソースを MCP クライアントに公開します。アプリには事前に mcp_toolkit を組み込む必要があります。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Toolkit Server(Dart)
v2.x からの移行
MCP のツール名には fmt_ というプレフィックスが付き、バイナリと mcpServers のキーが変更されています。**v2.x から v3.0 への移行**をご覧ください。
アーキテクチャ
このプロジェクトでは、共有コア実行レイヤーを使用するようになりました。
flutter-mcp-toolkitは正式なコマンドサーフェスです(接続、検査、実行、診断)。fmtkは同じ CLI エントリーポイントの短縮エイリアスです。flutter-mcp-toolkit-serverは、MCP のツール/リソース呼び出しを同じコア実行機能にマッピングする、軽量な MCP プロトコルアダプターです。- MCP の
tools/list名にはfmt_ケイパビリティプレフィックスを使用します。CLI のexec --nameでは、MCP のtools/call名前空間外のコマンドカタログ名またはエイリアスを使用します。リソース URI は変更されていません。
共有コアモジュールは、このパッケージ内で flutter_mcp_core として利用できます。
推奨手順
macOS では、まず次の手順を実行してください。
- アプリに
mcp_toolkitを追加し、MCPToolkitBinding.instance.bootstrapFlutter(...)を呼び出します。 - アプリをデバッグモードで起動します。
fmtk validate-runtimeを実行します(または正式な長形式のflutter-mcp-toolkit validate-runtimeを実行します)。- 次の順番で動的エントリを照会します。
fmt_list_client_tools_and_resources,fmt_client_tool,fmt_client_resource.
exec はエキスパートモードとして扱ってください。最初の確認には、validate-runtime を標準の検証コマンドとして使用します。
CLI v3 のインターフェース(破壊的変更)
CLI はエージェントファーストとなり、次の正規インターフェースを公開します。
exec --name <command> --args <json>schema [--name <command>]capabilitiesserve(stdio 経由の JSON-RPC 2.0)snapshot create --name <id> [--args <json>]snapshot diff --from <id> --to <id>bundle create --from-snapshot <id> [--output <dir>]doctor [--json] [--target <path>] [--timeout-ms <n>]permissions status|request|open-settings [--kind visual_capture]
書き込みを行うコマンドで使用する安全な書き込みフラグ:
snapshot create:--check --diff --backup --no-overwritebundle create:--check --diff --backup --no-overwrite
exec の対象は、共有の CommandCatalog に含まれるコマンドです(CLI のコマンド名は --name の後にのみ指定するため、接頭辞なしで指定できます。CLI は MCP の tools/call 名前空間ではありません)。
connect、session_start、session_exec、session_end、diagnose、watch、explain_errors、status、discover_debug_apps、get_vm、get_extension_rpcs、hot_reload_flutter、hot_restart_flutter、get_active_ports、get_app_errors、get_screenshots、focus_window、get_view_details、inspect_widget_at_point、capture_ui_snapshot、debug_dump_layer_tree、debug_dump_semantics_tree、debug_dump_render_tree、debug_dump_focus_tree、fmt_list_client_tools_and_resources、fmt_client_tool、fmt_client_resource、dynamicRegistryStats、semantic_snapshot、tap_widget、long_press、enter_text、reveal_search、scroll、swipe、drag、hot_reload_and_capture、evaluate_dart_expression、get_recent_logs
MCP の名前。MCP の
tools/call経由で呼び出す場合、公開されるツールにはfmt_ケイパビリティ接頭辞が付きます(例:fmt_tap_widget、fmt_hot_reload_and_capture)。有効な場合、動的レジストリのホスト用 3 ツールはfmt_list_client_tools_and_resources、fmt_client_tool、fmt_client_resourceとして公開されます。dynamicRegistryStatsは低レベル診断用として CLI カタログから引き続き利用できますが、デフォルトの MCP ツール群には含まれません。
インタラクションツール(カタログ名:semantic_snapshot → tap_widget / enter_text / reveal_search / scroll / swipe / long_press / drag)は、Playwright 形式の ref モデルに従います。スナップショットを取得した後、インタラクションツールに ref: "s_N"(古さを検出するための省略可能な snapshotId も指定可能)を渡します。reveal_search は、画面外にあるセマンティックターゲット用の範囲を限定したヘルパーです。スナップショットを取得し、限定的なセレクターを 1 つ照合して、maxAttempts 回までスクロールし、新しい ref / snapshotId とトレースを返します。hot_reload_and_capture は、リロード、スクリーンショット、新しいスナップショット、エラーをまとめて実行します。evaluate_dart_expression は、アプリのルートライブラリに対してアドホックな Dart 式を実行します。全インターフェースと推奨手順については、docs/start_here/cli_quick_recipes.mdx および docs/guides/interaction_cookbook.mdx を参照してください。
パッケージ版のインストールには flutter-mcp-toolkit と fmtk の両方が含まれます。以下の例では、ソースツリーでの開発に dart run を使用しています。ローカルでの短い実行サイクルには fmtk を優先し、検索しやすい正規名が役立つオンボーディング、インストール、PATH、MCP 設定のドキュメントでは flutter-mcp-toolkit を使用してください。
CLI は MCP と同じ共有コマンドカタログ/エグゼキューターを実行します。推奨されるデバッグ手順は次のとおりです。
discover_debug_apps -> capture_ui_snapshot -> inspect_widget_at_point。
get_active_ports と dynamicRegistryStats は低レベル診断用として CLI で引き続き利用できますが、意図的にデフォルトでは MCP に公開されません。
CLI の簡単な使い方(v3)
# introspection
dart run bin/flutter_mcp_toolkit.dart schema
dart run bin/flutter_mcp_toolkit.dart capabilities
# one-shot execution (machine envelope)
dart run bin/flutter_mcp_toolkit.dart exec --name status --args '{}'
dart run bin/flutter_mcp_toolkit.dart exec --name get_vm --args '{}'
dart run bin/flutter_mcp_toolkit.dart exec --name get_vm --args '{"connection":{"targetId":"ws://127.0.0.1:8181/<token>/ws"}}'
dart run bin/flutter_mcp_toolkit.dart exec --name discover_debug_apps --args '{}'
dart run bin/flutter_mcp_toolkit.dart exec --name capture_ui_snapshot --args '{"connection":{"targetId":"ws://127.0.0.1:8181/<token>/ws"}}'
dart run bin/flutter_mcp_toolkit.dart exec --name inspect_widget_at_point --args '{"x":120,"y":220,"connection":{"targetId":"ws://127.0.0.1:8181/<token>/ws"}}'
# session lifecycle
dart run bin/flutter_mcp_toolkit.dart exec --name session_start --args '{"mode":"uri","uri":"ws://127.0.0.1:8181/<token>/ws"}'
dart run bin/flutter_mcp_toolkit.dart exec --name session_exec --args '{"command":"get_app_errors","arguments":{"count":4}}'
dart run bin/flutter_mcp_toolkit.dart exec --name session_end --args '{}'
# reproducible artifacts
dart run bin/flutter_mcp_toolkit.dart snapshot create --name baseline --args '{"commands":[{"name":"status","args":{}}]}' --check --diff
dart run bin/flutter_mcp_toolkit.dart snapshot diff --from baseline --to after_fix
dart run bin/flutter_mcp_toolkit.dart bundle create --from-snapshot baseline --backup
# environment preflight
dart run bin/flutter_mcp_toolkit.dart doctor --json
dart run bin/flutter_mcp_toolkit.dart permissions status
dart run bin/flutter_mcp_toolkit.dart permissions request
dart run bin/flutter_mcp_toolkit.dart permissions open-settings
dart run bin/flutter_mcp_toolkit.dart exec --name get_extension_rpcs --args '{}'
# explicit capture policy/mode
dart run bin/flutter_mcp_toolkit.dart exec --name get_screenshots --args '{"mode":"desktop_window","permissionPolicy":"auto_request_once"}'
dart run bin/flutter_mcp_toolkit.dart exec --name capture_ui_snapshot --args '{"screenshotMode":"auto","permissionPolicy":"auto_request_once"}'
# one-command runtime validation (after app launch)
dart run bin/flutter_mcp_toolkit.dart --save-images --output-dir .flutter_mcp/app validate-runtime \
--target ws://127.0.0.1:8181/<token>/ws \
--timeout-ms 10000 \
--post-reload-delay-ms 500 \
--after-reload
# same, using global VM URI (equivalent to --target when only one is passed)
dart run bin/flutter_mcp_toolkit.dart --vm-service-uri ws://127.0.0.1:8181/<token>/ws validate-runtime \
--timeout-ms 10000
# optional: install bundled skill during runtime validation
dart run bin/flutter_mcp_toolkit.dart validate-runtime \
--target ws://127.0.0.1:8181/<token>/ws \
--install-skill
アプリの検査に関する CLI のランタイムゲート:
get_extension_rpcsからext.mcp.toolkit.app_errors、ext.mcp.toolkit.view_details、ext.mcp.toolkit.view_screenshots、ext.mcp.toolkit.inspect_widget_at_pointを取得する必要があります。- 不足している場合は、
mcp_toolkitがインストールおよび初期化され、アプリがホットリスタートまたは再実行されるまで、アプリレベルのスクリーンショット/レイアウト/エラー検査はブロックされます。 - スクリーンショットで、マップ/カメラ/ウェブビューが表示されるはずの場所に黒い長方形が表示される場合は、
get_view_detailsのcaptureHintsまたはスクリーンショットのペイロード(platformViewsDetectedまたはweakSignalsDetected)を確認してください。flutter_layerではなく、mode: desktop_windowを使用してください(またはautoのままにしてください。強いシグナルがある場合、macOS ホストではautoがdesktop_windowに切り替わります)。 - ホストキャプチャでは、再試行可能な失敗が発生すると、フォーカスとキャプチャを自動で1回リカバリーします(ペイロードの
desktopCaptureRetried)。focus_windowを呼び出してから、desktop_windowを指定してget_screenshotsを再試行することもできます。 - 明示的な URI での初回接続がタイムアウトした場合は、1回再試行し、
doctor --json --target <ws_uri> --timeout-ms 10000で検証してください。 --output-dirを設定すると、validate-runtimeは JSON エンベロープを<output-dir>/validate-runtime.jsonにも出力し、スクリーンショットファイルは<output-dir>/.mcp_screenshots/に書き込みます。autoがdesktop_windowを選択した場合、validate-runtimeはまずホストのdesktop_windowを試します。エグゼキューターのリカバリーでは、フォーカスとキャプチャを1回再試行します(desktopCaptureRetried)。それでもdesktop_windowが失敗する場合、validate-runtimeは(showcase のAppKitViewなど、プラットフォームビューが検出された場合も含めて)flutter_layerで1回再試行します。data.summary.capturePlatformViewsDetected、captureFocusAttempted、captureFallbackUsedを確認してください。Web の headful キャプチャオプションについては、ADR 0007 を参照してください。
ビジュアルキャプチャの権限
doctorは読み取り専用のままです。visual_capture_backend、visual_capture_permission、visual_capture_truth_mode、app_permission_bridgeが報告されるようになりました。- インタラクティブな CLI のキャプチャフローでは、
exec get_screenshots、exec capture_ui_snapshot、validate-runtimeのデフォルトがauto_request_onceです。生のコマンドスキーマでは、引き続きデフォルトがcheck_onlyです。 - macOS で実際のキャプチャを行う場合は
desktop_windowを使用します(Mac ホスト上の iOS Simulator と Chrome / web を含みます)。画面収録の権限は、Flutter アプリではなく、flutter-mcp-toolkitを実行するホストプロセスに付与します。ネイティブのプロンプトを表示するにはpermissions requestを使用し、拒否した場合はpermissions open-settingsを使用します。 - ネイティブプラットフォームビュー(
AndroidView、UiKitView、AppKitView、HtmlElementView、PlatformViewLink)が検出されると、get_view_detailsとview_screenshotsにcaptureHintsが含まれます。Textureは、ソフト警告とともにweakSignalsDetectedを設定します(autoへのアップグレードは行いません)。プラットフォームビューのないハイブリッドエンジンでは、アプリ内でMCPToolkitBinding.captureHintsContributorを使用できます。 - 画像のみの
get_screenshotsMCP レスポンスでは、captureHintsまたはwarningsがある場合、ルーティングメタデータがmetaに含まれ、先頭に JSON テキストブロックが追加されます。 - Showcase の Capture セクション:macOS の
AppKitView(make showcase)、Web のHtmlElementView(flutter run -d chrome)。macOS で新たに実行する前にmake showcase-stopを使用してください。 - Web(
chrome/web/web-server):desktop_windowは macOS ScreenCaptureKit → Chrome CDP(Page.captureScreenshot)→flutter_layerを使用します。グローバルフラグ:--web-browser-debugging-port、--web-port。オプトインのライブテスト:RUN_WEB_CDP_INTEGRATION=1 dart test test/web_cdp_integration_test.dart。ADR 0007 を参照してください。 - iOS/Android/Linux など、アプリ所有のキャプチャ対象では、
permissionsまたはdoctorがブリッジ経由の権限ツール/リソースを検証する前に、到達可能な VM ターゲットを選択する必要があります。これらのプラットフォームを調査する際は、--target <ws_uri>またはグローバルな--vm-service-uri <ws_uri>を使用してください。 desktop_windowが黙ってフォールバックすることはありません。autoはflutter_layerにフォールバックする場合がありますが、レスポンスでは常にrequestedMode、actualMode、permissionStatus、fallbackReasonが報告されます。
トラブルシューティング:
- macOS のキャプチャが拒否された場合は、まず
flutter-mcp-toolkit permissions statusを再実行してください。ステータスが引き続きdeniedの場合は、CLI からシステム設定を開き、使用中のターミナルまたはクライアントプロセスに画面収録を許可してください。 - macOS で
doctor --jsonにvisual_capture_truth_mode=flutter_layerと表示される場合、まだネイティブウィンドウのピクセルを取得できていません。 - Web の
desktop_windowが失敗した場合は、flutter_layerを使用するか、Chrome の--remote-debugging-portの値を--web-browser-debugging-portに渡してください。Web ターゲットでは、validate-runtimeに--flutter-device chromeを渡してください。validate-runtimeは、プラットフォームビューが検出されていても、desktop_windowの失敗後にflutter_layerを再試行します。 - macOS のデスクトップウィンドウモードで、リロード後のキャプチャが一度失敗する場合、通常はアプリの障害ではなくホストキャプチャの競合です。
validate-runtimeは、失敗を赤として返す前に再試行し、desktop_windowのスクリーンショット失敗後にflutter_layerで再試行する場合もあります。
障害マトリクス:
missing_mcp_toolkit_wiring:アプリで必要なツールキット拡張機能が公開されていません。アプリのブートストラップを修正し、ホットリスタートしてください。bad_target_uri_or_unreachable_vm_service:明示的なターゲット URI が誤っているか、VM サービスに到達できません。permission_denied:ホストのキャプチャバックエンドに権限がありません。host_capture_backend_instability:デスクトップウィンドウのキャプチャ中、通常はリロードの前後で、ネイティブキャプチャバックエンドが不安定になりました。
移行(v2.x -> v3.0.0)
- エラーメタデータは
error.descriptorの下に移動しました。レガシーのトップレベルフィールドは解析しないでください。 - 型付き引数は厳密に検証されます。文字列としてエンコードされたブール値/オブジェクト/リスト/整数は、検証に失敗するようになりました。
- 書き込みを行う自動化では、実際に書き込む前に
--check --diffを付けて実行してください。 --no-overwriteを使用する場合は、write_blockedを明示的に処理してください。- VM に依存する実行の事前チェックとして、
flutter-mcp-toolkit doctor --jsonを追加してください。
マシンエンベロープ
ワンショットコマンドは、安定したフィールドを持つ 1 つの JSON エンベロープを返します。
{
"ok": true,
"data": {},
"error": null,
"meta": {
"schemaVersion": "core-envelope/v1",
"command": "status",
"timestamp": "2026-03-03T00:00:00.000Z",
"durationMs": 2
}
}
失敗時は、error 内の厳密なエンベロープを使用します。
code、message、details、descriptor(category、retryable、exitCode、httpLikeStatus)、recovery。
コントラクトの全容は、docs/ai_agents/troubleshooting.mdx に記載されています。
デーモンプロトコル
serve は、stdio 上で JSON-RPC 2.0 を実行します。主なメソッドは次のとおりです。
- リクエスト:
initialize、capabilities/get、schema/get、command/execute、watch/start、watch/stop、snapshot/create、snapshot/diff、bundle/create、session/start、session/end - 通知:
watch/event、session/changed
Watch 通知は NDJSON の JSON-RPC 通知で、watch ごとに単調増加する seq を持ちます。
ターゲット指定の仕様:
command/execute:params.args.connectionは任意ですwatch/start:params.args.connectionは任意です(watch ループの開始前に一度適用されます)snapshot/create:各ステップのargs.commands[i].args.connectionは任意です
状態とロック
- 状態ルートのデフォルトは
.flutter_mcp/です - 状態ファイル:
.flutter_mcp/state.json - ロックファイル:
.flutter_mcp/state.lock - スナップショット:
.flutter_mcp/snapshots/ - バンドル:
.flutter_mcp/bundles/
状態操作では、ロックと期限切れロックの TTL 回復機能を使用し、複数のエージェントが安全に並行動作できるようにします。
接続解決の UX
サーバーは起動時にブロックせず、VM 依存の呼び出しが実行されるまでターゲットのロックを遅らせます。
VM 依存のコマンド/リソースに対する解決ポリシー:
- アクティブな接続が引き続き正常であれば、それを再利用します。
- そうでない場合、現在の検出結果に存在する固定ターゲットを再利用します。
- そうでない場合、検出されたターゲットが 1 つだけなら自動接続します。
- 複数のターゲットが存在し、明示的なターゲットが指定されていない場合は、
connection_selection_requiredで失敗します。
選択が必要なエラーは、エージェントがすぐに再試行できるよう、構造化 JSON として返されます。
{
"code": "connection_selection_required",
"message": "Multiple debug targets detected. Retry with URI connection.targetId.",
"descriptor": {
"category": "validation",
"retryable": true,
"exitCode": 64,
"httpLikeStatus": 409
},
"details": {
"reason": "multiple_targets",
"availableTargets": [
{
"targetId": "ws://127.0.0.1:8181/<token>/ws",
"host": "localhost",
"port": 8181,
"endpoint": "ws://127.0.0.1:8181/<token>/ws",
"isSticky": false,
"isCurrent": false
}
],
"suggestedAction": "retry_with_connection_target",
"example": {
"connection": { "targetId": "ws://127.0.0.1:8181/<token>/ws" }
},
"howToRetry": {
"connection": { "targetId": "ws://127.0.0.1:8181/<token>/ws" }
}
},
"recovery": {
"summary": "Select an explicit VM target and retry the command.",
"fix_command": "flutter-mcp-toolkit exec --name discover_debug_apps --args '{}'"
}
}
CLI のワンショット呼び出しとデーモン呼び出しは、同じハンドシェイクの動作を使用します。複数ターゲットがあり曖昧なセッションでは、明示的なセレクターを指定して再試行してください。
{
"connection": { "targetId": "ws://127.0.0.1:8181/<token>/ws" }
}
すべての VM 依存 MCP ツールで、任意の arguments.connection を指定できるようになりました。
{
"connection": {
"targetId": "ws://127.0.0.1:8181/<token>/ws",
"mode": "auto",
"host": "localhost",
"port": 8181,
"uri": "ws://127.0.0.1:8181/<token>/ws",
"forceReconnect": false
}
}
注意:
targetIdは推奨されるセレクターで、完全な VM WebSocket URI である必要があります。- レガシーの
host:port形式のターゲット ID は拒否されます。URI 形式のターゲット ID またはconnection.uriを使用してください。 - 最も安全なセレクターは、Flutter マシンの
app.debugPort.wsUriと完全に一致するconnection.uriです。 targetIdの検索に失敗し、URI が完全なトークン付き VM パス(/<token>/ws)の場合、サーバーは直接接続へのフォールバックを試みます。- CLI の
exec --argsとデーモンのcommand/execute/watch/startでは、同じ任意のネストされたconnectionオブジェクトを指定できます。 connect_debug_appでも同じ形式のconnectionを使用できます。- 動的レジストリツール(
fmt_list_client_tools_and_resources、fmt_client_tool、fmt_client_resource)でも、同じ任意のconnectionを指定できます。 - リソースの読み取りでは、クエリによるターゲット指定(
targetId、mode、host、port、uri、forceReconnect)もサポートされます。 - ツール引数で、トップレベルにフラットに指定する
host/port/uriなどの接続エイリアスは、厳密なスキーマによって意図的に拒否されます。 connectとsession_startでは、ネイティブのセレクター引数(mode、targetId、host、port、uri、force)とネストされたconnectionを併用できません。
間違いを防ぐ手順:
- マシンの
app.debugPort.wsUriを読み取ります。 {"connection":{"uri":"<that exact wsUri>"}}を使用します。targetIdを使用する場合は、availableTargets/discover_debug_appsから正確にコピーします。
Flutter Web の検出
検出順序は次のとおりです。
- Flutter によるマシン検出(
flutter attach --machine) - ポートスキャンによるフォールバック
CLI と MCP サーバーの両方で、次のオプションを指定できます。
--flutter-project-dir--flutter-device(例:chrome)--flutter-discovery-timeout-ms--scan-ports(例:8765-8767,9100)--prefer-target-label(例:staging)
ポートスキャンでは、dart/flutter プロセスを検出します。デスクトップアプリは VM サービスを独自のネイティブプロセス内でホストします。また、--no-dds を指定して起動したアプリには Dart プロセスがないため、どちらも名前による検出はできません。このようなアプリは、VM サービスのポートを固定して起動し(flutter run -d macos --device-vmservice-port=8765)、そのポートを --scan-ports=8765 でスキャナーに渡してください。
複数のデバッグアプリが同時に実行されている場合は、それぞれに MCPToolkitBinding.instance.setAppIdentity(label: 'my_app · staging') を設定して名前を付けます。検出結果では各ターゲットにラベルが表示され、--prefer-target-label を指定すると、呼び出し元がエンドポイントを指定しなくても自動接続で対象を選択できます。このラベルで候補が絞り込まれるのは自動接続の段階のみのため、アクティブな接続と明示的に接続されたターゲットが引き続き優先されます。実行中のアプリに一致する値がない場合は無視されるため、ラベルを指定しない場合と同じように検出が行われます。
手動でのフォールバックも引き続き利用できます。
- CLI:
--vm-service-uri ws://127.0.0.1:59490/<token>/ws - MCP ツール/リソースの呼び出し:
arguments.connection.uri
クイックスタート
📦 GitHub からのインストール(現在推奨)
プロジェクトへの貢献や、ソースから直接最新版を実行したい開発者は、次の手順に従ってください。
-
リポジトリをクローンします:
git clone https://github.com/Arenukvern/mcp_flutter cd mcp_flutter -
依存関係をインストールしてビルドします:
make installこのコマンドは、
pubspec.yamlに記載されているすべての依存関係をインストールし、その後 MCP サーバーをビルドします。 -
Flutter アプリに
mcp_toolkitパッケージを追加します:mcp_toolkitパッケージは、Flutter アプリケーション内で必要なサービス拡張機能を提供します。アプリのpubspec.yamlに追加する必要があります。Flutter アプリのディレクトリで次のコマンドを実行し、
mcp_toolkitパッケージを追加します。flutter pub add mcp_toolkitまたは、手動で
pubspec.yamlに追加します。dependencies: flutter: sdk: flutter # ... other dependencies mcp_toolkit: ^3.0.0その後、Flutter アプリのディレクトリで
flutter pub getを実行します。 -
アプリを初期化します: Flutter アプリケーションの
main.dartファイル(または同等のエントリーポイント)で、ブリッジバインディングを初期化します。import 'package:flutter/material.dart'; import 'package:mcp_toolkit/mcp_toolkit.dart'; // Import the package import 'dart:async'; Future<void> main() async { runZonedGuarded( () async { WidgetsFlutterBinding.ensureInitialized(); MCPToolkitBinding.instance ..initialize() // Initializes the Toolkit ..initializeFlutterToolkit(); // Adds Flutter related methods to the MCP server runApp(const MyApp()); }, (error, stack) { // You can place it in your error handling tool, or directly in the zone. The most important thing is to have it - otherwise the errors will not be captured and MCP server will not return error results. MCPToolkitBinding.instance.handleZoneError(error, stack); }, ); } // ... rest of your app code -
Flutter アプリをデバッグモードで起動します
flutter run --debug --machine --host-vmservice-port=8181 -d macosデバイスに合わせて
-dを調整してください。マシン出力に含まれる正確なapp.debugPort.wsUriを、arguments.connection.uriまたはconnection.targetIdで指定することをおすすめします。 -
🛠️ AI クライアントに Flutter MCP Toolkit を追加します
推奨(スキル+MCP 設定):
flutter-mcp-toolkit init claude-code # or: cursor | codex | cline | agents-skillsオープンな Agent Skills エコシステムを利用したスキルのみの設定:
npx skills add Arenukvern/mcp_flutter -a cursor -yインストール先、ロックファイル、skills.sh については、docs/ai_agents/overview.mdx を参照してください。
手動での
mcpServersJSON 設定(上級者向け —initを利用できない場合に使用):mcpServersのレジストリキーには、標準のflutter-mcp-toolkitを使用してください。設定の名前変更前から使っている場合は、旧式のキーflutter-inspectorも引き続き使用できます。この文字列はmcpServersの ID のみを指し、Claude Code のサブエージェント名ではありません。同梱のランタイムサブエージェントはflutter-mcp-toolkit-runtime(plugin/agents/flutter-mcp-toolkit-runtime.md)です。推奨サーバー引数:
--resources、--images、--dynamics(リソース/画像はデフォルトで有効です。動的レジストリを有効にするには--dynamicsを指定します)。ローカル開発の場合の注意(GitHub からのインストール):
GitHub からインストールしてローカルでビルドした場合は、
commandにmcp_server_dart/build/flutter-mcp-toolkit-serverを指定してください。上記のGitHub からのインストールを参照してください。Cline のセットアップ
.cline/config.jsonに追加します:{ "mcpServers": { "flutter-mcp-toolkit": { "command": "/path/to/your/cloned/mcp_flutter/mcp_server_dart/build/flutter-mcp-toolkit-server", "args": [ "--dart-vm-host=localhost", "--dart-vm-port=8181", "--resources", "--images", "--dynamics" ], "env": {}, "disabled": false, "autoApprove": [] } } }- Cline を再起動します
- Flutter MCP toolkit のツールが会話で利用できるようになります
- 「アプリのスクリーンショットを撮ってください」と試してみてください(MCP ツールでは
fmt_プレフィックスが使われます。例:fmt_get_screenshots)
Cursor のセットアップ
バッジ
サーバーをインストールします(クリックした後、Cursor でパスを編集してください):
注:インストール後に
commandのパスを修正してください。手動でのセットアップ
-
Cursor の設定を開きます
-
Features タブに移動します
-
「Model Context Protocol」の下で、サーバーを追加します:
{ "mcpServers": { "flutter-mcp-toolkit": { "command": "/path/to/your/cloned/mcp_flutter/mcp_server_dart/build/flutter-mcp-toolkit-server", "args": [ "--dart-vm-host=localhost", "--dart-vm-port=8181", "--resources", "--images", "--dynamics" ], "env": {}, "disabled": false, "autoApprove": [] } } } -
Cursor を再起動します
-
Agent Panel を開きます(macOS では cmd + L)
-
ツール呼び出しでは、MCP の通信に
fmt_*という名前を使用します(例:fmt_capture_ui_snapshot)。
Claude のセットアップ
- Claude の設定ファイルに追加します:
{ "mcpServers": { "flutter-mcp-toolkit": { "command": "/path/to/your/cloned/mcp_flutter/mcp_server_dart/build/flutter-mcp-toolkit-server", "args": [ "--dart-vm-host=localhost", "--dart-vm-port=8181", "--resources", "--images", "--dynamics" ], "env": {}, "disabled": false, "autoApprove": [] } } } - Claude を再起動します
- Flutter MCP toolkit のツールが利用できるようになります
- 「アプリのスクリーンショットを撮ってください」と試してみてください
開発
コマンドラインオプション
./build/flutter-mcp-toolkit-server [options]
Options:
--dart-vm-host Host for Dart VM connection (default: localhost)
--dart-vm-port Port for Dart VM connection (default: 8181)
--resources Enable resources support (default: true)
--images Enable images support (default: true)
--save-images Save captured images as files in temporal folder instead of returning base64 data (default: false)
--dumps Enable dumps support (default: false)
--await-dnd Wait until DND connection is established (default: false). Do not use with Windsurf. Workaround for MCP Clients which don't support tools updates. Important: some clients doesn't support it. Use with caution. (disable for Windsurf, works with Cursor)
--log-level Logging level (default: critical)
--environment Environment (default: production)
-h, --help Show usage text
画像ファイル保存モード
--save-images を有効にすると、サーバーは次の処理を行います:
- キャプチャしたすべてのスクリーンショットを、現在の作業ディレクトリ内の
.mcp_screenshotsフォルダーに PNG ファイルとして保存します - base64 エンコードされた画像データの代わりに、ファイル URL(
file://)を返します - 24 時間より古いスクリーンショットを自動的に削除します
screenshot-2025-01-27T10-30-15.123Z.pngのようなタイムスタンプ付きのファイル名を使用します
このモードは、次の場合に便利です:
- base64 データよりもファイル参照を優先する AI ツールを使用する場合
- 後で分析できるようにスクリーンショットを保存しておく必要がある場合
- 応答内の大きな base64 文字列を避けて、メモリ使用量を削減する場合
基本的な使い方
-
Flutter アプリをデバッグモードで起動します:
flutter run --debug --dart-vm-host=localhost --dart-vm-port=8181 -
MCP サーバーを実行します:
./build/flutter-mcp-toolkit-server
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。