@tmhs/mobile-mcp 0.5.0 → 0.7.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 (38) hide show
  1. package/dist/index.js +15 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/tools/analyzeBundle.d.ts +3 -0
  4. package/dist/tools/analyzeBundle.d.ts.map +1 -0
  5. package/dist/tools/analyzeBundle.js +122 -0
  6. package/dist/tools/analyzeBundle.js.map +1 -0
  7. package/dist/tools/buildForStore.d.ts +3 -0
  8. package/dist/tools/buildForStore.d.ts.map +1 -0
  9. package/dist/tools/buildForStore.js +99 -0
  10. package/dist/tools/buildForStore.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/generateScreenshots.d.ts +3 -0
  18. package/dist/tools/generateScreenshots.d.ts.map +1 -0
  19. package/dist/tools/generateScreenshots.js +128 -0
  20. package/dist/tools/generateScreenshots.js.map +1 -0
  21. package/dist/tools/runOnDevice.d.ts.map +1 -1
  22. package/dist/tools/runOnDevice.js +45 -40
  23. package/dist/tools/runOnDevice.js.map +1 -1
  24. package/dist/tools/scaffoldProject.js +1 -1
  25. package/dist/tools/scaffoldProject.js.map +1 -1
  26. package/dist/tools/submitToAppStore.d.ts +3 -0
  27. package/dist/tools/submitToAppStore.d.ts.map +1 -0
  28. package/dist/tools/submitToAppStore.js +93 -0
  29. package/dist/tools/submitToAppStore.js.map +1 -0
  30. package/dist/tools/submitToPlayStore.d.ts +3 -0
  31. package/dist/tools/submitToPlayStore.d.ts.map +1 -0
  32. package/dist/tools/submitToPlayStore.js +92 -0
  33. package/dist/tools/submitToPlayStore.js.map +1 -0
  34. package/dist/tools/validateStoreMetadata.d.ts +3 -0
  35. package/dist/tools/validateStoreMetadata.d.ts.map +1 -0
  36. package/dist/tools/validateStoreMetadata.js +152 -0
  37. package/dist/tools/validateStoreMetadata.js.map +1 -0
  38. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -13,9 +13,16 @@ import { register as registerCheckBuildHealth } from "./tools/checkBuildHealth.j
13
13
  import { register as registerAddPushNotifications } from "./tools/addPushNotifications.js";
14
14
  import { register as registerConfigureDeepLinks } from "./tools/configureDeepLinks.js";
15
15
  import { register as registerResetDevEnvironment } from "./tools/resetDevEnvironment.js";
16
+ import { register as registerBuildForStore } from "./tools/buildForStore.js";
17
+ import { register as registerValidateStoreMetadata } from "./tools/validateStoreMetadata.js";
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";
16
23
  const server = new McpServer({
17
24
  name: "mobile-mcp",
18
- version: "0.5.0",
25
+ version: "0.7.0",
19
26
  });
20
27
  registerCheckDevEnvironment(server);
21
28
  registerScaffoldProject(server);
@@ -29,6 +36,13 @@ registerCheckBuildHealth(server);
29
36
  registerAddPushNotifications(server);
30
37
  registerConfigureDeepLinks(server);
31
38
  registerResetDevEnvironment(server);
39
+ registerBuildForStore(server);
40
+ registerValidateStoreMetadata(server);
41
+ registerSubmitToAppStore(server);
42
+ registerSubmitToPlayStore(server);
43
+ registerGenerateScreenshots(server);
44
+ registerAnalyzeBundle(server);
45
+ registerConfigureOTA(server);
32
46
  async function main() {
33
47
  const transport = new StdioServerTransport();
34
48
  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;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"}
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=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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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer): void;
3
+ //# sourceMappingURL=buildForStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildForStore.d.ts","sourceRoot":"","sources":["../../src/tools/buildForStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiDzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0EhD"}
@@ -0,0 +1,99 @@
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
+ platform: z
8
+ .enum(["ios", "android", "both"])
9
+ .describe("Target platform for the production build"),
10
+ profile: z
11
+ .string()
12
+ .optional()
13
+ .default("production")
14
+ .describe("EAS build profile name (default: production)"),
15
+ project_path: z
16
+ .string()
17
+ .optional()
18
+ .describe("Absolute path to the Expo project root. Defaults to cwd."),
19
+ };
20
+ function validateAppJson(root, platform) {
21
+ const appJsonPath = join(root, "app.json");
22
+ if (!existsSync(appJsonPath)) {
23
+ return { valid: false, errors: ["app.json not found"] };
24
+ }
25
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
26
+ const expo = appJson.expo || {};
27
+ const errors = [];
28
+ if (!expo.version)
29
+ errors.push("Missing expo.version");
30
+ if (!expo.icon)
31
+ errors.push("Missing expo.icon");
32
+ if (platform === "ios" || platform === "both") {
33
+ if (!expo.ios?.bundleIdentifier) {
34
+ errors.push("Missing expo.ios.bundleIdentifier");
35
+ }
36
+ }
37
+ if (platform === "android" || platform === "both") {
38
+ if (!expo.android?.package) {
39
+ errors.push("Missing expo.android.package");
40
+ }
41
+ }
42
+ return { valid: errors.length === 0, errors };
43
+ }
44
+ export function register(server) {
45
+ server.tool("mobile_buildForStore", "Create a production build for app store submission using EAS Build. Validates app.json before building.", inputSchema, async (args) => {
46
+ try {
47
+ const root = args.project_path || process.cwd();
48
+ const platforms = args.platform === "both" ? ["ios", "android"] : [args.platform];
49
+ const validation = validateAppJson(root, args.platform);
50
+ if (!validation.valid) {
51
+ return textResponse(JSON.stringify({
52
+ success: false,
53
+ message: "app.json validation failed. Fix these before building:",
54
+ errors: validation.errors,
55
+ }, null, 2));
56
+ }
57
+ const results = [];
58
+ for (const platform of platforms) {
59
+ try {
60
+ const cmd = `npx eas-cli build --platform ${platform} --profile ${args.profile} --non-interactive`;
61
+ const output = execSync(cmd, {
62
+ cwd: root,
63
+ encoding: "utf-8",
64
+ timeout: 600000,
65
+ stdio: ["pipe", "pipe", "pipe"],
66
+ });
67
+ results.push({
68
+ platform,
69
+ status: "submitted",
70
+ output: output.slice(-500),
71
+ });
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ results.push({
76
+ platform,
77
+ status: "error",
78
+ output: message.slice(-500),
79
+ });
80
+ }
81
+ }
82
+ const result = {
83
+ success: results.every((r) => r.status === "submitted"),
84
+ profile: args.profile,
85
+ builds: results,
86
+ next_steps: [
87
+ "Monitor build progress at https://expo.dev",
88
+ "Once complete, use mobile_submitToAppStore for iOS",
89
+ "For Android, use eas submit --platform android",
90
+ ],
91
+ };
92
+ return textResponse(JSON.stringify(result, null, 2));
93
+ }
94
+ catch (err) {
95
+ return errorResponse(err);
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=buildForStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildForStore.js","sourceRoot":"","sources":["../../src/tools/buildForStore.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":"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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=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=generateScreenshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateScreenshots.d.ts","sourceRoot":"","sources":["../../src/tools/generateScreenshots.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4EzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8EhD"}
@@ -0,0 +1,128 @@
1
+ import { z } from "zod";
2
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { textResponse, errorResponse } from "../types.js";
5
+ const IOS_DEVICES = [
6
+ { name: '6.7" Display', width: 1290, height: 2796, label: "iPhone 15 Pro Max / 16 Pro Max" },
7
+ { name: '6.5" Display', width: 1284, height: 2778, label: "iPhone 14 Plus / 15 Plus" },
8
+ { name: '5.5" Display', width: 1242, height: 2208, label: "iPhone 8 Plus (legacy)" },
9
+ { name: '12.9" iPad Pro', width: 2048, height: 2732, label: "iPad Pro 12.9-inch" },
10
+ ];
11
+ const ANDROID_DEVICES = [
12
+ { name: "Phone", width: 1080, height: 1920, label: "Standard phone (1080x1920)" },
13
+ { name: "Phone Hi-Res", width: 1440, height: 3120, label: "Flagship phone (1440x3120)" },
14
+ { name: '7" Tablet', width: 1200, height: 1920, label: "7-inch tablet" },
15
+ { name: '10" Tablet', width: 1600, height: 2560, label: "10-inch tablet" },
16
+ ];
17
+ const HELPER_SCRIPT = `#!/usr/bin/env node
18
+ /**
19
+ * Screenshot helper - captures screenshots at store-required dimensions.
20
+ * Run from your project root with a running dev server.
21
+ *
22
+ * Usage:
23
+ * node scripts/capture-screenshots.js --platform ios
24
+ * node scripts/capture-screenshots.js --platform android
25
+ *
26
+ * Prerequisites:
27
+ * - Simulator/emulator running with your app loaded
28
+ * - For iOS: Xcode command line tools (xcrun simctl)
29
+ * - For Android: adb in PATH
30
+ */
31
+
32
+ const { execSync } = require("child_process");
33
+ const { mkdirSync, existsSync } = require("fs");
34
+ const path = require("path");
35
+
36
+ const platform = process.argv.includes("--android") ? "android" : "ios";
37
+ const outDir = path.join("screenshots", platform);
38
+
39
+ if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });
40
+
41
+ if (platform === "ios") {
42
+ const timestamp = Date.now();
43
+ const file = path.join(outDir, \`screenshot_\${timestamp}.png\`);
44
+ try {
45
+ execSync(\`xcrun simctl io booted screenshot "\${file}"\`, { stdio: "pipe" });
46
+ console.log("Saved:", file);
47
+ } catch (e) {
48
+ console.error("Failed. Is the iOS Simulator running?");
49
+ process.exit(1);
50
+ }
51
+ } else {
52
+ const timestamp = Date.now();
53
+ const file = path.join(outDir, \`screenshot_\${timestamp}.png\`);
54
+ try {
55
+ execSync(\`adb exec-out screencap -p > "\${file}"\`, { stdio: "pipe", shell: true });
56
+ console.log("Saved:", file);
57
+ } catch (e) {
58
+ console.error("Failed. Is an Android device/emulator connected?");
59
+ process.exit(1);
60
+ }
61
+ }
62
+ `;
63
+ const inputSchema = {
64
+ project_path: z
65
+ .string()
66
+ .optional()
67
+ .describe("Absolute path to the Expo project root. Defaults to cwd."),
68
+ platform: z
69
+ .enum(["ios", "android", "both"])
70
+ .optional()
71
+ .default("both")
72
+ .describe("Target platform for screenshot dimensions (default: both)"),
73
+ };
74
+ export function register(server) {
75
+ server.tool("mobile_generateScreenshots", "Generate a screenshot capture helper script and list required App Store and Play Store screenshot dimensions. Creates scripts/capture-screenshots.js.", inputSchema, async (args) => {
76
+ try {
77
+ const root = args.project_path || process.cwd();
78
+ const scriptsDir = join(root, "scripts");
79
+ if (!existsSync(scriptsDir)) {
80
+ mkdirSync(scriptsDir, { recursive: true });
81
+ }
82
+ const scriptPath = join(scriptsDir, "capture-screenshots.js");
83
+ writeFileSync(scriptPath, HELPER_SCRIPT, "utf-8");
84
+ const devices = [];
85
+ if (args.platform === "ios" || args.platform === "both") {
86
+ devices.push(...IOS_DEVICES.map((d) => ({ platform: "ios", ...d })));
87
+ }
88
+ if (args.platform === "android" || args.platform === "both") {
89
+ devices.push(...ANDROID_DEVICES.map((d) => ({ platform: "android", ...d })));
90
+ }
91
+ return textResponse(JSON.stringify({
92
+ success: true,
93
+ message: "Screenshot helper script created and dimension reference generated",
94
+ script: "scripts/capture-screenshots.js",
95
+ usage: [
96
+ "node scripts/capture-screenshots.js --ios",
97
+ "node scripts/capture-screenshots.js --android",
98
+ ],
99
+ required_dimensions: devices,
100
+ guidelines: {
101
+ ios: [
102
+ "Minimum 3 screenshots, maximum 10 per device size",
103
+ "6.7-inch and 6.5-inch displays are required for current iPhones",
104
+ "5.5-inch is required if supporting older iPhones",
105
+ "No device frames, status bars, or alpha transparency",
106
+ "PNG or JPEG, RGB color space",
107
+ ],
108
+ android: [
109
+ "Minimum 2 screenshots, maximum 8",
110
+ "JPEG or 24-bit PNG, minimum 320px, maximum 3840px per side",
111
+ "16:9 aspect ratio recommended for phones",
112
+ "At least one phone and one 7-inch or 10-inch tablet screenshot",
113
+ ],
114
+ },
115
+ next_steps: [
116
+ "Navigate to each key screen in your app",
117
+ "Run the capture script for each screen",
118
+ "Resize captures to required dimensions if needed",
119
+ "Upload to App Store Connect / Play Console",
120
+ ],
121
+ }, null, 2));
122
+ }
123
+ catch (err) {
124
+ return errorResponse(err);
125
+ }
126
+ });
127
+ }
128
+ //# sourceMappingURL=generateScreenshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateScreenshots.js","sourceRoot":"","sources":["../../src/tools/generateScreenshots.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runOnDevice.d.ts","sourceRoot":"","sources":["../../src/tools/runOnDevice.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiGhD"}
1
+ {"version":3,"file":"runOnDevice.d.ts","sourceRoot":"","sources":["../../src/tools/runOnDevice.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqGhD"}
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { platform } from "node:os";
3
- import { textResponse } from "../types.js";
3
+ import { textResponse, errorResponse } from "../types.js";
4
4
  const inputSchema = {
5
5
  project_path: z
6
6
  .string()
@@ -17,48 +17,53 @@ const inputSchema = {
17
17
  .describe("Connection method between dev server and device"),
18
18
  };
19
19
  export function register(server) {
20
- server.tool("mobile_runOnDevice", "Start the Expo dev server and provide step-by-step instructions for connecting a physical device.", inputSchema, async (args) => {
21
- const os = platform();
22
- const connection = args.connection;
23
- const targetPlatform = args.target_platform;
24
- const startCommand = connection === "tunnel"
25
- ? "npx expo start --tunnel"
26
- : "npx expo start";
27
- const instructions = [
28
- `## Run on Device`,
29
- ``,
30
- `**Start the dev server:**`,
31
- `\`\`\`bash`,
32
- `cd ${args.project_path || "."}`,
33
- startCommand,
34
- `\`\`\``,
35
- ``,
36
- ];
37
- if (connection === "tunnel") {
38
- instructions.push(`**Tunnel mode** routes through Expo's servers. Slower but works across different networks and through firewalls.`, ``);
39
- }
40
- if (!targetPlatform || targetPlatform === "ios") {
41
- instructions.push(`### iOS Device`, `1. Install **Expo Go** from the App Store`, `2. Open the **Camera** app on your iPhone/iPad`, `3. Point it at the QR code shown in the terminal`, `4. Tap the notification to open in Expo Go`, ``);
42
- if (os !== "darwin") {
43
- instructions.push(`> Note: You are not on macOS. You can test via Expo Go but cannot create native iOS builds locally. Use EAS Build for cloud-based iOS builds.`, ``);
20
+ server.tool("mobile_runOnDevice", "Provide step-by-step instructions for connecting a physical device to the Expo dev server via LAN, tunnel, or USB.", inputSchema, async (args) => {
21
+ try {
22
+ const os = platform();
23
+ const connection = args.connection;
24
+ const targetPlatform = args.target_platform;
25
+ const startCommand = connection === "tunnel"
26
+ ? "npx expo start --tunnel"
27
+ : "npx expo start";
28
+ const instructions = [
29
+ `## Run on Device`,
30
+ ``,
31
+ `**Start the dev server:**`,
32
+ `\`\`\`bash`,
33
+ `cd ${args.project_path || "."}`,
34
+ startCommand,
35
+ `\`\`\``,
36
+ ``,
37
+ ];
38
+ if (connection === "tunnel") {
39
+ instructions.push(`**Tunnel mode** routes through Expo's servers. Slower but works across different networks and through firewalls.`, ``);
44
40
  }
45
- }
46
- if (!targetPlatform || targetPlatform === "android") {
47
- instructions.push(`### Android Device`, `1. Install **Expo Go** from the Play Store`, `2. Open Expo Go and tap **Scan QR Code**`, `3. Scan the QR code from the terminal`, ``);
48
- if (connection === "usb") {
49
- instructions.push(`### USB Debugging (Android)`, `1. Enable Developer Options: Settings > About phone > tap "Build number" 7 times`, `2. Enable USB Debugging: Settings > Developer options > USB debugging`, `3. Connect USB cable`, `4. Accept "Allow USB debugging" prompt on the phone`, `5. Run: \`npx expo run:android\``, ``);
41
+ if (!targetPlatform || targetPlatform === "ios") {
42
+ instructions.push(`### iOS Device`, `1. Install **Expo Go** from the App Store`, `2. Open the **Camera** app on your iPhone/iPad`, `3. Point it at the QR code shown in the terminal`, `4. Tap the notification to open in Expo Go`, ``);
43
+ if (os !== "darwin") {
44
+ instructions.push(`> Note: You are not on macOS. You can test via Expo Go but cannot create native iOS builds locally. Use EAS Build for cloud-based iOS builds.`, ``);
45
+ }
50
46
  }
47
+ if (!targetPlatform || targetPlatform === "android") {
48
+ instructions.push(`### Android Device`, `1. Install **Expo Go** from the Play Store`, `2. Open Expo Go and tap **Scan QR Code**`, `3. Scan the QR code from the terminal`, ``);
49
+ if (connection === "usb") {
50
+ instructions.push(`### USB Debugging (Android)`, `1. Enable Developer Options: Settings > About phone > tap "Build number" 7 times`, `2. Enable USB Debugging: Settings > Developer options > USB debugging`, `3. Connect USB cable`, `4. Accept "Allow USB debugging" prompt on the phone`, `5. Run: \`npx expo run:android\``, ``);
51
+ }
52
+ }
53
+ instructions.push(`### Troubleshooting`, ``, `| Problem | Fix |`, `|---------|-----|`, `| QR code won't scan | Type the URL manually in Expo Go |`, `| "Network response timed out" | Use \`npx expo start --tunnel\` |`, `| Red error screen | Read the error. Usually a missing dependency or syntax error |`, `| Hot reload not working | Shake device > enable Fast Refresh |`, `| "Untrusted Developer" (iOS) | Settings > General > VPN & Device Management > trust certificate |`);
54
+ const result = {
55
+ start_command: startCommand,
56
+ project_path: args.project_path || ".",
57
+ connection_method: connection,
58
+ target_platform: targetPlatform || "both",
59
+ host_os: os,
60
+ instructions: instructions.join("\n"),
61
+ };
62
+ return textResponse(JSON.stringify(result, null, 2));
63
+ }
64
+ catch (err) {
65
+ return errorResponse(err);
51
66
  }
52
- instructions.push(`### Troubleshooting`, ``, `| Problem | Fix |`, `|---------|-----|`, `| QR code won't scan | Type the URL manually in Expo Go |`, `| "Network response timed out" | Use \`npx expo start --tunnel\` |`, `| Red error screen | Read the error. Usually a missing dependency or syntax error |`, `| Hot reload not working | Shake device > enable Fast Refresh |`, `| "Untrusted Developer" (iOS) | Settings > General > VPN & Device Management > trust certificate |`);
53
- const result = {
54
- start_command: startCommand,
55
- project_path: args.project_path || ".",
56
- connection_method: connection,
57
- target_platform: targetPlatform || "both",
58
- host_os: os,
59
- instructions: instructions.join("\n"),
60
- };
61
- return textResponse(JSON.stringify(result, null, 2));
62
67
  });
63
68
  }
64
69
  //# sourceMappingURL=runOnDevice.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runOnDevice.js","sourceRoot":"","sources":["../../src/tools/runOnDevice.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runOnDevice.js","sourceRoot":"","sources":["../../src/tools/runOnDevice.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ const inputSchema = {
16
16
  .describe("Parent directory to create the project in (defaults to current directory)"),
17
17
  };
18
18
  export function register(server) {
19
- server.tool("mobile_scaffoldProject", "Generate a new Expo project with TypeScript and recommended configuration.", inputSchema, async (args) => {
19
+ server.tool("mobile_scaffoldProject", "Generate a new Expo project using create-expo-app with the default or specified template.", inputSchema, async (args) => {
20
20
  try {
21
21
  const cwd = args.directory || process.cwd();
22
22
  const templateArg = args.template === "blank"
@@ -1 +1 @@
1
- {"version":3,"file":"scaffoldProject.js","sourceRoot":"","sources":["../../src/tools/scaffoldProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;SAClC,QAAQ,EAAE;SACV,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,sBAAsB,CAAC;IACnC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2EAA2E,CAAC;CACzF,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,4EAA4E,EAC5E,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5C,MAAM,WAAW,GACf,IAAI,CAAC,QAAQ,KAAK,OAAO;gBACvB,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM;oBACxB,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,EAAE,CAAC;YAEX,MAAM,OAAO,GAAG,8BAA8B,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAEhF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;gBAC/B,GAAG;gBACH,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,IAAI,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,YAAY,EAAE,OAAO;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,UAAU,EAAE;oBACV,MAAM,IAAI,CAAC,IAAI,EAAE;oBACjB,gBAAgB;oBAChB,uEAAuE;iBACxE;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"}
1
+ {"version":3,"file":"scaffoldProject.js","sourceRoot":"","sources":["../../src/tools/scaffoldProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;SAClC,QAAQ,EAAE;SACV,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,sBAAsB,CAAC;IACnC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2EAA2E,CAAC;CACzF,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,2FAA2F,EAC3F,WAAW,EACX,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAC5C,MAAM,WAAW,GACf,IAAI,CAAC,QAAQ,KAAK,OAAO;gBACvB,CAAC,CAAC,kBAAkB;gBACpB,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM;oBACxB,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,EAAE,CAAC;YAEX,MAAM,OAAO,GAAG,8BAA8B,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAEhF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;gBAC/B,GAAG;gBACH,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG;gBACb,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,IAAI,CAAC,IAAI;gBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,YAAY,EAAE,OAAO;gBACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,UAAU,EAAE;oBACV,MAAM,IAAI,CAAC,IAAI,EAAE;oBACjB,gBAAgB;oBAChB,uEAAuE;iBACxE;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=submitToAppStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submitToAppStore.d.ts","sourceRoot":"","sources":["../../src/tools/submitToAppStore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuGhD"}
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ import { execSync } from "node:child_process";
3
+ import { 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
+ apple_id: z
12
+ .string()
13
+ .optional()
14
+ .describe("Apple ID email for App Store Connect. Falls back to EAS config or env."),
15
+ asc_app_id: z
16
+ .string()
17
+ .optional()
18
+ .describe("App Store Connect app ID (numeric). Falls back to EAS config."),
19
+ };
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.", inputSchema, async (args) => {
22
+ try {
23
+ const root = args.project_path || process.cwd();
24
+ if (!existsSync(join(root, "app.json"))) {
25
+ return errorResponse(new Error(`No app.json at ${root}. Is this an Expo project?`));
26
+ }
27
+ // Check EAS CLI is available
28
+ try {
29
+ execSync("npx eas-cli --version", {
30
+ encoding: "utf-8",
31
+ stdio: ["pipe", "pipe", "pipe"],
32
+ timeout: 15000,
33
+ });
34
+ }
35
+ catch {
36
+ return textResponse(JSON.stringify({
37
+ success: false,
38
+ message: "EAS CLI not found. Install with: npm install -g eas-cli",
39
+ }, null, 2));
40
+ }
41
+ // Build the submit command
42
+ const cmdParts = [
43
+ "npx eas-cli submit",
44
+ "--platform ios",
45
+ "--non-interactive",
46
+ ];
47
+ if (args.apple_id) {
48
+ cmdParts.push(`--apple-id ${args.apple_id}`);
49
+ }
50
+ if (args.asc_app_id) {
51
+ cmdParts.push(`--asc-app-id ${args.asc_app_id}`);
52
+ }
53
+ const cmd = cmdParts.join(" ");
54
+ try {
55
+ const output = execSync(cmd, {
56
+ cwd: root,
57
+ encoding: "utf-8",
58
+ timeout: 300000,
59
+ stdio: ["pipe", "pipe", "pipe"],
60
+ });
61
+ return textResponse(JSON.stringify({
62
+ success: true,
63
+ message: "Build submitted to App Store Connect",
64
+ output: output.slice(-1000),
65
+ next_steps: [
66
+ "Check App Store Connect for the build status",
67
+ "Add the build to a TestFlight group for testing",
68
+ "Once tested, submit for App Review",
69
+ "Provide demo credentials in App Review Information if login is required",
70
+ ],
71
+ }, null, 2));
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ return textResponse(JSON.stringify({
76
+ success: false,
77
+ message: "Submission failed",
78
+ error: message.slice(-1000),
79
+ troubleshooting: [
80
+ "Ensure you have a recent production build: eas build --platform ios --profile production",
81
+ "Check Apple credentials: eas credentials --platform ios",
82
+ "Verify Apple Developer account is active",
83
+ "If using ASC API key, ensure it has App Manager role",
84
+ ],
85
+ }, null, 2));
86
+ }
87
+ }
88
+ catch (err) {
89
+ return errorResponse(err);
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=submitToAppStore.js.map
@@ -0,0 +1 @@
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,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,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;SACjD,QAAQ,EAAE;SACV,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CACP,0GAA0G,CAC3G;CACJ,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,4JAA4J,EAC5J,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,kBAAkB,IAAI,4BAA4B,CAAC,CAC9D,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;YACtD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,OAAO,YAAY,CACjB,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,KAAK;oBACd,OAAO,EACL,qEAAqE;oBACvE,OAAO,EAAE,mBAAmB;iBAC7B,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,QAAQ,CAAC,uBAAuB,EAAE;oBAChC,QAAQ,EAAE,OAAO;oBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;oBAC/B,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,YAAY,CACjB,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,KAAK;oBACd,OAAO,EACL,yDAAyD;iBAC5D,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,yDAAyD,CAAC;YAEtE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;oBAC3B,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,MAAM;oBACf,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;iBAChC,CAAC,CAAC;gBAEH,OAAO,YAAY,CACjB,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,2CAA2C,IAAI,CAAC,KAAK,SAAS;oBACvE,OAAO,EAAE,cAAc;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;oBAC3B,UAAU,EAAE;wBACV,2CAA2C,IAAI,CAAC,KAAK,QAAQ;wBAC7D,mCAAmC;wBACnC,IAAI,CAAC,KAAK,KAAK,UAAU;4BACvB,CAAC,CAAC,2CAA2C;4BAC7C,CAAC,CAAC,4CAA4C;wBAChD,6DAA6D;qBAC9D;iBACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,YAAY,CACjB,IAAI,CAAC,SAAS,CACZ;oBACE,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,mBAAmB;oBAC5B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;oBAC3B,eAAe,EAAE;wBACf,8FAA8F;wBAC9F,wEAAwE;wBACxE,iEAAiE;wBACjE,iEAAiE;wBACjE,0DAA0D;qBAC3D;iBACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;QACH,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=validateStoreMetadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateStoreMetadata.d.ts","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsKhD"}
@@ -0,0 +1,152 @@
1
+ import { z } from "zod";
2
+ import { readFileSync, 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
+ platform: z
11
+ .enum(["ios", "android", "both"])
12
+ .optional()
13
+ .default("both")
14
+ .describe("Which platform to validate metadata for"),
15
+ };
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 screen. Returns a pass/fail checklist.", inputSchema, async (args) => {
18
+ try {
19
+ const root = args.project_path || process.cwd();
20
+ const appJsonPath = join(root, "app.json");
21
+ if (!existsSync(appJsonPath)) {
22
+ return errorResponse(new Error(`No app.json found at ${root}. Is this an Expo project?`));
23
+ }
24
+ const appJson = JSON.parse(readFileSync(appJsonPath, "utf-8"));
25
+ const expo = appJson.expo || {};
26
+ const checks = [];
27
+ const platform = args.platform;
28
+ // Shared checks
29
+ checks.push({
30
+ field: "expo.name",
31
+ status: expo.name ? "pass" : "fail",
32
+ message: expo.name
33
+ ? `"${expo.name}" (${expo.name.length} chars)`
34
+ : "Missing app name",
35
+ });
36
+ if (expo.name && expo.name.length > 30) {
37
+ checks.push({
38
+ field: "expo.name (length)",
39
+ status: "warn",
40
+ message: `Name is ${expo.name.length} chars. Both stores limit to 30.`,
41
+ });
42
+ }
43
+ checks.push({
44
+ field: "expo.version",
45
+ status: expo.version ? "pass" : "fail",
46
+ message: expo.version
47
+ ? `"${expo.version}"`
48
+ : "Missing version string",
49
+ });
50
+ checks.push({
51
+ field: "expo.icon",
52
+ status: expo.icon ? "pass" : "fail",
53
+ message: expo.icon
54
+ ? existsSync(join(root, expo.icon))
55
+ ? `Found: ${expo.icon}`
56
+ : `Configured as ${expo.icon} but file not found`
57
+ : "Missing app icon",
58
+ });
59
+ if (expo.icon && existsSync(join(root, expo.icon))) {
60
+ checks[checks.length - 1].status = "pass";
61
+ }
62
+ else if (expo.icon) {
63
+ checks[checks.length - 1].status = "fail";
64
+ }
65
+ checks.push({
66
+ field: "expo.splash",
67
+ status: expo.splash?.image ? "pass" : "warn",
68
+ message: expo.splash?.image
69
+ ? `Found: ${expo.splash.image}`
70
+ : "No splash screen configured (recommended)",
71
+ });
72
+ // iOS-specific
73
+ if (platform === "ios" || platform === "both") {
74
+ checks.push({
75
+ field: "expo.ios.bundleIdentifier",
76
+ status: expo.ios?.bundleIdentifier ? "pass" : "fail",
77
+ message: expo.ios?.bundleIdentifier
78
+ ? `"${expo.ios.bundleIdentifier}"`
79
+ : "Missing iOS bundle identifier",
80
+ });
81
+ if (expo.ios?.bundleIdentifier) {
82
+ const validBundle = /^[a-zA-Z][a-zA-Z0-9.-]*$/.test(expo.ios.bundleIdentifier);
83
+ if (!validBundle) {
84
+ checks.push({
85
+ field: "expo.ios.bundleIdentifier (format)",
86
+ status: "fail",
87
+ message: "Invalid format. Must start with a letter and contain only alphanumerics, dots, and hyphens.",
88
+ });
89
+ }
90
+ }
91
+ checks.push({
92
+ field: "expo.ios.buildNumber",
93
+ status: expo.ios?.buildNumber ? "pass" : "warn",
94
+ message: expo.ios?.buildNumber
95
+ ? `"${expo.ios.buildNumber}"`
96
+ : "Not set. Will default to 1. Set autoIncrement in eas.json for production.",
97
+ });
98
+ }
99
+ // Android-specific
100
+ if (platform === "android" || platform === "both") {
101
+ checks.push({
102
+ field: "expo.android.package",
103
+ status: expo.android?.package ? "pass" : "fail",
104
+ message: expo.android?.package
105
+ ? `"${expo.android.package}"`
106
+ : "Missing Android package name",
107
+ });
108
+ if (expo.android?.package) {
109
+ const validPackage = /^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z][a-zA-Z0-9]*)+$/.test(expo.android.package);
110
+ if (!validPackage) {
111
+ checks.push({
112
+ field: "expo.android.package (format)",
113
+ status: "fail",
114
+ message: "Invalid format. Must be reverse domain notation (e.g. com.example.myapp).",
115
+ });
116
+ }
117
+ }
118
+ checks.push({
119
+ field: "expo.android.versionCode",
120
+ status: expo.android?.versionCode !== undefined ? "pass" : "warn",
121
+ message: expo.android?.versionCode !== undefined
122
+ ? `${expo.android.versionCode}`
123
+ : "Not set. Will default to 1. Set autoIncrement in eas.json for production.",
124
+ });
125
+ checks.push({
126
+ field: "expo.android.adaptiveIcon",
127
+ status: expo.android?.adaptiveIcon?.foregroundImage
128
+ ? "pass"
129
+ : "warn",
130
+ message: expo.android?.adaptiveIcon?.foregroundImage
131
+ ? `Found: ${expo.android.adaptiveIcon.foregroundImage}`
132
+ : "No adaptive icon configured (recommended for Android)",
133
+ });
134
+ }
135
+ const passed = checks.filter((c) => c.status === "pass").length;
136
+ const failed = checks.filter((c) => c.status === "fail").length;
137
+ const warned = checks.filter((c) => c.status === "warn").length;
138
+ const result = {
139
+ project_path: root,
140
+ platform,
141
+ summary: `${passed} passed, ${failed} failed, ${warned} warnings out of ${checks.length} checks`,
142
+ ready: failed === 0,
143
+ checks,
144
+ };
145
+ return textResponse(JSON.stringify(result, null, 2));
146
+ }
147
+ catch (err) {
148
+ return errorResponse(err);
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=validateStoreMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateStoreMetadata.js","sourceRoot":"","sources":["../../src/tools/validateStoreMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,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,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SAChC,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,yCAAyC,CAAC;CACvD,CAAC;AAQF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,8BAA8B,EAC9B,qJAAqJ,EACrJ,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,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE/B,gBAAgB;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACnC,OAAO,EAAE,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,SAAS;oBAC9C,CAAC,CAAC,kBAAkB;aACvB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,oBAAoB;oBAC3B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,kCAAkC;iBACvE,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACtC,OAAO,EAAE,IAAI,CAAC,OAAO;oBACnB,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG;oBACrB,CAAC,CAAC,wBAAwB;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBACnC,OAAO,EAAE,IAAI,CAAC,IAAI;oBAChB,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACjC,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE;wBACvB,CAAC,CAAC,iBAAiB,IAAI,CAAC,IAAI,qBAAqB;oBACnD,CAAC,CAAC,kBAAkB;aACvB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;YAC5C,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;YAC5C,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;gBAC5C,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;oBACzB,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;oBAC/B,CAAC,CAAC,2CAA2C;aAChD,CAAC,CAAC;YAEH,eAAe;YACf,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,2BAA2B;oBAClC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBACpD,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB;wBACjC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG;wBAClC,CAAC,CAAC,+BAA+B;iBACpC,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,0BAA0B,CAAC,IAAI,CACjD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAC1B,CAAC;oBACF,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,oCAAoC;4BAC3C,MAAM,EAAE,MAAM;4BACd,OAAO,EACL,6FAA6F;yBAChG,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,sBAAsB;oBAC7B,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBAC/C,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW;wBAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG;wBAC7B,CAAC,CAAC,2EAA2E;iBAChF,CAAC,CAAC;YACL,CAAC;YAED,mBAAmB;YACnB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,sBAAsB;oBAC7B,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBAC/C,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO;wBAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG;wBAC7B,CAAC,CAAC,8BAA8B;iBACnC,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;oBAC1B,MAAM,YAAY,GAAG,iDAAiD,CAAC,IAAI,CACzE,IAAI,CAAC,OAAO,CAAC,OAAO,CACrB,CAAC;oBACF,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,MAAM,CAAC,IAAI,CAAC;4BACV,KAAK,EAAE,+BAA+B;4BACtC,MAAM,EAAE,MAAM;4BACd,OAAO,EACL,2EAA2E;yBAC9E,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,0BAA0B;oBACjC,MAAM,EACJ,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oBAC3D,OAAO,EACL,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS;wBACrC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC/B,CAAC,CAAC,2EAA2E;iBAClF,CAAC,CAAC;gBAEH,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,2BAA2B;oBAClC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe;wBACjD,CAAC,CAAC,MAAM;wBACR,CAAC,CAAC,MAAM;oBACV,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe;wBAClD,CAAC,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE;wBACvD,CAAC,CAAC,uDAAuD;iBAC5D,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAEhE,MAAM,MAAM,GAAG;gBACb,YAAY,EAAE,IAAI;gBAClB,QAAQ;gBACR,OAAO,EAAE,GAAG,MAAM,YAAY,MAAM,YAAY,MAAM,oBAAoB,MAAM,CAAC,MAAM,SAAS;gBAChG,KAAK,EAAE,MAAM,KAAK,CAAC;gBACnB,MAAM;aACP,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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tmhs/mobile-mcp",
3
- "version": "0.5.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.7.0",
4
+ "description": "MCP server for mobile app development - 19 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, and OTA update configuration.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "bin": {