Airogel Editor
Build and inspect browser-based 3D games: projects, scenes, Lua scripts, assets and publishing.
Description from the maker (original English)
Inspect and drive Flutter debug apps/games: semantic snapshots, search, and custom client tools
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"flutter-toolkit": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1"
]
}
}
}Run this in your terminal
claude mcp add flutter-toolkit -- docker run -i --rm ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"flutter-toolkit": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"flutter-toolkit": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arenukvern/flutter-mcp-toolkit:7.0.1"
]
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026
The registry name was verified with the GitHub account Arenukvern, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (7.0.1) reached the registry 21 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker on your computer.
In the same category: Airogel Editor, Prospre, RSS.com MCP by usefulapi
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Build and inspect browser-based 3D games: projects, scenes, Lua scripts, assets and publishing.
Log food, plan meals, fix the diary, build the grocery list and move macro targets in Prospre.
Read podcasts and episodes; create and edit episodes, chapters and transcripts in RSS.com.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
Tool names on MCP are prefixed with `fmt_`, binaries and mcpServers keys were renamed — see [Migrating from v2.x to v3.0](../docs/start_here/migration_v2_to_v3.mdx).
This project now uses a shared core execution layer:
flutter-mcp-toolkit is the canonical command surface (connect, inspect, execute, diagnostics). fmtk is the short alias for the same CLI entrypoint.flutter-mcp-toolkit-server is a thin MCP protocol adapter that maps MCP tool/resource calls to the same core executor.tools/call namespace. Resource URIs are unchanged.The shared core module is available as flutter_mcp_core inside this package.
Use this sequence first on macOS:
mcp_toolkit to the app and call MCPToolkitBinding.instance.bootstrapFlutter(...).fmtk validate-runtime (or the canonical long form flutter-mcp-toolkit validate-runtime).fmt_list_client_tools_and_resources, fmt_client_tool, fmt_client_resource.Treat exec as expert mode. validate-runtime is the default first-pass proof command.
The CLI is now agent-first and exposes a canonical interface:
exec --name --args schema [--name ]capabilitiesserve (JSON-RPC 2.0 over stdio)snapshot create --name [--args ]snapshot diff --from --to bundle create --from-snapshot [--output ]doctor [--json] [--target ] [--timeout-ms ]permissions status|request|open-settings [--kind visual_capture]Safe-write flags for write-producing commands:
snapshot create: --check --diff --backup --no-overwritebundle create: --check --diff --backup --no-overwriteexec targets commands in the shared CommandCatalog (CLI command names may be bare because they appear only after --name; the CLI is not the MCP tools/call namespace): 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 names. When invoked via MCP
tools/call, exposed tools use the
fmt_capability prefix (e.g.fmt_tap_widget,
fmt_hot_reload_and_capture). The dynamic-registry host trio is exposed as
fmt_list_client_tools_and_resources,fmt_client_tool, and
fmt_client_resourcewhere enabled.dynamicRegistryStatsremains available
from the CLI catalog for low-level diagnostics and is not part of the default
MCP tool surface.
Interaction tools (catalog names: semantic_snapshot → tap_widget / enter_text / reveal_search / scroll / swipe / long_press / drag) follow a Playwright-style ref model: take a snapshot, then pass ref: "s_N" (and optional snapshotId for staleness detection) into the interaction tool. reveal_search is the bounded helper for off-screen semantic targets: it snapshots, matches one narrow selector, scrolls up to maxAttempts, and returns a fresh ref/snapshotId plus trace. hot_reload_and_capture fuses reload + screenshot + fresh snapshot + errors. evaluate_dart_expression runs an ad-hoc Dart expression against the app's root library. See docs/start_here/cli_quick_recipes.mdx and docs/guides/interaction_cookbook.mdx for the full surface and golden paths.
Packaged installs include both flutter-mcp-toolkit and fmtk; examples below use dart run for source-tree development. Prefer fmtk for compact local loops and keep flutter-mcp-toolkit in onboarding, install, PATH, and MCP config docs where the searchable canonical name helps.
CLI runs the same shared command catalog/executor as MCP. Preferred debugging path: discover_debug_apps -> capture_ui_snapshot -> inspect_widget_at_point. get_active_ports and dynamicRegistryStats remain available in CLI for low-level diagnostics, but are intentionally not MCP-exposed by default.
# introspection
dart run bin/flutter_mcp_toolkit.dart schema dart run bin/flutter_mcp_toolkit.dart capabilities
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/ /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/ /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/ /ws"}}'
dart run bin/flutter_mcp_toolkit.dart exec --name session_start --args '{"mode":"uri","uri":"ws://127.0.0.1:8181/ /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 '{}'
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
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 '{}'
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"}'
dart run bin/flutter_mcp_toolkit.dart --save-images --output-dir .flutter_mcp/app validate-runtime \ --target ws://127.0.0.1:8181/ /ws \ --timeout-ms 10000 \ --post-reload-delay-ms 500 \ --after-reload
dart run bin/flutter_mcp_toolkit.dart --vm-service-uri ws://127.0.0.1:8181/ /ws validate-runtime \ --timeout-ms 10000
dart run bin/flutter_mcp_toolkit.dart validate-runtime \ --target ws://127.0.0.1:8181/ /ws \ --install-skill
CLI runtime gate for app inspection:
ext.mcp.toolkit.app_errors, ext.mcp.toolkit.view_details, ext.mcp.toolkit.view_screenshots, and ext.mcp.toolkit.inspect_widget_at_point from get_extension_rpcs.mcp_toolkit is installed, initialized, and the app is hot restarted or rerun.captureHints on get_view_details or screenshot payloads (platformViewsDetected or weakSignalsDetected). Use mode: desktop_window (or keep auto, which upgrades on macOS host when strong signals are present) instead of flutter_layer.desktopCaptureRetried in the payload). You can also call focus_window then retry get_screenshots with desktop_window.doctor --json --target --timeout-ms 10000.--output-dir is set, validate-runtime mirrors its JSON envelope to /validate-runtime.json and screenshot files are written under /.mcp_screenshots/.validate-runtime tries host desktop_window first when auto selects it. Executor recovery retries focus+capture once (desktopCaptureRetried). If desktop_window still fails, validate-runtime retries once with flutter_layer (including when platform views are detected, e.g. the showcase AppKitView). Check data.summary.capturePlatformViewsDetected, captureFocusAttempted, and captureFallbackUsed. Web headful capture options: ADR 0007.doctor stays read-only. It now reports visual_capture_backend, visual_capture_permission, visual_capture_truth_mode, and app_permission_bridge.auto_request_once for exec get_screenshots, exec capture_ui_snapshot, and validate-runtime. Raw command schemas still default to check_only.desktop_window (including iOS Simulator and Chrome / web on a Mac host). Screen Recording permission belongs to the host process running flutter-mcp-toolkit, not the Flutter app. Use permissions request for the native prompt and permissions open-settings after a denial.get_view_details and view_screenshots include captureHints when native platform views are detected (AndroidView, UiKitView, AppKitView, HtmlElementView, PlatformViewLink). Texture sets weakSignalsDetected with a soft warning (no auto upgrade). Hybrid engines without platform views can use MCPToolkitBinding.captureHintsContributor in the app.get_screenshots MCP responses include routing metadata in meta and a leading JSON text block when captureHints / warnings are present.AppKitView on macOS (make showcase), HtmlElementView on web (flutter run -d chrome). Use make showcase-stop before a new macOS run.chrome / web / web-server): desktop_window uses macOS ScreenCaptureKit → Chrome CDP (Page.captureScreenshot) → flutter_layer. Global flags: --web-browser-debugging-port, --web-port. Opt-in live test: RUN_WEB_CDP_INTEGRATION=1 dart test test/web_cdp_integration_test.dart. See ADR 0007.permissions or doctor can verify bridge-backed permission tools/resources. Use --target or the global --vm-service-uri when probing those platforms.desktop_window never silently falls back. auto may fall back to flutter_layer, but responses always report requestedMode, actualMode, permissionStatus, and fallbackReason.Troubleshooting:
flutter-mcp-toolkit permissions status first. If status is still denied, open System Settings from the CLI and grant Screen Recording to the terminal or client process you are using.doctor --json shows visual_capture_truth_mode=flutter_layer on macOS, you are not getting native window pOnly the beginning is shown; read the rest in the repo