@tac0de/flutter-mcp 0.1.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.
@@ -0,0 +1,316 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import { existsSync } from "fs";
4
+ import { z } from "zod";
5
+ // Zod schemas for validation
6
+ const FlutterConfigSchema = z.object({
7
+ "uses-material-design": z.boolean().optional(),
8
+ assets: z.array(z.string()).optional(),
9
+ fonts: z.array(z.any()).optional(),
10
+ });
11
+ export const PubspecSchema = z.object({
12
+ name: z.string(),
13
+ description: z.string().optional(),
14
+ version: z.string().optional(),
15
+ publish_to: z.string().optional(),
16
+ environment: z
17
+ .object({
18
+ sdk: z.string(),
19
+ flutter: z.string().optional(),
20
+ })
21
+ .optional(),
22
+ dependencies: z.record(z.string()).optional(),
23
+ dev_dependencies: z.record(z.string()).optional(),
24
+ flutter: FlutterConfigSchema.optional(),
25
+ });
26
+ /**
27
+ * Check if a directory exists
28
+ */
29
+ async function directoryExists(dirPath) {
30
+ try {
31
+ const stats = await fs.stat(dirPath);
32
+ return stats.isDirectory();
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * Find pubspec.yaml in directory or parent directories
40
+ */
41
+ async function findPubspecYaml(startPath) {
42
+ let currentPath = path.resolve(startPath);
43
+ while (currentPath !== path.dirname(currentPath)) {
44
+ const pubspecPath = path.join(currentPath, "pubspec.yaml");
45
+ if (existsSync(pubspecPath)) {
46
+ return pubspecPath;
47
+ }
48
+ currentPath = path.dirname(currentPath);
49
+ }
50
+ return null;
51
+ }
52
+ /**
53
+ * Simple YAML parser (basic implementation without external dependency)
54
+ */
55
+ function parseYaml(content) {
56
+ const lines = content.split("\n");
57
+ const result = {};
58
+ const stack = [{ obj: result, indent: -1 }];
59
+ for (const line of lines) {
60
+ const trimmed = line.trim();
61
+ if (!trimmed || trimmed.startsWith("#"))
62
+ continue;
63
+ const indent = line.search(/\S|$/);
64
+ const [key, ...valueParts] = trimmed.split(":");
65
+ const value = valueParts.join(":").trim();
66
+ // Pop stack to correct indent level
67
+ while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
68
+ stack.pop();
69
+ }
70
+ const current = stack[stack.length - 1].obj;
71
+ if (value === "") {
72
+ // It's a parent object or array
73
+ if (trimmed.endsWith("|")) {
74
+ // Multiline string
75
+ current[key] = "";
76
+ }
77
+ else if (trimmed.startsWith("- ")) {
78
+ // Array item (simplified)
79
+ if (!Array.isArray(current)) {
80
+ stack[stack.length - 1].obj = [];
81
+ }
82
+ }
83
+ else {
84
+ current[key] = {};
85
+ stack.push({ obj: current[key], indent });
86
+ }
87
+ }
88
+ else {
89
+ // Parse value
90
+ current[key] = parseYamlValue(value);
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ /**
96
+ * Parse YAML value (string, number, boolean, array)
97
+ */
98
+ function parseYamlValue(value) {
99
+ value = value.trim();
100
+ // Remove quotes
101
+ if ((value.startsWith("'") && value.endsWith("'")) ||
102
+ (value.startsWith('"') && value.endsWith('"'))) {
103
+ return value.slice(1, -1);
104
+ }
105
+ // Boolean
106
+ if (value === "true")
107
+ return true;
108
+ if (value === "false")
109
+ return false;
110
+ // Null
111
+ if (value === "null" || value === "~")
112
+ return null;
113
+ // Number
114
+ if (/^\d+$/.test(value))
115
+ return parseInt(value, 10);
116
+ if (/^\d+\.\d+$/.test(value))
117
+ return parseFloat(value);
118
+ // Array
119
+ if (value.startsWith("[") && value.endsWith("]")) {
120
+ const items = value.slice(1, -1).split(",").map((v) => v.trim());
121
+ return items;
122
+ }
123
+ return value;
124
+ }
125
+ /**
126
+ * Read and parse pubspec.yaml
127
+ */
128
+ export async function readPubspecYaml(projectPath) {
129
+ try {
130
+ const pubspecPath = path.join(projectPath, "pubspec.yaml");
131
+ if (!existsSync(pubspecPath)) {
132
+ return null;
133
+ }
134
+ const content = await fs.readFile(pubspecPath, "utf-8");
135
+ const parsed = parseYaml(content);
136
+ return PubspecSchema.parse(parsed);
137
+ }
138
+ catch (error) {
139
+ throw new Error(`Failed to parse pubspec.yaml: ${error instanceof Error ? error.message : String(error)}`);
140
+ }
141
+ }
142
+ /**
143
+ * Detect if directory is a Flutter project
144
+ */
145
+ export async function detectFlutterProject(projectPath) {
146
+ const result = {
147
+ isFlutterProject: false,
148
+ projectType: null,
149
+ flutterVersion: null,
150
+ hasPubspec: false,
151
+ errors: [],
152
+ };
153
+ try {
154
+ const pubspec = await readPubspecYaml(projectPath);
155
+ if (!pubspec) {
156
+ result.errors.push("pubspec.yaml not found");
157
+ return result;
158
+ }
159
+ result.hasPubspec = true;
160
+ // Check if it's a Flutter project by looking for flutter dependency
161
+ const hasFlutterDependency = pubspec.dependencies?.flutter !== undefined ||
162
+ pubspec.environment?.flutter !== undefined;
163
+ if (!hasFlutterDependency) {
164
+ result.errors.push("Flutter dependency not found in pubspec.yaml");
165
+ return result;
166
+ }
167
+ result.isFlutterProject = true;
168
+ // Determine project type
169
+ const hasAndroid = await directoryExists(path.join(projectPath, "android"));
170
+ const hasIOS = await directoryExists(path.join(projectPath, "ios"));
171
+ const hasWeb = await directoryExists(path.join(projectPath, "web"));
172
+ const hasLib = await directoryExists(path.join(projectPath, "lib"));
173
+ if (hasAndroid || hasIOS || hasWeb) {
174
+ result.projectType = "app";
175
+ }
176
+ else if (hasLib) {
177
+ result.projectType = "package";
178
+ }
179
+ else {
180
+ result.projectType = "module";
181
+ }
182
+ // Try to get Flutter version from environment
183
+ result.flutterVersion = pubspec.environment?.flutter || null;
184
+ }
185
+ catch (error) {
186
+ result.errors.push(error instanceof Error ? error.message : String(error));
187
+ }
188
+ return result;
189
+ }
190
+ /**
191
+ * Analyze Flutter project structure
192
+ */
193
+ export async function analyzeFlutterProject(projectPath) {
194
+ const result = {
195
+ projectPath,
196
+ projectName: null,
197
+ projectType: "unknown",
198
+ structure: {
199
+ hasLib: false,
200
+ hasAndroid: false,
201
+ hasIOS: false,
202
+ hasWeb: false,
203
+ hasLinux: false,
204
+ hasWindows: false,
205
+ hasMacOS: false,
206
+ hasTest: false,
207
+ hasIntegrationTest: false,
208
+ },
209
+ fileCount: 0,
210
+ dartFileCount: 0,
211
+ errors: [],
212
+ };
213
+ try {
214
+ const pubspec = await readPubspecYaml(projectPath);
215
+ if (pubspec) {
216
+ result.projectName = pubspec.name;
217
+ }
218
+ // Check directory structure
219
+ const dirs = [
220
+ "lib",
221
+ "android",
222
+ "ios",
223
+ "web",
224
+ "linux",
225
+ "windows",
226
+ "macos",
227
+ "test",
228
+ "integration_test",
229
+ ];
230
+ for (const dir of dirs) {
231
+ const exists = await directoryExists(path.join(projectPath, dir));
232
+ const key = dir === "macos" ? "hasMacOS" : `has${dir.charAt(0).toUpperCase() + dir.slice(1)}`;
233
+ result.structure[key] = exists;
234
+ }
235
+ // Determine project type
236
+ if (result.structure.hasAndroid || result.structure.hasIOS) {
237
+ result.projectType = "app";
238
+ }
239
+ else if (result.structure.hasLib) {
240
+ result.projectType = "package";
241
+ }
242
+ // Count files
243
+ result.dartFileCount = await countDartFiles(projectPath);
244
+ }
245
+ catch (error) {
246
+ result.errors.push(error instanceof Error ? error.message : String(error));
247
+ }
248
+ return result;
249
+ }
250
+ /**
251
+ * Count Dart files in project
252
+ */
253
+ async function countDartFiles(dirPath) {
254
+ let count = 0;
255
+ try {
256
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
257
+ for (const entry of entries) {
258
+ const fullPath = path.join(dirPath, entry.name);
259
+ if (entry.isDirectory()) {
260
+ // Skip node_modules, build, .dart_tool
261
+ if (entry.name === "node_modules" ||
262
+ entry.name === "build" ||
263
+ entry.name === ".dart_tool" ||
264
+ entry.name === ".git") {
265
+ continue;
266
+ }
267
+ count += await countDartFiles(fullPath);
268
+ }
269
+ else if (entry.isFile() && entry.name.endsWith(".dart")) {
270
+ count++;
271
+ }
272
+ }
273
+ }
274
+ catch {
275
+ // Ignore permission errors
276
+ }
277
+ return count;
278
+ }
279
+ /**
280
+ * Get Flutter project information
281
+ */
282
+ export async function getFlutterProjectInfo(projectPath) {
283
+ const result = {
284
+ name: null,
285
+ description: null,
286
+ version: null,
287
+ sdkVersion: null,
288
+ flutterVersion: null,
289
+ dependencies: {},
290
+ devDependencies: {},
291
+ usesMaterialDesign: false,
292
+ assets: [],
293
+ errors: [],
294
+ };
295
+ try {
296
+ const pubspec = await readPubspecYaml(projectPath);
297
+ if (!pubspec) {
298
+ result.errors.push("pubspec.yaml not found");
299
+ return result;
300
+ }
301
+ result.name = pubspec.name;
302
+ result.description = pubspec.description || null;
303
+ result.version = pubspec.version || null;
304
+ result.sdkVersion = pubspec.environment?.sdk || null;
305
+ result.flutterVersion = pubspec.environment?.flutter || null;
306
+ result.dependencies = pubspec.dependencies || {};
307
+ result.devDependencies = pubspec.dev_dependencies || {};
308
+ result.usesMaterialDesign = pubspec.flutter?.["uses-material-design"] || false;
309
+ result.assets = pubspec.flutter?.assets || [];
310
+ }
311
+ catch (error) {
312
+ result.errors.push(error instanceof Error ? error.message : String(error));
313
+ }
314
+ return result;
315
+ }
316
+ //# sourceMappingURL=flutter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flutter.js","sourceRoot":"","sources":["../../src/utils/flutter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@tac0de/flutter-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Repo-aware and Verify-first Flutter MCP Server for AI coding agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "flutter-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "watch": "tsc --watch",
16
+ "prepare": "npm run build",
17
+ "dev": "tsc --watch"
18
+ },
19
+ "keywords": [
20
+ "flutter",
21
+ "mcp",
22
+ "model-context-protocol",
23
+ "dart",
24
+ "code-analysis"
25
+ ],
26
+ "author": "tac0de",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.0.4",
30
+ "zod": "^3.24.1"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.10.5",
34
+ "typescript": "^5.7.3"
35
+ },
36
+ "engines": {
37
+ "node": ">=18"
38
+ }
39
+ }