@bdayadev/flutter-ultra-mcp 0.0.0 → 1.0.1
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.
- package/.claude-plugin/marketplace.json +35 -0
- package/.claude-plugin/plugin.json +14 -14
- package/.mcp.json +67 -67
- package/CODE_OF_CONDUCT.md +83 -83
- package/CONTRIBUTING.md +108 -108
- package/LICENSE +201 -201
- package/README.md +77 -77
- package/SECURITY.md +19 -19
- package/dart/ultra_flutter/CHANGELOG.md +34 -34
- package/dart/ultra_flutter/EXTENSIONS.md +61 -61
- package/dart/ultra_flutter/README.md +109 -109
- package/dart/ultra_flutter/pubspec.yaml +37 -37
- package/dart/ultra_flutter_devtools/README.md +7 -7
- package/dart/ultra_flutter_devtools/pubspec.yaml +27 -27
- package/docs/UPSTREAM-PATROL-PRS.md +5 -5
- package/docs/UPSTREAM-SENTRY-PR.md +62 -62
- package/docs/discovery-empirics.md +435 -435
- package/examples/counter-app/README.md +24 -24
- package/examples/counter-app/pubspec.yaml +23 -23
- package/examples/oidc-app/README.md +48 -48
- package/examples/oidc-app/pubspec.yaml +24 -24
- package/package.json +82 -82
- package/packages/flutter-ultra-browser/README.md +29 -29
- package/packages/flutter-ultra-browser/package.json +39 -39
- package/packages/flutter-ultra-build/README.md +60 -60
- package/packages/flutter-ultra-build/package.json +38 -38
- package/packages/flutter-ultra-devtools/README.md +7 -7
- package/packages/flutter-ultra-devtools/package.json +36 -36
- package/packages/flutter-ultra-gesture/README.md +51 -51
- package/packages/flutter-ultra-gesture/package.json +58 -58
- package/packages/flutter-ultra-native-desktop/README.md +131 -131
- package/packages/flutter-ultra-native-desktop/package.json +81 -81
- package/packages/flutter-ultra-native-mobile/README.md +103 -103
- package/packages/flutter-ultra-native-mobile/package.json +72 -72
- package/packages/flutter-ultra-patrol/README.md +40 -40
- package/packages/flutter-ultra-patrol/package.json +38 -38
- package/packages/flutter-ultra-runtime/README.md +63 -63
- package/packages/flutter-ultra-runtime/package.json +69 -69
- package/shared/contracts/package.json +31 -31
- package/shared/device-router/README.md +51 -51
- package/shared/device-router/package.json +62 -62
- package/shared/keyring/README.md +7 -7
- package/shared/keyring/package.json +24 -24
- package/shared/mcp-runtime/README.md +116 -116
- package/shared/mcp-runtime/package.json +58 -58
- package/shared/state-store/README.md +66 -66
- package/shared/state-store/package.json +60 -60
- package/shared/vm-service-client/README.md +135 -135
- package/shared/vm-service-client/package.json +62 -62
- package/skills/_internal-on-tool-failure/SKILL.md +13 -13
- package/skills/_internal-session-bootstrap/SKILL.md +18 -18
- package/skills/debug/SKILL.md +20 -20
- package/skills/devtools/SKILL.md +21 -21
- package/skills/drive/SKILL.md +20 -20
- package/skills/scaffold/SKILL.md +21 -21
- package/skills/setup/SKILL.md +26 -26
- package/skills/test/SKILL.md +19 -19
- package/skills/tour/SKILL.md +22 -22
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
# Counter App
|
|
2
|
-
|
|
3
|
-
Minimal Flutter counter demonstrating `ultra_flutter` binding integration.
|
|
4
|
-
|
|
5
|
-
Used as the primary E2E test fixture for the flutter-ultra-mcp plugin — all
|
|
6
|
-
platform-specific CI workflows drive this app to verify gesture, runtime, and
|
|
7
|
-
native automation servers.
|
|
8
|
-
|
|
9
|
-
## Running
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
flutter run -d chrome
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
In debug mode the `UltraFlutterBinding` is automatically initialized, exposing
|
|
16
|
-
`ext.flutter.ultra.*` VM service extensions that the MCP servers connect to.
|
|
17
|
-
|
|
18
|
-
## Widget Keys
|
|
19
|
-
|
|
20
|
-
| Key | Widget | Purpose |
|
|
21
|
-
|-----|--------|---------|
|
|
22
|
-
| `counter_value` | Text | Displays current count |
|
|
23
|
-
| `increment` | FAB | Increments counter |
|
|
24
|
-
| `decrement` | FAB | Decrements counter |
|
|
1
|
+
# Counter App
|
|
2
|
+
|
|
3
|
+
Minimal Flutter counter demonstrating `ultra_flutter` binding integration.
|
|
4
|
+
|
|
5
|
+
Used as the primary E2E test fixture for the flutter-ultra-mcp plugin — all
|
|
6
|
+
platform-specific CI workflows drive this app to verify gesture, runtime, and
|
|
7
|
+
native automation servers.
|
|
8
|
+
|
|
9
|
+
## Running
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
flutter run -d chrome
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
In debug mode the `UltraFlutterBinding` is automatically initialized, exposing
|
|
16
|
+
`ext.flutter.ultra.*` VM service extensions that the MCP servers connect to.
|
|
17
|
+
|
|
18
|
+
## Widget Keys
|
|
19
|
+
|
|
20
|
+
| Key | Widget | Purpose |
|
|
21
|
+
|-----|--------|---------|
|
|
22
|
+
| `counter_value` | Text | Displays current count |
|
|
23
|
+
| `increment` | FAB | Increments counter |
|
|
24
|
+
| `decrement` | FAB | Decrements counter |
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
name: counter_app
|
|
2
|
-
description: Minimal counter app demonstrating ultra_flutter binding for MCP-driven E2E testing.
|
|
3
|
-
publish_to: none
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
|
|
6
|
-
resolution: workspace
|
|
7
|
-
|
|
8
|
-
environment:
|
|
9
|
-
sdk: '>=3.6.0 <4.0.0'
|
|
10
|
-
flutter: '>=3.27.0'
|
|
11
|
-
|
|
12
|
-
dependencies:
|
|
13
|
-
flutter:
|
|
14
|
-
sdk: flutter
|
|
15
|
-
ultra_flutter:
|
|
16
|
-
path: ../../dart/ultra_flutter
|
|
17
|
-
|
|
18
|
-
dev_dependencies:
|
|
19
|
-
flutter_test:
|
|
20
|
-
sdk: flutter
|
|
21
|
-
|
|
22
|
-
flutter:
|
|
23
|
-
uses-material-design: true
|
|
1
|
+
name: counter_app
|
|
2
|
+
description: Minimal counter app demonstrating ultra_flutter binding for MCP-driven E2E testing.
|
|
3
|
+
publish_to: none
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
|
|
6
|
+
resolution: workspace
|
|
7
|
+
|
|
8
|
+
environment:
|
|
9
|
+
sdk: '>=3.6.0 <4.0.0'
|
|
10
|
+
flutter: '>=3.27.0'
|
|
11
|
+
|
|
12
|
+
dependencies:
|
|
13
|
+
flutter:
|
|
14
|
+
sdk: flutter
|
|
15
|
+
ultra_flutter:
|
|
16
|
+
path: ../../dart/ultra_flutter
|
|
17
|
+
|
|
18
|
+
dev_dependencies:
|
|
19
|
+
flutter_test:
|
|
20
|
+
sdk: flutter
|
|
21
|
+
|
|
22
|
+
flutter:
|
|
23
|
+
uses-material-design: true
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# OIDC App
|
|
2
|
-
|
|
3
|
-
Flutter example demonstrating OIDC PKCE authorization code flow with a mock
|
|
4
|
-
identity provider, used to verify the flutter-ultra-browser MCP server's OAuth
|
|
5
|
-
interception and CCT (Custom Chrome Tab) OAuth solver on mobile.
|
|
6
|
-
|
|
7
|
-
## Architecture
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
[Flutter App] --launch--> [Browser: /authorize]
|
|
11
|
-
|
|
|
12
|
-
[Mock OIDC Server]
|
|
13
|
-
|
|
|
14
|
-
[302 → localhost:9981/callback]
|
|
15
|
-
|
|
|
16
|
-
[Flutter App] <--code----- [Local HTTP server]
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Running
|
|
20
|
-
|
|
21
|
-
1. Start the mock OIDC server:
|
|
22
|
-
```bash
|
|
23
|
-
dart run lib/mock_oidc_server.dart
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
2. Run the Flutter app:
|
|
27
|
-
```bash
|
|
28
|
-
flutter run -d chrome
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
3. Click "Login with OIDC" — the browser server intercepts the redirect.
|
|
32
|
-
|
|
33
|
-
## Widget Keys
|
|
34
|
-
|
|
35
|
-
| Key | Widget | Purpose |
|
|
36
|
-
|-----|--------|---------|
|
|
37
|
-
| `login_button` | FilledButton | Initiates OIDC flow |
|
|
38
|
-
| `logout_button` | FilledButton.tonal | Clears token |
|
|
39
|
-
| `auth_status` | Text | Shows "Authenticated" or "Not authenticated" |
|
|
40
|
-
| `token_preview` | SelectableText | Truncated token display |
|
|
41
|
-
| `loading_indicator` | CircularProgressIndicator | During OAuth exchange |
|
|
42
|
-
| `error_text` | Text | Error message |
|
|
43
|
-
|
|
44
|
-
## CI Usage
|
|
45
|
-
|
|
46
|
-
The `ci-e2e-web.yml` workflow starts `mock_oidc_server.dart` as a background
|
|
47
|
-
process, then drives the app via Playwright to complete the full OAuth flow
|
|
48
|
-
end-to-end.
|
|
1
|
+
# OIDC App
|
|
2
|
+
|
|
3
|
+
Flutter example demonstrating OIDC PKCE authorization code flow with a mock
|
|
4
|
+
identity provider, used to verify the flutter-ultra-browser MCP server's OAuth
|
|
5
|
+
interception and CCT (Custom Chrome Tab) OAuth solver on mobile.
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
[Flutter App] --launch--> [Browser: /authorize]
|
|
11
|
+
|
|
|
12
|
+
[Mock OIDC Server]
|
|
13
|
+
|
|
|
14
|
+
[302 → localhost:9981/callback]
|
|
15
|
+
|
|
|
16
|
+
[Flutter App] <--code----- [Local HTTP server]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Running
|
|
20
|
+
|
|
21
|
+
1. Start the mock OIDC server:
|
|
22
|
+
```bash
|
|
23
|
+
dart run lib/mock_oidc_server.dart
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Run the Flutter app:
|
|
27
|
+
```bash
|
|
28
|
+
flutter run -d chrome
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. Click "Login with OIDC" — the browser server intercepts the redirect.
|
|
32
|
+
|
|
33
|
+
## Widget Keys
|
|
34
|
+
|
|
35
|
+
| Key | Widget | Purpose |
|
|
36
|
+
|-----|--------|---------|
|
|
37
|
+
| `login_button` | FilledButton | Initiates OIDC flow |
|
|
38
|
+
| `logout_button` | FilledButton.tonal | Clears token |
|
|
39
|
+
| `auth_status` | Text | Shows "Authenticated" or "Not authenticated" |
|
|
40
|
+
| `token_preview` | SelectableText | Truncated token display |
|
|
41
|
+
| `loading_indicator` | CircularProgressIndicator | During OAuth exchange |
|
|
42
|
+
| `error_text` | Text | Error message |
|
|
43
|
+
|
|
44
|
+
## CI Usage
|
|
45
|
+
|
|
46
|
+
The `ci-e2e-web.yml` workflow starts `mock_oidc_server.dart` as a background
|
|
47
|
+
process, then drives the app via Playwright to complete the full OAuth flow
|
|
48
|
+
end-to-end.
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
name: oidc_app
|
|
2
|
-
description: OIDC example app demonstrating browser-server OAuth flow with ultra_flutter binding.
|
|
3
|
-
publish_to: none
|
|
4
|
-
version: 1.0.0
|
|
5
|
-
|
|
6
|
-
resolution: workspace
|
|
7
|
-
|
|
8
|
-
environment:
|
|
9
|
-
sdk: '>=3.6.0 <4.0.0'
|
|
10
|
-
flutter: '>=3.27.0'
|
|
11
|
-
|
|
12
|
-
dependencies:
|
|
13
|
-
flutter:
|
|
14
|
-
sdk: flutter
|
|
15
|
-
ultra_flutter:
|
|
16
|
-
path: ../../dart/ultra_flutter
|
|
17
|
-
url_launcher: ^6.3.0
|
|
18
|
-
|
|
19
|
-
dev_dependencies:
|
|
20
|
-
flutter_test:
|
|
21
|
-
sdk: flutter
|
|
22
|
-
|
|
23
|
-
flutter:
|
|
24
|
-
uses-material-design: true
|
|
1
|
+
name: oidc_app
|
|
2
|
+
description: OIDC example app demonstrating browser-server OAuth flow with ultra_flutter binding.
|
|
3
|
+
publish_to: none
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
|
|
6
|
+
resolution: workspace
|
|
7
|
+
|
|
8
|
+
environment:
|
|
9
|
+
sdk: '>=3.6.0 <4.0.0'
|
|
10
|
+
flutter: '>=3.27.0'
|
|
11
|
+
|
|
12
|
+
dependencies:
|
|
13
|
+
flutter:
|
|
14
|
+
sdk: flutter
|
|
15
|
+
ultra_flutter:
|
|
16
|
+
path: ../../dart/ultra_flutter
|
|
17
|
+
url_launcher: ^6.3.0
|
|
18
|
+
|
|
19
|
+
dev_dependencies:
|
|
20
|
+
flutter_test:
|
|
21
|
+
sdk: flutter
|
|
22
|
+
|
|
23
|
+
flutter:
|
|
24
|
+
uses-material-design: true
|
package/package.json
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@bdayadev/flutter-ultra-mcp",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Flutter Ultra MCP plugin monorepo
|
|
5
|
-
"license": "Apache-2.0",
|
|
6
|
-
"homepage": "https://github.com/Bdaya-Dev/flutter-ultra-mcp",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "https://github.com/Bdaya-Dev/flutter-ultra-mcp.git"
|
|
10
|
-
},
|
|
11
|
-
"bugs": {
|
|
12
|
-
"url": "https://github.com/Bdaya-Dev/flutter-ultra-mcp/issues"
|
|
13
|
-
},
|
|
14
|
-
"engines": {
|
|
15
|
-
"node": ">=20"
|
|
16
|
-
},
|
|
17
|
-
"packageManager": "npm@10.9.0",
|
|
18
|
-
"workspaces": [
|
|
19
|
-
"packages/*",
|
|
20
|
-
"shared/*"
|
|
21
|
-
],
|
|
22
|
-
"scripts": {
|
|
23
|
-
"build": "turbo run build",
|
|
24
|
-
"lint": "turbo run lint",
|
|
25
|
-
"test": "turbo run test",
|
|
26
|
-
"typecheck": "turbo run typecheck",
|
|
27
|
-
"clean": "turbo run clean && rimraf node_modules",
|
|
28
|
-
"format": "prettier --write \"**/*.{ts,tsx,js,json,md,yml,yaml}\"",
|
|
29
|
-
"format:check": "prettier --check \"**/*.{ts,tsx,js,json,md,yml,yaml}\"",
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"@
|
|
39
|
-
"@
|
|
40
|
-
"
|
|
41
|
-
"eslint": "^
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"turbo": "^2.3.0",
|
|
47
|
-
"typescript": "^5.6.0",
|
|
48
|
-
"typescript-eslint": "^8.59.3",
|
|
49
|
-
"vitest": "^3.2.4"
|
|
50
|
-
},
|
|
51
|
-
"publishConfig": {
|
|
52
|
-
"access": "public",
|
|
53
|
-
"registry": "https://registry.npmjs.org"
|
|
54
|
-
},
|
|
55
|
-
"files": [
|
|
56
|
-
".claude-plugin/",
|
|
57
|
-
".mcp.json",
|
|
58
|
-
"skills/",
|
|
59
|
-
"packages/*/dist/",
|
|
60
|
-
"packages/*/package.json",
|
|
61
|
-
"packages/*/README.md",
|
|
62
|
-
"packages/*/sidecars/",
|
|
63
|
-
"shared/*/dist/",
|
|
64
|
-
"shared/*/package.json",
|
|
65
|
-
"shared/*/README.md",
|
|
66
|
-
"dart/*/lib/",
|
|
67
|
-
"dart/*/pubspec.yaml",
|
|
68
|
-
"dart/*/README.md",
|
|
69
|
-
"dart/*/CHANGELOG.md",
|
|
70
|
-
"dart/*/EXTENSIONS.md",
|
|
71
|
-
"docs/",
|
|
72
|
-
"examples/*/lib/",
|
|
73
|
-
"examples/*/pubspec.yaml",
|
|
74
|
-
"examples/*/web/",
|
|
75
|
-
"examples/*/README.md",
|
|
76
|
-
"README.md",
|
|
77
|
-
"LICENSE",
|
|
78
|
-
"CONTRIBUTING.md",
|
|
79
|
-
"SECURITY.md",
|
|
80
|
-
"CODE_OF_CONDUCT.md"
|
|
81
|
-
]
|
|
82
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@bdayadev/flutter-ultra-mcp",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Flutter Ultra MCP plugin monorepo — 8 MCP servers + ultra_flutter Dart packages + skills for Claude Code.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"homepage": "https://github.com/Bdaya-Dev/flutter-ultra-mcp",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/Bdaya-Dev/flutter-ultra-mcp.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/Bdaya-Dev/flutter-ultra-mcp/issues"
|
|
13
|
+
},
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=20"
|
|
16
|
+
},
|
|
17
|
+
"packageManager": "npm@10.9.0",
|
|
18
|
+
"workspaces": [
|
|
19
|
+
"packages/*",
|
|
20
|
+
"shared/*"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "turbo run build",
|
|
24
|
+
"lint": "turbo run lint",
|
|
25
|
+
"test": "turbo run test",
|
|
26
|
+
"typecheck": "turbo run typecheck",
|
|
27
|
+
"clean": "turbo run clean && rimraf node_modules",
|
|
28
|
+
"format": "prettier --write \"**/*.{ts,tsx,js,json,md,yml,yaml}\"",
|
|
29
|
+
"format:check": "prettier --check \"**/*.{ts,tsx,js,json,md,yml,yaml}\"",
|
|
30
|
+
"prepare": "husky"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@commitlint/cli": "^19.0.0",
|
|
34
|
+
"@commitlint/config-conventional": "^19.0.0",
|
|
35
|
+
"@eslint/js": "^9.39.4",
|
|
36
|
+
"@semantic-release/changelog": "6.0.3",
|
|
37
|
+
"@semantic-release/exec": "7.1.0",
|
|
38
|
+
"@semantic-release/git": "10.0.1",
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"eslint": "^9.0.0",
|
|
41
|
+
"eslint-config-prettier": "^10.1.8",
|
|
42
|
+
"husky": "^9.0.0",
|
|
43
|
+
"prettier": "^3.3.0",
|
|
44
|
+
"rimraf": "^6.0.0",
|
|
45
|
+
"semantic-release": "25.0.3",
|
|
46
|
+
"turbo": "^2.3.0",
|
|
47
|
+
"typescript": "^5.6.0",
|
|
48
|
+
"typescript-eslint": "^8.59.3",
|
|
49
|
+
"vitest": "^3.2.4"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public",
|
|
53
|
+
"registry": "https://registry.npmjs.org"
|
|
54
|
+
},
|
|
55
|
+
"files": [
|
|
56
|
+
".claude-plugin/",
|
|
57
|
+
".mcp.json",
|
|
58
|
+
"skills/",
|
|
59
|
+
"packages/*/dist/",
|
|
60
|
+
"packages/*/package.json",
|
|
61
|
+
"packages/*/README.md",
|
|
62
|
+
"packages/*/sidecars/",
|
|
63
|
+
"shared/*/dist/",
|
|
64
|
+
"shared/*/package.json",
|
|
65
|
+
"shared/*/README.md",
|
|
66
|
+
"dart/*/lib/",
|
|
67
|
+
"dart/*/pubspec.yaml",
|
|
68
|
+
"dart/*/README.md",
|
|
69
|
+
"dart/*/CHANGELOG.md",
|
|
70
|
+
"dart/*/EXTENSIONS.md",
|
|
71
|
+
"docs/",
|
|
72
|
+
"examples/*/lib/",
|
|
73
|
+
"examples/*/pubspec.yaml",
|
|
74
|
+
"examples/*/web/",
|
|
75
|
+
"examples/*/README.md",
|
|
76
|
+
"README.md",
|
|
77
|
+
"LICENSE",
|
|
78
|
+
"CONTRIBUTING.md",
|
|
79
|
+
"SECURITY.md",
|
|
80
|
+
"CODE_OF_CONDUCT.md"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
# @flutter-ultra/flutter-ultra-browser
|
|
2
|
-
|
|
3
|
-
MCP server for **Playwright-driven browser automation**: navigate, click, fill, screenshot, console / network capture, OAuth redirect handling, and sandboxed Playwright scripts for Flutter web apps.
|
|
4
|
-
|
|
5
|
-
## Tools
|
|
6
|
-
|
|
7
|
-
| Tool | Purpose |
|
|
8
|
-
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
-
| `launch_browser` / `close_browser` | Lifecycle of a single per-session browser instance |
|
|
10
|
-
| `new_context` / `new_tab` | Cookie/storage-isolated contexts; pages within a context |
|
|
11
|
-
| `navigate` | `page.goto(url)` with load wait |
|
|
12
|
-
| `intercept_redirect` / `wait_for_url` | Wait for navigation matching URL pattern; auth flows |
|
|
13
|
-
| `click` / `fill` / `press_key` | Interaction primitives by selector |
|
|
14
|
-
| `screenshot` | PNG screenshot of page or element (works on CanvasKit) |
|
|
15
|
-
| `console_logs` | One-shot read of recent console events |
|
|
16
|
-
| `start_console_capture` / `get_console_capture` / `stop_console_capture` | **rev-23** persistent buffer of `console.*` + `pageerror` + `crash`, survives navigation, captures Dart `print()` on Flutter web within 100ms (AC-Br4) |
|
|
17
|
-
| `network_requests` | Recent network events for a page |
|
|
18
|
-
| `evaluate_js` | Run JS expression in page context, return JSON-serialized value |
|
|
19
|
-
| `run_playwright_script` | **Sandboxed** Node `vm` execution of Playwright TS/JS with `page` / `context` / `browser` / `expect` / `console` / `fetch` exposed; **no** `process`/`require`/`import`; CPU + wall-time watchdog |
|
|
20
|
-
| `eval_playwright_recipe` | Run a named recipe from `${CLAUDE_PLUGIN_DATA}/recipes/*.ts` |
|
|
21
|
-
| `set_storage` / `get_storage` | Pre-seed / export cookies + localStorage |
|
|
22
|
-
| `link_to_flutter` | Associate this browser context with a Flutter sessionId (used by `/flutter:drive`) |
|
|
23
|
-
|
|
24
|
-
See plan §5.4 lines 596-660 for the full design, AC-Br1..AC-Br4 acceptance criteria, and `run_playwright_script` sandbox boundary rationale.
|
|
25
|
-
|
|
26
|
-
State files this server owns:
|
|
27
|
-
|
|
28
|
-
- `${FLUTTER_ULTRA_STATE_DIR}/browsers.json` — active browser instances and their `link_to_flutter` mappings (plan §4)
|
|
29
|
-
- `${FLUTTER_ULTRA_STATE_DIR}/captures/console-<captureId>.jsonl` — append-only console event buffer per active capture (rev-23, survives server restart)
|
|
1
|
+
# @flutter-ultra/flutter-ultra-browser
|
|
2
|
+
|
|
3
|
+
MCP server for **Playwright-driven browser automation**: navigate, click, fill, screenshot, console / network capture, OAuth redirect handling, and sandboxed Playwright scripts for Flutter web apps.
|
|
4
|
+
|
|
5
|
+
## Tools
|
|
6
|
+
|
|
7
|
+
| Tool | Purpose |
|
|
8
|
+
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
9
|
+
| `launch_browser` / `close_browser` | Lifecycle of a single per-session browser instance |
|
|
10
|
+
| `new_context` / `new_tab` | Cookie/storage-isolated contexts; pages within a context |
|
|
11
|
+
| `navigate` | `page.goto(url)` with load wait |
|
|
12
|
+
| `intercept_redirect` / `wait_for_url` | Wait for navigation matching URL pattern; auth flows |
|
|
13
|
+
| `click` / `fill` / `press_key` | Interaction primitives by selector |
|
|
14
|
+
| `screenshot` | PNG screenshot of page or element (works on CanvasKit) |
|
|
15
|
+
| `console_logs` | One-shot read of recent console events |
|
|
16
|
+
| `start_console_capture` / `get_console_capture` / `stop_console_capture` | **rev-23** persistent buffer of `console.*` + `pageerror` + `crash`, survives navigation, captures Dart `print()` on Flutter web within 100ms (AC-Br4) |
|
|
17
|
+
| `network_requests` | Recent network events for a page |
|
|
18
|
+
| `evaluate_js` | Run JS expression in page context, return JSON-serialized value |
|
|
19
|
+
| `run_playwright_script` | **Sandboxed** Node `vm` execution of Playwright TS/JS with `page` / `context` / `browser` / `expect` / `console` / `fetch` exposed; **no** `process`/`require`/`import`; CPU + wall-time watchdog |
|
|
20
|
+
| `eval_playwright_recipe` | Run a named recipe from `${CLAUDE_PLUGIN_DATA}/recipes/*.ts` |
|
|
21
|
+
| `set_storage` / `get_storage` | Pre-seed / export cookies + localStorage |
|
|
22
|
+
| `link_to_flutter` | Associate this browser context with a Flutter sessionId (used by `/flutter:drive`) |
|
|
23
|
+
|
|
24
|
+
See plan §5.4 lines 596-660 for the full design, AC-Br1..AC-Br4 acceptance criteria, and `run_playwright_script` sandbox boundary rationale.
|
|
25
|
+
|
|
26
|
+
State files this server owns:
|
|
27
|
+
|
|
28
|
+
- `${FLUTTER_ULTRA_STATE_DIR}/browsers.json` — active browser instances and their `link_to_flutter` mappings (plan §4)
|
|
29
|
+
- `${FLUTTER_ULTRA_STATE_DIR}/captures/console-<captureId>.jsonl` — append-only console event buffer per active capture (rev-23, survives server restart)
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@flutter-ultra/flutter-ultra-browser",
|
|
3
|
-
"version": "0.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"description": "MCP server for Playwright-driven browser automation: OAuth redirects, popups, console capture, network, sandboxed JS.",
|
|
6
|
-
"license": "Apache-2.0",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"main": "dist/index.js",
|
|
9
|
-
"types": "dist/index.d.ts",
|
|
10
|
-
"bin": {
|
|
11
|
-
"flutter-ultra-browser": "dist/bin.js"
|
|
12
|
-
},
|
|
13
|
-
"files": [
|
|
14
|
-
"dist",
|
|
15
|
-
"README.md"
|
|
16
|
-
],
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsc -b",
|
|
19
|
-
"lint": "eslint src",
|
|
20
|
-
"test": "vitest run",
|
|
21
|
-
"typecheck": "tsc -b --noEmit",
|
|
22
|
-
"clean": "rimraf dist .turbo *.tsbuildinfo"
|
|
23
|
-
},
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
26
|
-
"playwright-core": "^1.49.0",
|
|
27
|
-
"proper-lockfile": "^4.1.2",
|
|
28
|
-
"superjson": "^2.2.1",
|
|
29
|
-
"zod": "^3.23.8",
|
|
30
|
-
"zod-to-json-schema": "^3.23.5"
|
|
31
|
-
},
|
|
32
|
-
"devDependencies": {
|
|
33
|
-
"@types/proper-lockfile": "^4.1.4",
|
|
34
|
-
"playwright": "^1.49.0",
|
|
35
|
-
"rimraf": "^6.0.0",
|
|
36
|
-
"typescript": "^5.6.0",
|
|
37
|
-
"vitest": "^2.0.0"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@flutter-ultra/flutter-ultra-browser",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "MCP server for Playwright-driven browser automation: OAuth redirects, popups, console capture, network, sandboxed JS.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"bin": {
|
|
11
|
+
"flutter-ultra-browser": "dist/bin.js"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -b",
|
|
19
|
+
"lint": "eslint src",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"typecheck": "tsc -b --noEmit",
|
|
22
|
+
"clean": "rimraf dist .turbo *.tsbuildinfo"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
26
|
+
"playwright-core": "^1.49.0",
|
|
27
|
+
"proper-lockfile": "^4.1.2",
|
|
28
|
+
"superjson": "^2.2.1",
|
|
29
|
+
"zod": "^3.23.8",
|
|
30
|
+
"zod-to-json-schema": "^3.23.5"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
34
|
+
"playwright": "^1.49.0",
|
|
35
|
+
"rimraf": "^6.0.0",
|
|
36
|
+
"typescript": "^5.6.0",
|
|
37
|
+
"vitest": "^2.0.0"
|
|
38
|
+
}
|
|
39
|
+
}
|