@tmhs/mobile-mcp 0.6.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.
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/analyzeBundle.d.ts +3 -0
- package/dist/tools/analyzeBundle.d.ts.map +1 -0
- package/dist/tools/analyzeBundle.js +122 -0
- package/dist/tools/analyzeBundle.js.map +1 -0
- package/dist/tools/checkDevEnvironment.js +1 -1
- package/dist/tools/checkDevEnvironment.js.map +1 -1
- package/dist/tools/configureOTA.d.ts +3 -0
- package/dist/tools/configureOTA.d.ts.map +1 -0
- package/dist/tools/configureOTA.js +118 -0
- package/dist/tools/configureOTA.js.map +1 -0
- package/dist/tools/generateScreenshots.d.ts +3 -0
- package/dist/tools/generateScreenshots.d.ts.map +1 -0
- package/dist/tools/generateScreenshots.js +128 -0
- package/dist/tools/generateScreenshots.js.map +1 -0
- package/dist/tools/runOnDevice.d.ts.map +1 -1
- package/dist/tools/runOnDevice.js +45 -40
- package/dist/tools/runOnDevice.js.map +1 -1
- package/dist/tools/scaffoldProject.js +1 -1
- package/dist/tools/scaffoldProject.js.map +1 -1
- package/dist/tools/submitToAppStore.js +1 -1
- package/dist/tools/submitToAppStore.js.map +1 -1
- package/dist/tools/submitToPlayStore.d.ts +3 -0
- package/dist/tools/submitToPlayStore.d.ts.map +1 -0
- package/dist/tools/submitToPlayStore.js +92 -0
- package/dist/tools/submitToPlayStore.js.map +1 -0
- package/dist/tools/validateStoreMetadata.js +1 -1
- package/dist/tools/validateStoreMetadata.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -16,9 +16,13 @@ import { register as registerResetDevEnvironment } from "./tools/resetDevEnviron
|
|
|
16
16
|
import { register as registerBuildForStore } from "./tools/buildForStore.js";
|
|
17
17
|
import { register as registerValidateStoreMetadata } from "./tools/validateStoreMetadata.js";
|
|
18
18
|
import { register as registerSubmitToAppStore } from "./tools/submitToAppStore.js";
|
|
19
|
+
import { register as registerSubmitToPlayStore } from "./tools/submitToPlayStore.js";
|
|
20
|
+
import { register as registerGenerateScreenshots } from "./tools/generateScreenshots.js";
|
|
21
|
+
import { register as registerAnalyzeBundle } from "./tools/analyzeBundle.js";
|
|
22
|
+
import { register as registerConfigureOTA } from "./tools/configureOTA.js";
|
|
19
23
|
const server = new McpServer({
|
|
20
24
|
name: "mobile-mcp",
|
|
21
|
-
version: "0.
|
|
25
|
+
version: "0.7.0",
|
|
22
26
|
});
|
|
23
27
|
registerCheckDevEnvironment(server);
|
|
24
28
|
registerScaffoldProject(server);
|
|
@@ -35,6 +39,10 @@ registerResetDevEnvironment(server);
|
|
|
35
39
|
registerBuildForStore(server);
|
|
36
40
|
registerValidateStoreMetadata(server);
|
|
37
41
|
registerSubmitToAppStore(server);
|
|
42
|
+
registerSubmitToPlayStore(server);
|
|
43
|
+
registerGenerateScreenshots(server);
|
|
44
|
+
registerAnalyzeBundle(server);
|
|
45
|
+
registerConfigureOTA(server);
|
|
38
46
|
async function main() {
|
|
39
47
|
const transport = new StdioServerTransport();
|
|
40
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;AACzF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,QAAQ,IAAI,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeBundle.d.ts","sourceRoot":"","sources":["../../src/tools/analyzeBundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6DzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgGhD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFileSync, existsSync, readdirSync, statSync } from "node:fs";
|
|
3
|
+
import { join, extname } from "node:path";
|
|
4
|
+
import { textResponse, errorResponse } from "../types.js";
|
|
5
|
+
const KNOWN_HEAVY_PACKAGES = {
|
|
6
|
+
moment: { size: "~300KB", alternative: "date-fns or dayjs" },
|
|
7
|
+
"moment-timezone": { size: "~200KB", alternative: "date-fns-tz" },
|
|
8
|
+
lodash: { size: "~70KB", alternative: "lodash-es or individual lodash/* imports" },
|
|
9
|
+
"aws-sdk": { size: "~50MB", alternative: "@aws-sdk/client-* (v3 modular)" },
|
|
10
|
+
firebase: { size: "~500KB", alternative: "@react-native-firebase/* (modular)" },
|
|
11
|
+
antd: { size: "~1MB", alternative: "Not suitable for React Native" },
|
|
12
|
+
"react-native-maps": { size: "~15MB native", alternative: "Only if maps are essential" },
|
|
13
|
+
underscore: { size: "~25KB", alternative: "Native Array/Object methods or lodash-es" },
|
|
14
|
+
axios: { size: "~15KB", alternative: "Built-in fetch API" },
|
|
15
|
+
"crypto-js": { size: "~40KB", alternative: "expo-crypto for basic hashing" },
|
|
16
|
+
};
|
|
17
|
+
const LARGE_ASSET_THRESHOLD = 500 * 1024;
|
|
18
|
+
const ASSET_EXTENSIONS = new Set([".png", ".jpg", ".jpeg", ".gif", ".webp", ".mp4", ".ttf", ".otf", ".json"]);
|
|
19
|
+
function scanAssets(dir) {
|
|
20
|
+
const results = [];
|
|
21
|
+
if (!existsSync(dir))
|
|
22
|
+
return results;
|
|
23
|
+
try {
|
|
24
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
const fullPath = join(dir, entry.name);
|
|
27
|
+
if (entry.isDirectory() && entry.name !== "node_modules" && entry.name !== ".git") {
|
|
28
|
+
results.push(...scanAssets(fullPath));
|
|
29
|
+
}
|
|
30
|
+
else if (entry.isFile() && ASSET_EXTENSIONS.has(extname(entry.name).toLowerCase())) {
|
|
31
|
+
const stat = statSync(fullPath);
|
|
32
|
+
if (stat.size > LARGE_ASSET_THRESHOLD) {
|
|
33
|
+
results.push({ path: fullPath, size: stat.size });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Skip directories we can't read
|
|
40
|
+
}
|
|
41
|
+
return results;
|
|
42
|
+
}
|
|
43
|
+
function formatBytes(bytes) {
|
|
44
|
+
if (bytes < 1024)
|
|
45
|
+
return `${bytes} B`;
|
|
46
|
+
if (bytes < 1024 * 1024)
|
|
47
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
48
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
49
|
+
}
|
|
50
|
+
const inputSchema = {
|
|
51
|
+
project_path: z
|
|
52
|
+
.string()
|
|
53
|
+
.optional()
|
|
54
|
+
.describe("Absolute path to the project root. Defaults to cwd."),
|
|
55
|
+
platform: z
|
|
56
|
+
.enum(["ios", "android", "both"])
|
|
57
|
+
.optional()
|
|
58
|
+
.default("both")
|
|
59
|
+
.describe("Target platform for analysis context (default: both)"),
|
|
60
|
+
};
|
|
61
|
+
export function register(server) {
|
|
62
|
+
server.tool("mobile_analyzeBundle", "Analyze app bundle for large dependencies, heavy assets, and optimization opportunities. Reads package.json and scans the project for bloat.", inputSchema, async (args) => {
|
|
63
|
+
try {
|
|
64
|
+
const root = args.project_path || process.cwd();
|
|
65
|
+
const pkgPath = join(root, "package.json");
|
|
66
|
+
if (!existsSync(pkgPath)) {
|
|
67
|
+
return errorResponse(new Error(`No package.json at ${root}. Is this a Node.js project?`));
|
|
68
|
+
}
|
|
69
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
70
|
+
const deps = Object.keys(pkg.dependencies || {});
|
|
71
|
+
const devDeps = Object.keys(pkg.devDependencies || {});
|
|
72
|
+
const heavyDeps = [];
|
|
73
|
+
for (const dep of deps) {
|
|
74
|
+
const info = KNOWN_HEAVY_PACKAGES[dep];
|
|
75
|
+
if (info) {
|
|
76
|
+
heavyDeps.push({
|
|
77
|
+
name: dep,
|
|
78
|
+
estimated_size: info.size,
|
|
79
|
+
alternative: info.alternative,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const assetsDir = join(root, "assets");
|
|
84
|
+
const largeAssets = scanAssets(assetsDir).map((a) => ({
|
|
85
|
+
path: a.path.replace(root, "."),
|
|
86
|
+
size: formatBytes(a.size),
|
|
87
|
+
size_bytes: a.size,
|
|
88
|
+
}));
|
|
89
|
+
const recommendations = [];
|
|
90
|
+
if (heavyDeps.length > 0) {
|
|
91
|
+
recommendations.push(`Replace ${heavyDeps.length} heavy dependenc${heavyDeps.length === 1 ? "y" : "ies"} with lighter alternatives`);
|
|
92
|
+
}
|
|
93
|
+
if (largeAssets.length > 0) {
|
|
94
|
+
recommendations.push(`Optimize ${largeAssets.length} large asset${largeAssets.length === 1 ? "" : "s"} (>500KB each)`);
|
|
95
|
+
recommendations.push("Convert PNG/JPEG assets to WebP for 30-50% size reduction");
|
|
96
|
+
}
|
|
97
|
+
if (deps.length > 50) {
|
|
98
|
+
recommendations.push(`${deps.length} production dependencies is high. Run npx depcheck to find unused packages.`);
|
|
99
|
+
}
|
|
100
|
+
if (deps.includes("lodash") && !deps.includes("lodash-es")) {
|
|
101
|
+
recommendations.push("Switch from lodash to lodash-es for proper tree shaking");
|
|
102
|
+
}
|
|
103
|
+
recommendations.push("Run `npx expo export` to measure actual bundle size");
|
|
104
|
+
return textResponse(JSON.stringify({
|
|
105
|
+
success: true,
|
|
106
|
+
summary: {
|
|
107
|
+
production_dependencies: deps.length,
|
|
108
|
+
dev_dependencies: devDeps.length,
|
|
109
|
+
heavy_packages_found: heavyDeps.length,
|
|
110
|
+
large_assets_found: largeAssets.length,
|
|
111
|
+
},
|
|
112
|
+
heavy_dependencies: heavyDeps,
|
|
113
|
+
large_assets: largeAssets,
|
|
114
|
+
recommendations,
|
|
115
|
+
}, null, 2));
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return errorResponse(err);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=analyzeBundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeBundle.js","sourceRoot":"","sources":["../../src/tools/analyzeBundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,7 +41,7 @@ const inputSchema = {
|
|
|
41
41
|
.describe("Target platform to check requirements for"),
|
|
42
42
|
};
|
|
43
43
|
export function register(server) {
|
|
44
|
-
server.tool("mobile_checkDevEnvironment", "Detect installed mobile development tools
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS1D,MAAM,KAAK,GAAgB;IACzB,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9D,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzD,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE;IACzD,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC/F,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;IACvF,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE;CAC3D,CAAC;AAEF,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,OAAO,EAAE;YACvB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,WAAW,GACf,OAAO,CAAC,GAAG,CAAC,YAAY;QACxB,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC5B,IAAI,CAAC;IAEP,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAG;IAClB,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;SAChC,QAAQ,EAAE;SACV,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,2CAA2C,CAAC;CACzD,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"checkDevEnvironment.js","sourceRoot":"","sources":["../../src/tools/checkDevEnvironment.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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,
|
|
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", "
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
|
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,
|
|
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"}
|
|
@@ -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
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,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,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;IACrF,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;CAC7E,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,
|
|
1
|
+
{"version":3,"file":"submitToAppStore.js","sourceRoot":"","sources":["../../src/tools/submitToAppStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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":"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,
|
|
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.
|
|
4
|
-
"description": "MCP server for mobile app development -
|
|
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": {
|