@tmhs/mobile-mcp 0.6.0 → 0.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.
Files changed (58) hide show
  1. package/dist/index.js +23 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/tools/addMap.d.ts +3 -0
  4. package/dist/tools/addMap.d.ts.map +1 -0
  5. package/dist/tools/addMap.js +223 -0
  6. package/dist/tools/addMap.js.map +1 -0
  7. package/dist/tools/analyzeBundle.d.ts +3 -0
  8. package/dist/tools/analyzeBundle.d.ts.map +1 -0
  9. package/dist/tools/analyzeBundle.js +122 -0
  10. package/dist/tools/analyzeBundle.js.map +1 -0
  11. package/dist/tools/checkDevEnvironment.js +1 -1
  12. package/dist/tools/checkDevEnvironment.js.map +1 -1
  13. package/dist/tools/configureOTA.d.ts +3 -0
  14. package/dist/tools/configureOTA.d.ts.map +1 -0
  15. package/dist/tools/configureOTA.js +118 -0
  16. package/dist/tools/configureOTA.js.map +1 -0
  17. package/dist/tools/generateForm.d.ts +3 -0
  18. package/dist/tools/generateForm.d.ts.map +1 -0
  19. package/dist/tools/generateForm.js +337 -0
  20. package/dist/tools/generateForm.js.map +1 -0
  21. package/dist/tools/generateScreenshots.d.ts +3 -0
  22. package/dist/tools/generateScreenshots.d.ts.map +1 -0
  23. package/dist/tools/generateScreenshots.js +128 -0
  24. package/dist/tools/generateScreenshots.js.map +1 -0
  25. package/dist/tools/generateTestFile.d.ts +3 -0
  26. package/dist/tools/generateTestFile.d.ts.map +1 -0
  27. package/dist/tools/generateTestFile.js +184 -0
  28. package/dist/tools/generateTestFile.js.map +1 -0
  29. package/dist/tools/runOnDevice.d.ts.map +1 -1
  30. package/dist/tools/runOnDevice.js +45 -40
  31. package/dist/tools/runOnDevice.js.map +1 -1
  32. package/dist/tools/runTests.d.ts +3 -0
  33. package/dist/tools/runTests.d.ts.map +1 -0
  34. package/dist/tools/runTests.js +165 -0
  35. package/dist/tools/runTests.js.map +1 -0
  36. package/dist/tools/scaffoldProject.js +1 -1
  37. package/dist/tools/scaffoldProject.js.map +1 -1
  38. package/dist/tools/setupCI.d.ts +3 -0
  39. package/dist/tools/setupCI.d.ts.map +1 -0
  40. package/dist/tools/setupCI.js +202 -0
  41. package/dist/tools/setupCI.js.map +1 -0
  42. package/dist/tools/setupI18n.d.ts +3 -0
  43. package/dist/tools/setupI18n.d.ts.map +1 -0
  44. package/dist/tools/setupI18n.js +155 -0
  45. package/dist/tools/setupI18n.js.map +1 -0
  46. package/dist/tools/setupRealtime.d.ts +3 -0
  47. package/dist/tools/setupRealtime.d.ts.map +1 -0
  48. package/dist/tools/setupRealtime.js +311 -0
  49. package/dist/tools/setupRealtime.js.map +1 -0
  50. package/dist/tools/submitToAppStore.js +1 -1
  51. package/dist/tools/submitToAppStore.js.map +1 -1
  52. package/dist/tools/submitToPlayStore.d.ts +3 -0
  53. package/dist/tools/submitToPlayStore.d.ts.map +1 -0
  54. package/dist/tools/submitToPlayStore.js +92 -0
  55. package/dist/tools/submitToPlayStore.js.map +1 -0
  56. package/dist/tools/validateStoreMetadata.js +1 -1
  57. package/dist/tools/validateStoreMetadata.js.map +1 -1
  58. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -16,9 +16,20 @@ import { register as registerResetDevEnvironment } from "./tools/resetDevEnviron
16
16
  import { register as registerBuildForStore } from "./tools/buildForStore.js";
17
17
  import { register as registerValidateStoreMetadata } from "./tools/validateStoreMetadata.js";
18
18
  import { register as registerSubmitToAppStore } from "./tools/submitToAppStore.js";
19
+ import { register as registerSubmitToPlayStore } from "./tools/submitToPlayStore.js";
20
+ import { register as registerGenerateScreenshots } from "./tools/generateScreenshots.js";
21
+ import { register as registerAnalyzeBundle } from "./tools/analyzeBundle.js";
22
+ import { register as registerConfigureOTA } from "./tools/configureOTA.js";
23
+ import { register as registerRunTests } from "./tools/runTests.js";
24
+ import { register as registerSetupCI } from "./tools/setupCI.js";
25
+ import { register as registerGenerateTestFile } from "./tools/generateTestFile.js";
26
+ import { register as registerSetupI18n } from "./tools/setupI18n.js";
27
+ import { register as registerAddMap } from "./tools/addMap.js";
28
+ import { register as registerGenerateForm } from "./tools/generateForm.js";
29
+ import { register as registerSetupRealtime } from "./tools/setupRealtime.js";
19
30
  const server = new McpServer({
20
31
  name: "mobile-mcp",
21
- version: "0.6.0",
32
+ version: "0.9.0",
22
33
  });
23
34
  registerCheckDevEnvironment(server);
24
35
  registerScaffoldProject(server);
@@ -35,6 +46,17 @@ registerResetDevEnvironment(server);
35
46
  registerBuildForStore(server);
36
47
  registerValidateStoreMetadata(server);
37
48
  registerSubmitToAppStore(server);
49
+ registerSubmitToPlayStore(server);
50
+ registerGenerateScreenshots(server);
51
+ registerAnalyzeBundle(server);
52
+ registerConfigureOTA(server);
53
+ registerRunTests(server);
54
+ registerSetupCI(server);
55
+ registerGenerateTestFile(server);
56
+ registerSetupI18n(server);
57
+ registerAddMap(server);
58
+ registerGenerateForm(server);
59
+ registerSetupRealtime(server);
38
60
  async function main() {
39
61
  const transport = new StdioServerTransport();
40
62
  await server.connect(transport);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC3F,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEnF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACnC,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACtC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAEjC,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=addMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMap.d.ts","sourceRoot":"","sources":["../../src/tools/addMap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0IzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkHhD"}
@@ -0,0 +1,223 @@
1
+ import { z } from "zod";
2
+ import { writeFileSync, mkdirSync, existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { textResponse, errorResponse } from "../types.js";
5
+ const inputSchema = {
6
+ project_path: z
7
+ .string()
8
+ .optional()
9
+ .describe("Absolute path to the project root. Defaults to cwd."),
10
+ framework: z
11
+ .enum(["expo", "flutter"])
12
+ .optional()
13
+ .default("expo")
14
+ .describe("Project framework (default: expo)."),
15
+ provider: z
16
+ .enum(["google", "apple"])
17
+ .optional()
18
+ .default("google")
19
+ .describe("Map provider (default: google). Apple Maps only available on iOS."),
20
+ screen_name: z
21
+ .string()
22
+ .optional()
23
+ .default("MapScreen")
24
+ .describe("Name for the generated map screen component (default: MapScreen)."),
25
+ };
26
+ function generateExpoMapScreen(name) {
27
+ return `import { useState } from "react";
28
+ import { StyleSheet, View } from "react-native";
29
+ import MapView, { Marker, type Region } from "react-native-maps";
30
+
31
+ const INITIAL_REGION: Region = {
32
+ latitude: 37.7749,
33
+ longitude: -122.4194,
34
+ latitudeDelta: 0.0922,
35
+ longitudeDelta: 0.0421,
36
+ };
37
+
38
+ interface MapMarker {
39
+ id: string;
40
+ coordinate: { latitude: number; longitude: number };
41
+ title: string;
42
+ description?: string;
43
+ }
44
+
45
+ export default function ${name}() {
46
+ const [markers] = useState<MapMarker[]>([
47
+ {
48
+ id: "1",
49
+ coordinate: { latitude: 37.7749, longitude: -122.4194 },
50
+ title: "San Francisco",
51
+ description: "Starting point",
52
+ },
53
+ ]);
54
+
55
+ return (
56
+ <View style={styles.container}>
57
+ <MapView
58
+ style={styles.map}
59
+ initialRegion={INITIAL_REGION}
60
+ showsUserLocation
61
+ showsMyLocationButton
62
+ >
63
+ {markers.map((marker) => (
64
+ <Marker
65
+ key={marker.id}
66
+ coordinate={marker.coordinate}
67
+ title={marker.title}
68
+ description={marker.description}
69
+ />
70
+ ))}
71
+ </MapView>
72
+ </View>
73
+ );
74
+ }
75
+
76
+ const styles = StyleSheet.create({
77
+ container: {
78
+ flex: 1,
79
+ },
80
+ map: {
81
+ width: "100%",
82
+ height: "100%",
83
+ },
84
+ });
85
+ `;
86
+ }
87
+ function generateFlutterMapScreen(name) {
88
+ const className = name.charAt(0).toUpperCase() + name.slice(1);
89
+ return `import 'package:flutter/material.dart';
90
+ import 'package:google_maps_flutter/google_maps_flutter.dart';
91
+
92
+ class ${className} extends StatefulWidget {
93
+ const ${className}({super.key});
94
+
95
+ @override
96
+ State<${className}> createState() => _${className}State();
97
+ }
98
+
99
+ class _${className}State extends State<${className}> {
100
+ static const _initialPosition = CameraPosition(
101
+ target: LatLng(37.7749, -122.4194),
102
+ zoom: 14,
103
+ );
104
+
105
+ final Set<Marker> _markers = {
106
+ const Marker(
107
+ markerId: MarkerId('san_francisco'),
108
+ position: LatLng(37.7749, -122.4194),
109
+ infoWindow: InfoWindow(title: 'San Francisco'),
110
+ ),
111
+ };
112
+
113
+ GoogleMapController? _controller;
114
+
115
+ @override
116
+ Widget build(BuildContext context) {
117
+ return Scaffold(
118
+ appBar: AppBar(title: const Text('Map')),
119
+ body: GoogleMap(
120
+ initialCameraPosition: _initialPosition,
121
+ markers: _markers,
122
+ myLocationEnabled: true,
123
+ myLocationButtonEnabled: true,
124
+ onMapCreated: (controller) => _controller = controller,
125
+ ),
126
+ );
127
+ }
128
+
129
+ @override
130
+ void dispose() {
131
+ _controller?.dispose();
132
+ super.dispose();
133
+ }
134
+ }
135
+ `;
136
+ }
137
+ export function register(server) {
138
+ server.tool("mobile_addMap", "Add a map view with provider config, location permissions, and marker support. Generates a starter map screen component.", inputSchema, async (args) => {
139
+ try {
140
+ const root = args.project_path || process.cwd();
141
+ const filesCreated = [];
142
+ const configChanges = [];
143
+ if (args.framework === "flutter") {
144
+ const screenDir = join(root, "lib", "screens");
145
+ mkdirSync(screenDir, { recursive: true });
146
+ const fileName = args.screen_name
147
+ .replace(/([A-Z])/g, "_$1")
148
+ .toLowerCase()
149
+ .replace(/^_/, "");
150
+ const screenPath = join(screenDir, `${fileName}.dart`);
151
+ if (existsSync(screenPath)) {
152
+ return errorResponse(new Error(`File already exists: ${screenPath}`));
153
+ }
154
+ writeFileSync(screenPath, generateFlutterMapScreen(args.screen_name), "utf-8");
155
+ filesCreated.push(screenPath);
156
+ return textResponse(JSON.stringify({
157
+ success: true,
158
+ framework: "flutter",
159
+ provider: args.provider,
160
+ files_created: filesCreated,
161
+ next_steps: [
162
+ "Add google_maps_flutter to pubspec.yaml: flutter pub add google_maps_flutter",
163
+ "Add your API key to android/app/src/main/AndroidManifest.xml:",
164
+ ' <meta-data android:name="com.google.android.geo.API_KEY" android:value="YOUR_KEY"/>',
165
+ "Add your API key to ios/Runner/AppDelegate.swift:",
166
+ ' GMSServices.provideAPIKey("YOUR_KEY")',
167
+ "Add location permissions to AndroidManifest.xml and Info.plist",
168
+ "Get a Google Maps API key from console.cloud.google.com",
169
+ ],
170
+ }, null, 2));
171
+ }
172
+ const appJsonPath = join(root, "app.json");
173
+ if (existsSync(appJsonPath)) {
174
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
175
+ const expo = appJson.expo || {};
176
+ if (!expo.plugins)
177
+ expo.plugins = [];
178
+ const hasMapPlugin = expo.plugins.some((p) => (typeof p === "string" && p === "react-native-maps") ||
179
+ (Array.isArray(p) && p[0] === "react-native-maps"));
180
+ if (!hasMapPlugin) {
181
+ const mapConfig = [
182
+ "react-native-maps",
183
+ {
184
+ googleMapsApiKey: "GOOGLE_MAPS_API_KEY_HERE",
185
+ },
186
+ ];
187
+ expo.plugins.push(mapConfig);
188
+ appJson.expo = expo;
189
+ writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + "\n", "utf-8");
190
+ configChanges.push("Added react-native-maps plugin to app.json");
191
+ }
192
+ }
193
+ const screenDir = join(root, "app");
194
+ if (!existsSync(screenDir)) {
195
+ mkdirSync(screenDir, { recursive: true });
196
+ }
197
+ const screenPath = join(screenDir, `${args.screen_name.charAt(0).toLowerCase() + args.screen_name.slice(1)}.tsx`);
198
+ if (!existsSync(screenPath)) {
199
+ writeFileSync(screenPath, generateExpoMapScreen(args.screen_name), "utf-8");
200
+ filesCreated.push(screenPath);
201
+ }
202
+ return textResponse(JSON.stringify({
203
+ success: true,
204
+ framework: "expo",
205
+ provider: args.provider,
206
+ files_created: filesCreated,
207
+ config_changes: configChanges,
208
+ next_steps: [
209
+ "Install react-native-maps: npx expo install react-native-maps",
210
+ "Install expo-location for user location: npx expo install expo-location",
211
+ "Replace GOOGLE_MAPS_API_KEY_HERE in app.json with your actual key",
212
+ "Get a Google Maps API key from console.cloud.google.com",
213
+ "Add location permission with mobile_addPermission",
214
+ "This requires a dev build (not Expo Go) for native map rendering",
215
+ ],
216
+ }, null, 2));
217
+ }
218
+ catch (err) {
219
+ return errorResponse(err);
220
+ }
221
+ });
222
+ }
223
+ //# sourceMappingURL=addMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMap.js","sourceRoot":"","sources":["../../src/tools/addMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=analyzeBundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeBundle.d.ts","sourceRoot":"","sources":["../../src/tools/analyzeBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6DzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgGhD"}
@@ -0,0 +1,122 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
3
+ import { join, extname } from "node:path";
4
+ import { textResponse, errorResponse } from "../types.js";
5
+ const KNOWN_HEAVY_PACKAGES = {
6
+ moment: { size: "~300KB", alternative: "date-fns or dayjs" },
7
+ "moment-timezone": { size: "~200KB", alternative: "date-fns-tz" },
8
+ lodash: { size: "~70KB", alternative: "lodash-es or individual lodash/* imports" },
9
+ "aws-sdk": { size: "~50MB", alternative: "@aws-sdk/client-* (v3 modular)" },
10
+ firebase: { size: "~500KB", alternative: "@react-native-firebase/* (modular)" },
11
+ antd: { size: "~1MB", alternative: "Not suitable for React Native" },
12
+ "react-native-maps": { size: "~15MB native", alternative: "Only if maps are essential" },
13
+ underscore: { size: "~25KB", alternative: "Native Array/Object methods or lodash-es" },
14
+ axios: { size: "~15KB", alternative: "Built-in fetch API" },
15
+ "crypto-js": { size: "~40KB", alternative: "expo-crypto for basic hashing" },
16
+ };
17
+ const LARGE_ASSET_THRESHOLD = 500 * 1024;
18
+ const ASSET_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".mp4", ".ttf", ".otf", ".json"]);
19
+ function scanAssets(dir) {
20
+ const results = [];
21
+ if (!existsSync(dir))
22
+ return results;
23
+ try {
24
+ const entries = readdirSync(dir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ const fullPath = join(dir, entry.name);
27
+ if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== ".git") {
28
+ results.push(...scanAssets(fullPath));
29
+ }
30
+ else if (entry.isFile() && ASSET_EXTENSIONS.has(extname(entry.name).toLowerCase())) {
31
+ const stat = statSync(fullPath);
32
+ if (stat.size > LARGE_ASSET_THRESHOLD) {
33
+ results.push({ path: fullPath, size: stat.size });
34
+ }
35
+ }
36
+ }
37
+ }
38
+ catch {
39
+ // Skip directories we can't read
40
+ }
41
+ return results;
42
+ }
43
+ function formatBytes(bytes) {
44
+ if (bytes < 1024)
45
+ return `${bytes} B`;
46
+ if (bytes < 1024 * 1024)
47
+ return `${(bytes / 1024).toFixed(1)} KB`;
48
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
49
+ }
50
+ const inputSchema = {
51
+ project_path: z
52
+ .string()
53
+ .optional()
54
+ .describe("Absolute path to the project root. Defaults to cwd."),
55
+ platform: z
56
+ .enum(["ios", "android", "both"])
57
+ .optional()
58
+ .default("both")
59
+ .describe("Target platform for analysis context (default: both)"),
60
+ };
61
+ export function register(server) {
62
+ server.tool("mobile_analyzeBundle", "Analyze app bundle for large dependencies, heavy assets, and optimization opportunities. Reads package.json and scans the project for bloat.", inputSchema, async (args) => {
63
+ try {
64
+ const root = args.project_path || process.cwd();
65
+ const pkgPath = join(root, "package.json");
66
+ if (!existsSync(pkgPath)) {
67
+ return errorResponse(new Error(`No package.json at ${root}. Is this a Node.js project?`));
68
+ }
69
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
70
+ const deps = Object.keys(pkg.dependencies || {});
71
+ const devDeps = Object.keys(pkg.devDependencies || {});
72
+ const heavyDeps = [];
73
+ for (const dep of deps) {
74
+ const info = KNOWN_HEAVY_PACKAGES[dep];
75
+ if (info) {
76
+ heavyDeps.push({
77
+ name: dep,
78
+ estimated_size: info.size,
79
+ alternative: info.alternative,
80
+ });
81
+ }
82
+ }
83
+ const assetsDir = join(root, "assets");
84
+ const largeAssets = scanAssets(assetsDir).map((a) => ({
85
+ path: a.path.replace(root, "."),
86
+ size: formatBytes(a.size),
87
+ size_bytes: a.size,
88
+ }));
89
+ const recommendations = [];
90
+ if (heavyDeps.length > 0) {
91
+ recommendations.push(`Replace ${heavyDeps.length} heavy dependenc${heavyDeps.length === 1 ? "y" : "ies"} with lighter alternatives`);
92
+ }
93
+ if (largeAssets.length > 0) {
94
+ recommendations.push(`Optimize ${largeAssets.length} large asset${largeAssets.length === 1 ? "" : "s"} (>500KB each)`);
95
+ recommendations.push("Convert PNG/JPEG assets to WebP for 30-50% size reduction");
96
+ }
97
+ if (deps.length > 50) {
98
+ recommendations.push(`${deps.length} production dependencies is high. Run npx depcheck to find unused packages.`);
99
+ }
100
+ if (deps.includes("lodash") && !deps.includes("lodash-es")) {
101
+ recommendations.push("Switch from lodash to lodash-es for proper tree shaking");
102
+ }
103
+ recommendations.push("Run `npx expo export` to measure actual bundle size");
104
+ return textResponse(JSON.stringify({
105
+ success: true,
106
+ summary: {
107
+ production_dependencies: deps.length,
108
+ dev_dependencies: devDeps.length,
109
+ heavy_packages_found: heavyDeps.length,
110
+ large_assets_found: largeAssets.length,
111
+ },
112
+ heavy_dependencies: heavyDeps,
113
+ large_assets: largeAssets,
114
+ recommendations,
115
+ }, null, 2));
116
+ }
117
+ catch (err) {
118
+ return errorResponse(err);
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=analyzeBundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeBundle.js","sourceRoot":"","sources":["../../src/tools/analyzeBundle.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ const inputSchema = {
41
41
  .describe("Target platform to check requirements for"),
42
42
  };
43
43
  export function register(server) {
44
- server.tool("mobile_checkDevEnvironment", "Detect installed mobile development tools, SDKs, and simulators. Report what is installed and what is missing with install instructions.", inputSchema, async (args) => {
44
+ server.tool("mobile_checkDevEnvironment", "Detect installed mobile development tools and SDKs (Node, Expo CLI, Watchman, Xcode, Android Studio, JDK). Report what is installed and what is missing with install instructions.", inputSchema, async (args) => {
45
45
  try {
46
46
  const os = platform();
47
47
  const targetPlatform = args.target_platform;
@@ -1 +1 @@
1
- {"version":3,"file":"checkDevEnvironment.js","sourceRoot":"","sources":["../../src/tools/checkDevEnvironment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkDevEnvironment.js","sourceRoot":"","sources":["../../src/tools/checkDevEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS1D,MAAM,KAAK,GAAgB;IACzB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzD,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC/F,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;IACvF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE;CAC3D,CAAC;AAEF,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,EAAE;YACvB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,IAAI,CAAC;IAEP,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SAChC,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,2CAA2C,CAAC;CACzD,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,oLAAoL,EACpL,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;YAC5C,MAAM,OAAO,GAMR,EAAE,CAAC;YAER,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnD,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;oBACxC,OAAO,EAAE,MAAM,IAAI,GAAG;oBACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;YACrC,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;oBAC5C,OAAO,EAAE,UAAU,IAAI,GAAG;oBAC1B,QAAQ,EAAE,cAAc,KAAK,SAAS;oBACtC,IAAI,EAAE,UAAU;wBACd,CAAC,CAAC,gBAAgB,UAAU,EAAE;wBAC9B,CAAC,CAAC,uCAAuC;iBAC5C,CAAC,CAAC;YACL,CAAC;YAED,IAAI,EAAE,KAAK,QAAQ,IAAI,CAAC,cAAc,KAAK,KAAK,IAAI,cAAc,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,mBAAmB;oBACzB,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,GAAG;oBACZ,QAAQ,EAAE,KAAK;oBACf,IAAI,EAAE,8EAA8E;iBACrF,CAAC,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAE1D,MAAM,OAAO,GAAG;gBACd,EAAE;gBACF,eAAe,EAAE,cAAc;gBAC/B,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,SAAS,EAAE,SAAS,CAAC,MAAM;gBAC3B,OAAO,EAAE,OAAO,CAAC,MAAM;gBACvB,gBAAgB,EAAE,eAAe,CAAC,MAAM;gBACxC,KAAK,EAAE,eAAe,CAAC,MAAM,KAAK,CAAC;gBACnC,KAAK,EAAE,OAAO;aACf,CAAC;YAEF,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=configureOTA.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureOTA.d.ts","sourceRoot":"","sources":["../../src/tools/configureOTA.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6IhD"}
@@ -0,0 +1,118 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { textResponse, errorResponse } from "../types.js";
5
+ const inputSchema = {
6
+ project_path: z
7
+ .string()
8
+ .optional()
9
+ .describe("Absolute path to the Expo project root. Defaults to cwd."),
10
+ channel: z
11
+ .string()
12
+ .optional()
13
+ .default("production")
14
+ .describe("Default update channel name (default: production). Common values: production, staging, preview."),
15
+ runtime_version_policy: z
16
+ .enum(["appVersion", "nativeVersion", "fingerprint"])
17
+ .optional()
18
+ .default("fingerprint")
19
+ .describe("How to determine runtime version compatibility (default: fingerprint). fingerprint auto-detects native changes."),
20
+ };
21
+ export function register(server) {
22
+ server.tool("mobile_configureOTA", "Configure EAS Update for over-the-air JavaScript updates. Sets runtime version policy and update URL in app.json, and verifies eas.json channel config.", inputSchema, async (args) => {
23
+ try {
24
+ const root = args.project_path || process.cwd();
25
+ const appJsonPath = join(root, "app.json");
26
+ if (!existsSync(appJsonPath)) {
27
+ return errorResponse(new Error(`No app.json at ${root}. Is this an Expo project?`));
28
+ }
29
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
30
+ const expo = appJson.expo || {};
31
+ const projectId = expo.extra?.eas?.projectId;
32
+ if (!projectId) {
33
+ return textResponse(JSON.stringify({
34
+ success: false,
35
+ message: "No EAS project ID found. Run `eas init` to link this project to EAS.",
36
+ fix: "eas init",
37
+ }, null, 2));
38
+ }
39
+ const changes = [];
40
+ if (args.runtime_version_policy === "fingerprint") {
41
+ if (typeof expo.runtimeVersion !== "object" ||
42
+ expo.runtimeVersion?.policy !== "fingerprint") {
43
+ expo.runtimeVersion = { policy: "fingerprint" };
44
+ changes.push('Set runtimeVersion to { policy: "fingerprint" }');
45
+ }
46
+ }
47
+ else {
48
+ if (typeof expo.runtimeVersion !== "object" ||
49
+ expo.runtimeVersion?.policy !== args.runtime_version_policy) {
50
+ expo.runtimeVersion = { policy: args.runtime_version_policy };
51
+ changes.push(`Set runtimeVersion to { policy: "${args.runtime_version_policy}" }`);
52
+ }
53
+ }
54
+ if (!expo.updates) {
55
+ expo.updates = {};
56
+ }
57
+ const updateUrl = `https://u.expo.dev/${projectId}`;
58
+ if (expo.updates.url !== updateUrl) {
59
+ expo.updates.url = updateUrl;
60
+ changes.push(`Set updates.url to ${updateUrl}`);
61
+ }
62
+ if (expo.updates.enabled !== true) {
63
+ expo.updates.enabled = true;
64
+ changes.push("Enabled updates");
65
+ }
66
+ if (expo.updates.checkAutomatically !== "ON_LOAD") {
67
+ expo.updates.checkAutomatically = "ON_LOAD";
68
+ changes.push("Set checkAutomatically to ON_LOAD");
69
+ }
70
+ if (expo.updates.fallbackToCacheTimeout !== 0) {
71
+ expo.updates.fallbackToCacheTimeout = 0;
72
+ changes.push("Set fallbackToCacheTimeout to 0 (loads cached bundle immediately, downloads update in background)");
73
+ }
74
+ appJson.expo = expo;
75
+ if (changes.length > 0) {
76
+ writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + "\n", "utf-8");
77
+ }
78
+ const easJsonPath = join(root, "eas.json");
79
+ let easJsonWarning = null;
80
+ if (!existsSync(easJsonPath)) {
81
+ easJsonWarning =
82
+ "No eas.json found. Run `eas build:configure` to create it, then add channel config to your build profiles.";
83
+ }
84
+ else {
85
+ const easJson = JSON.parse(readFileSync(easJsonPath, "utf-8"));
86
+ const profiles = easJson.build || {};
87
+ const hasChannel = Object.values(profiles).some((p) => p.channel);
88
+ if (!hasChannel) {
89
+ easJsonWarning = `No channel configured in eas.json build profiles. Add "channel": "${args.channel}" to your production profile.`;
90
+ }
91
+ }
92
+ return textResponse(JSON.stringify({
93
+ success: true,
94
+ message: changes.length > 0
95
+ ? "EAS Update configured in app.json"
96
+ : "EAS Update already configured, no changes needed",
97
+ changes,
98
+ config: {
99
+ runtime_version_policy: args.runtime_version_policy,
100
+ update_url: `https://u.expo.dev/${projectId}`,
101
+ channel: args.channel,
102
+ },
103
+ eas_json_warning: easJsonWarning,
104
+ next_steps: [
105
+ `Ensure eas.json production profile has "channel": "${args.channel}"`,
106
+ "Create a production build: eas build --platform all --profile production",
107
+ `Publish an update: eas update --channel ${args.channel} --message "description"`,
108
+ "For staged rollouts: eas update --channel production --rollout-percentage 10",
109
+ "Monitor updates at https://expo.dev",
110
+ ],
111
+ }, null, 2));
112
+ }
113
+ catch (err) {
114
+ return errorResponse(err);
115
+ }
116
+ });
117
+ }
118
+ //# sourceMappingURL=configureOTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureOTA.js","sourceRoot":"","sources":["../../src/tools/configureOTA.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=generateForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateForm.d.ts","sourceRoot":"","sources":["../../src/tools/generateForm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6RzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwFhD"}