google_create_release
Create a release on Android tracks (internal, alpha, beta, production) with version codes, release notes, status, and staged rollout fraction for production.
Instructions
Create a release on a track with optional version codes and release notes
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| packageName | Yes | Android package name | |
| editId | Yes | Edit ID | |
| track | Yes | Target track | |
| versionCodes | No | Version codes to include | |
| releaseNotes | No | Release notes per language | |
| status | No | completed | |
| userFraction | No | Staged rollout fraction (0.0-1.0, only for production) | |
| releaseName | No | Release name/label |
Implementation Reference
- src/google/tools.ts:307-333 (handler)The 'google_create_release' tool definition — builds a release object from args and calls client.updateTrack. This is the main handler function.
const createRelease: ToolDef = { name: 'google_create_release', description: 'Create a release on a track with optional version codes and release notes', schema: z.object({ packageName: z.string().describe('Android package name'), editId: z.string().describe('Edit ID'), track: z.enum(['internal', 'alpha', 'beta', 'production']).describe('Target track'), versionCodes: z.array(z.string()).optional().describe('Version codes to include'), releaseNotes: z.array(z.object({ language: z.string(), text: z.string(), })).optional().describe('Release notes per language'), status: z.enum(['draft', 'halted', 'completed', 'inProgress']).default('completed'), userFraction: z.number().optional().describe('Staged rollout fraction (0.0-1.0, only for production)'), releaseName: z.string().optional().describe('Release name/label'), }), handler: async (client, args) => { const release: any = { status: args.status, }; if (args.versionCodes) release.versionCodes = args.versionCodes; if (args.releaseNotes) release.releaseNotes = args.releaseNotes; if (args.userFraction) release.userFraction = args.userFraction; if (args.releaseName) release.name = args.releaseName; return client.updateTrack(args.packageName, args.editId, args.track, [release]); }, - src/google/tools.ts:310-322 (schema)Zod schema defining the input validation for google_create_release — requires packageName, editId, track; optional versionCodes, releaseNotes, status, userFraction, releaseName.
schema: z.object({ packageName: z.string().describe('Android package name'), editId: z.string().describe('Edit ID'), track: z.enum(['internal', 'alpha', 'beta', 'production']).describe('Target track'), versionCodes: z.array(z.string()).optional().describe('Version codes to include'), releaseNotes: z.array(z.object({ language: z.string(), text: z.string(), })).optional().describe('Release notes per language'), status: z.enum(['draft', 'halted', 'completed', 'inProgress']).default('completed'), userFraction: z.number().optional().describe('Staged rollout fraction (0.0-1.0, only for production)'), releaseName: z.string().optional().describe('Release name/label'), }), - src/google/tools.ts:605-617 (registration)The createRelease tool is exported in the googleTools array, which is iterated over in src/index.ts to register each tool with the MCP server.
export const googleTools: ToolDef[] = [ // Edit lifecycle createEdit, commitEdit, validateEdit, deleteEdit, // App details getDetails, updateDetails, // Store listing listListings, getListing, updateListing, deleteListing, // Country availability & Testers getCountryAvailability, getTesters, updateTesters, // Images listImages, uploadImage, deleteImage, deleteAllImages, // Tracks & Releases listTracks, getTrack, createRelease, promoteRelease, haltRelease, - src/index.ts:76-92 (registration)The loop that registers all google tools (including google_create_release) with the MCP server via server.tool().
// ── Register Google tools ── for (const tool of googleTools) { server.tool(tool.name, tool.description, tool.schema.shape, async (args: any) => { if (!googleClient) { return { content: [{ type: 'text' as const, text: 'Google client not configured. Set GOOGLE_SERVICE_ACCOUNT_PATH env var.' }], isError: true, }; } try { const result = await tool.handler(googleClient, args); return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] }; } catch (err: any) { return { content: [{ type: 'text' as const, text: `Error: ${err.message}` }], isError: true }; } }); } - src/google/client.ts:208-219 (helper)The GoogleClient.updateTrack method that actually calls the Google Play Android Publisher API to persist the release.
async updateTrack( packageName: string, editId: string, track: string, releases: androidpublisher_v3.Schema$TrackRelease[], ) { const res = await this.publisher.edits.tracks.update({ packageName, editId, track, requestBody: { track, releases }, }); return res.data; }