release-create
Create new app versions on App Store and Google Play. When no version is specified, it checks and displays the latest versions from each store.
Instructions
Create a new version on App Store/Google Play. If version is not provided, checks and displays latest versions from each store.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Registered app slug | |
| packageName | No | Google Play package name | |
| bundleId | No | App Store bundle ID | |
| version | No | Version string to create (e.g., 1.2.0). If not provided, will check and display latest versions. | |
| store | No | Target store (default: both) | |
| versionCodes | No | Version code array for Google Play (required when creating Google Play version) |
Input Schema (JSON Schema)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"app": {
"description": "Registered app slug",
"type": "string"
},
"bundleId": {
"description": "App Store bundle ID",
"type": "string"
},
"packageName": {
"description": "Google Play package name",
"type": "string"
},
"store": {
"description": "Target store (default: both)",
"enum": [
"appStore",
"googlePlay",
"both"
],
"type": "string"
},
"version": {
"description": "Version string to create (e.g., 1.2.0). If not provided, will check and display latest versions.",
"type": "string"
},
"versionCodes": {
"description": "Version code array for Google Play (required when creating Google Play version)",
"items": {
"type": "number"
},
"type": "array"
}
},
"type": "object"
}
Implementation Reference
- src/tools/release/create.ts:21-167 (handler)The `handleAsoCreateVersion` function is the main handler for the 'release-create' tool. It resolves app identifiers, loads config, optionally prompts for version if not provided, and creates new versions on App Store and/or Google Play using the respective services.export async function handleAsoCreateVersion(options: AsoCreateVersionOptions) { const { app, version, store = "both", versionCodes } = options; let { packageName, bundleId } = options; const resolved = appResolutionService.resolve({ slug: app, packageName, bundleId, }); if (!resolved.success) { return { content: [ { type: "text" as const, text: resolved.error.message, }, ], }; } const { slug, bundleId: resolvedBundleId, packageName: resolvedPackageName, hasAppStore, hasGooglePlay, } = resolved.data; bundleId = resolvedBundleId; packageName = resolvedPackageName; let config; try { config = loadConfig(); } catch (error) { const message = error instanceof Error ? error.message : String(error); return { content: [ { type: "text" as const, text: `β Failed to load config: ${message}`, }, ], isError: true, }; } // If version is not provided, check latest versions and prompt user if (!version) { const versionInfo = await getLatestVersions({ store, bundleId, packageName, hasAppStore, hasGooglePlay, }); return { content: [ { type: "text" as const, text: versionInfo.messages.join("\n"), }, ], }; } // Version is provided, proceed with creation console.error(`[MCP] π¦ Creating version: ${version}`); console.error(`[MCP] Store: ${store}`); console.error(`[MCP] App: ${slug}`); if (packageName) console.error(`[MCP] Package Name: ${packageName}`); if (bundleId) console.error(`[MCP] Bundle ID: ${bundleId}`); if (versionCodes) { console.error(`[MCP] Version Codes: ${versionCodes.join(", ")}`); } const results: string[] = []; if (store === "appStore" || store === "both") { if (!hasAppStore) { results.push(`βοΈ Skipping App Store (not registered for App Store)`); } else if (!config.appStore) { results.push( `βοΈ Skipping App Store (not configured in ~/.config/pabal-mcp/config.json)` ); } else if (!bundleId) { results.push(`βοΈ Skipping App Store (no bundleId provided)`); } else { const createResult = await appStoreService.createVersion( bundleId, version ); if (!createResult.success) { results.push( `β App Store version creation failed: ${createResult.error.message}` ); } else { const state = createResult.data.state?.toUpperCase() || "UNKNOWN"; results.push( `β App Store version ${createResult.data.versionString} created (${state})` ); } } } if (store === "googlePlay" || store === "both") { if (!hasGooglePlay) { results.push(`βοΈ Skipping Google Play (not registered for Google Play)`); } else if (!config.playStore) { results.push( `βοΈ Skipping Google Play (not configured in ~/.config/pabal-mcp/config.json)` ); } else if (!packageName) { results.push(`βοΈ Skipping Google Play (no packageName provided)`); } else if (!versionCodes || versionCodes.length === 0) { results.push(`βοΈ Skipping Google Play (no version codes provided)`); } else { const createResult = await googlePlayService.createVersion( packageName, version, versionCodes ); if (!createResult.success) { results.push( `β Google Play version creation failed: ${createResult.error.message}` ); } else { results.push( `β Google Play production draft created with versionCodes: ${versionCodes.join( ", " )}` ); } } } return { content: [ { type: "text" as const, text: `π¦ Version Creation Results:\n${results.join("\n")}`, }, ], }; }
- src/index.ts:299-325 (registration)The 'release-create' tool is registered here using `registerToolWithInfo`, which adds it to the MCP server, provides the description, input schema, and links to the `handleAsoCreateVersion` handler.registerToolWithInfo( "release-create", { description: "Create a new version on App Store/Google Play. If version is not provided, checks and displays latest versions from each store.", inputSchema: z.object({ app: z.string().optional().describe("Registered app slug"), packageName: z.string().optional().describe("Google Play package name"), bundleId: z.string().optional().describe("App Store bundle ID"), version: z .string() .optional() .describe( "Version string to create (e.g., 1.2.0). If not provided, will check and display latest versions." ), store: storeSchema.describe("Target store (default: both)"), versionCodes: z .array(z.number()) .optional() .describe( "Version code array for Google Play (required when creating Google Play version)" ), }), }, handleAsoCreateVersion, "Release Management" );
- src/tools/release/create.ts:12-19 (schema)TypeScript interface defining the input options for the handler, matching the Zod schema used in registration.interface AsoCreateVersionOptions { app?: string; // Registered app slug packageName?: string; // For Google Play bundleId?: string; // For App Store version?: string; // Optional: if not provided, will check latest versions and prompt store?: StoreType; versionCodes?: number[]; // For Google Play }