asc-mcp 1.0.0 → 1.0.3

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/README.md CHANGED
@@ -11,7 +11,7 @@ A Model Context Protocol (MCP) server for Apple's App Store Connect API. Manage
11
11
  - **App Store Localizations** - Full CRUD for version descriptions, keywords, and what's new
12
12
  - **App Management** - List and inspect apps across all platforms
13
13
  - **Version Control** - Create and manage app store versions
14
- - **Beta Testing** - Manage TestFlight groups, testers, and invitations
14
+ - **Beta Testing** - Manage TestFlight groups and testers
15
15
  - **Screenshot Management** - Upload and organize app screenshots
16
16
  - **Bundle ID Management** - Full CRUD for bundle identifiers
17
17
  - **Device Management** - List and inspect registered devices
@@ -268,7 +268,6 @@ For CI/CD or containerized environments, you can pass the key content directly:
268
268
  |------|-------------|------------|
269
269
  | `list_builds` | List builds for an app | `appId`, `limit?` |
270
270
  | `get_build` | Get build details | `buildId` |
271
- | `list_beta_tester_invitations` | List pending invitations | `betaGroupId`, `limit?` |
272
271
 
273
272
  ### Categories & Pricing
274
273
 
package/dist/index.js CHANGED
@@ -510,8 +510,8 @@ function createTokenManagerFromEnv() {
510
510
  // src/utils/validation.ts
511
511
  import { z } from "zod";
512
512
  var appIdSchema = z.string().regex(/^\d+$/, "App ID must be a numeric string").min(1, "App ID is required");
513
- var versionIdSchema = z.string().regex(/^\d+$/, "Version ID must be a numeric string").min(1, "Version ID is required");
514
- var localizationIdSchema = z.string().regex(/^\d+$/, "Localization ID must be a numeric string").min(1, "Localization ID is required");
513
+ var versionIdSchema = z.string().min(1, "Version ID is required");
514
+ var localizationIdSchema = z.string().min(1, "Localization ID is required");
515
515
  var buildIdSchema = z.string().min(1, "Build ID is required");
516
516
  var betaGroupIdSchema = z.string().min(1, "Beta Group ID is required");
517
517
  var localeSchema = z.string().regex(
@@ -1200,8 +1200,7 @@ async function listBuilds(client, input) {
1200
1200
  const params = validateInput(listBuildsInputSchema, input);
1201
1201
  const response = await client.get(`/apps/${params.appId}/builds`, {
1202
1202
  limit: params.limit,
1203
- "fields[builds]": "version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption",
1204
- sort: "-uploadedDate"
1203
+ "fields[builds]": "version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption"
1205
1204
  });
1206
1205
  return {
1207
1206
  success: true,
@@ -1250,33 +1249,10 @@ async function getBuild(client, input) {
1250
1249
  return formatErrorResponse(error);
1251
1250
  }
1252
1251
  }
1253
- async function listBetaTesterInvitations(client, input) {
1254
- try {
1255
- const params = validateInput(listBetaTesterInvitationsInputSchema, input);
1256
- const response = await client.get(
1257
- `/betaGroups/${params.betaGroupId}/betaTesterInvitations`,
1258
- {
1259
- limit: params.limit
1260
- }
1261
- );
1262
- return {
1263
- success: true,
1264
- data: response.data.map((invitation) => ({
1265
- id: invitation.id
1266
- })),
1267
- meta: {
1268
- total: response.meta?.paging?.total,
1269
- returned: response.data.length
1270
- }
1271
- };
1272
- } catch (error) {
1273
- return formatErrorResponse(error);
1274
- }
1275
- }
1276
1252
  var buildsToolDefinitions = [
1277
1253
  {
1278
1254
  name: "list_builds",
1279
- description: "List all builds for an app, sorted by upload date (newest first).",
1255
+ description: "List all builds for an app.",
1280
1256
  inputSchema: {
1281
1257
  type: "object",
1282
1258
  properties: {
@@ -1307,26 +1283,6 @@ var buildsToolDefinitions = [
1307
1283
  },
1308
1284
  required: ["buildId"]
1309
1285
  }
1310
- },
1311
- {
1312
- name: "list_beta_tester_invitations",
1313
- description: "List pending beta tester invitations for a beta group.",
1314
- inputSchema: {
1315
- type: "object",
1316
- properties: {
1317
- betaGroupId: {
1318
- type: "string",
1319
- description: "The beta group ID"
1320
- },
1321
- limit: {
1322
- type: "number",
1323
- description: "Maximum number of invitations to return (1-200)",
1324
- minimum: 1,
1325
- maximum: 200
1326
- }
1327
- },
1328
- required: ["betaGroupId"]
1329
- }
1330
1286
  }
1331
1287
  ];
1332
1288
 
@@ -1636,25 +1592,29 @@ async function getAppAvailability(client, input) {
1636
1592
  try {
1637
1593
  const params = validateInput(getAppAvailabilityInputSchema, input);
1638
1594
  const response = await client.get(
1639
- `/apps/${params.appId}/appAvailability`,
1595
+ `/apps/${params.appId}/appAvailabilityV2`,
1640
1596
  {
1641
- include: "availableTerritories",
1642
- "fields[territories]": "currency"
1597
+ include: "territoryAvailabilities",
1598
+ "fields[territoryAvailabilities]": "available,preOrderEnabled,releaseDate"
1643
1599
  }
1644
1600
  );
1645
1601
  const availability = response.data;
1646
1602
  const included = response.included ?? [];
1647
- const territories = included.filter((item) => item.type === "territories").map((territory) => ({
1648
- id: territory.id,
1649
- currency: territory.attributes.currency
1603
+ const territoryAvailabilities = included.filter(
1604
+ (item) => item.type === "territoryAvailabilities"
1605
+ ).filter((ta) => ta.attributes.available).map((ta) => ({
1606
+ territoryId: ta.relationships?.territory?.data?.id ?? ta.id,
1607
+ available: ta.attributes.available,
1608
+ preOrderEnabled: ta.attributes.preOrderEnabled,
1609
+ releaseDate: ta.attributes.releaseDate
1650
1610
  }));
1651
1611
  return {
1652
1612
  success: true,
1653
1613
  data: {
1654
1614
  id: availability.id,
1655
1615
  availableInNewTerritories: availability.attributes.availableInNewTerritories,
1656
- territories,
1657
- territoryCount: territories.length
1616
+ territories: territoryAvailabilities,
1617
+ territoryCount: territoryAvailabilities.length
1658
1618
  }
1659
1619
  };
1660
1620
  } catch (error) {
@@ -2330,7 +2290,7 @@ async function listUsers(client, input) {
2330
2290
  const params = validateInput(listUsersInputSchema, input);
2331
2291
  const queryParams = {
2332
2292
  limit: params.limit,
2333
- "fields[users]": "username,firstName,lastName,email,roles,allAppsVisible,provisioningAllowed"
2293
+ "fields[users]": "username,firstName,lastName,roles,allAppsVisible,provisioningAllowed"
2334
2294
  };
2335
2295
  if (params.roles && params.roles.length > 0) {
2336
2296
  queryParams["filter[roles]"] = params.roles.join(",");
@@ -2343,7 +2303,6 @@ async function listUsers(client, input) {
2343
2303
  username: user.attributes.username,
2344
2304
  firstName: user.attributes.firstName,
2345
2305
  lastName: user.attributes.lastName,
2346
- email: user.attributes.email,
2347
2306
  roles: user.attributes.roles,
2348
2307
  allAppsVisible: user.attributes.allAppsVisible,
2349
2308
  provisioningAllowed: user.attributes.provisioningAllowed
@@ -2361,7 +2320,7 @@ async function getUser(client, input) {
2361
2320
  try {
2362
2321
  const params = validateInput(getUserInputSchema, input);
2363
2322
  const response = await client.get(`/users/${params.userId}`, {
2364
- "fields[users]": "username,firstName,lastName,email,roles,allAppsVisible,provisioningAllowed"
2323
+ "fields[users]": "username,firstName,lastName,roles,allAppsVisible,provisioningAllowed"
2365
2324
  });
2366
2325
  const user = response.data;
2367
2326
  return {
@@ -2371,7 +2330,6 @@ async function getUser(client, input) {
2371
2330
  username: user.attributes.username,
2372
2331
  firstName: user.attributes.firstName,
2373
2332
  lastName: user.attributes.lastName,
2374
- email: user.attributes.email,
2375
2333
  roles: user.attributes.roles,
2376
2334
  allAppsVisible: user.attributes.allAppsVisible,
2377
2335
  provisioningAllowed: user.attributes.provisioningAllowed
@@ -2669,7 +2627,6 @@ var toolHandlers = {
2669
2627
  // Builds
2670
2628
  list_builds: listBuilds,
2671
2629
  get_build: getBuild,
2672
- list_beta_tester_invitations: listBetaTesterInvitations,
2673
2630
  // Categories
2674
2631
  list_app_categories: listAppCategories,
2675
2632
  get_app_price_schedule: getAppPriceSchedule,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/errors.ts","../src/api/client.ts","../src/auth/jwt.ts","../src/utils/validation.ts","../src/tools/app-info.tools.ts","../src/tools/apps.tools.ts","../src/tools/beta.tools.ts","../src/tools/builds.tools.ts","../src/tools/bundle-ids.tools.ts","../src/tools/categories.tools.ts","../src/tools/devices.tools.ts","../src/tools/localizations.tools.ts","../src/tools/screenshots.tools.ts","../src/tools/users.tools.ts","../src/tools/versions.tools.ts","../src/tools/index.ts"],"sourcesContent":["/**\n * App Store Connect MCP Server\n *\n * MCP server providing tools to interact with Apple's App Store Connect API.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { type AppStoreConnectClient, createClient } from \"./api/client.js\";\nimport { type TokenManager, createTokenManagerFromEnv } from \"./auth/jwt.js\";\nimport { allToolDefinitions, executeTool, hasToolHandler } from \"./tools/index.js\";\nimport { ConfigError, formatErrorResponse } from \"./utils/errors.js\";\n\n// Server metadata\nconst SERVER_NAME = \"asc-mcp\";\nconst SERVER_VERSION = \"1.0.0\";\n\n/**\n * Initialize and run the MCP server\n */\nasync function main(): Promise<void> {\n // Initialize token manager and client\n let tokenManager: TokenManager;\n let client: AppStoreConnectClient;\n\n try {\n tokenManager = createTokenManagerFromEnv();\n client = createClient(tokenManager);\n } catch (error) {\n if (error instanceof ConfigError) {\n console.error(`Configuration error: ${error.message}`);\n console.error(\"\\nRequired environment variables:\");\n console.error(\" APP_STORE_CONNECT_KEY_ID - Your API key ID\");\n console.error(\" APP_STORE_CONNECT_ISSUER_ID - Your issuer ID\");\n console.error(\" APP_STORE_CONNECT_P8_PATH - Path to your .p8 private key file\");\n console.error(\" or APP_STORE_CONNECT_P8_CONTENT - Content of your .p8 private key\");\n process.exit(1);\n }\n throw error;\n }\n\n // Create MCP server\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle list tools request\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: allToolDefinitions,\n };\n });\n\n // Handle call tool request\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasToolHandler(name)) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n success: false,\n error: {\n code: \"UNKNOWN_TOOL\",\n message: `Unknown tool: ${name}`,\n },\n },\n null,\n 2\n ),\n },\n ],\n isError: true,\n };\n }\n\n try {\n const result = await executeTool(client, name, args ?? {});\n\n // Check if result indicates an error\n const isError =\n typeof result === \"object\" &&\n result !== null &&\n \"success\" in result &&\n (result as { success: boolean }).success === false;\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (error) {\n const errorResponse = formatErrorResponse(error);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(errorResponse, null, 2),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Handle graceful shutdown\n const shutdown = (): void => {\n console.error(\"Shutting down...\");\n tokenManager.destroy();\n // Allow a brief moment for cleanup before exiting\n setTimeout(() => {\n process.exit(0);\n }, 100);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Start the server with stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Log to stderr (not stdout, which is used for MCP communication)\n console.error(`${SERVER_NAME} v${SERVER_VERSION} started`);\n}\n\n// Run the server\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n","/**\n * Custom error classes for App Store Connect API\n */\n\n/**\n * Returns fresh regex patterns for sanitizing sensitive data.\n * Creates new instances each call to avoid stateful regex issues with global flag.\n */\nfunction getSensitivePatterns(): RegExp[] {\n return [\n /Bearer [A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+/gi, // JWT tokens\n /-----BEGIN.*?-----[\\s\\S]*?-----END.*?-----/g, // PEM keys\n /[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}/gi, // UUIDs (issuer IDs)\n ];\n}\n\nfunction sanitizeMessage(message: string): string {\n let sanitized = message;\n for (const pattern of getSensitivePatterns()) {\n sanitized = sanitized.replace(pattern, \"[REDACTED]\");\n }\n return sanitized;\n}\n\nexport interface ASCErrorDetails {\n id?: string;\n status?: string;\n code?: string;\n title?: string;\n detail?: string;\n source?: {\n pointer?: string;\n parameter?: string;\n };\n}\n\n/**\n * Base error class for App Store Connect API errors\n */\nexport class ASCError extends Error {\n readonly code: string;\n readonly status: number;\n readonly details?: ASCErrorDetails[];\n\n constructor(message: string, code: string, status: number, details?: ASCErrorDetails[]) {\n super(sanitizeMessage(message));\n this.name = \"ASCError\";\n this.code = code;\n this.status = status;\n this.details = details;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n },\n };\n }\n}\n\n/**\n * Authentication error (invalid credentials, expired token, etc.)\n */\nexport class AuthError extends ASCError {\n constructor(message: string, details?: ASCErrorDetails[]) {\n super(message, \"AUTH_ERROR\", 401, details);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * Rate limit error with retry information\n */\nexport class RateLimitError extends ASCError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, details?: ASCErrorDetails[]) {\n super(`Rate limit exceeded. Retry after ${retryAfter} seconds.`, \"RATE_LIMIT\", 429, details);\n this.name = \"RateLimitError\";\n this.retryAfter = retryAfter;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n retryAfter: this.retryAfter,\n },\n };\n }\n}\n\n/**\n * Validation error for invalid input\n */\nexport class ValidationError extends ASCError {\n readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message, \"VALIDATION_ERROR\", 400);\n this.name = \"ValidationError\";\n this.field = field;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n field: this.field,\n },\n };\n }\n}\n\n/**\n * Not found error\n */\nexport class NotFoundError extends ASCError {\n constructor(resourceType: string, resourceId: string) {\n super(`${resourceType} with ID '${resourceId}' not found`, \"NOT_FOUND\", 404);\n this.name = \"NotFoundError\";\n }\n}\n\n/**\n * Configuration error (missing environment variables, invalid config)\n */\nexport class ConfigError extends ASCError {\n constructor(message: string) {\n super(message, \"CONFIG_ERROR\", 500);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Parse Apple API error response into ASCError\n */\nexport function parseAPIError(status: number, body: unknown): ASCError {\n const errors = (body as { errors?: ASCErrorDetails[] })?.errors;\n\n if (status === 401) {\n return new AuthError(\"Authentication failed\", errors);\n }\n\n if (status === 429) {\n return new RateLimitError(60, errors); // Default to 60s if not specified\n }\n\n if (status === 404) {\n const detail = errors?.[0]?.detail ?? \"Resource not found\";\n return new ASCError(detail, \"NOT_FOUND\", 404, errors);\n }\n\n if (status === 403) {\n return new ASCError(\n \"Access forbidden. Check your API key permissions.\",\n \"FORBIDDEN\",\n 403,\n errors\n );\n }\n\n if (status === 409) {\n const detail = errors?.[0]?.detail ?? \"Conflict with current state\";\n return new ASCError(detail, \"CONFLICT\", 409, errors);\n }\n\n // Generic error\n const message = errors?.[0]?.detail ?? `API request failed with status ${status}`;\n return new ASCError(message, \"API_ERROR\", status, errors);\n}\n\n/**\n * Format error for MCP tool response\n */\nexport function formatErrorResponse(error: unknown): {\n success: false;\n error: { code: string; message: string; details?: unknown };\n} {\n if (error instanceof ASCError) {\n return error.toJSON() as {\n success: false;\n error: { code: string; message: string; details?: unknown };\n };\n }\n\n if (error instanceof Error) {\n return {\n success: false,\n error: {\n code: \"INTERNAL_ERROR\",\n message: sanitizeMessage(error.message),\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: \"UNKNOWN_ERROR\",\n message: \"An unknown error occurred\",\n },\n };\n}\n","/**\n * App Store Connect API Client\n *\n * Handles HTTP requests with automatic token refresh, rate limiting, and retry logic.\n */\n\nimport type { TokenManager } from \"../auth/jwt.js\";\nimport { ASCError, RateLimitError, parseAPIError } from \"../utils/errors.js\";\nimport type { ASCListResponse } from \"./types.js\";\n\nconst BASE_URL = \"https://api.appstoreconnect.apple.com/v1\";\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\n// Self-imposed rate limiting: 50 requests per minute\nconst RATE_LIMIT_WINDOW_MS = 60000;\nconst MAX_REQUESTS_PER_WINDOW = 50;\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n timeout?: number;\n}\n\ninterface RateLimiter {\n timestamps: number[];\n}\n\n/**\n * App Store Connect API Client\n */\nexport class AppStoreConnectClient {\n private readonly tokenManager: TokenManager;\n private readonly baseUrl: string;\n private readonly rateLimiter: RateLimiter = { timestamps: [] };\n\n constructor(tokenManager: TokenManager, baseUrl = BASE_URL) {\n this.tokenManager = tokenManager;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Make a GET request\n */\n async get<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.request<T>({ method: \"GET\", path, params });\n }\n\n /**\n * Make a POST request\n */\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>({ method: \"POST\", path, body });\n }\n\n /**\n * Make a PATCH request\n */\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>({ method: \"PATCH\", path, body });\n }\n\n /**\n * Make a DELETE request\n */\n async delete(path: string, body?: unknown): Promise<void> {\n await this.request<void>({ method: \"DELETE\", path, body });\n }\n\n /**\n * Make a raw request (for custom operations like file uploads)\n */\n async rawRequest(\n url: string,\n options: {\n method: string;\n headers?: Record<string, string>;\n body?: Buffer | string;\n timeout?: number;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? DEFAULT_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Paginate through all results\n */\n async *paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n maxItems?: number\n ): AsyncGenerator<T, void, undefined> {\n let cursor: string | undefined;\n let itemsYielded = 0;\n\n do {\n const queryParams = { ...params };\n if (cursor) {\n // Extract cursor from next URL if it contains query params\n if (cursor.includes(\"?\")) {\n try {\n // Try parsing as full URL first\n const url = new URL(cursor);\n for (const [key, value] of url.searchParams) {\n queryParams[key] = value;\n }\n } catch {\n // Fall back to parsing as relative URL\n const queryString = cursor.split(\"?\")[1];\n if (queryString) {\n const searchParams = new URLSearchParams(queryString);\n for (const [key, value] of searchParams) {\n queryParams[key] = value;\n }\n }\n }\n }\n }\n\n const response = await this.get<ASCListResponse<T>>(path, queryParams);\n\n for (const item of response.data) {\n yield item;\n itemsYielded++;\n\n if (maxItems && itemsYielded >= maxItems) {\n return;\n }\n }\n\n cursor = response.links?.next;\n } while (cursor);\n }\n\n /**\n * Core request method with retry logic\n */\n private async request<T>(options: RequestOptions): Promise<T> {\n await this.enforceRateLimit();\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n return await this.executeRequest<T>(options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on client errors (4xx) except rate limits\n if (error instanceof ASCError && error.status >= 400 && error.status < 500) {\n if (error instanceof RateLimitError) {\n // Wait for rate limit to clear\n const waitMs = error.retryAfter * 1000;\n await this.sleep(waitMs);\n continue;\n }\n throw error;\n }\n\n // Exponential backoff for server errors\n if (attempt < MAX_RETRIES - 1) {\n const delay = INITIAL_RETRY_DELAY_MS * 2 ** attempt;\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError ?? new Error(\"Request failed after max retries\");\n }\n\n /**\n * Execute a single HTTP request\n */\n private async executeRequest<T>(options: RequestOptions): Promise<T> {\n const token = await this.tokenManager.getToken();\n const url = this.buildUrl(options.path, options.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n // Only set Content-Type when there's a body\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? DEFAULT_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle rate limiting from API\n if (response.status === 429) {\n const retryAfter = Number.parseInt(response.headers.get(\"Retry-After\") ?? \"60\", 10);\n throw new RateLimitError(retryAfter);\n }\n\n // Handle no content responses\n if (response.status === 204) {\n return undefined as T;\n }\n\n const body = await response.json();\n\n // Handle error responses\n if (!response.ok) {\n throw parseAPIError(response.status, body);\n }\n\n return body as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ASCError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new ASCError(\"Request timed out\", \"TIMEOUT\", 408);\n }\n throw new ASCError(error.message, \"NETWORK_ERROR\", 0);\n }\n\n throw new ASCError(\"Unknown error occurred\", \"UNKNOWN\", 0);\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n path: string,\n params?: Record<string, string | number | boolean | undefined>\n ): string {\n const url = new URL(path.startsWith(\"/\") ? path.slice(1) : path, `${this.baseUrl}/`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Self-imposed rate limiting.\n * Records the request timestamp before checking to prevent off-by-one errors.\n */\n private async enforceRateLimit(): Promise<void> {\n const now = Date.now();\n\n // Clean old timestamps\n this.rateLimiter.timestamps = this.rateLimiter.timestamps.filter(\n (ts) => now - ts < RATE_LIMIT_WINDOW_MS\n );\n\n // Check if we're at the limit (check BEFORE adding this request)\n if (this.rateLimiter.timestamps.length >= MAX_REQUESTS_PER_WINDOW) {\n const oldestTimestamp = this.rateLimiter.timestamps[0];\n if (oldestTimestamp) {\n const waitTime = RATE_LIMIT_WINDOW_MS - (now - oldestTimestamp);\n if (waitTime > 0) {\n await this.sleep(waitTime);\n // Clean timestamps again after waiting\n const newNow = Date.now();\n this.rateLimiter.timestamps = this.rateLimiter.timestamps.filter(\n (ts) => newNow - ts < RATE_LIMIT_WINDOW_MS\n );\n }\n }\n }\n\n // Record this request AFTER the rate limit check passes\n this.rateLimiter.timestamps.push(Date.now());\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Create an App Store Connect client from a token manager\n */\nexport function createClient(tokenManager: TokenManager): AppStoreConnectClient {\n return new AppStoreConnectClient(tokenManager);\n}\n","/**\n * JWT Token Manager for App Store Connect API authentication\n *\n * Generates ES256 signed JWTs with automatic caching and refresh.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type KeyLike, SignJWT, importPKCS8 } from \"jose\";\nimport { AuthError, ConfigError } from \"../utils/errors.js\";\n\nconst TOKEN_LIFETIME_SECONDS = 15 * 60; // 15 minutes\nconst TOKEN_REFRESH_BUFFER_SECONDS = 5 * 60; // Refresh 5 minutes before expiry\nconst AUDIENCE = \"appstoreconnect-v1\";\n\nexport interface TokenManagerConfig {\n keyId: string;\n issuerId: string;\n privateKeyPath?: string;\n privateKeyContent?: string;\n}\n\n/**\n * Manages JWT token generation and caching for App Store Connect API\n */\nexport class TokenManager {\n private readonly keyId: string;\n private readonly issuerId: string;\n private readonly privateKeySource:\n | { type: \"path\"; path: string }\n | { type: \"content\"; content: string };\n\n private cachedToken: string | null = null;\n private tokenExpiresAt = 0;\n private privateKey: KeyLike | null = null;\n private pendingTokenGeneration: Promise<string> | null = null;\n\n constructor(config: TokenManagerConfig) {\n this.keyId = config.keyId;\n this.issuerId = config.issuerId;\n\n if (config.privateKeyPath) {\n // Validate path doesn't contain directory traversal\n if (config.privateKeyPath.includes(\"..\")) {\n throw new ConfigError(\"Private key path cannot contain '..'\");\n }\n this.privateKeySource = { type: \"path\", path: config.privateKeyPath };\n } else if (config.privateKeyContent) {\n this.privateKeySource = { type: \"content\", content: config.privateKeyContent };\n } else {\n throw new ConfigError(\"Either privateKeyPath or privateKeyContent must be provided\");\n }\n }\n\n /**\n * Get a valid JWT token, generating a new one if needed.\n * Uses a pending promise pattern to prevent concurrent token generation.\n */\n async getToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n\n // Return cached token if still valid (with buffer)\n if (this.cachedToken && this.tokenExpiresAt > now + TOKEN_REFRESH_BUFFER_SECONDS) {\n return this.cachedToken;\n }\n\n // If a token generation is already in progress, wait for it\n if (this.pendingTokenGeneration) {\n return this.pendingTokenGeneration;\n }\n\n // Generate new token with mutex pattern\n this.pendingTokenGeneration = this.generateToken().finally(() => {\n this.pendingTokenGeneration = null;\n });\n\n return this.pendingTokenGeneration;\n }\n\n /**\n * Generate a new JWT token\n */\n async generateToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const expiresAt = now + TOKEN_LIFETIME_SECONDS;\n\n // Load private key if not already loaded\n if (!this.privateKey) {\n await this.loadPrivateKey();\n }\n\n if (!this.privateKey) {\n throw new AuthError(\"Failed to load private key\");\n }\n\n try {\n const jwt = await new SignJWT({})\n .setProtectedHeader({\n alg: \"ES256\",\n kid: this.keyId,\n typ: \"JWT\",\n })\n .setIssuer(this.issuerId)\n .setIssuedAt(now)\n .setExpirationTime(expiresAt)\n .setAudience(AUDIENCE)\n .sign(this.privateKey);\n\n // Cache the token\n this.cachedToken = jwt;\n this.tokenExpiresAt = expiresAt;\n\n return jwt;\n } catch (error) {\n throw new AuthError(\n `Failed to generate JWT: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Load the private key from file or content\n */\n private async loadPrivateKey(): Promise<void> {\n let keyContent: string;\n\n if (this.privateKeySource.type === \"path\") {\n try {\n // Resolve to absolute path\n const absolutePath = path.resolve(this.privateKeySource.path);\n keyContent = await fs.readFile(absolutePath, \"utf-8\");\n } catch (error) {\n throw new ConfigError(\n `Failed to read private key from ${this.privateKeySource.path}: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n } else {\n keyContent = this.privateKeySource.content;\n }\n\n // Handle raw key content (without PEM headers)\n keyContent = keyContent.trim();\n if (!keyContent.startsWith(\"-----BEGIN\")) {\n keyContent = `-----BEGIN PRIVATE KEY-----\\n${keyContent}\\n-----END PRIVATE KEY-----`;\n }\n\n try {\n this.privateKey = await importPKCS8(keyContent, \"ES256\");\n } catch (error) {\n throw new AuthError(\n `Failed to parse private key: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Clear cached token (call on shutdown)\n */\n destroy(): void {\n this.cachedToken = null;\n this.tokenExpiresAt = 0;\n this.privateKey = null;\n this.pendingTokenGeneration = null;\n }\n\n /**\n * Check if a token is currently cached and valid\n */\n hasValidToken(): boolean {\n const now = Math.floor(Date.now() / 1000);\n return this.cachedToken !== null && this.tokenExpiresAt > now + TOKEN_REFRESH_BUFFER_SECONDS;\n }\n}\n\n/**\n * Create a TokenManager from environment variables\n */\nexport function createTokenManagerFromEnv(): TokenManager {\n const keyId = process.env.APP_STORE_CONNECT_KEY_ID;\n const issuerId = process.env.APP_STORE_CONNECT_ISSUER_ID;\n const privateKeyPath = process.env.APP_STORE_CONNECT_P8_PATH;\n const privateKeyContent = process.env.APP_STORE_CONNECT_P8_CONTENT;\n\n if (!keyId) {\n throw new ConfigError(\"APP_STORE_CONNECT_KEY_ID environment variable is required\");\n }\n\n if (!issuerId) {\n throw new ConfigError(\"APP_STORE_CONNECT_ISSUER_ID environment variable is required\");\n }\n\n if (!privateKeyPath && !privateKeyContent) {\n throw new ConfigError(\n \"Either APP_STORE_CONNECT_P8_PATH or APP_STORE_CONNECT_P8_CONTENT environment variable is required\"\n );\n }\n\n return new TokenManager({\n keyId,\n issuerId,\n privateKeyPath,\n privateKeyContent,\n });\n}\n","/**\n * Input validation schemas and utilities using Zod\n */\n\nimport { z } from \"zod\";\nimport { ValidationError } from \"./errors.js\";\n\n// App ID - numeric string\nexport const appIdSchema = z\n .string()\n .regex(/^\\d+$/, \"App ID must be a numeric string\")\n .min(1, \"App ID is required\");\n\n// Version ID - numeric string\nexport const versionIdSchema = z\n .string()\n .regex(/^\\d+$/, \"Version ID must be a numeric string\")\n .min(1, \"Version ID is required\");\n\n// Localization ID - numeric string\nexport const localizationIdSchema = z\n .string()\n .regex(/^\\d+$/, \"Localization ID must be a numeric string\")\n .min(1, \"Localization ID is required\");\n\n// Build ID - numeric string (can be UUID format in some cases)\nexport const buildIdSchema = z.string().min(1, \"Build ID is required\");\n\n// Beta Group ID\nexport const betaGroupIdSchema = z.string().min(1, \"Beta Group ID is required\");\n\n// Locale code (e.g., \"en-US\", \"ja\", \"zh-Hans\", \"en_US\")\nexport const localeSchema = z\n .string()\n .regex(\n /^[a-z]{2}([-_][A-Z][a-z]{3})?([-_][A-Z]{2})?$/,\n \"Invalid locale format (e.g., en-US, en_US, ja, zh-Hans)\"\n )\n .min(2, \"Locale is required\");\n\n// HTTPS URL\nexport const urlSchema = z\n .string()\n .url(\"Must be a valid URL\")\n .refine((url) => url.startsWith(\"https://\"), \"URL must use HTTPS\");\n\n// Optional HTTPS URL\nexport const optionalUrlSchema = urlSchema.optional();\n\n// Version string (e.g., \"1.0.0\", \"2.1\") - no leading zeros except for single \"0\"\nexport const versionStringSchema = z\n .string()\n .regex(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))*$/, \"Invalid version format (e.g., 1.0.0)\")\n .min(1, \"Version string is required\");\n\n// Platform enum\nexport const platformSchema = z.enum([\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"]);\n\n// App Store version state\nexport const versionStateSchema = z.enum([\n \"DEVELOPER_REMOVED_FROM_SALE\",\n \"DEVELOPER_REJECTED\",\n \"IN_REVIEW\",\n \"INVALID_BINARY\",\n \"METADATA_REJECTED\",\n \"PENDING_APPLE_RELEASE\",\n \"PENDING_CONTRACT\",\n \"PENDING_DEVELOPER_RELEASE\",\n \"PREPARE_FOR_SUBMISSION\",\n \"PREORDER_READY_FOR_SALE\",\n \"PROCESSING_FOR_APP_STORE\",\n \"READY_FOR_REVIEW\",\n \"READY_FOR_SALE\",\n \"REJECTED\",\n \"REMOVED_FROM_SALE\",\n \"WAITING_FOR_EXPORT_COMPLIANCE\",\n \"WAITING_FOR_REVIEW\",\n \"REPLACED_WITH_NEW_VERSION\",\n \"NOT_APPLICABLE\",\n]);\n\n// Release type\nexport const releaseTypeSchema = z.enum([\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"]);\n\n// Pagination options\nexport const paginationSchema = z.object({\n limit: z.number().int().min(1).max(200).optional().default(50),\n cursor: z.string().optional(),\n});\n\n// List apps input\nexport const listAppsInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get app input\nexport const getAppInputSchema = z.object({\n appId: appIdSchema,\n});\n\n// List app versions input\nexport const listAppVersionsInputSchema = z.object({\n appId: appIdSchema,\n platform: platformSchema.optional(),\n versionState: versionStateSchema.optional(),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get app version input\nexport const getAppVersionInputSchema = z.object({\n versionId: versionIdSchema,\n});\n\n// Create app version input\nexport const createAppVersionInputSchema = z.object({\n appId: appIdSchema,\n platform: platformSchema,\n versionString: versionStringSchema,\n releaseType: releaseTypeSchema.optional(),\n copyright: z.string().optional(),\n earliestReleaseDate: z.string().datetime().optional(),\n});\n\n// List version localizations input\nexport const listVersionLocalizationsInputSchema = z.object({\n versionId: versionIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get version localization input\nexport const getVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n});\n\n// Create version localization input\nexport const createVersionLocalizationInputSchema = z.object({\n versionId: versionIdSchema,\n locale: localeSchema,\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n whatsNew: z.string().max(4000).optional(),\n promotionalText: z.string().max(170).optional(),\n marketingUrl: optionalUrlSchema,\n supportUrl: optionalUrlSchema,\n});\n\n// Update version localization input\nexport const updateVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n whatsNew: z.string().max(4000).optional(),\n promotionalText: z.string().max(170).optional(),\n marketingUrl: optionalUrlSchema,\n supportUrl: optionalUrlSchema,\n});\n\n// Delete version localization input\nexport const deleteVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n});\n\n// Get app infos input\nexport const getAppInfosInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List app info localizations input\nexport const listAppInfoLocalizationsInputSchema = z.object({\n appInfoId: z.string().min(1, \"App Info ID is required\"),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Update app info localization input\nexport const updateAppInfoLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n name: z.string().max(30).optional(),\n subtitle: z.string().max(30).optional(),\n privacyPolicyUrl: optionalUrlSchema,\n privacyChoicesUrl: optionalUrlSchema,\n privacyPolicyText: z.string().optional(),\n});\n\n// List beta groups input\nexport const listBetaGroupsInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List beta testers input\nexport const listBetaTestersInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Add beta tester input\nexport const addBetaTesterInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n email: z.string().email(\"Invalid email address\"),\n firstName: z.string().min(1).optional(),\n lastName: z.string().min(1).optional(),\n});\n\n// Screenshot set input\nexport const listScreenshotSetsInputSchema = z.object({\n localizationId: localizationIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List screenshots input\nexport const listScreenshotsInputSchema = z.object({\n screenshotSetId: z.string().min(1, \"Screenshot Set ID is required\"),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Upload screenshot input\nexport const uploadScreenshotInputSchema = z.object({\n screenshotSetId: z.string().min(1, \"Screenshot Set ID is required\"),\n fileName: z.string().min(1, \"File name is required\"),\n fileSize: z.number().int().positive(\"File size must be positive\"),\n filePath: z.string().min(1, \"File path is required\"),\n});\n\n/**\n * Validate input and throw ValidationError if invalid\n */\nexport function validateInput<T>(schema: z.ZodSchema<T>, input: unknown): T {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const firstError = result.error.errors[0];\n const field = firstError?.path.join(\".\");\n const message = firstError?.message ?? \"Invalid input\";\n throw new ValidationError(message, field || undefined);\n }\n\n return result.data;\n}\n\n/**\n * Safe parse that returns result without throwing\n */\nexport function safeValidate<T>(\n schema: z.ZodSchema<T>,\n input: unknown\n): { success: true; data: T } | { success: false; error: ValidationError } {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const firstError = result.error.errors[0];\n const field = firstError?.path.join(\".\");\n const message = firstError?.message ?? \"Invalid input\";\n return { success: false, error: new ValidationError(message, field || undefined) };\n }\n\n return { success: true, data: result.data };\n}\n\n// ============================================================================\n// Bundle ID Schemas\n// ============================================================================\n\n// Bundle ID identifier (e.g., com.example.app)\nexport const bundleIdIdentifierSchema = z\n .string()\n .regex(\n /^[a-zA-Z][a-zA-Z0-9.-]*$/,\n \"Bundle ID must start with a letter and contain only letters, numbers, dots, and hyphens\"\n )\n .min(1, \"Bundle ID identifier is required\");\n\n// List bundle IDs input\nexport const listBundleIdsInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n});\n\n// Get bundle ID input\nexport const getBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n});\n\n// Create bundle ID input\nexport const createBundleIdInputSchema = z.object({\n identifier: bundleIdIdentifierSchema,\n name: z.string().min(1, \"Name is required\").max(255, \"Name must be 255 characters or less\"),\n platform: platformSchema,\n});\n\n// Update bundle ID input\nexport const updateBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n name: z.string().min(1, \"Name is required\").max(255, \"Name must be 255 characters or less\"),\n});\n\n// Delete bundle ID input\nexport const deleteBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n});\n\n// ============================================================================\n// Device Schemas\n// ============================================================================\n\n// Device status enum\nexport const deviceStatusSchema = z.enum([\"ENABLED\", \"DISABLED\"]);\n\n// List devices input\nexport const listDevicesInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n status: deviceStatusSchema.optional(),\n});\n\n// Get device input\nexport const getDeviceInputSchema = z.object({\n deviceId: z.string().min(1, \"Device ID is required\"),\n});\n\n// ============================================================================\n// User Schemas\n// ============================================================================\n\n// User role enum\nexport const userRoleSchema = z.enum([\n \"ADMIN\",\n \"FINANCE\",\n \"TECHNICAL\",\n \"SALES\",\n \"DEVELOPER\",\n \"MARKETING\",\n \"APP_MANAGER\",\n \"CUSTOMER_SUPPORT\",\n \"ACCESS_TO_REPORTS\",\n \"READ_ONLY\",\n]);\n\n// List users input\nexport const listUsersInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n roles: z.array(userRoleSchema).optional(),\n});\n\n// Get user input\nexport const getUserInputSchema = z.object({\n userId: z.string().min(1, \"User ID is required\"),\n});\n\n// ============================================================================\n// Beta Tester Removal Schema\n// ============================================================================\n\n// Beta tester ID\nexport const betaTesterIdSchema = z.string().min(1, \"Beta Tester ID is required\");\n\n// Remove beta tester input\nexport const removeBetaTesterInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n betaTesterId: betaTesterIdSchema,\n});\n\n// ============================================================================\n// Build Schemas\n// ============================================================================\n\n// List builds input\nexport const listBuildsInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get build input\nexport const getBuildInputSchema = z.object({\n buildId: buildIdSchema,\n});\n\n// List beta tester invitations input\nexport const listBetaTesterInvitationsInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// ============================================================================\n// Category Schemas\n// ============================================================================\n\n// List app categories input\nexport const listAppCategoriesInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n});\n\n// Get app price schedule input\nexport const getAppPriceScheduleInputSchema = z.object({\n appId: appIdSchema,\n});\n\n// Get app availability input\nexport const getAppAvailabilityInputSchema = z.object({\n appId: appIdSchema,\n});\n","/**\n * App Info Localizations Tools - Manage app-level localizations (name, subtitle, privacy)\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppInfo,\n AppInfoLocalization,\n UpdateAppInfoLocalizationRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getAppInfosInputSchema,\n listAppInfoLocalizationsInputSchema,\n updateAppInfoLocalizationInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List app infos for an app (needed to get appInfoId for localizations)\n */\nexport async function listAppInfos(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppInfosInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppInfo>>(`/apps/${params.appId}/appInfos`, {\n limit: params.limit,\n \"fields[appInfos]\": \"appStoreState,appStoreAgeRating\",\n });\n\n return {\n success: true,\n data: response.data.map((info) => ({\n id: info.id,\n appStoreState: info.attributes.appStoreState,\n appStoreAgeRating: info.attributes.appStoreAgeRating,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List all localizations for an app info\n */\nexport async function listAppInfoLocalizations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppInfoLocalizationsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppInfoLocalization>>(\n `/appInfos/${params.appInfoId}/appInfoLocalizations`,\n {\n limit: params.limit,\n \"fields[appInfoLocalizations]\":\n \"locale,name,subtitle,privacyPolicyUrl,privacyChoicesUrl,privacyPolicyText\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((loc) => ({\n id: loc.id,\n locale: loc.attributes.locale,\n name: loc.attributes.name,\n subtitle: loc.attributes.subtitle,\n privacyPolicyUrl: loc.attributes.privacyPolicyUrl,\n privacyChoicesUrl: loc.attributes.privacyChoicesUrl,\n privacyPolicyText: loc.attributes.privacyPolicyText,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update an app info localization\n */\nexport async function updateAppInfoLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateAppInfoLocalizationInputSchema, input);\n\n const requestBody: UpdateAppInfoLocalizationRequest = {\n data: {\n type: \"appInfoLocalizations\",\n id: params.localizationId,\n attributes: {\n name: params.name,\n subtitle: params.subtitle,\n privacyPolicyUrl: params.privacyPolicyUrl,\n privacyChoicesUrl: params.privacyChoicesUrl,\n privacyPolicyText: params.privacyPolicyText,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<AppInfoLocalization>>(\n `/appInfoLocalizations/${params.localizationId}`,\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n name: loc.attributes.name,\n subtitle: loc.attributes.subtitle,\n privacyPolicyUrl: loc.attributes.privacyPolicyUrl,\n privacyChoicesUrl: loc.attributes.privacyChoicesUrl,\n privacyPolicyText: loc.attributes.privacyPolicyText,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for app info localizations\n */\nexport const appInfoToolDefinitions = [\n {\n name: \"list_app_infos\",\n description:\n \"List app info records for an app. Use this to get the appInfoId needed for localization operations.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of results to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"list_app_info_localizations\",\n description:\n \"List all localizations for an app info. Returns app name, subtitle, and privacy policy info for each locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appInfoId: {\n type: \"string\",\n description: \"The App Info ID (get this from list_app_infos)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of localizations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appInfoId\"],\n },\n },\n {\n name: \"update_app_info_localization\",\n description:\n \"Update an app info localization. Use this to change app name, subtitle, or privacy policy URL for a locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The app info localization ID to update\",\n },\n name: {\n type: \"string\",\n description: \"App name (max 30 characters)\",\n },\n subtitle: {\n type: \"string\",\n description: \"App subtitle (max 30 characters)\",\n },\n privacyPolicyUrl: {\n type: \"string\",\n description: \"Privacy policy URL (HTTPS only)\",\n },\n privacyChoicesUrl: {\n type: \"string\",\n description: \"Privacy choices URL (HTTPS only)\",\n },\n privacyPolicyText: {\n type: \"string\",\n description: \"Privacy policy text (for apps without a URL)\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n];\n","/**\n * Apps Tools - List and get app information\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, App } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport { getAppInputSchema, listAppsInputSchema, validateInput } from \"../utils/validation.js\";\n\n/**\n * List all apps in the App Store Connect account\n */\nexport async function listApps(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listAppsInputSchema, input);\n\n const response = await client.get<ASCListResponse<App>>(\"/apps\", {\n limit: params.limit,\n \"fields[apps]\": \"name,bundleId,sku,primaryLocale\",\n });\n\n return {\n success: true,\n data: response.data.map((app) => ({\n id: app.id,\n name: app.attributes.name,\n bundleId: app.attributes.bundleId,\n sku: app.attributes.sku,\n primaryLocale: app.attributes.primaryLocale,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific app\n */\nexport async function getApp(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getAppInputSchema, input);\n\n const response = await client.get<ASCResponse<App>>(`/apps/${params.appId}`, {\n \"fields[apps]\":\n \"name,bundleId,sku,primaryLocale,contentRightsDeclaration,isOrEverWasMadeForKids\",\n include: \"appInfos,appStoreVersions\",\n });\n\n const app = response.data;\n\n return {\n success: true,\n data: {\n id: app.id,\n name: app.attributes.name,\n bundleId: app.attributes.bundleId,\n sku: app.attributes.sku,\n primaryLocale: app.attributes.primaryLocale,\n contentRightsDeclaration: app.attributes.contentRightsDeclaration,\n isOrEverWasMadeForKids: app.attributes.isOrEverWasMadeForKids,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for apps\n */\nexport const appsToolDefinitions = [\n {\n name: \"list_apps\",\n description:\n \"List all apps in your App Store Connect account. Returns app IDs, names, bundle IDs, and SKUs.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of apps to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n },\n },\n {\n name: \"get_app\",\n description: \"Get detailed information about a specific app by its ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID (numeric string)\",\n },\n },\n required: [\"appId\"],\n },\n },\n];\n","/**\n * Beta Testing Tools - Manage beta groups and testers\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n BetaGroup,\n BetaTester,\n CreateBetaTesterRequest,\n RemoveBetaTestersRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n addBetaTesterInputSchema,\n listBetaGroupsInputSchema,\n listBetaTestersInputSchema,\n removeBetaTesterInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List beta groups for an app\n */\nexport async function listBetaGroups(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBetaGroupsInputSchema, input);\n\n const response = await client.get<ASCListResponse<BetaGroup>>(\n `/apps/${params.appId}/betaGroups`,\n {\n limit: params.limit,\n \"fields[betaGroups]\":\n \"name,createdDate,isInternalGroup,hasAccessToAllBuilds,publicLinkEnabled,publicLink,feedbackEnabled\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((group) => ({\n id: group.id,\n name: group.attributes.name,\n createdDate: group.attributes.createdDate,\n isInternalGroup: group.attributes.isInternalGroup,\n hasAccessToAllBuilds: group.attributes.hasAccessToAllBuilds,\n publicLinkEnabled: group.attributes.publicLinkEnabled,\n publicLink: group.attributes.publicLink,\n feedbackEnabled: group.attributes.feedbackEnabled,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List beta testers in a beta group\n */\nexport async function listBetaTesters(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBetaTestersInputSchema, input);\n\n const response = await client.get<ASCListResponse<BetaTester>>(\n `/betaGroups/${params.betaGroupId}/betaTesters`,\n {\n limit: params.limit,\n \"fields[betaTesters]\": \"firstName,lastName,email,inviteType,state\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((tester) => ({\n id: tester.id,\n firstName: tester.attributes.firstName,\n lastName: tester.attributes.lastName,\n email: tester.attributes.email,\n inviteType: tester.attributes.inviteType,\n state: tester.attributes.state,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Add a beta tester to a beta group\n */\nexport async function addBetaTester(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(addBetaTesterInputSchema, input);\n\n const requestBody: CreateBetaTesterRequest = {\n data: {\n type: \"betaTesters\",\n attributes: {\n email: params.email,\n firstName: params.firstName,\n lastName: params.lastName,\n },\n relationships: {\n betaGroups: {\n data: [\n {\n type: \"betaGroups\",\n id: params.betaGroupId,\n },\n ],\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<BetaTester>>(\"/betaTesters\", requestBody);\n\n const tester = response.data;\n\n return {\n success: true,\n data: {\n id: tester.id,\n firstName: tester.attributes.firstName,\n lastName: tester.attributes.lastName,\n email: tester.attributes.email,\n inviteType: tester.attributes.inviteType,\n state: tester.attributes.state,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Remove a beta tester from a beta group\n */\nexport async function removeBetaTester(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(removeBetaTesterInputSchema, input);\n\n const requestBody: RemoveBetaTestersRequest = {\n data: [\n {\n type: \"betaTesters\",\n id: params.betaTesterId,\n },\n ],\n };\n\n // Delete the beta tester from the group by deleting the relationship\n // The API endpoint is: DELETE /betaGroups/{id}/relationships/betaTesters\n // with a body containing the tester IDs to remove\n await client.delete(`/betaGroups/${params.betaGroupId}/relationships/betaTesters`, requestBody);\n\n return {\n success: true,\n data: {\n removed: true,\n betaGroupId: params.betaGroupId,\n betaTesterId: params.betaTesterId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for beta testing\n */\nexport const betaToolDefinitions = [\n {\n name: \"list_beta_groups\",\n description:\n \"List all beta groups for an app. Returns group names, public link info, and settings.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of groups to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"list_beta_testers\",\n description: \"List all beta testers in a specific beta group.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of testers to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"betaGroupId\"],\n },\n },\n {\n name: \"add_beta_tester\",\n description: \"Add a new beta tester to a beta group by email address.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID to add the tester to\",\n },\n email: {\n type: \"string\",\n description: \"Email address of the beta tester\",\n },\n firstName: {\n type: \"string\",\n description: \"First name of the beta tester (optional)\",\n },\n lastName: {\n type: \"string\",\n description: \"Last name of the beta tester (optional)\",\n },\n },\n required: [\"betaGroupId\", \"email\"],\n },\n },\n {\n name: \"remove_beta_tester\",\n description: \"Remove a beta tester from a beta group.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID to remove the tester from\",\n },\n betaTesterId: {\n type: \"string\",\n description: \"The beta tester ID to remove\",\n },\n },\n required: [\"betaGroupId\", \"betaTesterId\"],\n },\n },\n];\n","/**\n * Build Tools - Manage app builds\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, BetaTesterInvitation, Build } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getBuildInputSchema,\n listBetaTesterInvitationsInputSchema,\n listBuildsInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all builds for an app\n */\nexport async function listBuilds(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listBuildsInputSchema, input);\n\n const response = await client.get<ASCListResponse<Build>>(`/apps/${params.appId}/builds`, {\n limit: params.limit,\n \"fields[builds]\":\n \"version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption\",\n sort: \"-uploadedDate\",\n });\n\n return {\n success: true,\n data: response.data.map((build) => ({\n id: build.id,\n version: build.attributes.version,\n uploadedDate: build.attributes.uploadedDate,\n expirationDate: build.attributes.expirationDate,\n expired: build.attributes.expired,\n minOsVersion: build.attributes.minOsVersion,\n processingState: build.attributes.processingState,\n buildAudienceType: build.attributes.buildAudienceType,\n usesNonExemptEncryption: build.attributes.usesNonExemptEncryption,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific build\n */\nexport async function getBuild(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getBuildInputSchema, input);\n\n const response = await client.get<ASCResponse<Build>>(`/builds/${params.buildId}`, {\n \"fields[builds]\":\n \"version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption\",\n });\n\n const build = response.data;\n\n return {\n success: true,\n data: {\n id: build.id,\n version: build.attributes.version,\n uploadedDate: build.attributes.uploadedDate,\n expirationDate: build.attributes.expirationDate,\n expired: build.attributes.expired,\n minOsVersion: build.attributes.minOsVersion,\n processingState: build.attributes.processingState,\n buildAudienceType: build.attributes.buildAudienceType,\n usesNonExemptEncryption: build.attributes.usesNonExemptEncryption,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List beta tester invitations for a beta group\n */\nexport async function listBetaTesterInvitations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBetaTesterInvitationsInputSchema, input);\n\n const response = await client.get<ASCListResponse<BetaTesterInvitation>>(\n `/betaGroups/${params.betaGroupId}/betaTesterInvitations`,\n {\n limit: params.limit,\n }\n );\n\n return {\n success: true,\n data: response.data.map((invitation) => ({\n id: invitation.id,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for builds\n */\nexport const buildsToolDefinitions = [\n {\n name: \"list_builds\",\n description: \"List all builds for an app, sorted by upload date (newest first).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of builds to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_build\",\n description: \"Get details of a specific build.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n buildId: {\n type: \"string\",\n description: \"The build resource ID\",\n },\n },\n required: [\"buildId\"],\n },\n },\n {\n name: \"list_beta_tester_invitations\",\n description: \"List pending beta tester invitations for a beta group.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of invitations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"betaGroupId\"],\n },\n },\n];\n","/**\n * Bundle ID Tools - Manage bundle identifiers\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n BundleId,\n CreateBundleIdRequest,\n UpdateBundleIdRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createBundleIdInputSchema,\n deleteBundleIdInputSchema,\n getBundleIdInputSchema,\n listBundleIdsInputSchema,\n updateBundleIdInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all bundle IDs\n */\nexport async function listBundleIds(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBundleIdsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[bundleIds]\": \"name,identifier,platform,seedId\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n const response = await client.get<ASCListResponse<BundleId>>(\"/bundleIds\", queryParams);\n\n return {\n success: true,\n data: response.data.map((bundleId) => ({\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific bundle ID\n */\nexport async function getBundleId(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getBundleIdInputSchema, input);\n\n const response = await client.get<ASCResponse<BundleId>>(`/bundleIds/${params.bundleIdId}`, {\n \"fields[bundleIds]\": \"name,identifier,platform,seedId\",\n });\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new bundle ID\n */\nexport async function createBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createBundleIdInputSchema, input);\n\n const requestBody: CreateBundleIdRequest = {\n data: {\n type: \"bundleIds\",\n attributes: {\n identifier: params.identifier,\n name: params.name,\n platform: params.platform,\n },\n },\n };\n\n const response = await client.post<ASCResponse<BundleId>>(\"/bundleIds\", requestBody);\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update a bundle ID (only name can be changed)\n */\nexport async function updateBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateBundleIdInputSchema, input);\n\n const requestBody: UpdateBundleIdRequest = {\n data: {\n type: \"bundleIds\",\n id: params.bundleIdId,\n attributes: {\n name: params.name,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<BundleId>>(\n `/bundleIds/${params.bundleIdId}`,\n requestBody\n );\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Delete a bundle ID\n */\nexport async function deleteBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(deleteBundleIdInputSchema, input);\n\n await client.delete(`/bundleIds/${params.bundleIdId}`);\n\n return {\n success: true,\n data: {\n deleted: true,\n bundleIdId: params.bundleIdId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for bundle IDs\n */\nexport const bundleIdsToolDefinitions = [\n {\n name: \"list_bundle_ids\",\n description: \"List all bundle IDs registered in App Store Connect. Can filter by platform.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of bundle IDs to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_bundle_id\",\n description: \"Get details of a specific bundle ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID\",\n },\n },\n required: [\"bundleIdId\"],\n },\n },\n {\n name: \"create_bundle_id\",\n description:\n \"Register a new bundle ID in App Store Connect. The identifier must be unique and follow reverse-domain notation (e.g., com.example.app).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n identifier: {\n type: \"string\",\n description: \"The bundle identifier (e.g., com.example.app)\",\n },\n name: {\n type: \"string\",\n description: \"A name for the bundle ID\",\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"The platform for this bundle ID\",\n },\n },\n required: [\"identifier\", \"name\", \"platform\"],\n },\n },\n {\n name: \"update_bundle_id\",\n description: \"Update a bundle ID's name. Note: The identifier cannot be changed.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID\",\n },\n name: {\n type: \"string\",\n description: \"The new name for the bundle ID\",\n },\n },\n required: [\"bundleIdId\", \"name\"],\n },\n },\n {\n name: \"delete_bundle_id\",\n description:\n \"Delete a bundle ID. Note: This cannot be undone and may affect apps using this bundle ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID to delete\",\n },\n },\n required: [\"bundleIdId\"],\n },\n },\n];\n","/**\n * Category Tools - Manage app categories and pricing\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppAvailability,\n AppCategory,\n AppPriceSchedule,\n Territory,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getAppAvailabilityInputSchema,\n getAppPriceScheduleInputSchema,\n listAppCategoriesInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all app categories\n */\nexport async function listAppCategories(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppCategoriesInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appCategories]\": \"platforms\",\n include: \"subcategories\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platforms]\"] = params.platform;\n }\n\n const response = await client.get<ASCListResponse<AppCategory>>(\"/appCategories\", queryParams);\n\n // Get included subcategories\n const included = (response.included ?? []) as AppCategory[];\n const subcategoriesMap = new Map<string, AppCategory>();\n for (const sub of included) {\n if (sub.type === \"appCategories\") {\n subcategoriesMap.set(sub.id, sub);\n }\n }\n\n return {\n success: true,\n data: response.data.map((category) => {\n // Get subcategory IDs from relationships\n const subcategoryData = category.relationships?.subcategories?.data;\n const subcategoryIds = Array.isArray(subcategoryData)\n ? subcategoryData.map((s) => s.id)\n : [];\n\n return {\n id: category.id,\n platforms: category.attributes.platforms,\n subcategories: subcategoryIds.map((id) => {\n const sub = subcategoriesMap.get(id);\n return sub\n ? {\n id: sub.id,\n platforms: sub.attributes.platforms,\n }\n : { id };\n }),\n };\n }),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get app price schedule (pricing tiers)\n */\nexport async function getAppPriceSchedule(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppPriceScheduleInputSchema, input);\n\n const response = await client.get<ASCResponse<AppPriceSchedule>>(\n `/apps/${params.appId}/appPriceSchedule`,\n {\n include: \"baseTerritory,manualPrices,automaticPrices\",\n }\n );\n\n const schedule = response.data;\n const included = (response.included ?? []) as Array<Territory | unknown>;\n\n // Find the base territory from included\n let baseTerritory: { id: string; currency?: string } | undefined;\n const baseTerritoryData = schedule.relationships?.baseTerritory?.data;\n if (baseTerritoryData && !Array.isArray(baseTerritoryData)) {\n const territory = included.find(\n (item): item is Territory =>\n (item as Territory).type === \"territories\" &&\n (item as Territory).id === baseTerritoryData.id\n );\n if (territory) {\n baseTerritory = {\n id: territory.id,\n currency: territory.attributes.currency,\n };\n }\n }\n\n return {\n success: true,\n data: {\n id: schedule.id,\n baseTerritory,\n hasManualPrices:\n schedule.relationships?.manualPrices?.data !== undefined &&\n (Array.isArray(schedule.relationships.manualPrices.data)\n ? schedule.relationships.manualPrices.data.length > 0\n : true),\n hasAutomaticPrices:\n schedule.relationships?.automaticPrices?.data !== undefined &&\n (Array.isArray(schedule.relationships.automaticPrices.data)\n ? schedule.relationships.automaticPrices.data.length > 0\n : true),\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get app availability in territories\n */\nexport async function getAppAvailability(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppAvailabilityInputSchema, input);\n\n const response = await client.get<ASCResponse<AppAvailability>>(\n `/apps/${params.appId}/appAvailability`,\n {\n include: \"availableTerritories\",\n \"fields[territories]\": \"currency\",\n }\n );\n\n const availability = response.data;\n const included = (response.included ?? []) as Territory[];\n\n // Get territory details from included\n const territories = included\n .filter((item): item is Territory => item.type === \"territories\")\n .map((territory) => ({\n id: territory.id,\n currency: territory.attributes.currency,\n }));\n\n return {\n success: true,\n data: {\n id: availability.id,\n availableInNewTerritories: availability.attributes.availableInNewTerritories,\n territories,\n territoryCount: territories.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for categories\n */\nexport const categoriesToolDefinitions = [\n {\n name: \"list_app_categories\",\n description: \"List all app categories available in the App Store. Can filter by platform.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of categories to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_app_price_schedule\",\n description: \"Get the price schedule for an app, including pricing information.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_app_availability\",\n description:\n \"Get app availability information, including which territories the app is available in.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n },\n required: [\"appId\"],\n },\n },\n];\n","/**\n * Device Tools - Manage registered devices\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, Device } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getDeviceInputSchema,\n listDevicesInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all registered devices\n */\nexport async function listDevices(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listDevicesInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[devices]\": \"name,platform,udid,deviceClass,status,model,addedDate\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n if (params.status) {\n queryParams[\"filter[status]\"] = params.status;\n }\n\n const response = await client.get<ASCListResponse<Device>>(\"/devices\", queryParams);\n\n return {\n success: true,\n data: response.data.map((device) => ({\n id: device.id,\n name: device.attributes.name,\n platform: device.attributes.platform,\n udid: device.attributes.udid,\n deviceClass: device.attributes.deviceClass,\n status: device.attributes.status,\n model: device.attributes.model,\n addedDate: device.attributes.addedDate,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific device\n */\nexport async function getDevice(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getDeviceInputSchema, input);\n\n const response = await client.get<ASCResponse<Device>>(`/devices/${params.deviceId}`, {\n \"fields[devices]\": \"name,platform,udid,deviceClass,status,model,addedDate\",\n });\n\n const device = response.data;\n\n return {\n success: true,\n data: {\n id: device.id,\n name: device.attributes.name,\n platform: device.attributes.platform,\n udid: device.attributes.udid,\n deviceClass: device.attributes.deviceClass,\n status: device.attributes.status,\n model: device.attributes.model,\n addedDate: device.attributes.addedDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for devices\n */\nexport const devicesToolDefinitions = [\n {\n name: \"list_devices\",\n description:\n \"List all registered devices in App Store Connect. Can filter by platform and status.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of devices to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n status: {\n type: \"string\",\n enum: [\"ENABLED\", \"DISABLED\"],\n description: \"Filter by device status\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_device\",\n description: \"Get details of a specific registered device.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n deviceId: {\n type: \"string\",\n description: \"The device resource ID\",\n },\n },\n required: [\"deviceId\"],\n },\n },\n];\n","/**\n * App Store Version Localizations Tools - CRUD operations for version localizations\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppStoreVersionLocalization,\n CreateAppStoreVersionLocalizationRequest,\n UpdateAppStoreVersionLocalizationRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createVersionLocalizationInputSchema,\n deleteVersionLocalizationInputSchema,\n getVersionLocalizationInputSchema,\n listVersionLocalizationsInputSchema,\n updateVersionLocalizationInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all localizations for an app version\n */\nexport async function listVersionLocalizations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listVersionLocalizationsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppStoreVersionLocalization>>(\n `/appStoreVersions/${params.versionId}/appStoreVersionLocalizations`,\n {\n limit: params.limit,\n \"fields[appStoreVersionLocalizations]\":\n \"locale,description,keywords,marketingUrl,promotionalText,supportUrl,whatsNew\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((loc) => ({\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific version localization\n */\nexport async function getVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getVersionLocalizationInputSchema, input);\n\n const response = await client.get<ASCResponse<AppStoreVersionLocalization>>(\n `/appStoreVersionLocalizations/${params.localizationId}`,\n {\n \"fields[appStoreVersionLocalizations]\":\n \"locale,description,keywords,marketingUrl,promotionalText,supportUrl,whatsNew\",\n }\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new version localization\n */\nexport async function createVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createVersionLocalizationInputSchema, input);\n\n const requestBody: CreateAppStoreVersionLocalizationRequest = {\n data: {\n type: \"appStoreVersionLocalizations\",\n attributes: {\n locale: params.locale,\n description: params.description,\n keywords: params.keywords,\n marketingUrl: params.marketingUrl,\n promotionalText: params.promotionalText,\n supportUrl: params.supportUrl,\n whatsNew: params.whatsNew,\n },\n relationships: {\n appStoreVersion: {\n data: {\n type: \"appStoreVersions\",\n id: params.versionId,\n },\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<AppStoreVersionLocalization>>(\n \"/appStoreVersionLocalizations\",\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update an existing version localization\n */\nexport async function updateVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateVersionLocalizationInputSchema, input);\n\n const requestBody: UpdateAppStoreVersionLocalizationRequest = {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.localizationId,\n attributes: {\n description: params.description,\n keywords: params.keywords,\n marketingUrl: params.marketingUrl,\n promotionalText: params.promotionalText,\n supportUrl: params.supportUrl,\n whatsNew: params.whatsNew,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<AppStoreVersionLocalization>>(\n `/appStoreVersionLocalizations/${params.localizationId}`,\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Delete a version localization\n */\nexport async function deleteVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(deleteVersionLocalizationInputSchema, input);\n\n await client.delete(`/appStoreVersionLocalizations/${params.localizationId}`);\n\n return {\n success: true,\n data: {\n deleted: true,\n localizationId: params.localizationId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for localizations\n */\nexport const localizationsToolDefinitions = [\n {\n name: \"list_version_localizations\",\n description:\n \"List all localizations for an App Store version. Returns description, keywords, what's new, and URLs for each locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of localizations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"versionId\"],\n },\n },\n {\n name: \"get_version_localization\",\n description: \"Get detailed information about a specific version localization.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"create_version_localization\",\n description:\n \"Create a new localization for an App Store version. Add descriptions, keywords, and other metadata in a specific locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., 'en-US', 'ja', 'zh-Hans')\",\n },\n description: {\n type: \"string\",\n description: \"App description (max 4000 characters)\",\n },\n keywords: {\n type: \"string\",\n description: \"Keywords for search (max 100 characters, comma-separated)\",\n },\n whatsNew: {\n type: \"string\",\n description: \"What's new in this version (max 4000 characters)\",\n },\n promotionalText: {\n type: \"string\",\n description: \"Promotional text (max 170 characters)\",\n },\n marketingUrl: {\n type: \"string\",\n description: \"Marketing URL (HTTPS only)\",\n },\n supportUrl: {\n type: \"string\",\n description: \"Support URL (HTTPS only)\",\n },\n },\n required: [\"versionId\", \"locale\"],\n },\n },\n {\n name: \"update_version_localization\",\n description: \"Update an existing version localization. Only provided fields will be updated.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID to update\",\n },\n description: {\n type: \"string\",\n description: \"App description (max 4000 characters)\",\n },\n keywords: {\n type: \"string\",\n description: \"Keywords for search (max 100 characters, comma-separated)\",\n },\n whatsNew: {\n type: \"string\",\n description: \"What's new in this version (max 4000 characters)\",\n },\n promotionalText: {\n type: \"string\",\n description: \"Promotional text (max 170 characters)\",\n },\n marketingUrl: {\n type: \"string\",\n description: \"Marketing URL (HTTPS only)\",\n },\n supportUrl: {\n type: \"string\",\n description: \"Support URL (HTTPS only)\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"delete_version_localization\",\n description: \"Delete a version localization. Cannot delete the primary locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID to delete\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n];\n","/**\n * Screenshots Tools - Manage app screenshot sets and screenshots\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppScreenshot,\n AppScreenshotSet,\n CreateAppScreenshotRequest,\n UpdateAppScreenshotRequest,\n} from \"../api/types.js\";\nimport { ASCError, formatErrorResponse } from \"../utils/errors.js\";\nimport {\n listScreenshotSetsInputSchema,\n listScreenshotsInputSchema,\n uploadScreenshotInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List screenshot sets for a version localization\n */\nexport async function listScreenshotSets(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listScreenshotSetsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppScreenshotSet>>(\n `/appStoreVersionLocalizations/${params.localizationId}/appScreenshotSets`,\n {\n limit: params.limit,\n \"fields[appScreenshotSets]\": \"screenshotDisplayType\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((set) => ({\n id: set.id,\n screenshotDisplayType: set.attributes.screenshotDisplayType,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List screenshots in a screenshot set\n */\nexport async function listScreenshots(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listScreenshotsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppScreenshot>>(\n `/appScreenshotSets/${params.screenshotSetId}/appScreenshots`,\n {\n limit: params.limit,\n \"fields[appScreenshots]\":\n \"fileSize,fileName,sourceFileChecksum,imageAsset,assetDeliveryState\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((screenshot) => ({\n id: screenshot.id,\n fileName: screenshot.attributes.fileName,\n fileSize: screenshot.attributes.fileSize,\n sourceFileChecksum: screenshot.attributes.sourceFileChecksum,\n imageAsset: screenshot.attributes.imageAsset,\n assetDeliveryState: screenshot.attributes.assetDeliveryState,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Upload a screenshot to a screenshot set\n *\n * This is a multi-step process:\n * 1. Reserve the screenshot (POST)\n * 2. Upload file chunks to the provided URLs (PUT)\n * 3. Commit the upload (PATCH)\n */\nexport async function uploadScreenshot(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(uploadScreenshotInputSchema, input);\n\n // Read the file\n let fileBuffer: Buffer;\n try {\n fileBuffer = await fs.readFile(params.filePath);\n } catch (_error) {\n throw new ASCError(`Failed to read file: ${params.filePath}`, \"FILE_READ_ERROR\", 400);\n }\n\n // Validate file size matches\n if (fileBuffer.length !== params.fileSize) {\n throw new ASCError(\n `File size mismatch: expected ${params.fileSize}, got ${fileBuffer.length}`,\n \"FILE_SIZE_MISMATCH\",\n 400\n );\n }\n\n // Step 1: Reserve the screenshot\n const reserveRequest: CreateAppScreenshotRequest = {\n data: {\n type: \"appScreenshots\",\n attributes: {\n fileName: params.fileName,\n fileSize: params.fileSize,\n },\n relationships: {\n appScreenshotSet: {\n data: {\n type: \"appScreenshotSets\",\n id: params.screenshotSetId,\n },\n },\n },\n },\n };\n\n const reserveResponse = await client.post<ASCResponse<AppScreenshot>>(\n \"/appScreenshots\",\n reserveRequest\n );\n\n const screenshot = reserveResponse.data;\n const uploadOperations = screenshot.attributes.uploadOperations;\n\n if (!uploadOperations?.length) {\n throw new ASCError(\"No upload operations provided\", \"UPLOAD_ERROR\", 500);\n }\n\n // Step 2: Upload file chunks\n for (const operation of uploadOperations) {\n const chunk = fileBuffer.subarray(operation.offset, operation.offset + operation.length);\n\n const headers: Record<string, string> = {};\n for (const header of operation.requestHeaders) {\n headers[header.name] = header.value;\n }\n\n const uploadResponse = await client.rawRequest(operation.url, {\n method: operation.method,\n headers,\n body: chunk,\n });\n\n if (!uploadResponse.ok) {\n throw new ASCError(\n `Chunk upload failed: ${uploadResponse.status}`,\n \"UPLOAD_ERROR\",\n uploadResponse.status\n );\n }\n }\n\n // Step 3: Commit the upload\n const checksum = crypto.createHash(\"md5\").update(fileBuffer).digest(\"base64\");\n\n const commitRequest: UpdateAppScreenshotRequest = {\n data: {\n type: \"appScreenshots\",\n id: screenshot.id,\n attributes: {\n sourceFileChecksum: checksum,\n uploaded: true,\n },\n },\n };\n\n const commitResponse = await client.patch<ASCResponse<AppScreenshot>>(\n `/appScreenshots/${screenshot.id}`,\n commitRequest\n );\n\n const finalScreenshot = commitResponse.data;\n\n return {\n success: true,\n data: {\n id: finalScreenshot.id,\n fileName: finalScreenshot.attributes.fileName,\n fileSize: finalScreenshot.attributes.fileSize,\n sourceFileChecksum: finalScreenshot.attributes.sourceFileChecksum,\n assetDeliveryState: finalScreenshot.attributes.assetDeliveryState,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for screenshots\n */\nexport const screenshotsToolDefinitions = [\n {\n name: \"list_screenshot_sets\",\n description:\n \"List all screenshot sets for a version localization. Each set represents a different display type (device size).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The version localization ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of sets to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"list_screenshots\",\n description: \"List all screenshots in a screenshot set.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n screenshotSetId: {\n type: \"string\",\n description: \"The screenshot set ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of screenshots to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"screenshotSetId\"],\n },\n },\n {\n name: \"upload_screenshot\",\n description:\n \"Upload a new screenshot to a screenshot set. Provide the local file path, and this tool will handle the multi-step upload process.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n screenshotSetId: {\n type: \"string\",\n description: \"The screenshot set ID to upload to\",\n },\n fileName: {\n type: \"string\",\n description: \"Name for the screenshot file\",\n },\n fileSize: {\n type: \"number\",\n description: \"Size of the file in bytes\",\n },\n filePath: {\n type: \"string\",\n description: \"Local path to the screenshot file\",\n },\n },\n required: [\"screenshotSetId\", \"fileName\", \"fileSize\", \"filePath\"],\n },\n },\n];\n","/**\n * User Tools - Manage team users\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, User } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport { getUserInputSchema, listUsersInputSchema, validateInput } from \"../utils/validation.js\";\n\n/**\n * List all users in the team\n */\nexport async function listUsers(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listUsersInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[users]\": \"username,firstName,lastName,email,roles,allAppsVisible,provisioningAllowed\",\n };\n\n if (params.roles && params.roles.length > 0) {\n queryParams[\"filter[roles]\"] = params.roles.join(\",\");\n }\n\n const response = await client.get<ASCListResponse<User>>(\"/users\", queryParams);\n\n return {\n success: true,\n data: response.data.map((user) => ({\n id: user.id,\n username: user.attributes.username,\n firstName: user.attributes.firstName,\n lastName: user.attributes.lastName,\n email: user.attributes.email,\n roles: user.attributes.roles,\n allAppsVisible: user.attributes.allAppsVisible,\n provisioningAllowed: user.attributes.provisioningAllowed,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific user\n */\nexport async function getUser(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getUserInputSchema, input);\n\n const response = await client.get<ASCResponse<User>>(`/users/${params.userId}`, {\n \"fields[users]\": \"username,firstName,lastName,email,roles,allAppsVisible,provisioningAllowed\",\n });\n\n const user = response.data;\n\n return {\n success: true,\n data: {\n id: user.id,\n username: user.attributes.username,\n firstName: user.attributes.firstName,\n lastName: user.attributes.lastName,\n email: user.attributes.email,\n roles: user.attributes.roles,\n allAppsVisible: user.attributes.allAppsVisible,\n provisioningAllowed: user.attributes.provisioningAllowed,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for users\n */\nexport const usersToolDefinitions = [\n {\n name: \"list_users\",\n description: \"List all users in your App Store Connect team. Can filter by roles.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of users to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n roles: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\n \"ADMIN\",\n \"FINANCE\",\n \"TECHNICAL\",\n \"SALES\",\n \"DEVELOPER\",\n \"MARKETING\",\n \"APP_MANAGER\",\n \"CUSTOMER_SUPPORT\",\n \"ACCESS_TO_REPORTS\",\n \"READ_ONLY\",\n ],\n },\n description: \"Filter by user roles\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_user\",\n description: \"Get details of a specific team user.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n userId: {\n type: \"string\",\n description: \"The user resource ID\",\n },\n },\n required: [\"userId\"],\n },\n },\n];\n","/**\n * App Store Versions Tools - List, get, and create app versions\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppStoreVersion,\n CreateAppStoreVersionRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createAppVersionInputSchema,\n getAppVersionInputSchema,\n listAppVersionsInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all versions for an app\n */\nexport async function listAppVersions(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppVersionsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appStoreVersions]\":\n \"platform,versionString,appStoreState,copyright,releaseType,createdDate\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n if (params.versionState) {\n queryParams[\"filter[appStoreState]\"] = params.versionState;\n }\n\n const response = await client.get<ASCListResponse<AppStoreVersion>>(\n `/apps/${params.appId}/appStoreVersions`,\n queryParams\n );\n\n return {\n success: true,\n data: response.data.map((version) => ({\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n createdDate: version.attributes.createdDate,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific app version\n */\nexport async function getAppVersion(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppVersionInputSchema, input);\n\n const response = await client.get<ASCResponse<AppStoreVersion>>(\n `/appStoreVersions/${params.versionId}`,\n {\n \"fields[appStoreVersions]\":\n \"platform,versionString,appStoreState,copyright,releaseType,earliestReleaseDate,usesIdfa,downloadable,createdDate\",\n }\n );\n\n const version = response.data;\n\n return {\n success: true,\n data: {\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n earliestReleaseDate: version.attributes.earliestReleaseDate,\n usesIdfa: version.attributes.usesIdfa,\n downloadable: version.attributes.downloadable,\n createdDate: version.attributes.createdDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new app version\n */\nexport async function createAppVersion(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createAppVersionInputSchema, input);\n\n const requestBody: CreateAppStoreVersionRequest = {\n data: {\n type: \"appStoreVersions\",\n attributes: {\n platform: params.platform,\n versionString: params.versionString,\n copyright: params.copyright,\n releaseType: params.releaseType,\n earliestReleaseDate: params.earliestReleaseDate,\n },\n relationships: {\n app: {\n data: {\n type: \"apps\",\n id: params.appId,\n },\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<AppStoreVersion>>(\n \"/appStoreVersions\",\n requestBody\n );\n\n const version = response.data;\n\n return {\n success: true,\n data: {\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n createdDate: version.attributes.createdDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for versions\n */\nexport const versionsToolDefinitions = [\n {\n name: \"list_app_versions\",\n description:\n \"List all App Store versions for an app. Can filter by platform and version state.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n platform: {\n type: \"string\",\n description: \"Filter by platform (IOS, MAC_OS, TV_OS, VISION_OS)\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n },\n versionState: {\n type: \"string\",\n description: \"Filter by version state (e.g., PREPARE_FOR_SUBMISSION, READY_FOR_SALE)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of versions to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_app_version\",\n description: \"Get detailed information about a specific app version.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n },\n required: [\"versionId\"],\n },\n },\n {\n name: \"create_app_version\",\n description: \"Create a new App Store version for an app.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n platform: {\n type: \"string\",\n description: \"Platform for the version\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n },\n versionString: {\n type: \"string\",\n description: \"Version number (e.g., '1.0.0', '2.1')\",\n },\n releaseType: {\n type: \"string\",\n description: \"Release type\",\n enum: [\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"],\n },\n copyright: {\n type: \"string\",\n description: \"Copyright text for the version\",\n },\n earliestReleaseDate: {\n type: \"string\",\n description: \"Earliest release date (ISO 8601 format) for SCHEDULED release type\",\n },\n },\n required: [\"appId\", \"platform\", \"versionString\"],\n },\n },\n];\n","/**\n * Tool Registry - Central registry for all MCP tools\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\n\nimport {\n appInfoToolDefinitions,\n listAppInfoLocalizations,\n listAppInfos,\n updateAppInfoLocalization,\n} from \"./app-info.tools.js\";\n// Import tool handlers\nimport { appsToolDefinitions, getApp, listApps } from \"./apps.tools.js\";\nimport {\n addBetaTester,\n betaToolDefinitions,\n listBetaGroups,\n listBetaTesters,\n removeBetaTester,\n} from \"./beta.tools.js\";\nimport {\n buildsToolDefinitions,\n getBuild,\n listBetaTesterInvitations,\n listBuilds,\n} from \"./builds.tools.js\";\nimport {\n bundleIdsToolDefinitions,\n createBundleId,\n deleteBundleId,\n getBundleId,\n listBundleIds,\n updateBundleId,\n} from \"./bundle-ids.tools.js\";\nimport {\n categoriesToolDefinitions,\n getAppAvailability,\n getAppPriceSchedule,\n listAppCategories,\n} from \"./categories.tools.js\";\nimport { devicesToolDefinitions, getDevice, listDevices } from \"./devices.tools.js\";\nimport {\n createVersionLocalization,\n deleteVersionLocalization,\n getVersionLocalization,\n listVersionLocalizations,\n localizationsToolDefinitions,\n updateVersionLocalization,\n} from \"./localizations.tools.js\";\nimport {\n listScreenshotSets,\n listScreenshots,\n screenshotsToolDefinitions,\n uploadScreenshot,\n} from \"./screenshots.tools.js\";\nimport { getUser, listUsers, usersToolDefinitions } from \"./users.tools.js\";\nimport {\n createAppVersion,\n getAppVersion,\n listAppVersions,\n versionsToolDefinitions,\n} from \"./versions.tools.js\";\n\n// Tool handler type\ntype ToolHandler = (client: AppStoreConnectClient, input: unknown) => Promise<unknown>;\n\n// Tool handler registry\nconst toolHandlers: Record<string, ToolHandler> = {\n // Apps\n list_apps: listApps,\n get_app: getApp,\n\n // Versions\n list_app_versions: listAppVersions,\n get_app_version: getAppVersion,\n create_app_version: createAppVersion,\n\n // Localizations\n list_version_localizations: listVersionLocalizations,\n get_version_localization: getVersionLocalization,\n create_version_localization: createVersionLocalization,\n update_version_localization: updateVersionLocalization,\n delete_version_localization: deleteVersionLocalization,\n\n // App Info\n list_app_infos: listAppInfos,\n list_app_info_localizations: listAppInfoLocalizations,\n update_app_info_localization: updateAppInfoLocalization,\n\n // Beta\n list_beta_groups: listBetaGroups,\n list_beta_testers: listBetaTesters,\n add_beta_tester: addBetaTester,\n remove_beta_tester: removeBetaTester,\n\n // Screenshots\n list_screenshot_sets: listScreenshotSets,\n list_screenshots: listScreenshots,\n upload_screenshot: uploadScreenshot,\n\n // Bundle IDs\n list_bundle_ids: listBundleIds,\n get_bundle_id: getBundleId,\n create_bundle_id: createBundleId,\n update_bundle_id: updateBundleId,\n delete_bundle_id: deleteBundleId,\n\n // Devices\n list_devices: listDevices,\n get_device: getDevice,\n\n // Users\n list_users: listUsers,\n get_user: getUser,\n\n // Builds\n list_builds: listBuilds,\n get_build: getBuild,\n list_beta_tester_invitations: listBetaTesterInvitations,\n\n // Categories\n list_app_categories: listAppCategories,\n get_app_price_schedule: getAppPriceSchedule,\n get_app_availability: getAppAvailability,\n};\n\n// All tool definitions\nexport const allToolDefinitions = [\n ...appsToolDefinitions,\n ...versionsToolDefinitions,\n ...localizationsToolDefinitions,\n ...appInfoToolDefinitions,\n ...betaToolDefinitions,\n ...screenshotsToolDefinitions,\n ...bundleIdsToolDefinitions,\n ...devicesToolDefinitions,\n ...usersToolDefinitions,\n ...buildsToolDefinitions,\n ...categoriesToolDefinitions,\n];\n\n/**\n * Get a tool handler by name\n */\nexport function getToolHandler(name: string): ToolHandler | undefined {\n return toolHandlers[name];\n}\n\n/**\n * Check if a tool exists\n */\nexport function hasToolHandler(name: string): boolean {\n return name in toolHandlers;\n}\n\n/**\n * Execute a tool by name\n */\nexport async function executeTool(\n client: AppStoreConnectClient,\n name: string,\n input: unknown\n): Promise<unknown> {\n const handler = toolHandlers[name];\n if (!handler) {\n return {\n success: false,\n error: {\n code: \"UNKNOWN_TOOL\",\n message: `Unknown tool: ${name}`,\n },\n };\n }\n\n return handler(client, input);\n}\n"],"mappings":"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","names":["path","resolve","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/errors.ts","../src/api/client.ts","../src/auth/jwt.ts","../src/utils/validation.ts","../src/tools/app-info.tools.ts","../src/tools/apps.tools.ts","../src/tools/beta.tools.ts","../src/tools/builds.tools.ts","../src/tools/bundle-ids.tools.ts","../src/tools/categories.tools.ts","../src/tools/devices.tools.ts","../src/tools/localizations.tools.ts","../src/tools/screenshots.tools.ts","../src/tools/users.tools.ts","../src/tools/versions.tools.ts","../src/tools/index.ts"],"sourcesContent":["/**\n * App Store Connect MCP Server\n *\n * MCP server providing tools to interact with Apple's App Store Connect API.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { type AppStoreConnectClient, createClient } from \"./api/client.js\";\nimport { type TokenManager, createTokenManagerFromEnv } from \"./auth/jwt.js\";\nimport { allToolDefinitions, executeTool, hasToolHandler } from \"./tools/index.js\";\nimport { ConfigError, formatErrorResponse } from \"./utils/errors.js\";\n\n// Server metadata\nconst SERVER_NAME = \"asc-mcp\";\nconst SERVER_VERSION = \"1.0.0\";\n\n/**\n * Initialize and run the MCP server\n */\nasync function main(): Promise<void> {\n // Initialize token manager and client\n let tokenManager: TokenManager;\n let client: AppStoreConnectClient;\n\n try {\n tokenManager = createTokenManagerFromEnv();\n client = createClient(tokenManager);\n } catch (error) {\n if (error instanceof ConfigError) {\n console.error(`Configuration error: ${error.message}`);\n console.error(\"\\nRequired environment variables:\");\n console.error(\" APP_STORE_CONNECT_KEY_ID - Your API key ID\");\n console.error(\" APP_STORE_CONNECT_ISSUER_ID - Your issuer ID\");\n console.error(\" APP_STORE_CONNECT_P8_PATH - Path to your .p8 private key file\");\n console.error(\" or APP_STORE_CONNECT_P8_CONTENT - Content of your .p8 private key\");\n process.exit(1);\n }\n throw error;\n }\n\n // Create MCP server\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Handle list tools request\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: allToolDefinitions,\n };\n });\n\n // Handle call tool request\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n if (!hasToolHandler(name)) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(\n {\n success: false,\n error: {\n code: \"UNKNOWN_TOOL\",\n message: `Unknown tool: ${name}`,\n },\n },\n null,\n 2\n ),\n },\n ],\n isError: true,\n };\n }\n\n try {\n const result = await executeTool(client, name, args ?? {});\n\n // Check if result indicates an error\n const isError =\n typeof result === \"object\" &&\n result !== null &&\n \"success\" in result &&\n (result as { success: boolean }).success === false;\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n isError,\n };\n } catch (error) {\n const errorResponse = formatErrorResponse(error);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(errorResponse, null, 2),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Handle graceful shutdown\n const shutdown = (): void => {\n console.error(\"Shutting down...\");\n tokenManager.destroy();\n // Allow a brief moment for cleanup before exiting\n setTimeout(() => {\n process.exit(0);\n }, 100);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n // Start the server with stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Log to stderr (not stdout, which is used for MCP communication)\n console.error(`${SERVER_NAME} v${SERVER_VERSION} started`);\n}\n\n// Run the server\nmain().catch((error) => {\n console.error(\"Fatal error:\", error);\n if (error instanceof Error && error.stack) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n","/**\n * Custom error classes for App Store Connect API\n */\n\n/**\n * Returns fresh regex patterns for sanitizing sensitive data.\n * Creates new instances each call to avoid stateful regex issues with global flag.\n */\nfunction getSensitivePatterns(): RegExp[] {\n return [\n /Bearer [A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+/gi, // JWT tokens\n /-----BEGIN.*?-----[\\s\\S]*?-----END.*?-----/g, // PEM keys\n /[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}/gi, // UUIDs (issuer IDs)\n ];\n}\n\nfunction sanitizeMessage(message: string): string {\n let sanitized = message;\n for (const pattern of getSensitivePatterns()) {\n sanitized = sanitized.replace(pattern, \"[REDACTED]\");\n }\n return sanitized;\n}\n\nexport interface ASCErrorDetails {\n id?: string;\n status?: string;\n code?: string;\n title?: string;\n detail?: string;\n source?: {\n pointer?: string;\n parameter?: string;\n };\n}\n\n/**\n * Base error class for App Store Connect API errors\n */\nexport class ASCError extends Error {\n readonly code: string;\n readonly status: number;\n readonly details?: ASCErrorDetails[];\n\n constructor(message: string, code: string, status: number, details?: ASCErrorDetails[]) {\n super(sanitizeMessage(message));\n this.name = \"ASCError\";\n this.code = code;\n this.status = status;\n this.details = details;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n },\n };\n }\n}\n\n/**\n * Authentication error (invalid credentials, expired token, etc.)\n */\nexport class AuthError extends ASCError {\n constructor(message: string, details?: ASCErrorDetails[]) {\n super(message, \"AUTH_ERROR\", 401, details);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * Rate limit error with retry information\n */\nexport class RateLimitError extends ASCError {\n readonly retryAfter: number;\n\n constructor(retryAfter: number, details?: ASCErrorDetails[]) {\n super(`Rate limit exceeded. Retry after ${retryAfter} seconds.`, \"RATE_LIMIT\", 429, details);\n this.name = \"RateLimitError\";\n this.retryAfter = retryAfter;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n retryAfter: this.retryAfter,\n },\n };\n }\n}\n\n/**\n * Validation error for invalid input\n */\nexport class ValidationError extends ASCError {\n readonly field?: string;\n\n constructor(message: string, field?: string) {\n super(message, \"VALIDATION_ERROR\", 400);\n this.name = \"ValidationError\";\n this.field = field;\n }\n\n toJSON() {\n return {\n success: false,\n error: {\n code: this.code,\n message: this.message,\n details: this.details,\n field: this.field,\n },\n };\n }\n}\n\n/**\n * Not found error\n */\nexport class NotFoundError extends ASCError {\n constructor(resourceType: string, resourceId: string) {\n super(`${resourceType} with ID '${resourceId}' not found`, \"NOT_FOUND\", 404);\n this.name = \"NotFoundError\";\n }\n}\n\n/**\n * Configuration error (missing environment variables, invalid config)\n */\nexport class ConfigError extends ASCError {\n constructor(message: string) {\n super(message, \"CONFIG_ERROR\", 500);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Parse Apple API error response into ASCError\n */\nexport function parseAPIError(status: number, body: unknown): ASCError {\n const errors = (body as { errors?: ASCErrorDetails[] })?.errors;\n\n if (status === 401) {\n return new AuthError(\"Authentication failed\", errors);\n }\n\n if (status === 429) {\n return new RateLimitError(60, errors); // Default to 60s if not specified\n }\n\n if (status === 404) {\n const detail = errors?.[0]?.detail ?? \"Resource not found\";\n return new ASCError(detail, \"NOT_FOUND\", 404, errors);\n }\n\n if (status === 403) {\n return new ASCError(\n \"Access forbidden. Check your API key permissions.\",\n \"FORBIDDEN\",\n 403,\n errors\n );\n }\n\n if (status === 409) {\n const detail = errors?.[0]?.detail ?? \"Conflict with current state\";\n return new ASCError(detail, \"CONFLICT\", 409, errors);\n }\n\n // Generic error\n const message = errors?.[0]?.detail ?? `API request failed with status ${status}`;\n return new ASCError(message, \"API_ERROR\", status, errors);\n}\n\n/**\n * Format error for MCP tool response\n */\nexport function formatErrorResponse(error: unknown): {\n success: false;\n error: { code: string; message: string; details?: unknown };\n} {\n if (error instanceof ASCError) {\n return error.toJSON() as {\n success: false;\n error: { code: string; message: string; details?: unknown };\n };\n }\n\n if (error instanceof Error) {\n return {\n success: false,\n error: {\n code: \"INTERNAL_ERROR\",\n message: sanitizeMessage(error.message),\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: \"UNKNOWN_ERROR\",\n message: \"An unknown error occurred\",\n },\n };\n}\n","/**\n * App Store Connect API Client\n *\n * Handles HTTP requests with automatic token refresh, rate limiting, and retry logic.\n */\n\nimport type { TokenManager } from \"../auth/jwt.js\";\nimport { ASCError, RateLimitError, parseAPIError } from \"../utils/errors.js\";\nimport type { ASCListResponse } from \"./types.js\";\n\nconst BASE_URL = \"https://api.appstoreconnect.apple.com/v1\";\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst MAX_RETRIES = 3;\nconst INITIAL_RETRY_DELAY_MS = 1000;\n\n// Self-imposed rate limiting: 50 requests per minute\nconst RATE_LIMIT_WINDOW_MS = 60000;\nconst MAX_REQUESTS_PER_WINDOW = 50;\n\ninterface RequestOptions {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n path: string;\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n timeout?: number;\n}\n\ninterface RateLimiter {\n timestamps: number[];\n}\n\n/**\n * App Store Connect API Client\n */\nexport class AppStoreConnectClient {\n private readonly tokenManager: TokenManager;\n private readonly baseUrl: string;\n private readonly rateLimiter: RateLimiter = { timestamps: [] };\n\n constructor(tokenManager: TokenManager, baseUrl = BASE_URL) {\n this.tokenManager = tokenManager;\n this.baseUrl = baseUrl;\n }\n\n /**\n * Make a GET request\n */\n async get<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n return this.request<T>({ method: \"GET\", path, params });\n }\n\n /**\n * Make a POST request\n */\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>({ method: \"POST\", path, body });\n }\n\n /**\n * Make a PATCH request\n */\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>({ method: \"PATCH\", path, body });\n }\n\n /**\n * Make a DELETE request\n */\n async delete(path: string, body?: unknown): Promise<void> {\n await this.request<void>({ method: \"DELETE\", path, body });\n }\n\n /**\n * Make a raw request (for custom operations like file uploads)\n */\n async rawRequest(\n url: string,\n options: {\n method: string;\n headers?: Record<string, string>;\n body?: Buffer | string;\n timeout?: number;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? DEFAULT_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Paginate through all results\n */\n async *paginate<T>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n maxItems?: number\n ): AsyncGenerator<T, void, undefined> {\n let cursor: string | undefined;\n let itemsYielded = 0;\n\n do {\n const queryParams = { ...params };\n if (cursor) {\n // Extract cursor from next URL if it contains query params\n if (cursor.includes(\"?\")) {\n try {\n // Try parsing as full URL first\n const url = new URL(cursor);\n for (const [key, value] of url.searchParams) {\n queryParams[key] = value;\n }\n } catch {\n // Fall back to parsing as relative URL\n const queryString = cursor.split(\"?\")[1];\n if (queryString) {\n const searchParams = new URLSearchParams(queryString);\n for (const [key, value] of searchParams) {\n queryParams[key] = value;\n }\n }\n }\n }\n }\n\n const response = await this.get<ASCListResponse<T>>(path, queryParams);\n\n for (const item of response.data) {\n yield item;\n itemsYielded++;\n\n if (maxItems && itemsYielded >= maxItems) {\n return;\n }\n }\n\n cursor = response.links?.next;\n } while (cursor);\n }\n\n /**\n * Core request method with retry logic\n */\n private async request<T>(options: RequestOptions): Promise<T> {\n await this.enforceRateLimit();\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n return await this.executeRequest<T>(options);\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry on client errors (4xx) except rate limits\n if (error instanceof ASCError && error.status >= 400 && error.status < 500) {\n if (error instanceof RateLimitError) {\n // Wait for rate limit to clear\n const waitMs = error.retryAfter * 1000;\n await this.sleep(waitMs);\n continue;\n }\n throw error;\n }\n\n // Exponential backoff for server errors\n if (attempt < MAX_RETRIES - 1) {\n const delay = INITIAL_RETRY_DELAY_MS * 2 ** attempt;\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError ?? new Error(\"Request failed after max retries\");\n }\n\n /**\n * Execute a single HTTP request\n */\n private async executeRequest<T>(options: RequestOptions): Promise<T> {\n const token = await this.tokenManager.getToken();\n const url = this.buildUrl(options.path, options.params);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n // Only set Content-Type when there's a body\n if (options.body) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? DEFAULT_TIMEOUT_MS);\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // Handle rate limiting from API\n if (response.status === 429) {\n const retryAfter = Number.parseInt(response.headers.get(\"Retry-After\") ?? \"60\", 10);\n throw new RateLimitError(retryAfter);\n }\n\n // Handle no content responses\n if (response.status === 204) {\n return undefined as T;\n }\n\n const body = await response.json();\n\n // Handle error responses\n if (!response.ok) {\n throw parseAPIError(response.status, body);\n }\n\n return body as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ASCError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new ASCError(\"Request timed out\", \"TIMEOUT\", 408);\n }\n throw new ASCError(error.message, \"NETWORK_ERROR\", 0);\n }\n\n throw new ASCError(\"Unknown error occurred\", \"UNKNOWN\", 0);\n }\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(\n path: string,\n params?: Record<string, string | number | boolean | undefined>\n ): string {\n const url = new URL(path.startsWith(\"/\") ? path.slice(1) : path, `${this.baseUrl}/`);\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.append(key, String(value));\n }\n }\n }\n\n return url.toString();\n }\n\n /**\n * Self-imposed rate limiting.\n * Records the request timestamp before checking to prevent off-by-one errors.\n */\n private async enforceRateLimit(): Promise<void> {\n const now = Date.now();\n\n // Clean old timestamps\n this.rateLimiter.timestamps = this.rateLimiter.timestamps.filter(\n (ts) => now - ts < RATE_LIMIT_WINDOW_MS\n );\n\n // Check if we're at the limit (check BEFORE adding this request)\n if (this.rateLimiter.timestamps.length >= MAX_REQUESTS_PER_WINDOW) {\n const oldestTimestamp = this.rateLimiter.timestamps[0];\n if (oldestTimestamp) {\n const waitTime = RATE_LIMIT_WINDOW_MS - (now - oldestTimestamp);\n if (waitTime > 0) {\n await this.sleep(waitTime);\n // Clean timestamps again after waiting\n const newNow = Date.now();\n this.rateLimiter.timestamps = this.rateLimiter.timestamps.filter(\n (ts) => newNow - ts < RATE_LIMIT_WINDOW_MS\n );\n }\n }\n }\n\n // Record this request AFTER the rate limit check passes\n this.rateLimiter.timestamps.push(Date.now());\n }\n\n /**\n * Sleep helper\n */\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Create an App Store Connect client from a token manager\n */\nexport function createClient(tokenManager: TokenManager): AppStoreConnectClient {\n return new AppStoreConnectClient(tokenManager);\n}\n","/**\n * JWT Token Manager for App Store Connect API authentication\n *\n * Generates ES256 signed JWTs with automatic caching and refresh.\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { type KeyLike, SignJWT, importPKCS8 } from \"jose\";\nimport { AuthError, ConfigError } from \"../utils/errors.js\";\n\nconst TOKEN_LIFETIME_SECONDS = 15 * 60; // 15 minutes\nconst TOKEN_REFRESH_BUFFER_SECONDS = 5 * 60; // Refresh 5 minutes before expiry\nconst AUDIENCE = \"appstoreconnect-v1\";\n\nexport interface TokenManagerConfig {\n keyId: string;\n issuerId: string;\n privateKeyPath?: string;\n privateKeyContent?: string;\n}\n\n/**\n * Manages JWT token generation and caching for App Store Connect API\n */\nexport class TokenManager {\n private readonly keyId: string;\n private readonly issuerId: string;\n private readonly privateKeySource:\n | { type: \"path\"; path: string }\n | { type: \"content\"; content: string };\n\n private cachedToken: string | null = null;\n private tokenExpiresAt = 0;\n private privateKey: KeyLike | null = null;\n private pendingTokenGeneration: Promise<string> | null = null;\n\n constructor(config: TokenManagerConfig) {\n this.keyId = config.keyId;\n this.issuerId = config.issuerId;\n\n if (config.privateKeyPath) {\n // Validate path doesn't contain directory traversal\n if (config.privateKeyPath.includes(\"..\")) {\n throw new ConfigError(\"Private key path cannot contain '..'\");\n }\n this.privateKeySource = { type: \"path\", path: config.privateKeyPath };\n } else if (config.privateKeyContent) {\n this.privateKeySource = { type: \"content\", content: config.privateKeyContent };\n } else {\n throw new ConfigError(\"Either privateKeyPath or privateKeyContent must be provided\");\n }\n }\n\n /**\n * Get a valid JWT token, generating a new one if needed.\n * Uses a pending promise pattern to prevent concurrent token generation.\n */\n async getToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n\n // Return cached token if still valid (with buffer)\n if (this.cachedToken && this.tokenExpiresAt > now + TOKEN_REFRESH_BUFFER_SECONDS) {\n return this.cachedToken;\n }\n\n // If a token generation is already in progress, wait for it\n if (this.pendingTokenGeneration) {\n return this.pendingTokenGeneration;\n }\n\n // Generate new token with mutex pattern\n this.pendingTokenGeneration = this.generateToken().finally(() => {\n this.pendingTokenGeneration = null;\n });\n\n return this.pendingTokenGeneration;\n }\n\n /**\n * Generate a new JWT token\n */\n async generateToken(): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n const expiresAt = now + TOKEN_LIFETIME_SECONDS;\n\n // Load private key if not already loaded\n if (!this.privateKey) {\n await this.loadPrivateKey();\n }\n\n if (!this.privateKey) {\n throw new AuthError(\"Failed to load private key\");\n }\n\n try {\n const jwt = await new SignJWT({})\n .setProtectedHeader({\n alg: \"ES256\",\n kid: this.keyId,\n typ: \"JWT\",\n })\n .setIssuer(this.issuerId)\n .setIssuedAt(now)\n .setExpirationTime(expiresAt)\n .setAudience(AUDIENCE)\n .sign(this.privateKey);\n\n // Cache the token\n this.cachedToken = jwt;\n this.tokenExpiresAt = expiresAt;\n\n return jwt;\n } catch (error) {\n throw new AuthError(\n `Failed to generate JWT: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Load the private key from file or content\n */\n private async loadPrivateKey(): Promise<void> {\n let keyContent: string;\n\n if (this.privateKeySource.type === \"path\") {\n try {\n // Resolve to absolute path\n const absolutePath = path.resolve(this.privateKeySource.path);\n keyContent = await fs.readFile(absolutePath, \"utf-8\");\n } catch (error) {\n throw new ConfigError(\n `Failed to read private key from ${this.privateKeySource.path}: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n } else {\n keyContent = this.privateKeySource.content;\n }\n\n // Handle raw key content (without PEM headers)\n keyContent = keyContent.trim();\n if (!keyContent.startsWith(\"-----BEGIN\")) {\n keyContent = `-----BEGIN PRIVATE KEY-----\\n${keyContent}\\n-----END PRIVATE KEY-----`;\n }\n\n try {\n this.privateKey = await importPKCS8(keyContent, \"ES256\");\n } catch (error) {\n throw new AuthError(\n `Failed to parse private key: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n /**\n * Clear cached token (call on shutdown)\n */\n destroy(): void {\n this.cachedToken = null;\n this.tokenExpiresAt = 0;\n this.privateKey = null;\n this.pendingTokenGeneration = null;\n }\n\n /**\n * Check if a token is currently cached and valid\n */\n hasValidToken(): boolean {\n const now = Math.floor(Date.now() / 1000);\n return this.cachedToken !== null && this.tokenExpiresAt > now + TOKEN_REFRESH_BUFFER_SECONDS;\n }\n}\n\n/**\n * Create a TokenManager from environment variables\n */\nexport function createTokenManagerFromEnv(): TokenManager {\n const keyId = process.env.APP_STORE_CONNECT_KEY_ID;\n const issuerId = process.env.APP_STORE_CONNECT_ISSUER_ID;\n const privateKeyPath = process.env.APP_STORE_CONNECT_P8_PATH;\n const privateKeyContent = process.env.APP_STORE_CONNECT_P8_CONTENT;\n\n if (!keyId) {\n throw new ConfigError(\"APP_STORE_CONNECT_KEY_ID environment variable is required\");\n }\n\n if (!issuerId) {\n throw new ConfigError(\"APP_STORE_CONNECT_ISSUER_ID environment variable is required\");\n }\n\n if (!privateKeyPath && !privateKeyContent) {\n throw new ConfigError(\n \"Either APP_STORE_CONNECT_P8_PATH or APP_STORE_CONNECT_P8_CONTENT environment variable is required\"\n );\n }\n\n return new TokenManager({\n keyId,\n issuerId,\n privateKeyPath,\n privateKeyContent,\n });\n}\n","/**\n * Input validation schemas and utilities using Zod\n */\n\nimport { z } from \"zod\";\nimport { ValidationError } from \"./errors.js\";\n\n// App ID - numeric string\nexport const appIdSchema = z\n .string()\n .regex(/^\\d+$/, \"App ID must be a numeric string\")\n .min(1, \"App ID is required\");\n\n// Version ID - numeric string\nexport const versionIdSchema = z.string().min(1, \"Version ID is required\");\n\n// Localization ID\nexport const localizationIdSchema = z.string().min(1, \"Localization ID is required\");\n\n// Build ID - numeric string (can be UUID format in some cases)\nexport const buildIdSchema = z.string().min(1, \"Build ID is required\");\n\n// Beta Group ID\nexport const betaGroupIdSchema = z.string().min(1, \"Beta Group ID is required\");\n\n// Locale code (e.g., \"en-US\", \"ja\", \"zh-Hans\", \"en_US\")\nexport const localeSchema = z\n .string()\n .regex(\n /^[a-z]{2}([-_][A-Z][a-z]{3})?([-_][A-Z]{2})?$/,\n \"Invalid locale format (e.g., en-US, en_US, ja, zh-Hans)\"\n )\n .min(2, \"Locale is required\");\n\n// HTTPS URL\nexport const urlSchema = z\n .string()\n .url(\"Must be a valid URL\")\n .refine((url) => url.startsWith(\"https://\"), \"URL must use HTTPS\");\n\n// Optional HTTPS URL\nexport const optionalUrlSchema = urlSchema.optional();\n\n// Version string (e.g., \"1.0.0\", \"2.1\") - no leading zeros except for single \"0\"\nexport const versionStringSchema = z\n .string()\n .regex(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*))*$/, \"Invalid version format (e.g., 1.0.0)\")\n .min(1, \"Version string is required\");\n\n// Platform enum\nexport const platformSchema = z.enum([\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"]);\n\n// App Store version state\nexport const versionStateSchema = z.enum([\n \"DEVELOPER_REMOVED_FROM_SALE\",\n \"DEVELOPER_REJECTED\",\n \"IN_REVIEW\",\n \"INVALID_BINARY\",\n \"METADATA_REJECTED\",\n \"PENDING_APPLE_RELEASE\",\n \"PENDING_CONTRACT\",\n \"PENDING_DEVELOPER_RELEASE\",\n \"PREPARE_FOR_SUBMISSION\",\n \"PREORDER_READY_FOR_SALE\",\n \"PROCESSING_FOR_APP_STORE\",\n \"READY_FOR_REVIEW\",\n \"READY_FOR_SALE\",\n \"REJECTED\",\n \"REMOVED_FROM_SALE\",\n \"WAITING_FOR_EXPORT_COMPLIANCE\",\n \"WAITING_FOR_REVIEW\",\n \"REPLACED_WITH_NEW_VERSION\",\n \"NOT_APPLICABLE\",\n]);\n\n// Release type\nexport const releaseTypeSchema = z.enum([\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"]);\n\n// Pagination options\nexport const paginationSchema = z.object({\n limit: z.number().int().min(1).max(200).optional().default(50),\n cursor: z.string().optional(),\n});\n\n// List apps input\nexport const listAppsInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get app input\nexport const getAppInputSchema = z.object({\n appId: appIdSchema,\n});\n\n// List app versions input\nexport const listAppVersionsInputSchema = z.object({\n appId: appIdSchema,\n platform: platformSchema.optional(),\n versionState: versionStateSchema.optional(),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get app version input\nexport const getAppVersionInputSchema = z.object({\n versionId: versionIdSchema,\n});\n\n// Create app version input\nexport const createAppVersionInputSchema = z.object({\n appId: appIdSchema,\n platform: platformSchema,\n versionString: versionStringSchema,\n releaseType: releaseTypeSchema.optional(),\n copyright: z.string().optional(),\n earliestReleaseDate: z.string().datetime().optional(),\n});\n\n// List version localizations input\nexport const listVersionLocalizationsInputSchema = z.object({\n versionId: versionIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get version localization input\nexport const getVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n});\n\n// Create version localization input\nexport const createVersionLocalizationInputSchema = z.object({\n versionId: versionIdSchema,\n locale: localeSchema,\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n whatsNew: z.string().max(4000).optional(),\n promotionalText: z.string().max(170).optional(),\n marketingUrl: optionalUrlSchema,\n supportUrl: optionalUrlSchema,\n});\n\n// Update version localization input\nexport const updateVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n whatsNew: z.string().max(4000).optional(),\n promotionalText: z.string().max(170).optional(),\n marketingUrl: optionalUrlSchema,\n supportUrl: optionalUrlSchema,\n});\n\n// Delete version localization input\nexport const deleteVersionLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n});\n\n// Get app infos input\nexport const getAppInfosInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List app info localizations input\nexport const listAppInfoLocalizationsInputSchema = z.object({\n appInfoId: z.string().min(1, \"App Info ID is required\"),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Update app info localization input\nexport const updateAppInfoLocalizationInputSchema = z.object({\n localizationId: localizationIdSchema,\n name: z.string().max(30).optional(),\n subtitle: z.string().max(30).optional(),\n privacyPolicyUrl: optionalUrlSchema,\n privacyChoicesUrl: optionalUrlSchema,\n privacyPolicyText: z.string().optional(),\n});\n\n// List beta groups input\nexport const listBetaGroupsInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List beta testers input\nexport const listBetaTestersInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Add beta tester input\nexport const addBetaTesterInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n email: z.string().email(\"Invalid email address\"),\n firstName: z.string().min(1).optional(),\n lastName: z.string().min(1).optional(),\n});\n\n// Screenshot set input\nexport const listScreenshotSetsInputSchema = z.object({\n localizationId: localizationIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List screenshots input\nexport const listScreenshotsInputSchema = z.object({\n screenshotSetId: z.string().min(1, \"Screenshot Set ID is required\"),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Upload screenshot input\nexport const uploadScreenshotInputSchema = z.object({\n screenshotSetId: z.string().min(1, \"Screenshot Set ID is required\"),\n fileName: z.string().min(1, \"File name is required\"),\n fileSize: z.number().int().positive(\"File size must be positive\"),\n filePath: z.string().min(1, \"File path is required\"),\n});\n\n/**\n * Validate input and throw ValidationError if invalid\n */\nexport function validateInput<T>(schema: z.ZodSchema<T>, input: unknown): T {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const firstError = result.error.errors[0];\n const field = firstError?.path.join(\".\");\n const message = firstError?.message ?? \"Invalid input\";\n throw new ValidationError(message, field || undefined);\n }\n\n return result.data;\n}\n\n/**\n * Safe parse that returns result without throwing\n */\nexport function safeValidate<T>(\n schema: z.ZodSchema<T>,\n input: unknown\n): { success: true; data: T } | { success: false; error: ValidationError } {\n const result = schema.safeParse(input);\n\n if (!result.success) {\n const firstError = result.error.errors[0];\n const field = firstError?.path.join(\".\");\n const message = firstError?.message ?? \"Invalid input\";\n return { success: false, error: new ValidationError(message, field || undefined) };\n }\n\n return { success: true, data: result.data };\n}\n\n// ============================================================================\n// Bundle ID Schemas\n// ============================================================================\n\n// Bundle ID identifier (e.g., com.example.app)\nexport const bundleIdIdentifierSchema = z\n .string()\n .regex(\n /^[a-zA-Z][a-zA-Z0-9.-]*$/,\n \"Bundle ID must start with a letter and contain only letters, numbers, dots, and hyphens\"\n )\n .min(1, \"Bundle ID identifier is required\");\n\n// List bundle IDs input\nexport const listBundleIdsInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n});\n\n// Get bundle ID input\nexport const getBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n});\n\n// Create bundle ID input\nexport const createBundleIdInputSchema = z.object({\n identifier: bundleIdIdentifierSchema,\n name: z.string().min(1, \"Name is required\").max(255, \"Name must be 255 characters or less\"),\n platform: platformSchema,\n});\n\n// Update bundle ID input\nexport const updateBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n name: z.string().min(1, \"Name is required\").max(255, \"Name must be 255 characters or less\"),\n});\n\n// Delete bundle ID input\nexport const deleteBundleIdInputSchema = z.object({\n bundleIdId: z.string().min(1, \"Bundle ID ID is required\"),\n});\n\n// ============================================================================\n// Device Schemas\n// ============================================================================\n\n// Device status enum\nexport const deviceStatusSchema = z.enum([\"ENABLED\", \"DISABLED\"]);\n\n// List devices input\nexport const listDevicesInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n status: deviceStatusSchema.optional(),\n});\n\n// Get device input\nexport const getDeviceInputSchema = z.object({\n deviceId: z.string().min(1, \"Device ID is required\"),\n});\n\n// ============================================================================\n// User Schemas\n// ============================================================================\n\n// User role enum\nexport const userRoleSchema = z.enum([\n \"ADMIN\",\n \"FINANCE\",\n \"TECHNICAL\",\n \"SALES\",\n \"DEVELOPER\",\n \"MARKETING\",\n \"APP_MANAGER\",\n \"CUSTOMER_SUPPORT\",\n \"ACCESS_TO_REPORTS\",\n \"READ_ONLY\",\n]);\n\n// List users input\nexport const listUsersInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n roles: z.array(userRoleSchema).optional(),\n});\n\n// Get user input\nexport const getUserInputSchema = z.object({\n userId: z.string().min(1, \"User ID is required\"),\n});\n\n// ============================================================================\n// Beta Tester Removal Schema\n// ============================================================================\n\n// Beta tester ID\nexport const betaTesterIdSchema = z.string().min(1, \"Beta Tester ID is required\");\n\n// Remove beta tester input\nexport const removeBetaTesterInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n betaTesterId: betaTesterIdSchema,\n});\n\n// ============================================================================\n// Build Schemas\n// ============================================================================\n\n// List builds input\nexport const listBuildsInputSchema = z.object({\n appId: appIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get build input\nexport const getBuildInputSchema = z.object({\n buildId: buildIdSchema,\n});\n\n// List beta tester invitations input\nexport const listBetaTesterInvitationsInputSchema = z.object({\n betaGroupId: betaGroupIdSchema,\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// ============================================================================\n// Category Schemas\n// ============================================================================\n\n// List app categories input\nexport const listAppCategoriesInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n platform: platformSchema.optional(),\n});\n\n// Get app price schedule input\nexport const getAppPriceScheduleInputSchema = z.object({\n appId: appIdSchema,\n});\n\n// Get app availability input\nexport const getAppAvailabilityInputSchema = z.object({\n appId: appIdSchema,\n});\n","/**\n * App Info Localizations Tools - Manage app-level localizations (name, subtitle, privacy)\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppInfo,\n AppInfoLocalization,\n UpdateAppInfoLocalizationRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getAppInfosInputSchema,\n listAppInfoLocalizationsInputSchema,\n updateAppInfoLocalizationInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List app infos for an app (needed to get appInfoId for localizations)\n */\nexport async function listAppInfos(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppInfosInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppInfo>>(`/apps/${params.appId}/appInfos`, {\n limit: params.limit,\n \"fields[appInfos]\": \"appStoreState,appStoreAgeRating\",\n });\n\n return {\n success: true,\n data: response.data.map((info) => ({\n id: info.id,\n appStoreState: info.attributes.appStoreState,\n appStoreAgeRating: info.attributes.appStoreAgeRating,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List all localizations for an app info\n */\nexport async function listAppInfoLocalizations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppInfoLocalizationsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppInfoLocalization>>(\n `/appInfos/${params.appInfoId}/appInfoLocalizations`,\n {\n limit: params.limit,\n \"fields[appInfoLocalizations]\":\n \"locale,name,subtitle,privacyPolicyUrl,privacyChoicesUrl,privacyPolicyText\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((loc) => ({\n id: loc.id,\n locale: loc.attributes.locale,\n name: loc.attributes.name,\n subtitle: loc.attributes.subtitle,\n privacyPolicyUrl: loc.attributes.privacyPolicyUrl,\n privacyChoicesUrl: loc.attributes.privacyChoicesUrl,\n privacyPolicyText: loc.attributes.privacyPolicyText,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update an app info localization\n */\nexport async function updateAppInfoLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateAppInfoLocalizationInputSchema, input);\n\n const requestBody: UpdateAppInfoLocalizationRequest = {\n data: {\n type: \"appInfoLocalizations\",\n id: params.localizationId,\n attributes: {\n name: params.name,\n subtitle: params.subtitle,\n privacyPolicyUrl: params.privacyPolicyUrl,\n privacyChoicesUrl: params.privacyChoicesUrl,\n privacyPolicyText: params.privacyPolicyText,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<AppInfoLocalization>>(\n `/appInfoLocalizations/${params.localizationId}`,\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n name: loc.attributes.name,\n subtitle: loc.attributes.subtitle,\n privacyPolicyUrl: loc.attributes.privacyPolicyUrl,\n privacyChoicesUrl: loc.attributes.privacyChoicesUrl,\n privacyPolicyText: loc.attributes.privacyPolicyText,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for app info localizations\n */\nexport const appInfoToolDefinitions = [\n {\n name: \"list_app_infos\",\n description:\n \"List app info records for an app. Use this to get the appInfoId needed for localization operations.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of results to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"list_app_info_localizations\",\n description:\n \"List all localizations for an app info. Returns app name, subtitle, and privacy policy info for each locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appInfoId: {\n type: \"string\",\n description: \"The App Info ID (get this from list_app_infos)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of localizations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appInfoId\"],\n },\n },\n {\n name: \"update_app_info_localization\",\n description:\n \"Update an app info localization. Use this to change app name, subtitle, or privacy policy URL for a locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The app info localization ID to update\",\n },\n name: {\n type: \"string\",\n description: \"App name (max 30 characters)\",\n },\n subtitle: {\n type: \"string\",\n description: \"App subtitle (max 30 characters)\",\n },\n privacyPolicyUrl: {\n type: \"string\",\n description: \"Privacy policy URL (HTTPS only)\",\n },\n privacyChoicesUrl: {\n type: \"string\",\n description: \"Privacy choices URL (HTTPS only)\",\n },\n privacyPolicyText: {\n type: \"string\",\n description: \"Privacy policy text (for apps without a URL)\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n];\n","/**\n * Apps Tools - List and get app information\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, App } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport { getAppInputSchema, listAppsInputSchema, validateInput } from \"../utils/validation.js\";\n\n/**\n * List all apps in the App Store Connect account\n */\nexport async function listApps(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listAppsInputSchema, input);\n\n const response = await client.get<ASCListResponse<App>>(\"/apps\", {\n limit: params.limit,\n \"fields[apps]\": \"name,bundleId,sku,primaryLocale\",\n });\n\n return {\n success: true,\n data: response.data.map((app) => ({\n id: app.id,\n name: app.attributes.name,\n bundleId: app.attributes.bundleId,\n sku: app.attributes.sku,\n primaryLocale: app.attributes.primaryLocale,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific app\n */\nexport async function getApp(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getAppInputSchema, input);\n\n const response = await client.get<ASCResponse<App>>(`/apps/${params.appId}`, {\n \"fields[apps]\":\n \"name,bundleId,sku,primaryLocale,contentRightsDeclaration,isOrEverWasMadeForKids\",\n include: \"appInfos,appStoreVersions\",\n });\n\n const app = response.data;\n\n return {\n success: true,\n data: {\n id: app.id,\n name: app.attributes.name,\n bundleId: app.attributes.bundleId,\n sku: app.attributes.sku,\n primaryLocale: app.attributes.primaryLocale,\n contentRightsDeclaration: app.attributes.contentRightsDeclaration,\n isOrEverWasMadeForKids: app.attributes.isOrEverWasMadeForKids,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for apps\n */\nexport const appsToolDefinitions = [\n {\n name: \"list_apps\",\n description:\n \"List all apps in your App Store Connect account. Returns app IDs, names, bundle IDs, and SKUs.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of apps to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n },\n },\n {\n name: \"get_app\",\n description: \"Get detailed information about a specific app by its ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID (numeric string)\",\n },\n },\n required: [\"appId\"],\n },\n },\n];\n","/**\n * Beta Testing Tools - Manage beta groups and testers\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n BetaGroup,\n BetaTester,\n CreateBetaTesterRequest,\n RemoveBetaTestersRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n addBetaTesterInputSchema,\n listBetaGroupsInputSchema,\n listBetaTestersInputSchema,\n removeBetaTesterInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List beta groups for an app\n */\nexport async function listBetaGroups(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBetaGroupsInputSchema, input);\n\n const response = await client.get<ASCListResponse<BetaGroup>>(\n `/apps/${params.appId}/betaGroups`,\n {\n limit: params.limit,\n \"fields[betaGroups]\":\n \"name,createdDate,isInternalGroup,hasAccessToAllBuilds,publicLinkEnabled,publicLink,feedbackEnabled\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((group) => ({\n id: group.id,\n name: group.attributes.name,\n createdDate: group.attributes.createdDate,\n isInternalGroup: group.attributes.isInternalGroup,\n hasAccessToAllBuilds: group.attributes.hasAccessToAllBuilds,\n publicLinkEnabled: group.attributes.publicLinkEnabled,\n publicLink: group.attributes.publicLink,\n feedbackEnabled: group.attributes.feedbackEnabled,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List beta testers in a beta group\n */\nexport async function listBetaTesters(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBetaTestersInputSchema, input);\n\n const response = await client.get<ASCListResponse<BetaTester>>(\n `/betaGroups/${params.betaGroupId}/betaTesters`,\n {\n limit: params.limit,\n \"fields[betaTesters]\": \"firstName,lastName,email,inviteType,state\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((tester) => ({\n id: tester.id,\n firstName: tester.attributes.firstName,\n lastName: tester.attributes.lastName,\n email: tester.attributes.email,\n inviteType: tester.attributes.inviteType,\n state: tester.attributes.state,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Add a beta tester to a beta group\n */\nexport async function addBetaTester(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(addBetaTesterInputSchema, input);\n\n const requestBody: CreateBetaTesterRequest = {\n data: {\n type: \"betaTesters\",\n attributes: {\n email: params.email,\n firstName: params.firstName,\n lastName: params.lastName,\n },\n relationships: {\n betaGroups: {\n data: [\n {\n type: \"betaGroups\",\n id: params.betaGroupId,\n },\n ],\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<BetaTester>>(\"/betaTesters\", requestBody);\n\n const tester = response.data;\n\n return {\n success: true,\n data: {\n id: tester.id,\n firstName: tester.attributes.firstName,\n lastName: tester.attributes.lastName,\n email: tester.attributes.email,\n inviteType: tester.attributes.inviteType,\n state: tester.attributes.state,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Remove a beta tester from a beta group\n */\nexport async function removeBetaTester(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(removeBetaTesterInputSchema, input);\n\n const requestBody: RemoveBetaTestersRequest = {\n data: [\n {\n type: \"betaTesters\",\n id: params.betaTesterId,\n },\n ],\n };\n\n // Delete the beta tester from the group by deleting the relationship\n // The API endpoint is: DELETE /betaGroups/{id}/relationships/betaTesters\n // with a body containing the tester IDs to remove\n await client.delete(`/betaGroups/${params.betaGroupId}/relationships/betaTesters`, requestBody);\n\n return {\n success: true,\n data: {\n removed: true,\n betaGroupId: params.betaGroupId,\n betaTesterId: params.betaTesterId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for beta testing\n */\nexport const betaToolDefinitions = [\n {\n name: \"list_beta_groups\",\n description:\n \"List all beta groups for an app. Returns group names, public link info, and settings.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of groups to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"list_beta_testers\",\n description: \"List all beta testers in a specific beta group.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of testers to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"betaGroupId\"],\n },\n },\n {\n name: \"add_beta_tester\",\n description: \"Add a new beta tester to a beta group by email address.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID to add the tester to\",\n },\n email: {\n type: \"string\",\n description: \"Email address of the beta tester\",\n },\n firstName: {\n type: \"string\",\n description: \"First name of the beta tester (optional)\",\n },\n lastName: {\n type: \"string\",\n description: \"Last name of the beta tester (optional)\",\n },\n },\n required: [\"betaGroupId\", \"email\"],\n },\n },\n {\n name: \"remove_beta_tester\",\n description: \"Remove a beta tester from a beta group.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n betaGroupId: {\n type: \"string\",\n description: \"The beta group ID to remove the tester from\",\n },\n betaTesterId: {\n type: \"string\",\n description: \"The beta tester ID to remove\",\n },\n },\n required: [\"betaGroupId\", \"betaTesterId\"],\n },\n },\n];\n","/**\n * Build Tools - Manage app builds\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, Build } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport { getBuildInputSchema, listBuildsInputSchema, validateInput } from \"../utils/validation.js\";\n\n/**\n * List all builds for an app\n */\nexport async function listBuilds(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listBuildsInputSchema, input);\n\n const response = await client.get<ASCListResponse<Build>>(`/apps/${params.appId}/builds`, {\n limit: params.limit,\n \"fields[builds]\":\n \"version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption\",\n });\n\n return {\n success: true,\n data: response.data.map((build) => ({\n id: build.id,\n version: build.attributes.version,\n uploadedDate: build.attributes.uploadedDate,\n expirationDate: build.attributes.expirationDate,\n expired: build.attributes.expired,\n minOsVersion: build.attributes.minOsVersion,\n processingState: build.attributes.processingState,\n buildAudienceType: build.attributes.buildAudienceType,\n usesNonExemptEncryption: build.attributes.usesNonExemptEncryption,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific build\n */\nexport async function getBuild(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getBuildInputSchema, input);\n\n const response = await client.get<ASCResponse<Build>>(`/builds/${params.buildId}`, {\n \"fields[builds]\":\n \"version,uploadedDate,expirationDate,expired,minOsVersion,processingState,buildAudienceType,usesNonExemptEncryption\",\n });\n\n const build = response.data;\n\n return {\n success: true,\n data: {\n id: build.id,\n version: build.attributes.version,\n uploadedDate: build.attributes.uploadedDate,\n expirationDate: build.attributes.expirationDate,\n expired: build.attributes.expired,\n minOsVersion: build.attributes.minOsVersion,\n processingState: build.attributes.processingState,\n buildAudienceType: build.attributes.buildAudienceType,\n usesNonExemptEncryption: build.attributes.usesNonExemptEncryption,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for builds\n */\nexport const buildsToolDefinitions = [\n {\n name: \"list_builds\",\n description: \"List all builds for an app.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of builds to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_build\",\n description: \"Get details of a specific build.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n buildId: {\n type: \"string\",\n description: \"The build resource ID\",\n },\n },\n required: [\"buildId\"],\n },\n },\n];\n","/**\n * Bundle ID Tools - Manage bundle identifiers\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n BundleId,\n CreateBundleIdRequest,\n UpdateBundleIdRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createBundleIdInputSchema,\n deleteBundleIdInputSchema,\n getBundleIdInputSchema,\n listBundleIdsInputSchema,\n updateBundleIdInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all bundle IDs\n */\nexport async function listBundleIds(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listBundleIdsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[bundleIds]\": \"name,identifier,platform,seedId\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n const response = await client.get<ASCListResponse<BundleId>>(\"/bundleIds\", queryParams);\n\n return {\n success: true,\n data: response.data.map((bundleId) => ({\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific bundle ID\n */\nexport async function getBundleId(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getBundleIdInputSchema, input);\n\n const response = await client.get<ASCResponse<BundleId>>(`/bundleIds/${params.bundleIdId}`, {\n \"fields[bundleIds]\": \"name,identifier,platform,seedId\",\n });\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new bundle ID\n */\nexport async function createBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createBundleIdInputSchema, input);\n\n const requestBody: CreateBundleIdRequest = {\n data: {\n type: \"bundleIds\",\n attributes: {\n identifier: params.identifier,\n name: params.name,\n platform: params.platform,\n },\n },\n };\n\n const response = await client.post<ASCResponse<BundleId>>(\"/bundleIds\", requestBody);\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update a bundle ID (only name can be changed)\n */\nexport async function updateBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateBundleIdInputSchema, input);\n\n const requestBody: UpdateBundleIdRequest = {\n data: {\n type: \"bundleIds\",\n id: params.bundleIdId,\n attributes: {\n name: params.name,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<BundleId>>(\n `/bundleIds/${params.bundleIdId}`,\n requestBody\n );\n\n const bundleId = response.data;\n\n return {\n success: true,\n data: {\n id: bundleId.id,\n name: bundleId.attributes.name,\n identifier: bundleId.attributes.identifier,\n platform: bundleId.attributes.platform,\n seedId: bundleId.attributes.seedId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Delete a bundle ID\n */\nexport async function deleteBundleId(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(deleteBundleIdInputSchema, input);\n\n await client.delete(`/bundleIds/${params.bundleIdId}`);\n\n return {\n success: true,\n data: {\n deleted: true,\n bundleIdId: params.bundleIdId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for bundle IDs\n */\nexport const bundleIdsToolDefinitions = [\n {\n name: \"list_bundle_ids\",\n description: \"List all bundle IDs registered in App Store Connect. Can filter by platform.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of bundle IDs to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_bundle_id\",\n description: \"Get details of a specific bundle ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID\",\n },\n },\n required: [\"bundleIdId\"],\n },\n },\n {\n name: \"create_bundle_id\",\n description:\n \"Register a new bundle ID in App Store Connect. The identifier must be unique and follow reverse-domain notation (e.g., com.example.app).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n identifier: {\n type: \"string\",\n description: \"The bundle identifier (e.g., com.example.app)\",\n },\n name: {\n type: \"string\",\n description: \"A name for the bundle ID\",\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"The platform for this bundle ID\",\n },\n },\n required: [\"identifier\", \"name\", \"platform\"],\n },\n },\n {\n name: \"update_bundle_id\",\n description: \"Update a bundle ID's name. Note: The identifier cannot be changed.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID\",\n },\n name: {\n type: \"string\",\n description: \"The new name for the bundle ID\",\n },\n },\n required: [\"bundleIdId\", \"name\"],\n },\n },\n {\n name: \"delete_bundle_id\",\n description:\n \"Delete a bundle ID. Note: This cannot be undone and may affect apps using this bundle ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n bundleIdId: {\n type: \"string\",\n description: \"The bundle ID resource ID to delete\",\n },\n },\n required: [\"bundleIdId\"],\n },\n },\n];\n","/**\n * Category Tools - Manage app categories and pricing\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppAvailability,\n AppCategory,\n AppPriceSchedule,\n Territory,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getAppAvailabilityInputSchema,\n getAppPriceScheduleInputSchema,\n listAppCategoriesInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all app categories\n */\nexport async function listAppCategories(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppCategoriesInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appCategories]\": \"platforms\",\n include: \"subcategories\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platforms]\"] = params.platform;\n }\n\n const response = await client.get<ASCListResponse<AppCategory>>(\"/appCategories\", queryParams);\n\n // Get included subcategories\n const included = (response.included ?? []) as AppCategory[];\n const subcategoriesMap = new Map<string, AppCategory>();\n for (const sub of included) {\n if (sub.type === \"appCategories\") {\n subcategoriesMap.set(sub.id, sub);\n }\n }\n\n return {\n success: true,\n data: response.data.map((category) => {\n // Get subcategory IDs from relationships\n const subcategoryData = category.relationships?.subcategories?.data;\n const subcategoryIds = Array.isArray(subcategoryData)\n ? subcategoryData.map((s) => s.id)\n : [];\n\n return {\n id: category.id,\n platforms: category.attributes.platforms,\n subcategories: subcategoryIds.map((id) => {\n const sub = subcategoriesMap.get(id);\n return sub\n ? {\n id: sub.id,\n platforms: sub.attributes.platforms,\n }\n : { id };\n }),\n };\n }),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get app price schedule (pricing tiers)\n */\nexport async function getAppPriceSchedule(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppPriceScheduleInputSchema, input);\n\n const response = await client.get<ASCResponse<AppPriceSchedule>>(\n `/apps/${params.appId}/appPriceSchedule`,\n {\n include: \"baseTerritory,manualPrices,automaticPrices\",\n }\n );\n\n const schedule = response.data;\n const included = (response.included ?? []) as Array<Territory | unknown>;\n\n // Find the base territory from included\n let baseTerritory: { id: string; currency?: string } | undefined;\n const baseTerritoryData = schedule.relationships?.baseTerritory?.data;\n if (baseTerritoryData && !Array.isArray(baseTerritoryData)) {\n const territory = included.find(\n (item): item is Territory =>\n (item as Territory).type === \"territories\" &&\n (item as Territory).id === baseTerritoryData.id\n );\n if (territory) {\n baseTerritory = {\n id: territory.id,\n currency: territory.attributes.currency,\n };\n }\n }\n\n return {\n success: true,\n data: {\n id: schedule.id,\n baseTerritory,\n hasManualPrices:\n schedule.relationships?.manualPrices?.data !== undefined &&\n (Array.isArray(schedule.relationships.manualPrices.data)\n ? schedule.relationships.manualPrices.data.length > 0\n : true),\n hasAutomaticPrices:\n schedule.relationships?.automaticPrices?.data !== undefined &&\n (Array.isArray(schedule.relationships.automaticPrices.data)\n ? schedule.relationships.automaticPrices.data.length > 0\n : true),\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get app availability in territories\n */\nexport async function getAppAvailability(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppAvailabilityInputSchema, input);\n\n const response = await client.get<ASCResponse<AppAvailability>>(\n `/apps/${params.appId}/appAvailabilityV2`,\n {\n include: \"territoryAvailabilities\",\n \"fields[territoryAvailabilities]\": \"available,preOrderEnabled,releaseDate\",\n }\n );\n\n const availability = response.data;\n const included = response.included ?? [];\n\n // Get territory availability details from included\n interface TerritoryAvailability {\n type: string;\n id: string;\n attributes: {\n available: boolean;\n preOrderEnabled?: boolean;\n releaseDate?: string;\n };\n relationships?: {\n territory?: {\n data?: { id: string };\n };\n };\n }\n\n const territoryAvailabilities = included\n .filter(\n (item): item is TerritoryAvailability =>\n (item as TerritoryAvailability).type === \"territoryAvailabilities\"\n )\n .filter((ta) => ta.attributes.available)\n .map((ta) => ({\n territoryId: ta.relationships?.territory?.data?.id ?? ta.id,\n available: ta.attributes.available,\n preOrderEnabled: ta.attributes.preOrderEnabled,\n releaseDate: ta.attributes.releaseDate,\n }));\n\n return {\n success: true,\n data: {\n id: availability.id,\n availableInNewTerritories: availability.attributes.availableInNewTerritories,\n territories: territoryAvailabilities,\n territoryCount: territoryAvailabilities.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for categories\n */\nexport const categoriesToolDefinitions = [\n {\n name: \"list_app_categories\",\n description: \"List all app categories available in the App Store. Can filter by platform.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of categories to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_app_price_schedule\",\n description: \"Get the price schedule for an app, including pricing information.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_app_availability\",\n description:\n \"Get app availability information, including which territories the app is available in.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n },\n required: [\"appId\"],\n },\n },\n];\n","/**\n * Device Tools - Manage registered devices\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, Device } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getDeviceInputSchema,\n listDevicesInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all registered devices\n */\nexport async function listDevices(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listDevicesInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[devices]\": \"name,platform,udid,deviceClass,status,model,addedDate\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n if (params.status) {\n queryParams[\"filter[status]\"] = params.status;\n }\n\n const response = await client.get<ASCListResponse<Device>>(\"/devices\", queryParams);\n\n return {\n success: true,\n data: response.data.map((device) => ({\n id: device.id,\n name: device.attributes.name,\n platform: device.attributes.platform,\n udid: device.attributes.udid,\n deviceClass: device.attributes.deviceClass,\n status: device.attributes.status,\n model: device.attributes.model,\n addedDate: device.attributes.addedDate,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific device\n */\nexport async function getDevice(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getDeviceInputSchema, input);\n\n const response = await client.get<ASCResponse<Device>>(`/devices/${params.deviceId}`, {\n \"fields[devices]\": \"name,platform,udid,deviceClass,status,model,addedDate\",\n });\n\n const device = response.data;\n\n return {\n success: true,\n data: {\n id: device.id,\n name: device.attributes.name,\n platform: device.attributes.platform,\n udid: device.attributes.udid,\n deviceClass: device.attributes.deviceClass,\n status: device.attributes.status,\n model: device.attributes.model,\n addedDate: device.attributes.addedDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for devices\n */\nexport const devicesToolDefinitions = [\n {\n name: \"list_devices\",\n description:\n \"List all registered devices in App Store Connect. Can filter by platform and status.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of devices to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n platform: {\n type: \"string\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n description: \"Filter by platform\",\n },\n status: {\n type: \"string\",\n enum: [\"ENABLED\", \"DISABLED\"],\n description: \"Filter by device status\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_device\",\n description: \"Get details of a specific registered device.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n deviceId: {\n type: \"string\",\n description: \"The device resource ID\",\n },\n },\n required: [\"deviceId\"],\n },\n },\n];\n","/**\n * App Store Version Localizations Tools - CRUD operations for version localizations\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppStoreVersionLocalization,\n CreateAppStoreVersionLocalizationRequest,\n UpdateAppStoreVersionLocalizationRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createVersionLocalizationInputSchema,\n deleteVersionLocalizationInputSchema,\n getVersionLocalizationInputSchema,\n listVersionLocalizationsInputSchema,\n updateVersionLocalizationInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all localizations for an app version\n */\nexport async function listVersionLocalizations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listVersionLocalizationsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppStoreVersionLocalization>>(\n `/appStoreVersions/${params.versionId}/appStoreVersionLocalizations`,\n {\n limit: params.limit,\n \"fields[appStoreVersionLocalizations]\":\n \"locale,description,keywords,marketingUrl,promotionalText,supportUrl,whatsNew\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((loc) => ({\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific version localization\n */\nexport async function getVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getVersionLocalizationInputSchema, input);\n\n const response = await client.get<ASCResponse<AppStoreVersionLocalization>>(\n `/appStoreVersionLocalizations/${params.localizationId}`,\n {\n \"fields[appStoreVersionLocalizations]\":\n \"locale,description,keywords,marketingUrl,promotionalText,supportUrl,whatsNew\",\n }\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new version localization\n */\nexport async function createVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createVersionLocalizationInputSchema, input);\n\n const requestBody: CreateAppStoreVersionLocalizationRequest = {\n data: {\n type: \"appStoreVersionLocalizations\",\n attributes: {\n locale: params.locale,\n description: params.description,\n keywords: params.keywords,\n marketingUrl: params.marketingUrl,\n promotionalText: params.promotionalText,\n supportUrl: params.supportUrl,\n whatsNew: params.whatsNew,\n },\n relationships: {\n appStoreVersion: {\n data: {\n type: \"appStoreVersions\",\n id: params.versionId,\n },\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<AppStoreVersionLocalization>>(\n \"/appStoreVersionLocalizations\",\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Update an existing version localization\n */\nexport async function updateVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(updateVersionLocalizationInputSchema, input);\n\n const requestBody: UpdateAppStoreVersionLocalizationRequest = {\n data: {\n type: \"appStoreVersionLocalizations\",\n id: params.localizationId,\n attributes: {\n description: params.description,\n keywords: params.keywords,\n marketingUrl: params.marketingUrl,\n promotionalText: params.promotionalText,\n supportUrl: params.supportUrl,\n whatsNew: params.whatsNew,\n },\n },\n };\n\n const response = await client.patch<ASCResponse<AppStoreVersionLocalization>>(\n `/appStoreVersionLocalizations/${params.localizationId}`,\n requestBody\n );\n\n const loc = response.data;\n\n return {\n success: true,\n data: {\n id: loc.id,\n locale: loc.attributes.locale,\n description: loc.attributes.description,\n keywords: loc.attributes.keywords,\n marketingUrl: loc.attributes.marketingUrl,\n promotionalText: loc.attributes.promotionalText,\n supportUrl: loc.attributes.supportUrl,\n whatsNew: loc.attributes.whatsNew,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Delete a version localization\n */\nexport async function deleteVersionLocalization(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(deleteVersionLocalizationInputSchema, input);\n\n await client.delete(`/appStoreVersionLocalizations/${params.localizationId}`);\n\n return {\n success: true,\n data: {\n deleted: true,\n localizationId: params.localizationId,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for localizations\n */\nexport const localizationsToolDefinitions = [\n {\n name: \"list_version_localizations\",\n description:\n \"List all localizations for an App Store version. Returns description, keywords, what's new, and URLs for each locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of localizations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"versionId\"],\n },\n },\n {\n name: \"get_version_localization\",\n description: \"Get detailed information about a specific version localization.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"create_version_localization\",\n description:\n \"Create a new localization for an App Store version. Add descriptions, keywords, and other metadata in a specific locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n locale: {\n type: \"string\",\n description: \"Locale code (e.g., 'en-US', 'ja', 'zh-Hans')\",\n },\n description: {\n type: \"string\",\n description: \"App description (max 4000 characters)\",\n },\n keywords: {\n type: \"string\",\n description: \"Keywords for search (max 100 characters, comma-separated)\",\n },\n whatsNew: {\n type: \"string\",\n description: \"What's new in this version (max 4000 characters)\",\n },\n promotionalText: {\n type: \"string\",\n description: \"Promotional text (max 170 characters)\",\n },\n marketingUrl: {\n type: \"string\",\n description: \"Marketing URL (HTTPS only)\",\n },\n supportUrl: {\n type: \"string\",\n description: \"Support URL (HTTPS only)\",\n },\n },\n required: [\"versionId\", \"locale\"],\n },\n },\n {\n name: \"update_version_localization\",\n description: \"Update an existing version localization. Only provided fields will be updated.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID to update\",\n },\n description: {\n type: \"string\",\n description: \"App description (max 4000 characters)\",\n },\n keywords: {\n type: \"string\",\n description: \"Keywords for search (max 100 characters, comma-separated)\",\n },\n whatsNew: {\n type: \"string\",\n description: \"What's new in this version (max 4000 characters)\",\n },\n promotionalText: {\n type: \"string\",\n description: \"Promotional text (max 170 characters)\",\n },\n marketingUrl: {\n type: \"string\",\n description: \"Marketing URL (HTTPS only)\",\n },\n supportUrl: {\n type: \"string\",\n description: \"Support URL (HTTPS only)\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"delete_version_localization\",\n description: \"Delete a version localization. Cannot delete the primary locale.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The localization ID to delete\",\n },\n },\n required: [\"localizationId\"],\n },\n },\n];\n","/**\n * Screenshots Tools - Manage app screenshot sets and screenshots\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppScreenshot,\n AppScreenshotSet,\n CreateAppScreenshotRequest,\n UpdateAppScreenshotRequest,\n} from \"../api/types.js\";\nimport { ASCError, formatErrorResponse } from \"../utils/errors.js\";\nimport {\n listScreenshotSetsInputSchema,\n listScreenshotsInputSchema,\n uploadScreenshotInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List screenshot sets for a version localization\n */\nexport async function listScreenshotSets(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listScreenshotSetsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppScreenshotSet>>(\n `/appStoreVersionLocalizations/${params.localizationId}/appScreenshotSets`,\n {\n limit: params.limit,\n \"fields[appScreenshotSets]\": \"screenshotDisplayType\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((set) => ({\n id: set.id,\n screenshotDisplayType: set.attributes.screenshotDisplayType,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * List screenshots in a screenshot set\n */\nexport async function listScreenshots(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listScreenshotsInputSchema, input);\n\n const response = await client.get<ASCListResponse<AppScreenshot>>(\n `/appScreenshotSets/${params.screenshotSetId}/appScreenshots`,\n {\n limit: params.limit,\n \"fields[appScreenshots]\":\n \"fileSize,fileName,sourceFileChecksum,imageAsset,assetDeliveryState\",\n }\n );\n\n return {\n success: true,\n data: response.data.map((screenshot) => ({\n id: screenshot.id,\n fileName: screenshot.attributes.fileName,\n fileSize: screenshot.attributes.fileSize,\n sourceFileChecksum: screenshot.attributes.sourceFileChecksum,\n imageAsset: screenshot.attributes.imageAsset,\n assetDeliveryState: screenshot.attributes.assetDeliveryState,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Upload a screenshot to a screenshot set\n *\n * This is a multi-step process:\n * 1. Reserve the screenshot (POST)\n * 2. Upload file chunks to the provided URLs (PUT)\n * 3. Commit the upload (PATCH)\n */\nexport async function uploadScreenshot(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(uploadScreenshotInputSchema, input);\n\n // Read the file\n let fileBuffer: Buffer;\n try {\n fileBuffer = await fs.readFile(params.filePath);\n } catch (_error) {\n throw new ASCError(`Failed to read file: ${params.filePath}`, \"FILE_READ_ERROR\", 400);\n }\n\n // Validate file size matches\n if (fileBuffer.length !== params.fileSize) {\n throw new ASCError(\n `File size mismatch: expected ${params.fileSize}, got ${fileBuffer.length}`,\n \"FILE_SIZE_MISMATCH\",\n 400\n );\n }\n\n // Step 1: Reserve the screenshot\n const reserveRequest: CreateAppScreenshotRequest = {\n data: {\n type: \"appScreenshots\",\n attributes: {\n fileName: params.fileName,\n fileSize: params.fileSize,\n },\n relationships: {\n appScreenshotSet: {\n data: {\n type: \"appScreenshotSets\",\n id: params.screenshotSetId,\n },\n },\n },\n },\n };\n\n const reserveResponse = await client.post<ASCResponse<AppScreenshot>>(\n \"/appScreenshots\",\n reserveRequest\n );\n\n const screenshot = reserveResponse.data;\n const uploadOperations = screenshot.attributes.uploadOperations;\n\n if (!uploadOperations?.length) {\n throw new ASCError(\"No upload operations provided\", \"UPLOAD_ERROR\", 500);\n }\n\n // Step 2: Upload file chunks\n for (const operation of uploadOperations) {\n const chunk = fileBuffer.subarray(operation.offset, operation.offset + operation.length);\n\n const headers: Record<string, string> = {};\n for (const header of operation.requestHeaders) {\n headers[header.name] = header.value;\n }\n\n const uploadResponse = await client.rawRequest(operation.url, {\n method: operation.method,\n headers,\n body: chunk,\n });\n\n if (!uploadResponse.ok) {\n throw new ASCError(\n `Chunk upload failed: ${uploadResponse.status}`,\n \"UPLOAD_ERROR\",\n uploadResponse.status\n );\n }\n }\n\n // Step 3: Commit the upload\n const checksum = crypto.createHash(\"md5\").update(fileBuffer).digest(\"base64\");\n\n const commitRequest: UpdateAppScreenshotRequest = {\n data: {\n type: \"appScreenshots\",\n id: screenshot.id,\n attributes: {\n sourceFileChecksum: checksum,\n uploaded: true,\n },\n },\n };\n\n const commitResponse = await client.patch<ASCResponse<AppScreenshot>>(\n `/appScreenshots/${screenshot.id}`,\n commitRequest\n );\n\n const finalScreenshot = commitResponse.data;\n\n return {\n success: true,\n data: {\n id: finalScreenshot.id,\n fileName: finalScreenshot.attributes.fileName,\n fileSize: finalScreenshot.attributes.fileSize,\n sourceFileChecksum: finalScreenshot.attributes.sourceFileChecksum,\n assetDeliveryState: finalScreenshot.attributes.assetDeliveryState,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for screenshots\n */\nexport const screenshotsToolDefinitions = [\n {\n name: \"list_screenshot_sets\",\n description:\n \"List all screenshot sets for a version localization. Each set represents a different display type (device size).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n localizationId: {\n type: \"string\",\n description: \"The version localization ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of sets to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"localizationId\"],\n },\n },\n {\n name: \"list_screenshots\",\n description: \"List all screenshots in a screenshot set.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n screenshotSetId: {\n type: \"string\",\n description: \"The screenshot set ID\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of screenshots to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"screenshotSetId\"],\n },\n },\n {\n name: \"upload_screenshot\",\n description:\n \"Upload a new screenshot to a screenshot set. Provide the local file path, and this tool will handle the multi-step upload process.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n screenshotSetId: {\n type: \"string\",\n description: \"The screenshot set ID to upload to\",\n },\n fileName: {\n type: \"string\",\n description: \"Name for the screenshot file\",\n },\n fileSize: {\n type: \"number\",\n description: \"Size of the file in bytes\",\n },\n filePath: {\n type: \"string\",\n description: \"Local path to the screenshot file\",\n },\n },\n required: [\"screenshotSetId\", \"fileName\", \"fileSize\", \"filePath\"],\n },\n },\n];\n","/**\n * User Tools - Manage team users\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type { ASCListResponse, ASCResponse, User } from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport { getUserInputSchema, listUsersInputSchema, validateInput } from \"../utils/validation.js\";\n\n/**\n * List all users in the team\n */\nexport async function listUsers(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(listUsersInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[users]\": \"username,firstName,lastName,roles,allAppsVisible,provisioningAllowed\",\n };\n\n if (params.roles && params.roles.length > 0) {\n queryParams[\"filter[roles]\"] = params.roles.join(\",\");\n }\n\n const response = await client.get<ASCListResponse<User>>(\"/users\", queryParams);\n\n return {\n success: true,\n data: response.data.map((user) => ({\n id: user.id,\n username: user.attributes.username,\n firstName: user.attributes.firstName,\n lastName: user.attributes.lastName,\n roles: user.attributes.roles,\n allAppsVisible: user.attributes.allAppsVisible,\n provisioningAllowed: user.attributes.provisioningAllowed,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get a specific user\n */\nexport async function getUser(client: AppStoreConnectClient, input: unknown): Promise<unknown> {\n try {\n const params = validateInput(getUserInputSchema, input);\n\n const response = await client.get<ASCResponse<User>>(`/users/${params.userId}`, {\n \"fields[users]\": \"username,firstName,lastName,roles,allAppsVisible,provisioningAllowed\",\n });\n\n const user = response.data;\n\n return {\n success: true,\n data: {\n id: user.id,\n username: user.attributes.username,\n firstName: user.attributes.firstName,\n lastName: user.attributes.lastName,\n roles: user.attributes.roles,\n allAppsVisible: user.attributes.allAppsVisible,\n provisioningAllowed: user.attributes.provisioningAllowed,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for users\n */\nexport const usersToolDefinitions = [\n {\n name: \"list_users\",\n description: \"List all users in your App Store Connect team. Can filter by roles.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of users to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n roles: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\n \"ADMIN\",\n \"FINANCE\",\n \"TECHNICAL\",\n \"SALES\",\n \"DEVELOPER\",\n \"MARKETING\",\n \"APP_MANAGER\",\n \"CUSTOMER_SUPPORT\",\n \"ACCESS_TO_REPORTS\",\n \"READ_ONLY\",\n ],\n },\n description: \"Filter by user roles\",\n },\n },\n required: [],\n },\n },\n {\n name: \"get_user\",\n description: \"Get details of a specific team user.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n userId: {\n type: \"string\",\n description: \"The user resource ID\",\n },\n },\n required: [\"userId\"],\n },\n },\n];\n","/**\n * App Store Versions Tools - List, get, and create app versions\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppStoreVersion,\n CreateAppStoreVersionRequest,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n createAppVersionInputSchema,\n getAppVersionInputSchema,\n listAppVersionsInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all versions for an app\n */\nexport async function listAppVersions(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppVersionsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appStoreVersions]\":\n \"platform,versionString,appStoreState,copyright,releaseType,createdDate\",\n };\n\n if (params.platform) {\n queryParams[\"filter[platform]\"] = params.platform;\n }\n\n if (params.versionState) {\n queryParams[\"filter[appStoreState]\"] = params.versionState;\n }\n\n const response = await client.get<ASCListResponse<AppStoreVersion>>(\n `/apps/${params.appId}/appStoreVersions`,\n queryParams\n );\n\n return {\n success: true,\n data: response.data.map((version) => ({\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n createdDate: version.attributes.createdDate,\n })),\n meta: {\n total: response.meta?.paging?.total,\n returned: response.data.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Get details of a specific app version\n */\nexport async function getAppVersion(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getAppVersionInputSchema, input);\n\n const response = await client.get<ASCResponse<AppStoreVersion>>(\n `/appStoreVersions/${params.versionId}`,\n {\n \"fields[appStoreVersions]\":\n \"platform,versionString,appStoreState,copyright,releaseType,earliestReleaseDate,usesIdfa,downloadable,createdDate\",\n }\n );\n\n const version = response.data;\n\n return {\n success: true,\n data: {\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n earliestReleaseDate: version.attributes.earliestReleaseDate,\n usesIdfa: version.attributes.usesIdfa,\n downloadable: version.attributes.downloadable,\n createdDate: version.attributes.createdDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Create a new app version\n */\nexport async function createAppVersion(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(createAppVersionInputSchema, input);\n\n const requestBody: CreateAppStoreVersionRequest = {\n data: {\n type: \"appStoreVersions\",\n attributes: {\n platform: params.platform,\n versionString: params.versionString,\n copyright: params.copyright,\n releaseType: params.releaseType,\n earliestReleaseDate: params.earliestReleaseDate,\n },\n relationships: {\n app: {\n data: {\n type: \"apps\",\n id: params.appId,\n },\n },\n },\n },\n };\n\n const response = await client.post<ASCResponse<AppStoreVersion>>(\n \"/appStoreVersions\",\n requestBody\n );\n\n const version = response.data;\n\n return {\n success: true,\n data: {\n id: version.id,\n platform: version.attributes.platform,\n versionString: version.attributes.versionString,\n state: version.attributes.appStoreState,\n copyright: version.attributes.copyright,\n releaseType: version.attributes.releaseType,\n createdDate: version.attributes.createdDate,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for versions\n */\nexport const versionsToolDefinitions = [\n {\n name: \"list_app_versions\",\n description:\n \"List all App Store versions for an app. Can filter by platform and version state.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n platform: {\n type: \"string\",\n description: \"Filter by platform (IOS, MAC_OS, TV_OS, VISION_OS)\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n },\n versionState: {\n type: \"string\",\n description: \"Filter by version state (e.g., PREPARE_FOR_SUBMISSION, READY_FOR_SALE)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of versions to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_app_version\",\n description: \"Get detailed information about a specific app version.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n versionId: {\n type: \"string\",\n description: \"The App Store version ID\",\n },\n },\n required: [\"versionId\"],\n },\n },\n {\n name: \"create_app_version\",\n description: \"Create a new App Store version for an app.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n platform: {\n type: \"string\",\n description: \"Platform for the version\",\n enum: [\"IOS\", \"MAC_OS\", \"TV_OS\", \"VISION_OS\"],\n },\n versionString: {\n type: \"string\",\n description: \"Version number (e.g., '1.0.0', '2.1')\",\n },\n releaseType: {\n type: \"string\",\n description: \"Release type\",\n enum: [\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"],\n },\n copyright: {\n type: \"string\",\n description: \"Copyright text for the version\",\n },\n earliestReleaseDate: {\n type: \"string\",\n description: \"Earliest release date (ISO 8601 format) for SCHEDULED release type\",\n },\n },\n required: [\"appId\", \"platform\", \"versionString\"],\n },\n },\n];\n","/**\n * Tool Registry - Central registry for all MCP tools\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\n\nimport {\n appInfoToolDefinitions,\n listAppInfoLocalizations,\n listAppInfos,\n updateAppInfoLocalization,\n} from \"./app-info.tools.js\";\n// Import tool handlers\nimport { appsToolDefinitions, getApp, listApps } from \"./apps.tools.js\";\nimport {\n addBetaTester,\n betaToolDefinitions,\n listBetaGroups,\n listBetaTesters,\n removeBetaTester,\n} from \"./beta.tools.js\";\nimport { buildsToolDefinitions, getBuild, listBuilds } from \"./builds.tools.js\";\nimport {\n bundleIdsToolDefinitions,\n createBundleId,\n deleteBundleId,\n getBundleId,\n listBundleIds,\n updateBundleId,\n} from \"./bundle-ids.tools.js\";\nimport {\n categoriesToolDefinitions,\n getAppAvailability,\n getAppPriceSchedule,\n listAppCategories,\n} from \"./categories.tools.js\";\nimport { devicesToolDefinitions, getDevice, listDevices } from \"./devices.tools.js\";\nimport {\n createVersionLocalization,\n deleteVersionLocalization,\n getVersionLocalization,\n listVersionLocalizations,\n localizationsToolDefinitions,\n updateVersionLocalization,\n} from \"./localizations.tools.js\";\nimport {\n listScreenshotSets,\n listScreenshots,\n screenshotsToolDefinitions,\n uploadScreenshot,\n} from \"./screenshots.tools.js\";\nimport { getUser, listUsers, usersToolDefinitions } from \"./users.tools.js\";\nimport {\n createAppVersion,\n getAppVersion,\n listAppVersions,\n versionsToolDefinitions,\n} from \"./versions.tools.js\";\n\n// Tool handler type\ntype ToolHandler = (client: AppStoreConnectClient, input: unknown) => Promise<unknown>;\n\n// Tool handler registry\nconst toolHandlers: Record<string, ToolHandler> = {\n // Apps\n list_apps: listApps,\n get_app: getApp,\n\n // Versions\n list_app_versions: listAppVersions,\n get_app_version: getAppVersion,\n create_app_version: createAppVersion,\n\n // Localizations\n list_version_localizations: listVersionLocalizations,\n get_version_localization: getVersionLocalization,\n create_version_localization: createVersionLocalization,\n update_version_localization: updateVersionLocalization,\n delete_version_localization: deleteVersionLocalization,\n\n // App Info\n list_app_infos: listAppInfos,\n list_app_info_localizations: listAppInfoLocalizations,\n update_app_info_localization: updateAppInfoLocalization,\n\n // Beta\n list_beta_groups: listBetaGroups,\n list_beta_testers: listBetaTesters,\n add_beta_tester: addBetaTester,\n remove_beta_tester: removeBetaTester,\n\n // Screenshots\n list_screenshot_sets: listScreenshotSets,\n list_screenshots: listScreenshots,\n upload_screenshot: uploadScreenshot,\n\n // Bundle IDs\n list_bundle_ids: listBundleIds,\n get_bundle_id: getBundleId,\n create_bundle_id: createBundleId,\n update_bundle_id: updateBundleId,\n delete_bundle_id: deleteBundleId,\n\n // Devices\n list_devices: listDevices,\n get_device: getDevice,\n\n // Users\n list_users: listUsers,\n get_user: getUser,\n\n // Builds\n list_builds: listBuilds,\n get_build: getBuild,\n\n // Categories\n list_app_categories: listAppCategories,\n get_app_price_schedule: getAppPriceSchedule,\n get_app_availability: getAppAvailability,\n};\n\n// All tool definitions\nexport const allToolDefinitions = [\n ...appsToolDefinitions,\n ...versionsToolDefinitions,\n ...localizationsToolDefinitions,\n ...appInfoToolDefinitions,\n ...betaToolDefinitions,\n ...screenshotsToolDefinitions,\n ...bundleIdsToolDefinitions,\n ...devicesToolDefinitions,\n ...usersToolDefinitions,\n ...buildsToolDefinitions,\n ...categoriesToolDefinitions,\n];\n\n/**\n * Get a tool handler by name\n */\nexport function getToolHandler(name: string): ToolHandler | undefined {\n return toolHandlers[name];\n}\n\n/**\n * Check if a tool exists\n */\nexport function hasToolHandler(name: string): boolean {\n return name in toolHandlers;\n}\n\n/**\n * Execute a tool by name\n */\nexport async function executeTool(\n client: AppStoreConnectClient,\n name: string,\n input: unknown\n): Promise<unknown> {\n const handler = toolHandlers[name];\n if (!handler) {\n return {\n success: false,\n error: {\n code: \"UNKNOWN_TOOL\",\n message: `Unknown tool: ${name}`,\n },\n };\n }\n\n return handler(client, input);\n}\n"],"mappings":"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","names":["path","resolve","fs"]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "asc-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
+ "mcpName": "io.github.sardorbekr/appstore-connect",
4
5
  "description": "MCP server for Apple's App Store Connect API - manage iOS, macOS, tvOS, and visionOS apps with AI",
5
6
  "type": "module",
6
7
  "main": "dist/index.js",