asc-mcp 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -317,7 +317,11 @@ var AppStoreConnectClient = class {
317
317
  * Build URL with query parameters
318
318
  */
319
319
  buildUrl(path2, params) {
320
- const url = new URL(path2.startsWith("/") ? path2.slice(1) : path2, `${this.baseUrl}/`);
320
+ let baseUrl = this.baseUrl;
321
+ if (/^\/v\d+\//.test(path2)) {
322
+ baseUrl = this.baseUrl.replace(/\/v\d+$/, "");
323
+ }
324
+ const url = new URL(path2.startsWith("/") ? path2.slice(1) : path2, `${baseUrl}/`);
321
325
  if (params) {
322
326
  for (const [key, value] of Object.entries(params)) {
323
327
  if (value !== void 0) {
@@ -731,6 +735,30 @@ var getAppPriceScheduleInputSchema = z.object({
731
735
  var getAppAvailabilityInputSchema = z.object({
732
736
  appId: appIdSchema
733
737
  });
738
+ var territoryIdSchema = z.string().regex(/^[A-Z]{3}$/, "Territory ID must be a 3-letter code (e.g., USA, GBR)");
739
+ var listTerritoriesInputSchema = z.object({
740
+ limit: z.number().int().min(1).max(200).optional()
741
+ });
742
+ var listAppPricePointsInputSchema = z.object({
743
+ appId: appIdSchema,
744
+ territory: territoryIdSchema.optional(),
745
+ limit: z.number().int().min(1).max(200).optional()
746
+ });
747
+ var getPricePointEqualizationsInputSchema = z.object({
748
+ pricePointId: z.string().min(1, "Price Point ID is required"),
749
+ territories: z.array(territoryIdSchema).optional(),
750
+ limit: z.number().int().min(1).max(200).optional()
751
+ });
752
+ var setAppPricesInputSchema = z.object({
753
+ appId: appIdSchema,
754
+ baseTerritory: territoryIdSchema,
755
+ manualPrices: z.array(
756
+ z.object({
757
+ territory: territoryIdSchema,
758
+ pricePointId: z.string().min(1, "Price Point ID is required")
759
+ })
760
+ ).min(1, "At least one manual price entry is required")
761
+ });
734
762
 
735
763
  // src/tools/app-info.tools.ts
736
764
  async function listAppInfos(client, input) {
@@ -2067,6 +2095,274 @@ var localizationsToolDefinitions = [
2067
2095
  }
2068
2096
  ];
2069
2097
 
2098
+ // src/tools/pricing.tools.ts
2099
+ async function listTerritories(client, input) {
2100
+ try {
2101
+ const params = validateInput(listTerritoriesInputSchema, input);
2102
+ const response = await client.get("/territories", {
2103
+ limit: params.limit,
2104
+ "fields[territories]": "currency"
2105
+ });
2106
+ return {
2107
+ success: true,
2108
+ data: response.data.map((territory) => ({
2109
+ id: territory.id,
2110
+ currency: territory.attributes.currency
2111
+ })),
2112
+ meta: {
2113
+ total: response.meta?.paging?.total,
2114
+ returned: response.data.length
2115
+ }
2116
+ };
2117
+ } catch (error) {
2118
+ return formatErrorResponse(error);
2119
+ }
2120
+ }
2121
+ async function listAppPricePoints(client, input) {
2122
+ try {
2123
+ const params = validateInput(listAppPricePointsInputSchema, input);
2124
+ const queryParams = {
2125
+ limit: params.limit,
2126
+ "fields[appPricePoints]": "customerPrice,proceeds",
2127
+ include: "territory"
2128
+ };
2129
+ if (params.territory) {
2130
+ queryParams["filter[territory]"] = params.territory;
2131
+ }
2132
+ const response = await client.get(
2133
+ `/apps/${params.appId}/appPricePoints`,
2134
+ queryParams
2135
+ );
2136
+ const included = response.included ?? [];
2137
+ const territoryMap = /* @__PURE__ */ new Map();
2138
+ for (const item of included) {
2139
+ if (item.type === "territories") {
2140
+ territoryMap.set(item.id, item);
2141
+ }
2142
+ }
2143
+ return {
2144
+ success: true,
2145
+ data: response.data.map((pricePoint) => {
2146
+ const territoryData = pricePoint.relationships?.territory?.data;
2147
+ const territoryId = territoryData && !Array.isArray(territoryData) ? territoryData.id : void 0;
2148
+ const territory = territoryId ? territoryMap.get(territoryId) : void 0;
2149
+ return {
2150
+ id: pricePoint.id,
2151
+ customerPrice: pricePoint.attributes.customerPrice,
2152
+ proceeds: pricePoint.attributes.proceeds,
2153
+ territory: territory ? { id: territory.id, currency: territory.attributes.currency } : territoryId ? { id: territoryId } : void 0
2154
+ };
2155
+ }),
2156
+ meta: {
2157
+ total: response.meta?.paging?.total,
2158
+ returned: response.data.length
2159
+ }
2160
+ };
2161
+ } catch (error) {
2162
+ return formatErrorResponse(error);
2163
+ }
2164
+ }
2165
+ async function getPricePointEqualizations(client, input) {
2166
+ try {
2167
+ const params = validateInput(getPricePointEqualizationsInputSchema, input);
2168
+ const queryParams = {
2169
+ limit: params.limit,
2170
+ "fields[appPricePoints]": "customerPrice,proceeds",
2171
+ include: "territory"
2172
+ };
2173
+ if (params.territories && params.territories.length > 0) {
2174
+ queryParams["filter[territory]"] = params.territories.join(",");
2175
+ }
2176
+ const response = await client.get(
2177
+ `/v3/appPricePoints/${params.pricePointId}/equalizations`,
2178
+ queryParams
2179
+ );
2180
+ const included = response.included ?? [];
2181
+ const territoryMap = /* @__PURE__ */ new Map();
2182
+ for (const item of included) {
2183
+ if (item.type === "territories") {
2184
+ territoryMap.set(item.id, item);
2185
+ }
2186
+ }
2187
+ return {
2188
+ success: true,
2189
+ data: response.data.map((pricePoint) => {
2190
+ const territoryData = pricePoint.relationships?.territory?.data;
2191
+ const territoryId = territoryData && !Array.isArray(territoryData) ? territoryData.id : void 0;
2192
+ const territory = territoryId ? territoryMap.get(territoryId) : void 0;
2193
+ return {
2194
+ id: pricePoint.id,
2195
+ customerPrice: pricePoint.attributes.customerPrice,
2196
+ proceeds: pricePoint.attributes.proceeds,
2197
+ territory: territory ? { id: territory.id, currency: territory.attributes.currency } : territoryId ? { id: territoryId } : void 0
2198
+ };
2199
+ }),
2200
+ meta: {
2201
+ total: response.meta?.paging?.total,
2202
+ returned: response.data.length
2203
+ }
2204
+ };
2205
+ } catch (error) {
2206
+ return formatErrorResponse(error);
2207
+ }
2208
+ }
2209
+ async function setAppPrices(client, input) {
2210
+ try {
2211
+ const params = validateInput(setAppPricesInputSchema, input);
2212
+ const manualPricesData = [];
2213
+ const includedPrices = [];
2214
+ for (const entry of params.manualPrices) {
2215
+ const tempId = `\${${entry.territory}-price}`;
2216
+ manualPricesData.push({ type: "appPrices", id: tempId });
2217
+ includedPrices.push({
2218
+ type: "appPrices",
2219
+ id: tempId,
2220
+ attributes: { startDate: null },
2221
+ relationships: {
2222
+ appPricePoint: {
2223
+ data: { type: "appPricePoints", id: entry.pricePointId }
2224
+ }
2225
+ }
2226
+ });
2227
+ }
2228
+ const requestBody = {
2229
+ data: {
2230
+ type: "appPriceSchedules",
2231
+ relationships: {
2232
+ app: {
2233
+ data: { type: "apps", id: params.appId }
2234
+ },
2235
+ baseTerritory: {
2236
+ data: { type: "territories", id: params.baseTerritory }
2237
+ },
2238
+ manualPrices: {
2239
+ data: manualPricesData
2240
+ }
2241
+ }
2242
+ },
2243
+ included: includedPrices
2244
+ };
2245
+ const response = await client.post(
2246
+ "/appPriceSchedules",
2247
+ requestBody
2248
+ );
2249
+ return {
2250
+ success: true,
2251
+ data: {
2252
+ id: response.data.id,
2253
+ appId: params.appId,
2254
+ baseTerritory: params.baseTerritory,
2255
+ manualPricesCount: params.manualPrices.length
2256
+ }
2257
+ };
2258
+ } catch (error) {
2259
+ return formatErrorResponse(error);
2260
+ }
2261
+ }
2262
+ var pricingToolDefinitions = [
2263
+ {
2264
+ name: "list_territories",
2265
+ description: "List all App Store territories (countries/regions) with their currencies. Useful for understanding which markets are available for pricing.",
2266
+ inputSchema: {
2267
+ type: "object",
2268
+ properties: {
2269
+ limit: {
2270
+ type: "number",
2271
+ description: "Maximum number of territories to return (1-200)",
2272
+ minimum: 1,
2273
+ maximum: 200
2274
+ }
2275
+ },
2276
+ required: []
2277
+ }
2278
+ },
2279
+ {
2280
+ name: "list_app_price_points",
2281
+ description: "List available price points for an app. Each price point represents a possible price tier showing customer price and developer proceeds in local currency. Filter by territory to see prices for a specific country.",
2282
+ inputSchema: {
2283
+ type: "object",
2284
+ properties: {
2285
+ appId: {
2286
+ type: "string",
2287
+ description: "The App Store Connect app ID"
2288
+ },
2289
+ territory: {
2290
+ type: "string",
2291
+ description: "Filter by territory (3-letter code, e.g., USA, GBR, JPN)"
2292
+ },
2293
+ limit: {
2294
+ type: "number",
2295
+ description: "Maximum number of price points to return (1-200)",
2296
+ minimum: 1,
2297
+ maximum: 200
2298
+ }
2299
+ },
2300
+ required: ["appId"]
2301
+ }
2302
+ },
2303
+ {
2304
+ name: "get_price_point_equalizations",
2305
+ description: "Get Apple's equivalent price points in other territories for a given price point. This is the core Purchase Power Parity (PPP) data \u2014 shows what Apple considers equivalent pricing across countries. Use list_app_price_points first to get a price point ID.",
2306
+ inputSchema: {
2307
+ type: "object",
2308
+ properties: {
2309
+ pricePointId: {
2310
+ type: "string",
2311
+ description: "The price point ID (from list_app_price_points)"
2312
+ },
2313
+ territories: {
2314
+ type: "array",
2315
+ items: { type: "string" },
2316
+ description: "Filter to specific territories (3-letter codes, e.g., ['IND', 'BRA', 'TUR'])"
2317
+ },
2318
+ limit: {
2319
+ type: "number",
2320
+ description: "Maximum number of equalizations to return (1-200)",
2321
+ minimum: 1,
2322
+ maximum: 200
2323
+ }
2324
+ },
2325
+ required: ["pricePointId"]
2326
+ }
2327
+ },
2328
+ {
2329
+ name: "set_app_prices",
2330
+ description: "Set per-territory manual pricing for an app (Purchase Power Parity). WARNING: This replaces the entire price schedule \u2014 include ALL territory prices, not just changes. The base territory price must be included in manualPrices. Use list_app_price_points and get_price_point_equalizations to find price point IDs first.",
2331
+ inputSchema: {
2332
+ type: "object",
2333
+ properties: {
2334
+ appId: {
2335
+ type: "string",
2336
+ description: "The App Store Connect app ID"
2337
+ },
2338
+ baseTerritory: {
2339
+ type: "string",
2340
+ description: "Base territory for pricing (3-letter code, e.g., USA)"
2341
+ },
2342
+ manualPrices: {
2343
+ type: "array",
2344
+ items: {
2345
+ type: "object",
2346
+ properties: {
2347
+ territory: {
2348
+ type: "string",
2349
+ description: "Territory code (e.g., USA, GBR, IND)"
2350
+ },
2351
+ pricePointId: {
2352
+ type: "string",
2353
+ description: "Price point ID for this territory (from list_app_price_points or get_price_point_equalizations)"
2354
+ }
2355
+ },
2356
+ required: ["territory", "pricePointId"]
2357
+ },
2358
+ description: "Array of per-territory price assignments. Must include the base territory."
2359
+ }
2360
+ },
2361
+ required: ["appId", "baseTerritory", "manualPrices"]
2362
+ }
2363
+ }
2364
+ ];
2365
+
2070
2366
  // src/tools/screenshots.tools.ts
2071
2367
  import * as crypto from "crypto";
2072
2368
  import * as fs2 from "fs/promises";
@@ -2630,7 +2926,12 @@ var toolHandlers = {
2630
2926
  // Categories
2631
2927
  list_app_categories: listAppCategories,
2632
2928
  get_app_price_schedule: getAppPriceSchedule,
2633
- get_app_availability: getAppAvailability
2929
+ get_app_availability: getAppAvailability,
2930
+ // Pricing (PPP)
2931
+ list_territories: listTerritories,
2932
+ list_app_price_points: listAppPricePoints,
2933
+ get_price_point_equalizations: getPricePointEqualizations,
2934
+ set_app_prices: setAppPrices
2634
2935
  };
2635
2936
  var allToolDefinitions = [
2636
2937
  ...appsToolDefinitions,
@@ -2643,7 +2944,8 @@ var allToolDefinitions = [
2643
2944
  ...devicesToolDefinitions,
2644
2945
  ...usersToolDefinitions,
2645
2946
  ...buildsToolDefinitions,
2646
- ...categoriesToolDefinitions
2947
+ ...categoriesToolDefinitions,
2948
+ ...pricingToolDefinitions
2647
2949
  ];
2648
2950
  function hasToolHandler(name) {
2649
2951
  return name in toolHandlers;
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.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"]}
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/pricing.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 // Handle paths with explicit API version (e.g., /v3/...) by resolving against domain root\n let baseUrl = this.baseUrl;\n if (/^\\/v\\d+\\//.test(path)) {\n baseUrl = this.baseUrl.replace(/\\/v\\d+$/, \"\");\n }\n\n const url = new URL(path.startsWith(\"/\") ? path.slice(1) : path, `${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// ============================================================================\n// Pricing Schemas\n// ============================================================================\n\n// Territory ID (3-letter code, e.g., \"USA\", \"GBR\", \"JPN\")\nexport const territoryIdSchema = z\n .string()\n .regex(/^[A-Z]{3}$/, \"Territory ID must be a 3-letter code (e.g., USA, GBR)\");\n\n// List territories input\nexport const listTerritoriesInputSchema = z.object({\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// List app price points input\nexport const listAppPricePointsInputSchema = z.object({\n appId: appIdSchema,\n territory: territoryIdSchema.optional(),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Get price point equalizations input\nexport const getPricePointEqualizationsInputSchema = z.object({\n pricePointId: z.string().min(1, \"Price Point ID is required\"),\n territories: z.array(territoryIdSchema).optional(),\n limit: z.number().int().min(1).max(200).optional(),\n});\n\n// Set app prices input\nexport const setAppPricesInputSchema = z.object({\n appId: appIdSchema,\n baseTerritory: territoryIdSchema,\n manualPrices: z\n .array(\n z.object({\n territory: territoryIdSchema,\n pricePointId: z.string().min(1, \"Price Point ID is required\"),\n })\n )\n .min(1, \"At least one manual price entry is required\"),\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 * Pricing Tools - Manage app pricing and Purchase Power Parity (PPP)\n */\n\nimport type { AppStoreConnectClient } from \"../api/client.js\";\nimport type {\n ASCListResponse,\n ASCResponse,\n AppPricePoint,\n AppPriceSchedule,\n CreateAppPriceScheduleRequest,\n Territory,\n} from \"../api/types.js\";\nimport { formatErrorResponse } from \"../utils/errors.js\";\nimport {\n getPricePointEqualizationsInputSchema,\n listAppPricePointsInputSchema,\n listTerritoriesInputSchema,\n setAppPricesInputSchema,\n validateInput,\n} from \"../utils/validation.js\";\n\n/**\n * List all App Store territories with their currencies\n */\nexport async function listTerritories(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listTerritoriesInputSchema, input);\n\n const response = await client.get<ASCListResponse<Territory>>(\"/territories\", {\n limit: params.limit,\n \"fields[territories]\": \"currency\",\n });\n\n return {\n success: true,\n data: response.data.map((territory) => ({\n id: territory.id,\n currency: territory.attributes.currency,\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 available price points for an app, optionally filtered by territory\n */\nexport async function listAppPricePoints(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(listAppPricePointsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appPricePoints]\": \"customerPrice,proceeds\",\n include: \"territory\",\n };\n\n if (params.territory) {\n queryParams[\"filter[territory]\"] = params.territory;\n }\n\n const response = await client.get<ASCListResponse<AppPricePoint>>(\n `/apps/${params.appId}/appPricePoints`,\n queryParams\n );\n\n const included = (response.included ?? []) as Territory[];\n const territoryMap = new Map<string, Territory>();\n for (const item of included) {\n if ((item as { type: string }).type === \"territories\") {\n territoryMap.set(item.id, item);\n }\n }\n\n return {\n success: true,\n data: response.data.map((pricePoint) => {\n const territoryData = pricePoint.relationships?.territory?.data;\n const territoryId =\n territoryData && !Array.isArray(territoryData) ? territoryData.id : undefined;\n const territory = territoryId ? territoryMap.get(territoryId) : undefined;\n\n return {\n id: pricePoint.id,\n customerPrice: pricePoint.attributes.customerPrice,\n proceeds: pricePoint.attributes.proceeds,\n territory: territory\n ? { id: territory.id, currency: territory.attributes.currency }\n : territoryId\n ? { id: territoryId }\n : undefined,\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 Apple's equivalent price points in other territories for a given price point (PPP)\n */\nexport async function getPricePointEqualizations(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(getPricePointEqualizationsInputSchema, input);\n\n const queryParams: Record<string, string | number | boolean | undefined> = {\n limit: params.limit,\n \"fields[appPricePoints]\": \"customerPrice,proceeds\",\n include: \"territory\",\n };\n\n if (params.territories && params.territories.length > 0) {\n queryParams[\"filter[territory]\"] = params.territories.join(\",\");\n }\n\n // Equalizations endpoint is v3\n const response = await client.get<ASCListResponse<AppPricePoint>>(\n `/v3/appPricePoints/${params.pricePointId}/equalizations`,\n queryParams\n );\n\n const included = (response.included ?? []) as Territory[];\n const territoryMap = new Map<string, Territory>();\n for (const item of included) {\n if ((item as { type: string }).type === \"territories\") {\n territoryMap.set(item.id, item);\n }\n }\n\n return {\n success: true,\n data: response.data.map((pricePoint) => {\n const territoryData = pricePoint.relationships?.territory?.data;\n const territoryId =\n territoryData && !Array.isArray(territoryData) ? territoryData.id : undefined;\n const territory = territoryId ? territoryMap.get(territoryId) : undefined;\n\n return {\n id: pricePoint.id,\n customerPrice: pricePoint.attributes.customerPrice,\n proceeds: pricePoint.attributes.proceeds,\n territory: territory\n ? { id: territory.id, currency: territory.attributes.currency }\n : territoryId\n ? { id: territoryId }\n : undefined,\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 * Set per-territory manual pricing for an app (replaces entire price schedule)\n */\nexport async function setAppPrices(\n client: AppStoreConnectClient,\n input: unknown\n): Promise<unknown> {\n try {\n const params = validateInput(setAppPricesInputSchema, input);\n\n const manualPricesData: Array<{ type: \"appPrices\"; id: string }> = [];\n const includedPrices: CreateAppPriceScheduleRequest[\"included\"] = [];\n\n for (const entry of params.manualPrices) {\n const tempId = `\\${${entry.territory}-price}`;\n\n manualPricesData.push({ type: \"appPrices\", id: tempId });\n\n includedPrices.push({\n type: \"appPrices\",\n id: tempId,\n attributes: { startDate: null },\n relationships: {\n appPricePoint: {\n data: { type: \"appPricePoints\", id: entry.pricePointId },\n },\n },\n });\n }\n\n const requestBody: CreateAppPriceScheduleRequest = {\n data: {\n type: \"appPriceSchedules\",\n relationships: {\n app: {\n data: { type: \"apps\", id: params.appId },\n },\n baseTerritory: {\n data: { type: \"territories\", id: params.baseTerritory },\n },\n manualPrices: {\n data: manualPricesData,\n },\n },\n },\n included: includedPrices,\n };\n\n const response = await client.post<ASCResponse<AppPriceSchedule>>(\n \"/appPriceSchedules\",\n requestBody\n );\n\n return {\n success: true,\n data: {\n id: response.data.id,\n appId: params.appId,\n baseTerritory: params.baseTerritory,\n manualPricesCount: params.manualPrices.length,\n },\n };\n } catch (error) {\n return formatErrorResponse(error);\n }\n}\n\n/**\n * Tool definitions for pricing\n */\nexport const pricingToolDefinitions = [\n {\n name: \"list_territories\",\n description:\n \"List all App Store territories (countries/regions) with their currencies. Useful for understanding which markets are available for pricing.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of territories to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [],\n },\n },\n {\n name: \"list_app_price_points\",\n description:\n \"List available price points for an app. Each price point represents a possible price tier showing customer price and developer proceeds in local currency. Filter by territory to see prices for a specific country.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n appId: {\n type: \"string\",\n description: \"The App Store Connect app ID\",\n },\n territory: {\n type: \"string\",\n description: \"Filter by territory (3-letter code, e.g., USA, GBR, JPN)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of price points to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"appId\"],\n },\n },\n {\n name: \"get_price_point_equalizations\",\n description:\n \"Get Apple's equivalent price points in other territories for a given price point. This is the core Purchase Power Parity (PPP) data — shows what Apple considers equivalent pricing across countries. Use list_app_price_points first to get a price point ID.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n pricePointId: {\n type: \"string\",\n description: \"The price point ID (from list_app_price_points)\",\n },\n territories: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n \"Filter to specific territories (3-letter codes, e.g., ['IND', 'BRA', 'TUR'])\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of equalizations to return (1-200)\",\n minimum: 1,\n maximum: 200,\n },\n },\n required: [\"pricePointId\"],\n },\n },\n {\n name: \"set_app_prices\",\n description:\n \"Set per-territory manual pricing for an app (Purchase Power Parity). WARNING: This replaces the entire price schedule — include ALL territory prices, not just changes. The base territory price must be included in manualPrices. Use list_app_price_points and get_price_point_equalizations to find price point IDs 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 baseTerritory: {\n type: \"string\",\n description: \"Base territory for pricing (3-letter code, e.g., USA)\",\n },\n manualPrices: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n territory: {\n type: \"string\",\n description: \"Territory code (e.g., USA, GBR, IND)\",\n },\n pricePointId: {\n type: \"string\",\n description:\n \"Price point ID for this territory (from list_app_price_points or get_price_point_equalizations)\",\n },\n },\n required: [\"territory\", \"pricePointId\"],\n },\n description: \"Array of per-territory price assignments. Must include the base territory.\",\n },\n },\n required: [\"appId\", \"baseTerritory\", \"manualPrices\"],\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 getPricePointEqualizations,\n listAppPricePoints,\n listTerritories,\n pricingToolDefinitions,\n setAppPrices,\n} from \"./pricing.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 // Pricing (PPP)\n list_territories: listTerritories,\n list_app_price_points: listAppPricePoints,\n get_price_point_equalizations: getPricePointEqualizations,\n set_app_prices: setAppPrices,\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 ...pricingToolDefinitions,\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,7 +1,7 @@
1
1
  {
2
2
  "name": "asc-mcp",
3
- "version": "1.0.3",
4
- "mcpName": "io.github.sardorbekr/appstore-connect",
3
+ "version": "1.1.0",
4
+ "mcpName": "io.github.SardorbekR/appstore-connect",
5
5
  "description": "MCP server for Apple's App Store Connect API - manage iOS, macOS, tvOS, and visionOS apps with AI",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",