@bdayadev/flutter-ultra-mcp 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@
10
10
  {
11
11
  "name": "flutter",
12
12
  "description": "Durable cross-platform Flutter automation via 8 specialized MCP servers, in-app mixin binding, and an optional DevTools panel. Replaces marionette_mcp and the official dart mcp-server for Claude Code.",
13
- "version": "1.8.0",
13
+ "version": "1.9.0",
14
14
  "author": {
15
15
  "name": "Bdaya-Dev",
16
16
  "url": "https://github.com/Bdaya-Dev"
@@ -23,5 +23,5 @@
23
23
  "tags": ["flutter", "dart", "mcp", "testing", "automation", "patrol", "cross-platform"]
24
24
  }
25
25
  ],
26
- "version": "1.8.0"
26
+ "version": "1.9.0"
27
27
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "flutter",
4
- "version": "1.8.0",
4
+ "version": "1.9.0",
5
5
  "description": "Durable cross-platform Flutter automation via 8 specialized MCP servers, in-app mixin binding, and an optional DevTools panel. Replaces marionette_mcp and the official dart mcp-server for Claude Code.",
6
6
  "author": {
7
7
  "name": "Bdaya-Dev",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bdayadev/flutter-ultra-mcp",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "description": "Flutter Ultra MCP plugin monorepo — 8 MCP servers + ultra_flutter Dart packages + skills for Claude Code.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/Bdaya-Dev/flutter-ultra-mcp",
@@ -0,0 +1,190 @@
1
+ ---
2
+ name: flutter-design-audit
3
+ description: Audit the live Flutter app for design quality issues across accessibility, layout, and design-system conformance. Runs 10 checks (touch targets, semantics, text overflow, layout overflow, hardcoded colors, hardcoded text styles, inconsistent spacing, nested cards, over-centering, tiny text), extracts theme tokens, and tests at 4 responsive breakpoints. Produces a scored markdown report with per-issue fix suggestions.
4
+ ---
5
+
6
+ # Flutter Design Audit
7
+
8
+ Collect live design evidence from the running app before writing any recommendations. All tools are read-only and safe to run without side effects.
9
+
10
+ ## Workflow
11
+
12
+ ### 1. Attach to the session
13
+
14
+ - `mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions` — find active sessions.
15
+ - `mcp__plugin_flutter_flutter-ultra-runtime__attach` with the matching sessionId.
16
+
17
+ ### 2. Capture baseline screenshot
18
+
19
+ - `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — visual snapshot before audit begins.
20
+
21
+ ### 3. Run full design audit
22
+
23
+ Run the three audit tools in sequence. Each tool is independent and can be called separately.
24
+
25
+ #### 3a. Run all design checks
26
+
27
+ ```
28
+ mcp__plugin_flutter_flutter-ultra-runtime__audit_design
29
+ sessionId: <id>
30
+ # checks defaults to all 10 — omit for full audit
31
+ ```
32
+
33
+ Checks performed:
34
+
35
+ | Check | Severity | What it detects |
36
+ | ---------------------- | -------- | --------------------------------------------- |
37
+ | `touch_targets` | error | Tappable widgets < 48×48 dp (WCAG 2.5.5) |
38
+ | `missing_semantics` | warning | Interactive widgets without a Semantics label |
39
+ | `text_overflow` | warning | Text widgets clipping or showing ellipsis |
40
+ | `layout_overflow` | error | RenderFlex / RenderBox overflow |
41
+ | `hardcoded_color` | info | Colors not from colorScheme |
42
+ | `hardcoded_text_style` | info | TextStyle with raw fontSize/color |
43
+ | `inconsistent_spacing` | info | Padding values not on a 4 dp grid |
44
+ | `nested_cards` | warning | Card inside Card (doubled elevation) |
45
+ | `everything_centered` | info | >80% of Text nodes use TextAlign.center |
46
+ | `tiny_text` | warning | Text with fontSize < 12 dp |
47
+
48
+ Scores returned: `accessibility` (0–100), `layout` (0–100), `designSystem` (0–100).
49
+
50
+ #### 3b. Extract design tokens
51
+
52
+ ```
53
+ mcp__plugin_flutter_flutter-ultra-runtime__extract_design_tokens
54
+ sessionId: <id>
55
+ ```
56
+
57
+ Returns:
58
+
59
+ - `colorScheme` — all Material 3 color roles as hex strings.
60
+ - `textTheme` — fontSize for each text style (displayLarge → labelSmall).
61
+ - `brightness` — `light` or `dark`.
62
+ - `violations` — list of token reads that failed (evaluate unavailable).
63
+
64
+ #### 3c. Responsive audit at 4 breakpoints
65
+
66
+ ```
67
+ mcp__plugin_flutter_flutter-ultra-runtime__audit_responsive
68
+ sessionId: <id>
69
+ # viewports defaults to compact/medium/expanded/large
70
+ ```
71
+
72
+ Default viewports:
73
+
74
+ | Label | Size |
75
+ | -------- | -------- |
76
+ | compact | 375×667 |
77
+ | medium | 768×1024 |
78
+ | expanded | 1200×800 |
79
+ | large | 1440×900 |
80
+
81
+ Returns per-viewport issue counts and `crossViewportIssues` identifying regressions across breakpoints.
82
+
83
+ Note: viewport resizing requires a web or desktop debug build. On mobile/release builds, results reflect the current native window size.
84
+
85
+ ### 4. Capture per-viewport screenshots (optional)
86
+
87
+ If the responsive audit shows regressions, take a screenshot at each problematic viewport to document the issue:
88
+
89
+ ```
90
+ mcp__plugin_flutter_flutter-ultra-runtime__screenshot
91
+ sessionId: <id>
92
+ width: 375
93
+ height: 667
94
+ ```
95
+
96
+ ### 5. Deeper investigation for specific issues
97
+
98
+ #### Touch target failures
99
+
100
+ 1. `mcp__plugin_flutter_flutter-ultra-runtime__find_widget` with `finder: { type: 'InkWell' }` to locate all tappable areas.
101
+ 2. `mcp__plugin_flutter_flutter-ultra-runtime__get_widget_details` on the failing widget to confirm its bounds.
102
+ 3. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_debug_paint` to visualise hit-test areas.
103
+
104
+ #### Layout overflow
105
+
106
+ 1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_render_tree` — search for `OVERFLOWED`.
107
+ 2. `mcp__plugin_flutter_flutter-ultra-runtime__toggle_debug_paint` to show overflow markers.
108
+ 3. `mcp__plugin_flutter_flutter-ultra-runtime__screenshot` — capture the debug paint view.
109
+
110
+ #### Semantics gaps
111
+
112
+ 1. `mcp__plugin_flutter_flutter-ultra-runtime__dump_semantics_tree` — find nodes without labels.
113
+ 2. On mobile: `mcp__plugin_flutter_flutter-ultra-native-mobile__dump_a11y_tree` for the OS-level accessibility tree.
114
+
115
+ #### Hardcoded colors / text styles
116
+
117
+ 1. `mcp__plugin_flutter_flutter-ultra-runtime__evaluate` to inspect a specific widget's style:
118
+ ```dart
119
+ // Example: read the actual color of a Text widget's style
120
+ (context.findRenderObject() as RenderParagraph).text.style?.color?.value.toRadixString(16)
121
+ ```
122
+ 2. Compare against `extract_design_tokens` output to identify deviations.
123
+
124
+ ## Output format
125
+
126
+ Produce a markdown report with the following sections:
127
+
128
+ ### Design Audit Report
129
+
130
+ **App:** `<sessionId>`
131
+ **Date:** `<today>`
132
+ **Scores:** Accessibility: X/100 | Layout: Y/100 | Design System: Z/100
133
+
134
+ #### Issues (N total — E errors, W warnings, I info)
135
+
136
+ | Severity | Rule | Widget | Issue | Suggestion |
137
+ | -------- | ------------- | ---------- | ------------------------------ | ------------------------ |
138
+ | error | touch_targets | IconButton | 32×32 dp — below 48 dp minimum | Wrap in SizedBox(48, 48) |
139
+ | ... | | | | |
140
+
141
+ #### Design Tokens
142
+
143
+ **Color Scheme (brightness: light)**
144
+
145
+ | Role | Hex |
146
+ | ------- | ------- |
147
+ | primary | #006590 |
148
+ | ... | |
149
+
150
+ **Text Theme**
151
+
152
+ | Style | Size |
153
+ | ------------ | ----- |
154
+ | displayLarge | 57 dp |
155
+ | ... | |
156
+
157
+ #### Responsive Analysis
158
+
159
+ | Viewport | Size | Issues |
160
+ | -------- | -------- | ------ |
161
+ | compact | 375×667 | 3 |
162
+ | medium | 768×1024 | 2 |
163
+ | ... | | |
164
+
165
+ **Cross-viewport regressions:** `<crossViewportIssues list or "None">`
166
+
167
+ #### Screenshots
168
+
169
+ - Baseline: `<path>`
170
+ - compact viewport: `<path if captured>`
171
+
172
+ ## Common fix patterns
173
+
174
+ | Issue | Fix |
175
+ | ---------------------- | ------------------------------------------------------------------------------------------- |
176
+ | Touch target too small | `SizedBox(width: 48, height: 48, child: icon)` or `IconButton(padding: EdgeInsets.all(12))` |
177
+ | Missing semantics | `Semantics(label: 'Close dialog', child: icon)` |
178
+ | Text overflow | `Text(str, maxLines: 2, overflow: TextOverflow.ellipsis)` inside `Flexible` |
179
+ | Layout overflow | Replace `Row` with `Wrap`, or add `Flexible`/`Expanded` to children |
180
+ | Hardcoded color | Replace `Color(0xFF006590)` with `Theme.of(context).colorScheme.primary` |
181
+ | Hardcoded TextStyle | Replace `TextStyle(fontSize: 16)` with `Theme.of(context).textTheme.bodyLarge` |
182
+ | Nested Cards | Replace inner `Card` with `Container` + `decoration: BoxDecoration(borderRadius: ...)` |
183
+ | Over-centering | Use `TextAlign.start` for body copy; reserve `center` for headings |
184
+ | Tiny text | Increase to ≥ 12 dp, or use `textTheme.labelSmall` (14 dp minimum by M3 spec) |
185
+ | Inconsistent spacing | Use `const EdgeInsets.all(8)` / `16` / `24` — multiples of 4 |
186
+
187
+ ## See also
188
+
189
+ - `flutter-debug` — triage runtime exceptions and layout overflows in detail
190
+ - `flutter-tour` — navigate the app to audit each screen systematically
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: flutter-design-verify
3
+ description: Compare a running Flutter app against Figma mockups. Captures screenshots at multiple viewports, extracts theme tokens and component inventory, then uses Claude vision to identify design-implementation drift between the live app and Figma frames.
4
+ ---
5
+
6
+ # Flutter Design Verify
7
+
8
+ Compare a live Flutter app against Figma designs. Collect evidence from both sources, then produce a side-by-side report identifying drift.
9
+
10
+ ## Prerequisites
11
+
12
+ - Flutter app is running in debug mode (web or desktop for viewport resizing).
13
+ - Figma MCP plugin is installed and authenticated (`mcp__plugin_figma_figma__authenticate`).
14
+ - User has the Figma file URL containing the design frames.
15
+
16
+ ## Workflow
17
+
18
+ ### 1. Attach to the running Flutter session
19
+
20
+ ```
21
+ mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
22
+ ```
23
+
24
+ Pick the matching session, then:
25
+
26
+ ```
27
+ mcp__plugin_flutter_flutter-ultra-runtime__attach
28
+ sessionId: <id>
29
+ ```
30
+
31
+ ### 2. Capture Flutter screenshots
32
+
33
+ Capture the current screen, then navigate to each route and repeat:
34
+
35
+ ```
36
+ mcp__plugin_flutter_flutter-ultra-runtime__screenshot
37
+ sessionId: <id>
38
+ width: 375
39
+ height: 667
40
+ ```
41
+
42
+ Capture at relevant viewports (compact 375×667, medium 768×1024, expanded 1200×800) using `audit_responsive` as a guide for which breakpoints show regressions.
43
+
44
+ ### 3. Extract Flutter design tokens
45
+
46
+ ```
47
+ mcp__plugin_flutter_flutter-ultra-runtime__extract_design_tokens
48
+ sessionId: <id>
49
+ ```
50
+
51
+ Returns `colorScheme`, `textTheme`, and `brightness`. These become the Flutter side of the token diff.
52
+
53
+ ### 4. Extract component inventory
54
+
55
+ ```
56
+ mcp__plugin_flutter_flutter-ultra-runtime__extract_component_inventory
57
+ sessionId: <id>
58
+ ```
59
+
60
+ Returns per-type widget counts grouped by category (input / container / display / layout / navigation). Use this to map Flutter components to Figma component usage.
61
+
62
+ ### 5. Run design audit (optional but recommended)
63
+
64
+ ```
65
+ mcp__plugin_flutter_flutter-ultra-runtime__audit_design
66
+ sessionId: <id>
67
+ ```
68
+
69
+ Pre-flight check — surface existing issues before comparing against Figma.
70
+
71
+ ```
72
+ mcp__plugin_flutter_flutter-ultra-runtime__audit_responsive
73
+ sessionId: <id>
74
+ ```
75
+
76
+ Identify which viewports have the most drift so Figma frame selection can match.
77
+
78
+ ### 6. Retrieve Figma designs
79
+
80
+ Ask the user for the Figma file URL if not already provided.
81
+
82
+ #### 6a. Get Figma frame screenshots
83
+
84
+ ```
85
+ mcp__plugin_figma_figma__get_screenshot
86
+ url: <figma-frame-url>
87
+ ```
88
+
89
+ Capture one screenshot per screen / frame that corresponds to the Flutter routes captured in step 2. Match by route name or frame title.
90
+
91
+ #### 6b. Get Figma design tokens (variables)
92
+
93
+ ```
94
+ mcp__plugin_figma_figma__get_variable_defs
95
+ url: <figma-file-url>
96
+ ```
97
+
98
+ Returns color, typography, spacing, and radius variables. These become the Figma side of the token diff.
99
+
100
+ ### 7. Vision comparison
101
+
102
+ Present each Flutter screenshot alongside its matching Figma frame to Claude for visual analysis. For each pair, identify:
103
+
104
+ - **Color drift** — buttons, backgrounds, text colors that differ.
105
+ - **Typography drift** — font sizes, weights, line heights that differ.
106
+ - **Spacing drift** — padding, gap, margin inconsistencies.
107
+ - **Missing components** — UI elements present in Figma but absent in Flutter.
108
+ - **Extra components** — UI elements in Flutter not in Figma (scope creep).
109
+ - **Layout drift** — column/row arrangements, alignment, wrapping differences.
110
+
111
+ ### 8. Token diff
112
+
113
+ Compare `extract_design_tokens` output against `get_variable_defs` output:
114
+
115
+ | Token | Flutter value | Figma value | Match? |
116
+ | ------------------- | ------------- | ----------- | ------ |
117
+ | primary color | #006590 | #006591 | NO |
118
+ | bodyMedium fontSize | 14 dp | 14 sp | YES |
119
+ | ... | | | |
120
+
121
+ Flag every mismatch as a drift item with severity:
122
+
123
+ - **error** — value differs by more than 10% or is a completely different hue.
124
+ - **warning** — value differs by ≤ 10% (rounding or unit conversion).
125
+ - **info** — token present in Flutter but missing from Figma variables, or vice versa.
126
+
127
+ ### 9. Component mapping
128
+
129
+ Cross-reference `extract_component_inventory` output against Figma component usage:
130
+
131
+ - List Flutter components with no Figma counterpart.
132
+ - List Figma components with no Flutter counterpart.
133
+ - Flag count mismatches (e.g., Flutter has 14 ElevatedButton instances, Figma frame shows 2).
134
+
135
+ ## Output format
136
+
137
+ Produce a markdown report:
138
+
139
+ ### Design Verification Report
140
+
141
+ **Flutter session:** `<sessionId>`
142
+ **Figma file:** `<url>`
143
+ **Date:** `<today>`
144
+
145
+ #### Visual Comparison
146
+
147
+ For each Flutter route ↔ Figma frame pair:
148
+
149
+ | Screen | Flutter screenshot | Figma frame | Drift items |
150
+ | ------ | ------------------ | ----------- | ----------- |
151
+ | /home | (image) | (image) | 3 errors |
152
+
153
+ #### Token Diff Table
154
+
155
+ | Token | Flutter | Figma | Status |
156
+ | ------- | ------- | ------- | ------- |
157
+ | primary | #006590 | #006591 | warning |
158
+
159
+ #### Component Mapping
160
+
161
+ | Type | Flutter count | In Figma? | Notes |
162
+ | -------------- | ------------- | --------- | ----------------------- |
163
+ | ElevatedButton | 14 | yes | Figma shows 2 per frame |
164
+
165
+ #### Summary
166
+
167
+ - Total drift items: N (E errors, W warnings, I info)
168
+ - Token mismatches: N
169
+ - Missing Figma components in Flutter: N
170
+ - Recommendation: list top 3 highest-impact fixes
171
+
172
+ ## See also
173
+
174
+ - `flutter-design-audit` — standalone Flutter design quality audit without Figma
175
+ - `flutter-figma-push` — push Flutter web screenshots to Figma as editable frames
176
+ - `flutter-tour` — navigate all routes for comprehensive per-screen capture
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: flutter-figma-push
3
+ description: Push Flutter web app UI to Figma as editable layers. Navigates to each route, captures the browser view, and uses the Figma MCP to create editable Figma frames from the live app screenshots.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Flutter Figma Push
8
+
9
+ Push screenshots of a running Flutter web app into Figma as editable frames. Web only — requires a browser-accessible Flutter app.
10
+
11
+ ## Prerequisites
12
+
13
+ - Flutter web app is running and accessible via a browser URL.
14
+ - Figma MCP plugin is installed and authenticated.
15
+ - User has an existing Figma file URL to push frames into (or a new file will be created).
16
+
17
+ ## Workflow
18
+
19
+ ### 1. Confirm the app is running
20
+
21
+ ```
22
+ mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
23
+ ```
24
+
25
+ If no session is found, ask the user for the browser URL of the Flutter web app directly.
26
+
27
+ ### 2. Connect the browser
28
+
29
+ ```
30
+ mcp__plugin_flutter_flutter-ultra-browser__launch_browser
31
+ ```
32
+
33
+ Then navigate to the Flutter web app URL:
34
+
35
+ ```
36
+ mcp__plugin_flutter_flutter-ultra-browser__navigate
37
+ url: <flutter-web-app-url>
38
+ ```
39
+
40
+ If the app is already open in a browser, connect over CDP instead:
41
+
42
+ ```
43
+ mcp__plugin_flutter_flutter-ultra-browser__connect_over_cdp
44
+ wsEndpoint: <devtools-ws-url>
45
+ ```
46
+
47
+ ### 3. Collect the route list
48
+
49
+ Ask the user for the list of routes to capture, or infer from the app's navigation structure via:
50
+
51
+ ```
52
+ mcp__plugin_flutter_flutter-ultra-runtime__find_widget
53
+ sessionId: <id>
54
+ finder: { type: 'Navigator' }
55
+ ```
56
+
57
+ Typical routes to capture: `/`, `/home`, `/profile`, `/settings`, and any primary feature screens.
58
+
59
+ ### 4. For each route — capture and push
60
+
61
+ Repeat this sequence for every route:
62
+
63
+ #### 4a. Navigate
64
+
65
+ ```
66
+ mcp__plugin_flutter_flutter-ultra-browser__navigate
67
+ url: <flutter-web-app-url>/<route>
68
+ ```
69
+
70
+ #### 4b. Wait for Flutter render to settle
71
+
72
+ ```
73
+ mcp__plugin_flutter_flutter-ultra-browser__wait_for_url
74
+ url: <expected-url>
75
+ ```
76
+
77
+ Allow 1–2 seconds for animations to complete. Check console for any errors:
78
+
79
+ ```
80
+ mcp__plugin_flutter_flutter-ultra-browser__console_logs
81
+ ```
82
+
83
+ #### 4c. Take a browser screenshot
84
+
85
+ ```
86
+ mcp__plugin_flutter_flutter-ultra-browser__screenshot
87
+ ```
88
+
89
+ This captures the full browser viewport as rendered by the Flutter web engine.
90
+
91
+ #### 4d. Push to Figma
92
+
93
+ ```
94
+ mcp__plugin_figma_figma__generate_figma_design
95
+ url: <figma-file-url>
96
+ imageData: <screenshot-data>
97
+ frameName: <route-name>
98
+ ```
99
+
100
+ The Figma MCP creates an editable frame from the screenshot. The frame name should match the route (e.g., `Flutter / home`, `Flutter / settings`).
101
+
102
+ ### 5. Capture at multiple viewports (optional)
103
+
104
+ For responsive design, repeat step 4 at each breakpoint by resizing the browser viewport via JavaScript:
105
+
106
+ ```
107
+ mcp__plugin_flutter_flutter-ultra-browser__evaluate_js
108
+ expression: "window.resizeTo(375, 667)"
109
+ ```
110
+
111
+ Then re-navigate and push with a viewport-suffixed frame name (e.g., `Flutter / home / compact`).
112
+
113
+ Standard breakpoints: compact (375×667), medium (768×1024), expanded (1200×800).
114
+
115
+ ### 6. Report
116
+
117
+ After all routes are pushed, produce a summary:
118
+
119
+ ```
120
+ ## Figma Push Complete
121
+
122
+ | Route | Viewport | Figma frame | Status |
123
+ | ----- | -------- | ----------- | ------ |
124
+ | /home | 375×667 | Flutter / home / compact | created |
125
+ | /home | 1200×800 | Flutter / home / expanded | created |
126
+ | ... | | | |
127
+
128
+ Figma file: <url>
129
+ Total frames created: N
130
+ ```
131
+
132
+ Include the Figma file URL so the user can open it directly.
133
+
134
+ ## Notes
135
+
136
+ - This skill is web-only. Mobile screenshots require `mcp__plugin_flutter_flutter-ultra-native-mobile__take_device_screenshot` and cannot be pushed directly to Figma via the browser path.
137
+ - CanvasKit (default Flutter web renderer) renders to a `<canvas>` element — the browser screenshot captures the correct visual output.
138
+ - If `generate_figma_design` is unavailable, fall back to `mcp__plugin_figma_figma__use_figma` to upload the screenshot as an image asset.
139
+
140
+ ## See also
141
+
142
+ - `flutter-design-verify` — compare Flutter screenshots against existing Figma frames for drift detection
143
+ - `flutter-design-audit` — run design quality checks on the live Flutter app
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: record-demo
3
+ description: Records a video or GIF demo of a Flutter app flow. Detects platform (web browser or native device), starts recording, drives the UI interaction, stops recording, then converts to the requested format (MP4, WebM, or GIF). Use when the user asks to record a demo, capture a flow as video, or produce an animated GIF of app behavior.
4
+ ---
5
+
6
+ # Record Demo
7
+
8
+ Orchestrates platform detection → start recording → drive flow → stop recording → convert format.
9
+
10
+ ## Workflow
11
+
12
+ ### 1. Detect platform
13
+
14
+ Determine recording method based on the running target:
15
+
16
+ - **Web** — use `mcp__plugin_flutter_flutter-ultra-browser__new_context` with `recordVideo.dir` set to a local output directory. Playwright records all pages automatically; video is saved on `mcp__plugin_flutter_flutter-ultra-browser__close_context`.
17
+ - **Android device** — use `mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording` with an `outputPath` ending in `.mp4`.
18
+ - **iOS Simulator** — use `mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording` with an `outputPath` ending in `.mp4`.
19
+
20
+ Discover running sessions first:
21
+
22
+ ```
23
+ mcp__plugin_flutter_flutter-ultra-runtime__discover_sessions
24
+ ```
25
+
26
+ Check `device.kind` in the response: `'web'` → browser path, `'android'` / `'ios-sim'` → native path.
27
+
28
+ ### 2. Start recording
29
+
30
+ #### Web (Playwright recordVideo)
31
+
32
+ ```
33
+ mcp__plugin_flutter_flutter-ultra-browser__new_context
34
+ browserId: <id>
35
+ recordVideo:
36
+ dir: /tmp/flutter-demo-recordings
37
+ size: # optional — omit to use viewport size
38
+ width: 1280
39
+ height: 800
40
+ ```
41
+
42
+ Returns `contextId` and `recordingDir`. Then open a tab and navigate to the app URL.
43
+
44
+ #### Native device (Android / iOS)
45
+
46
+ ```
47
+ mcp__plugin_flutter_flutter-ultra-native-mobile__start_device_recording
48
+ deviceId: <udid>
49
+ outputPath: /tmp/flutter-demo.mp4
50
+ maxDurationSec: 60
51
+ ```
52
+
53
+ Returns `recordingId`. Keep it for the stop call.
54
+
55
+ ### 3. Drive the UI flow
56
+
57
+ Use the appropriate tools to exercise the flow being recorded:
58
+
59
+ - **Runtime** — `mcp__plugin_flutter_flutter-ultra-runtime__hot_reload`, `mcp__plugin_flutter_flutter-ultra-runtime__evaluate`, `mcp__plugin_flutter_flutter-ultra-runtime__find_widget`
60
+ - **Browser** — `mcp__plugin_flutter_flutter-ultra-browser__click`, `mcp__plugin_flutter_flutter-ultra-browser__fill`, `mcp__plugin_flutter_flutter-ultra-browser__navigate`
61
+ - **Native** — `mcp__plugin_flutter_flutter-ultra-native-mobile__native_tap`, `mcp__plugin_flutter_flutter-ultra-native-mobile__native_type`, `mcp__plugin_flutter_flutter-ultra-native-mobile__native_swipe`
62
+
63
+ For responsive demos, resize the viewport between key interactions:
64
+
65
+ - Mobile: 390×844
66
+ - Tablet: 768×1024
67
+ - Desktop: 1440×900
68
+
69
+ Take screenshots at key moments for verification alongside the recording.
70
+
71
+ ### 4. Stop recording
72
+
73
+ #### Web
74
+
75
+ ```
76
+ mcp__plugin_flutter_flutter-ultra-browser__close_context
77
+ contextId: <id>
78
+ ```
79
+
80
+ Returns `videoPath` — the `.webm` file Playwright wrote to `recordingDir`.
81
+
82
+ #### Native device
83
+
84
+ ```
85
+ mcp__plugin_flutter_flutter-ultra-native-mobile__stop_device_recording
86
+ recordingId: <id>
87
+ ```
88
+
89
+ Returns `path` and `durationMs`.
90
+
91
+ ### 5. Convert to target format
92
+
93
+ Use `mcp__plugin_flutter_flutter-ultra-build__convert_recording` to convert to the user's desired format:
94
+
95
+ #### High-quality GIF (for sharing in docs / GitHub)
96
+
97
+ ```
98
+ mcp__plugin_flutter_flutter-ultra-build__convert_recording
99
+ inputPath: /tmp/flutter-demo.mp4
100
+ outputPath: /tmp/flutter-demo.gif
101
+ outputFormat: gif
102
+ maxWidth: 800
103
+ fps: 12
104
+ ```
105
+
106
+ #### Compressed MP4 (for embedding in web pages)
107
+
108
+ ```
109
+ mcp__plugin_flutter_flutter-ultra-build__convert_recording
110
+ inputPath: /tmp/flutter-demo.webm
111
+ outputPath: /tmp/flutter-demo.mp4
112
+ outputFormat: mp4
113
+ maxWidth: 1280
114
+ quality: 23
115
+ ```
116
+
117
+ #### WebM (smallest size, web-native)
118
+
119
+ ```
120
+ mcp__plugin_flutter_flutter-ultra-build__convert_recording
121
+ inputPath: /tmp/flutter-demo.mp4
122
+ outputPath: /tmp/flutter-demo.webm
123
+ outputFormat: webm
124
+ quality: 30
125
+ ```
126
+
127
+ ### 6. Report result
128
+
129
+ Return the output file path, size in bytes, and format. Suggest next steps:
130
+
131
+ - Embed GIF in README with `![demo](./flutter-demo.gif)`
132
+ - Upload MP4 as a GitHub release asset
133
+ - Use WebM in `<video>` tags on web landing pages
134
+
135
+ ## Notes
136
+
137
+ - ffmpeg must be installed for `convert_recording`. If not found, the tool returns a clear installation hint.
138
+ - Android `screenrecord` has a 180-second hard limit. For longer demos, restart recording in segments.
139
+ - iOS Simulator recording requires macOS with Xcode installed.
140
+ - Playwright writes `.webm` by default; pass it directly to `convert_recording` for format changes.
141
+ - For CanvasKit Flutter web, ensure semantics are enabled before driving UI with browser tools.