@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
@@ -0,0 +1,311 @@
1
+ import { z } from "zod";
2
+ import { writeFileSync, mkdirSync, 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 project root. Defaults to cwd."),
10
+ provider: z
11
+ .enum(["websocket", "supabase", "socketio"])
12
+ .optional()
13
+ .default("websocket")
14
+ .describe("Real-time provider (default: websocket)."),
15
+ output_directory: z
16
+ .string()
17
+ .optional()
18
+ .default("lib")
19
+ .describe("Output directory relative to project root (default: lib)."),
20
+ };
21
+ function generateWebSocketClient() {
22
+ return `type MessageHandler = (data: unknown) => void;
23
+
24
+ interface WebSocketClientOptions {
25
+ url: string;
26
+ reconnect?: boolean;
27
+ maxRetries?: number;
28
+ onOpen?: () => void;
29
+ onClose?: () => void;
30
+ onError?: (error: Event) => void;
31
+ }
32
+
33
+ export class RealtimeClient {
34
+ private ws: WebSocket | null = null;
35
+ private handlers = new Map<string, Set<MessageHandler>>();
36
+ private retryCount = 0;
37
+ private url: string;
38
+ private options: WebSocketClientOptions;
39
+
40
+ constructor(options: WebSocketClientOptions) {
41
+ this.url = options.url;
42
+ this.options = {
43
+ reconnect: true,
44
+ maxRetries: 5,
45
+ ...options,
46
+ };
47
+ }
48
+
49
+ connect(): void {
50
+ this.ws = new WebSocket(this.url);
51
+
52
+ this.ws.onopen = () => {
53
+ this.retryCount = 0;
54
+ this.options.onOpen?.();
55
+ };
56
+
57
+ this.ws.onmessage = (event) => {
58
+ try {
59
+ const message = JSON.parse(event.data as string) as {
60
+ type: string;
61
+ payload: unknown;
62
+ };
63
+ const listeners = this.handlers.get(message.type);
64
+ if (listeners) {
65
+ for (const handler of listeners) {
66
+ handler(message.payload);
67
+ }
68
+ }
69
+ } catch {
70
+ // Non-JSON message, ignore
71
+ }
72
+ };
73
+
74
+ this.ws.onclose = () => {
75
+ this.options.onClose?.();
76
+ if (this.options.reconnect && this.retryCount < (this.options.maxRetries ?? 5)) {
77
+ const delay = Math.min(1000 * 2 ** this.retryCount, 30000);
78
+ this.retryCount++;
79
+ setTimeout(() => this.connect(), delay);
80
+ }
81
+ };
82
+
83
+ this.ws.onerror = (error) => {
84
+ this.options.onError?.(error);
85
+ };
86
+ }
87
+
88
+ on(event: string, handler: MessageHandler): () => void {
89
+ if (!this.handlers.has(event)) {
90
+ this.handlers.set(event, new Set());
91
+ }
92
+ this.handlers.get(event)!.add(handler);
93
+
94
+ return () => {
95
+ this.handlers.get(event)?.delete(handler);
96
+ };
97
+ }
98
+
99
+ send(type: string, payload: unknown): void {
100
+ if (this.ws?.readyState === WebSocket.OPEN) {
101
+ this.ws.send(JSON.stringify({ type, payload }));
102
+ }
103
+ }
104
+
105
+ disconnect(): void {
106
+ this.options.reconnect = false;
107
+ this.ws?.close();
108
+ this.ws = null;
109
+ this.handlers.clear();
110
+ }
111
+ }
112
+ `;
113
+ }
114
+ function generateSupabaseRealtimeClient() {
115
+ return `import { createClient, type RealtimeChannel } from "@supabase/supabase-js";
116
+
117
+ const supabaseUrl = process.env.EXPO_PUBLIC_SUPABASE_URL!;
118
+ const supabaseAnonKey = process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY!;
119
+
120
+ const supabase = createClient(supabaseUrl, supabaseAnonKey);
121
+
122
+ type ChangeHandler<T> = (payload: {
123
+ eventType: "INSERT" | "UPDATE" | "DELETE";
124
+ new: T;
125
+ old: T;
126
+ }) => void;
127
+
128
+ type PresenceHandler = (state: Record<string, unknown[]>) => void;
129
+
130
+ export class RealtimeClient {
131
+ private channels = new Map<string, RealtimeChannel>();
132
+
133
+ subscribeToTable<T extends Record<string, unknown>>(
134
+ table: string,
135
+ onChange: ChangeHandler<T>,
136
+ filter?: string,
137
+ ): () => void {
138
+ const channel = supabase
139
+ .channel(\`table-\${table}\`)
140
+ .on(
141
+ "postgres_changes" as any,
142
+ {
143
+ event: "*",
144
+ schema: "public",
145
+ table,
146
+ ...(filter ? { filter } : {}),
147
+ },
148
+ (payload: any) => {
149
+ onChange({
150
+ eventType: payload.eventType,
151
+ new: payload.new as T,
152
+ old: payload.old as T,
153
+ });
154
+ },
155
+ )
156
+ .subscribe();
157
+
158
+ this.channels.set(table, channel);
159
+
160
+ return () => {
161
+ supabase.removeChannel(channel);
162
+ this.channels.delete(table);
163
+ };
164
+ }
165
+
166
+ joinPresence(
167
+ roomId: string,
168
+ userState: Record<string, unknown>,
169
+ onSync: PresenceHandler,
170
+ ): () => void {
171
+ const channel = supabase
172
+ .channel(\`presence-\${roomId}\`)
173
+ .on("presence", { event: "sync" }, () => {
174
+ const state = channel.presenceState();
175
+ onSync(state);
176
+ })
177
+ .subscribe(async (status) => {
178
+ if (status === "SUBSCRIBED") {
179
+ await channel.track(userState);
180
+ }
181
+ });
182
+
183
+ this.channels.set(\`presence-\${roomId}\`, channel);
184
+
185
+ return () => {
186
+ supabase.removeChannel(channel);
187
+ this.channels.delete(\`presence-\${roomId}\`);
188
+ };
189
+ }
190
+
191
+ disconnectAll(): void {
192
+ for (const channel of this.channels.values()) {
193
+ supabase.removeChannel(channel);
194
+ }
195
+ this.channels.clear();
196
+ }
197
+ }
198
+ `;
199
+ }
200
+ function generateSocketIOClient() {
201
+ return `import { io, type Socket } from "socket.io-client";
202
+
203
+ type EventHandler = (...args: unknown[]) => void;
204
+
205
+ interface SocketClientOptions {
206
+ url: string;
207
+ auth?: Record<string, string>;
208
+ reconnect?: boolean;
209
+ }
210
+
211
+ export class RealtimeClient {
212
+ private socket: Socket | null = null;
213
+ private options: SocketClientOptions;
214
+
215
+ constructor(options: SocketClientOptions) {
216
+ this.options = options;
217
+ }
218
+
219
+ connect(): void {
220
+ this.socket = io(this.options.url, {
221
+ auth: this.options.auth,
222
+ reconnection: this.options.reconnect ?? true,
223
+ reconnectionAttempts: 5,
224
+ reconnectionDelay: 1000,
225
+ reconnectionDelayMax: 30000,
226
+ });
227
+ }
228
+
229
+ on(event: string, handler: EventHandler): () => void {
230
+ this.socket?.on(event, handler);
231
+ return () => {
232
+ this.socket?.off(event, handler);
233
+ };
234
+ }
235
+
236
+ emit(event: string, ...args: unknown[]): void {
237
+ this.socket?.emit(event, ...args);
238
+ }
239
+
240
+ joinRoom(room: string): void {
241
+ this.socket?.emit("join", room);
242
+ }
243
+
244
+ leaveRoom(room: string): void {
245
+ this.socket?.emit("leave", room);
246
+ }
247
+
248
+ disconnect(): void {
249
+ this.socket?.disconnect();
250
+ this.socket = null;
251
+ }
252
+ }
253
+ `;
254
+ }
255
+ export function register(server) {
256
+ server.tool("mobile_setupRealtime", "Add a real-time client module with connection management, event subscriptions, reconnection, and cleanup. Supports raw WebSocket, Supabase Realtime, and Socket.IO.", inputSchema, async (args) => {
257
+ try {
258
+ const root = args.project_path || process.cwd();
259
+ const outDir = join(root, args.output_directory);
260
+ mkdirSync(outDir, { recursive: true });
261
+ const fileName = "realtime-client.ts";
262
+ const filePath = join(outDir, fileName);
263
+ if (existsSync(filePath)) {
264
+ return errorResponse(new Error(`File already exists: ${filePath}`));
265
+ }
266
+ let content;
267
+ let dependencies;
268
+ switch (args.provider) {
269
+ case "supabase":
270
+ content = generateSupabaseRealtimeClient();
271
+ dependencies = ["@supabase/supabase-js"];
272
+ break;
273
+ case "socketio":
274
+ content = generateSocketIOClient();
275
+ dependencies = ["socket.io-client"];
276
+ break;
277
+ default:
278
+ content = generateWebSocketClient();
279
+ dependencies = [];
280
+ break;
281
+ }
282
+ writeFileSync(filePath, content, "utf-8");
283
+ const nextSteps = [];
284
+ if (dependencies.length > 0) {
285
+ nextSteps.push(`Install dependencies: npx expo install ${dependencies.join(" ")}`);
286
+ }
287
+ switch (args.provider) {
288
+ case "supabase":
289
+ nextSteps.push("Set EXPO_PUBLIC_SUPABASE_URL and EXPO_PUBLIC_SUPABASE_ANON_KEY in .env", "Enable Realtime on your table in the Supabase dashboard", "Use subscribeToTable() to listen for INSERT/UPDATE/DELETE events", "Use joinPresence() for user presence and typing indicators");
290
+ break;
291
+ case "socketio":
292
+ nextSteps.push("Create a new RealtimeClient({ url: 'wss://your-server' })", "Call connect() to establish the connection", "Use on() to subscribe and emit() to send events", "Call disconnect() in your cleanup/unmount");
293
+ break;
294
+ default:
295
+ nextSteps.push("Create a new RealtimeClient({ url: 'wss://your-server/ws' })", "Call connect() to establish the WebSocket connection", "Use on() to subscribe to typed events and send() to publish", "Call disconnect() in your cleanup/unmount", "Reconnection with exponential backoff is built in");
296
+ break;
297
+ }
298
+ return textResponse(JSON.stringify({
299
+ success: true,
300
+ provider: args.provider,
301
+ file_created: filePath,
302
+ dependencies_needed: dependencies.length > 0 ? dependencies : undefined,
303
+ next_steps: nextSteps,
304
+ }, null, 2));
305
+ }
306
+ catch (err) {
307
+ return errorResponse(err);
308
+ }
309
+ });
310
+ }
311
+ //# sourceMappingURL=setupRealtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupRealtime.js","sourceRoot":"","sources":["../../src/tools/setupRealtime.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ const inputSchema = {
18
18
  .describe("App Store Connect app ID (numeric). Falls back to EAS config."),
19
19
  };
20
20
  export function register(server) {
21
- server.tool("mobile_submitToAppStore", "Submit the latest iOS production build to App Store Connect via EAS Submit. Validates that EAS CLI is available and a recent build exists.", inputSchema, async (args) => {
21
+ server.tool("mobile_submitToAppStore", "Submit the latest iOS production build to App Store Connect via EAS Submit. Validates that EAS CLI is available.", inputSchema, async (args) => {
22
22
  try {
23
23
  const root = args.project_path || process.cwd();
24
24
  if (!existsSync(join(root, "app.json"))) {
@@ -1 +1 @@
1
- {"version":3,"file":"submitToAppStore.js","sourceRoot":"","sources":["../../src/tools/submitToAppStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submitToAppStore.js","sourceRoot":"","sources":["../../src/tools/submitToAppStore.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=submitToPlayStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitToPlayStore.d.ts","sourceRoot":"","sources":["../../src/tools/submitToPlayStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8GhD"}
@@ -0,0 +1,92 @@
1
+ import { z } from "zod";
2
+ import { execSync } from "node:child_process";
3
+ import { readFileSync, existsSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { textResponse, errorResponse } from "../types.js";
6
+ const inputSchema = {
7
+ project_path: z
8
+ .string()
9
+ .optional()
10
+ .describe("Absolute path to the Expo project root. Defaults to cwd."),
11
+ track: z
12
+ .enum(["internal", "alpha", "beta", "production"])
13
+ .optional()
14
+ .default("internal")
15
+ .describe("Play Console release track (default: internal). Use internal for testing, production for public release."),
16
+ };
17
+ export function register(server) {
18
+ server.tool("mobile_submitToPlayStore", "Submit the latest Android production build to Google Play Console via EAS Submit. Validates that EAS CLI is available and app.json has an Android package.", inputSchema, async (args) => {
19
+ try {
20
+ const root = args.project_path || process.cwd();
21
+ const appJsonPath = join(root, "app.json");
22
+ if (!existsSync(appJsonPath)) {
23
+ return errorResponse(new Error(`No app.json at ${root}. Is this an Expo project?`));
24
+ }
25
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
26
+ const androidPackage = appJson.expo?.android?.package;
27
+ if (!androidPackage) {
28
+ return textResponse(JSON.stringify({
29
+ success: false,
30
+ message: "Missing expo.android.package in app.json. Set it before submitting.",
31
+ example: "com.example.myapp",
32
+ }, null, 2));
33
+ }
34
+ try {
35
+ execSync("npx eas-cli --version", {
36
+ encoding: "utf-8",
37
+ stdio: ["pipe", "pipe", "pipe"],
38
+ timeout: 15000,
39
+ });
40
+ }
41
+ catch {
42
+ return textResponse(JSON.stringify({
43
+ success: false,
44
+ message: "EAS CLI not found. Install with: npm install -g eas-cli",
45
+ }, null, 2));
46
+ }
47
+ const cmd = `npx eas-cli submit --platform android --non-interactive`;
48
+ try {
49
+ const output = execSync(cmd, {
50
+ cwd: root,
51
+ encoding: "utf-8",
52
+ timeout: 300000,
53
+ stdio: ["pipe", "pipe", "pipe"],
54
+ });
55
+ return textResponse(JSON.stringify({
56
+ success: true,
57
+ message: `Build submitted to Google Play Console (${args.track} track)`,
58
+ package: androidPackage,
59
+ track: args.track,
60
+ output: output.slice(-1000),
61
+ next_steps: [
62
+ `Check Play Console for the build on the ${args.track} track`,
63
+ "Add release notes in Play Console",
64
+ args.track === "internal"
65
+ ? "Share the internal test link with testers"
66
+ : "Monitor the staged rollout in Play Console",
67
+ "If on internal/alpha/beta, promote to production when ready",
68
+ ],
69
+ }, null, 2));
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof Error ? err.message : String(err);
73
+ return textResponse(JSON.stringify({
74
+ success: false,
75
+ message: "Submission failed",
76
+ error: message.slice(-1000),
77
+ troubleshooting: [
78
+ "Ensure you have a recent production build: eas build --platform android --profile production",
79
+ "Check Play Console service account: eas credentials --platform android",
80
+ "Verify the service account JSON key has Play Console API access",
81
+ "The app must be created in Play Console before first submission",
82
+ "First submission requires manual upload via Play Console",
83
+ ],
84
+ }, null, 2));
85
+ }
86
+ }
87
+ catch (err) {
88
+ return errorResponse(err);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=submitToPlayStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitToPlayStore.js","sourceRoot":"","sources":["../../src/tools/submitToPlayStore.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ const inputSchema = {
14
14
  .describe("Which platform to validate metadata for"),
15
15
  };
16
16
  export function register(server) {
17
- server.tool("mobile_validateStoreMetadata", "Check that an Expo project has all required app store listing fields: name, bundle ID, version, icon, splash, privacy policy. Returns a pass/fail checklist.", inputSchema, async (args) => {
17
+ server.tool("mobile_validateStoreMetadata", "Check that an Expo project has all required app store listing fields: name, bundle ID, version, icon, splash screen. Returns a pass/fail checklist.", inputSchema, async (args) => {
18
18
  try {
19
19
  const root = args.project_path || process.cwd();
20
20
  const appJsonPath = join(root, "app.json");
@@ -1 +1 @@
1
- {"version":3,"file":"validateStoreMetadata.js","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validateStoreMetadata.js","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tmhs/mobile-mcp",
3
- "version": "0.6.0",
4
- "description": "MCP server for mobile app development - 12 tools for environment checks, project scaffolding, device deployment, screen/component generation, dependency installation, permissions, AI integration, build health, push notifications, deep links, and dev environment reset.",
3
+ "version": "0.9.0",
4
+ "description": "MCP server for mobile app development - 26 tools for environment checks, project scaffolding, device deployment, screen/component generation, dependency installation, permissions, AI integration, build health, push notifications, deep links, dev environment reset, store builds, metadata validation, App Store submission, Play Store submission, screenshot capture, bundle analysis, OTA update configuration, test execution, CI/CD setup, test file generation, i18n setup, map integration, form generation, and real-time client setup.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {