@tmhs/mobile-mcp 0.3.0 → 0.4.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.
package/dist/index.js CHANGED
@@ -10,9 +10,12 @@ import { register as registerInstallDependency } from "./tools/installDependency
10
10
  import { register as registerAddPermission } from "./tools/addPermission.js";
11
11
  import { register as registerIntegrateAI } from "./tools/integrateAI.js";
12
12
  import { register as registerCheckBuildHealth } from "./tools/checkBuildHealth.js";
13
+ import { register as registerAddPushNotifications } from "./tools/addPushNotifications.js";
14
+ import { register as registerConfigureDeepLinks } from "./tools/configureDeepLinks.js";
15
+ import { register as registerResetDevEnvironment } from "./tools/resetDevEnvironment.js";
13
16
  const server = new McpServer({
14
17
  name: "mobile-mcp",
15
- version: "0.3.0",
18
+ version: "0.4.0",
16
19
  });
17
20
  registerCheckDevEnvironment(server);
18
21
  registerScaffoldProject(server);
@@ -23,6 +26,9 @@ registerInstallDependency(server);
23
26
  registerAddPermission(server);
24
27
  registerIntegrateAI(server);
25
28
  registerCheckBuildHealth(server);
29
+ registerAddPushNotifications(server);
30
+ registerConfigureDeepLinks(server);
31
+ registerResetDevEnvironment(server);
26
32
  async function main() {
27
33
  const transport = new StdioServerTransport();
28
34
  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;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;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":";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;AAEzF,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;AAEpC,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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=addPushNotifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addPushNotifications.d.ts","sourceRoot":"","sources":["../../src/tools/addPushNotifications.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4DzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2EhD"}
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, 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 Expo project root. Defaults to cwd."),
10
+ channel_name: z
11
+ .string()
12
+ .optional()
13
+ .default("default")
14
+ .describe("Android notification channel name"),
15
+ };
16
+ const NOTIFICATION_HANDLER_CODE = `import * as Notifications from "expo-notifications";
17
+ import * as Device from "expo-device";
18
+ import Constants from "expo-constants";
19
+ import { Platform } from "react-native";
20
+
21
+ Notifications.setNotificationHandler({
22
+ handleNotification: async () => ({
23
+ shouldShowAlert: true,
24
+ shouldPlaySound: true,
25
+ shouldSetBadge: true,
26
+ }),
27
+ });
28
+
29
+ export async function registerForPushNotifications(): Promise<string | null> {
30
+ if (!Device.isDevice) {
31
+ console.warn("Push notifications require a physical device");
32
+ return null;
33
+ }
34
+
35
+ const { status: existing } = await Notifications.getPermissionsAsync();
36
+ let finalStatus = existing;
37
+
38
+ if (existing !== "granted") {
39
+ const { status } = await Notifications.requestPermissionsAsync();
40
+ finalStatus = status;
41
+ }
42
+
43
+ if (finalStatus !== "granted") {
44
+ return null;
45
+ }
46
+
47
+ if (Platform.OS === "android") {
48
+ await Notifications.setNotificationChannelAsync("default", {
49
+ name: "Default",
50
+ importance: Notifications.AndroidImportance.MAX,
51
+ vibrationPattern: [0, 250, 250, 250],
52
+ });
53
+ }
54
+
55
+ const projectId = Constants.expoConfig?.extra?.eas?.projectId;
56
+ const token = await Notifications.getExpoPushTokenAsync({ projectId });
57
+ return token.data;
58
+ }
59
+ `;
60
+ export function register(server) {
61
+ server.tool("mobile_addPushNotifications", "Wire up push notifications in an Expo project: add plugin to app.json, create notification handler utility, configure Android channel.", inputSchema, async (args) => {
62
+ try {
63
+ const root = args.project_path || process.cwd();
64
+ const appJsonPath = join(root, "app.json");
65
+ if (!existsSync(appJsonPath)) {
66
+ return errorResponse(new Error(`No app.json found at ${root}. Is this an Expo project?`));
67
+ }
68
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
69
+ if (!appJson.expo)
70
+ appJson.expo = {};
71
+ if (!appJson.expo.plugins)
72
+ appJson.expo.plugins = [];
73
+ const hasPlugin = appJson.expo.plugins.some((p) => (Array.isArray(p) && p[0] === "expo-notifications") ||
74
+ p === "expo-notifications");
75
+ if (!hasPlugin) {
76
+ appJson.expo.plugins.push([
77
+ "expo-notifications",
78
+ {
79
+ icon: "./assets/notification-icon.png",
80
+ color: "#ffffff",
81
+ defaultChannel: args.channel_name,
82
+ },
83
+ ]);
84
+ }
85
+ if (!appJson.expo.android)
86
+ appJson.expo.android = {};
87
+ appJson.expo.android.useNextNotificationsApi = true;
88
+ writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + "\n");
89
+ const libDir = join(root, "lib");
90
+ mkdirSync(libDir, { recursive: true });
91
+ const handlerFile = join(libDir, "notifications.ts");
92
+ let handlerCreated = false;
93
+ if (!existsSync(handlerFile)) {
94
+ writeFileSync(handlerFile, NOTIFICATION_HANDLER_CODE);
95
+ handlerCreated = true;
96
+ }
97
+ const result = {
98
+ success: true,
99
+ app_json_updated: true,
100
+ notification_plugin_added: !hasPlugin,
101
+ handler_file: handlerCreated ? handlerFile : null,
102
+ channel_name: args.channel_name,
103
+ next_steps: [
104
+ "Install packages: npx expo install expo-notifications expo-device expo-constants",
105
+ "Run npx expo prebuild to regenerate native projects",
106
+ handlerCreated
107
+ ? "Import registerForPushNotifications from lib/notifications.ts in your root layout"
108
+ : "Notification handler already exists",
109
+ "Create assets/notification-icon.png (96x96, white on transparent, Android only)",
110
+ "Send push token to your backend after registration",
111
+ ],
112
+ };
113
+ return textResponse(JSON.stringify(result, null, 2));
114
+ }
115
+ catch (err) {
116
+ return errorResponse(err);
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=addPushNotifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addPushNotifications.js","sourceRoot":"","sources":["../../src/tools/addPushNotifications.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0DAA0D,CAAC;IACvE,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,mCAAmC,CAAC;CACjD,CAAC;AAEF,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CjC,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,wIAAwI,EACxI,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE3C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,OAAO,aAAa,CAClB,IAAI,KAAK,CAAC,wBAAwB,IAAI,4BAA4B,CAAC,CACpE,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YAErD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CACzC,CAAC,CAAU,EAAE,EAAE,CACb,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,oBAAoB,CAAC;gBACnD,CAAC,KAAK,oBAAoB,CAC7B,CAAC;YAEF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBACxB,oBAAoB;oBACpB;wBACE,IAAI,EAAE,gCAAgC;wBACtC,KAAK,EAAE,SAAS;wBAChB,cAAc,EAAE,IAAI,CAAC,YAAY;qBAClC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;YAEpD,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACrD,IAAI,cAAc,GAAG,KAAK,CAAC;YAE3B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC7B,aAAa,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;gBACtD,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,IAAI;gBACb,gBAAgB,EAAE,IAAI;gBACtB,yBAAyB,EAAE,CAAC,SAAS;gBACrC,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;gBACjD,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE;oBACV,kFAAkF;oBAClF,qDAAqD;oBACrD,cAAc;wBACZ,CAAC,CAAC,mFAAmF;wBACrF,CAAC,CAAC,qCAAqC;oBACzC,iFAAiF;oBACjF,oDAAoD;iBACrD;aACF,CAAC;YAEF,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,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=configureDeepLinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureDeepLinks.d.ts","sourceRoot":"","sources":["../../src/tools/configureDeepLinks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8BzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8FhD"}
@@ -0,0 +1,112 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { textResponse, errorResponse } from "../types.js";
5
+ const inputSchema = {
6
+ scheme: z
7
+ .string()
8
+ .describe("URL scheme for deep linking (e.g. 'myapp')"),
9
+ domain: z
10
+ .string()
11
+ .optional()
12
+ .describe("Domain for universal/app links (e.g. 'example.com'). Omit for scheme-only deep links."),
13
+ project_path: z
14
+ .string()
15
+ .optional()
16
+ .describe("Absolute path to the Expo project root. Defaults to cwd."),
17
+ };
18
+ const AASA_TEMPLATE = `{
19
+ "applinks": {
20
+ "apps": [],
21
+ "details": [
22
+ {
23
+ "appIDs": ["TEAM_ID.BUNDLE_ID"],
24
+ "paths": ["*"]
25
+ }
26
+ ]
27
+ }
28
+ }
29
+ `;
30
+ export function register(server) {
31
+ server.tool("mobile_configureDeepLinks", "Configure deep linking for an Expo project: set scheme, add intent filters for Android App Links, add associated domains for iOS Universal Links.", inputSchema, async (args) => {
32
+ try {
33
+ const root = args.project_path || process.cwd();
34
+ const appJsonPath = join(root, "app.json");
35
+ if (!existsSync(appJsonPath)) {
36
+ return errorResponse(new Error(`No app.json found at ${root}. Is this an Expo project?`));
37
+ }
38
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
39
+ if (!appJson.expo)
40
+ appJson.expo = {};
41
+ appJson.expo.scheme = args.scheme;
42
+ const filesCreated = [];
43
+ if (args.domain) {
44
+ if (!appJson.expo.ios)
45
+ appJson.expo.ios = {};
46
+ appJson.expo.ios.associatedDomains = [
47
+ `applinks:${args.domain}`,
48
+ ];
49
+ if (!appJson.expo.android)
50
+ appJson.expo.android = {};
51
+ appJson.expo.android.intentFilters = [
52
+ {
53
+ action: "VIEW",
54
+ autoVerify: true,
55
+ data: [
56
+ {
57
+ scheme: "https",
58
+ host: args.domain,
59
+ pathPrefix: "/",
60
+ },
61
+ ],
62
+ category: ["BROWSABLE", "DEFAULT"],
63
+ },
64
+ ];
65
+ const wellKnownDir = join(root, "docs", ".well-known");
66
+ mkdirSync(wellKnownDir, { recursive: true });
67
+ const aasaFile = join(wellKnownDir, "apple-app-site-association");
68
+ if (!existsSync(aasaFile)) {
69
+ writeFileSync(aasaFile, AASA_TEMPLATE);
70
+ filesCreated.push(aasaFile);
71
+ }
72
+ }
73
+ writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + "\n");
74
+ const result = {
75
+ success: true,
76
+ scheme: args.scheme,
77
+ domain: args.domain || null,
78
+ app_json_updated: true,
79
+ files_created: filesCreated,
80
+ deep_link_examples: [
81
+ `${args.scheme}://` + " (opens app root)",
82
+ `${args.scheme}://settings` + " (opens /settings route)",
83
+ `${args.scheme}://chat/123` + " (opens /chat/[id] with id=123)",
84
+ ],
85
+ universal_link_examples: args.domain
86
+ ? [
87
+ `https://${args.domain}/settings`,
88
+ `https://${args.domain}/chat/123`,
89
+ ]
90
+ : [],
91
+ next_steps: [
92
+ "Run npx expo prebuild to regenerate native projects",
93
+ args.domain
94
+ ? `Host the apple-app-site-association file at https://${args.domain}/.well-known/apple-app-site-association`
95
+ : null,
96
+ args.domain
97
+ ? "Replace TEAM_ID.BUNDLE_ID in the AASA file with your Apple Team ID and bundle identifier"
98
+ : null,
99
+ args.domain
100
+ ? `Verify Android App Links at https://developers.google.com/digital-asset-links/tools/generator for ${args.domain}`
101
+ : null,
102
+ "Expo Router handles route matching automatically from the file system",
103
+ ].filter(Boolean),
104
+ };
105
+ return textResponse(JSON.stringify(result, null, 2));
106
+ }
107
+ catch (err) {
108
+ return errorResponse(err);
109
+ }
110
+ });
111
+ }
112
+ //# sourceMappingURL=configureDeepLinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureDeepLinks.js","sourceRoot":"","sources":["../../src/tools/configureDeepLinks.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=resetDevEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetDevEnvironment.d.ts","sourceRoot":"","sources":["../../src/tools/resetDevEnvironment.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoCzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiJhD"}
@@ -0,0 +1,163 @@
1
+ import { z } from "zod";
2
+ import { execSync } from "node:child_process";
3
+ import { existsSync, rmSync } 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
+ include_pods: z
12
+ .boolean()
13
+ .optional()
14
+ .default(false)
15
+ .describe("Remove ios/Pods and run pod install (macOS only)"),
16
+ include_gradle: z
17
+ .boolean()
18
+ .optional()
19
+ .default(false)
20
+ .describe("Clean Android Gradle build cache"),
21
+ };
22
+ function safeRemove(path) {
23
+ if (!existsSync(path))
24
+ return false;
25
+ try {
26
+ rmSync(path, { recursive: true, force: true });
27
+ return true;
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ }
33
+ export function register(server) {
34
+ server.tool("mobile_resetDevEnvironment", "Nuclear reset for a stuck Expo dev environment: clear Metro cache, node_modules cache, .expo directory, and optionally iOS Pods and Android Gradle cache.", inputSchema, async (args) => {
35
+ try {
36
+ const root = args.project_path || process.cwd();
37
+ const steps = [];
38
+ if (!existsSync(join(root, "package.json"))) {
39
+ return errorResponse(new Error(`No package.json at ${root}. Is this a project root?`));
40
+ }
41
+ // Metro cache
42
+ const metroCache = join(root, "node_modules", ".cache", "metro");
43
+ steps.push({
44
+ name: "Metro cache",
45
+ status: safeRemove(metroCache) ? "cleaned" : "skipped",
46
+ message: safeRemove(metroCache)
47
+ ? "Removed node_modules/.cache/metro"
48
+ : "Metro cache not found",
49
+ });
50
+ // General node_modules cache
51
+ const nmCache = join(root, "node_modules", ".cache");
52
+ if (existsSync(nmCache)) {
53
+ safeRemove(nmCache);
54
+ steps.push({
55
+ name: "node_modules/.cache",
56
+ status: "cleaned",
57
+ message: "Removed all cached build artifacts",
58
+ });
59
+ }
60
+ else {
61
+ steps.push({
62
+ name: "node_modules/.cache",
63
+ status: "skipped",
64
+ message: "No cache directory found",
65
+ });
66
+ }
67
+ // .expo directory
68
+ const expoDir = join(root, ".expo");
69
+ steps.push({
70
+ name: ".expo directory",
71
+ status: safeRemove(expoDir) ? "cleaned" : "skipped",
72
+ message: existsSync(expoDir)
73
+ ? "Removed .expo directory"
74
+ : ".expo directory not found",
75
+ });
76
+ // Temp directory
77
+ const tmpDir = join(root, "tmp");
78
+ if (existsSync(tmpDir)) {
79
+ safeRemove(tmpDir);
80
+ steps.push({
81
+ name: "tmp directory",
82
+ status: "cleaned",
83
+ message: "Removed tmp directory",
84
+ });
85
+ }
86
+ // iOS Pods
87
+ if (args.include_pods) {
88
+ const podsDir = join(root, "ios", "Pods");
89
+ const podfileLock = join(root, "ios", "Podfile.lock");
90
+ if (existsSync(podsDir)) {
91
+ safeRemove(podsDir);
92
+ if (existsSync(podfileLock))
93
+ safeRemove(podfileLock);
94
+ try {
95
+ execSync("pod install", {
96
+ cwd: join(root, "ios"),
97
+ encoding: "utf-8",
98
+ timeout: 120000,
99
+ stdio: ["pipe", "pipe", "pipe"],
100
+ });
101
+ steps.push({
102
+ name: "iOS Pods",
103
+ status: "cleaned",
104
+ message: "Removed Pods, reinstalled via pod install",
105
+ });
106
+ }
107
+ catch {
108
+ steps.push({
109
+ name: "iOS Pods",
110
+ status: "error",
111
+ message: "Removed Pods but pod install failed. Run manually: cd ios && pod install",
112
+ });
113
+ }
114
+ }
115
+ else {
116
+ steps.push({
117
+ name: "iOS Pods",
118
+ status: "skipped",
119
+ message: "ios/Pods not found",
120
+ });
121
+ }
122
+ }
123
+ // Android Gradle cache
124
+ if (args.include_gradle) {
125
+ const gradleBuild = join(root, "android", "build");
126
+ const appBuild = join(root, "android", "app", "build");
127
+ let cleaned = false;
128
+ if (existsSync(gradleBuild)) {
129
+ safeRemove(gradleBuild);
130
+ cleaned = true;
131
+ }
132
+ if (existsSync(appBuild)) {
133
+ safeRemove(appBuild);
134
+ cleaned = true;
135
+ }
136
+ steps.push({
137
+ name: "Android Gradle",
138
+ status: cleaned ? "cleaned" : "skipped",
139
+ message: cleaned
140
+ ? "Removed android/build and android/app/build"
141
+ : "Android build directories not found",
142
+ });
143
+ }
144
+ const cleaned = steps.filter((s) => s.status === "cleaned").length;
145
+ const result = {
146
+ success: true,
147
+ project_path: root,
148
+ summary: `${cleaned} of ${steps.length} items cleaned`,
149
+ steps,
150
+ next_steps: [
151
+ "Run: npx expo start --clear",
152
+ "If issues persist: rm -rf node_modules && npm install",
153
+ "For native rebuild: npx expo prebuild --clean",
154
+ ],
155
+ };
156
+ return textResponse(JSON.stringify(result, null, 2));
157
+ }
158
+ catch (err) {
159
+ return errorResponse(err);
160
+ }
161
+ });
162
+ }
163
+ //# sourceMappingURL=resetDevEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resetDevEnvironment.js","sourceRoot":"","sources":["../../src/tools/resetDevEnvironment.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.3.0",
4
- "description": "MCP server for mobile app development - 9 tools for environment checks, project scaffolding, device deployment, screen/component generation, dependency installation, permissions, AI integration, and build health checks.",
3
+ "version": "0.4.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.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {