@akoskomuves/appstoreconnect-mcp 0.1.1

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.
Files changed (73) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/LICENSE +21 -0
  3. package/README.md +158 -0
  4. package/data/apple-music-prices.json +78 -0
  5. package/dist/auth.d.ts +9 -0
  6. package/dist/auth.d.ts.map +1 -0
  7. package/dist/auth.js +33 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/client.d.ts +6 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +75 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/clients.d.ts +31 -0
  14. package/dist/clients.d.ts.map +1 -0
  15. package/dist/clients.js +88 -0
  16. package/dist/clients.js.map +1 -0
  17. package/dist/config.d.ts +7 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +29 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/digest.d.ts +13 -0
  22. package/dist/digest.d.ts.map +1 -0
  23. package/dist/digest.js +154 -0
  24. package/dist/digest.js.map +1 -0
  25. package/dist/doctor.d.ts +2 -0
  26. package/dist/doctor.d.ts.map +1 -0
  27. package/dist/doctor.js +139 -0
  28. package/dist/doctor.js.map +1 -0
  29. package/dist/domains/apps.d.ts +4 -0
  30. package/dist/domains/apps.d.ts.map +1 -0
  31. package/dist/domains/apps.js +40 -0
  32. package/dist/domains/apps.js.map +1 -0
  33. package/dist/domains/ppp.d.ts +6 -0
  34. package/dist/domains/ppp.d.ts.map +1 -0
  35. package/dist/domains/ppp.js +539 -0
  36. package/dist/domains/ppp.js.map +1 -0
  37. package/dist/domains/pricing.d.ts +4 -0
  38. package/dist/domains/pricing.d.ts.map +1 -0
  39. package/dist/domains/pricing.js +55 -0
  40. package/dist/domains/pricing.js.map +1 -0
  41. package/dist/domains/subscriptions.d.ts +4 -0
  42. package/dist/domains/subscriptions.d.ts.map +1 -0
  43. package/dist/domains/subscriptions.js +84 -0
  44. package/dist/domains/subscriptions.js.map +1 -0
  45. package/dist/domains/territories.d.ts +4 -0
  46. package/dist/domains/territories.d.ts.map +1 -0
  47. package/dist/domains/territories.js +21 -0
  48. package/dist/domains/territories.js.map +1 -0
  49. package/dist/errors.d.ts +6 -0
  50. package/dist/errors.d.ts.map +1 -0
  51. package/dist/errors.js +11 -0
  52. package/dist/errors.js.map +1 -0
  53. package/dist/index.d.ts +3 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +98 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/init.d.ts +6 -0
  58. package/dist/init.d.ts.map +1 -0
  59. package/dist/init.js +316 -0
  60. package/dist/init.js.map +1 -0
  61. package/dist/jsonapi.d.ts +62 -0
  62. package/dist/jsonapi.d.ts.map +1 -0
  63. package/dist/jsonapi.js +78 -0
  64. package/dist/jsonapi.js.map +1 -0
  65. package/dist/ppp/index.d.ts +40 -0
  66. package/dist/ppp/index.d.ts.map +1 -0
  67. package/dist/ppp/index.js +85 -0
  68. package/dist/ppp/index.js.map +1 -0
  69. package/dist/schemas.d.ts +10 -0
  70. package/dist/schemas.d.ts.map +1 -0
  71. package/dist/schemas.js +34 -0
  72. package/dist/schemas.js.map +1 -0
  73. package/package.json +79 -0
@@ -0,0 +1,84 @@
1
+ import { z } from 'zod';
2
+ import { digestSubscriptionGroups, digestSubscriptionPricePoints, digestSubscriptionPrices, digestSubscriptions, } from '../digest.js';
3
+ import { paginate } from '../jsonapi.js';
4
+ import { AppIdSchema, SubscriptionGroupIdSchema, SubscriptionIdSchema, TerritoryIdSchema, } from '../schemas.js';
5
+ const GROUP_FIELDS = 'referenceName';
6
+ const SUB_FIELDS = 'name,productId,subscriptionPeriod,state,groupLevel';
7
+ // SubscriptionPrice has only `startDate` as an attribute; `preserveCurrentPrice`
8
+ // is a write-only field on the POST body, not a queryable resource attribute.
9
+ // We don't apply fields[subscriptionPrices] at all — Apple rejects unknown names.
10
+ const PRICE_POINT_FIELDS = 'customerPrice,proceeds,proceedsYear2';
11
+ const TERRITORY_FIELDS = 'currency';
12
+ export function registerSubscriptions(server, client) {
13
+ server.registerTool('asc_list_subscription_groups', {
14
+ title: 'List subscription groups',
15
+ description: 'List subscription groups for an app.',
16
+ inputSchema: {
17
+ appId: AppIdSchema,
18
+ maxItems: z.number().int().positive().max(2000).default(500),
19
+ raw: z.boolean().default(false),
20
+ },
21
+ }, async ({ appId, maxItems, raw }) => {
22
+ const params = new URLSearchParams();
23
+ params.set('fields[subscriptionGroups]', GROUP_FIELDS);
24
+ params.set('limit', '200');
25
+ const pages = await paginate(client, `/v1/apps/${encodeURIComponent(appId)}/subscriptionGroups?${params.toString()}`, maxItems);
26
+ const text = raw ? JSON.stringify(pages, null, 2) : digestSubscriptionGroups(pages);
27
+ return { content: [{ type: 'text', text }] };
28
+ });
29
+ server.registerTool('asc_list_subscriptions', {
30
+ title: 'List subscriptions',
31
+ description: 'List auto-renewable subscriptions in a subscription group.',
32
+ inputSchema: {
33
+ groupId: SubscriptionGroupIdSchema,
34
+ maxItems: z.number().int().positive().max(2000).default(500),
35
+ raw: z.boolean().default(false),
36
+ },
37
+ }, async ({ groupId, maxItems, raw }) => {
38
+ const params = new URLSearchParams();
39
+ params.set('fields[subscriptions]', SUB_FIELDS);
40
+ params.set('limit', '200');
41
+ const pages = await paginate(client, `/v1/subscriptionGroups/${encodeURIComponent(groupId)}/subscriptions?${params.toString()}`, maxItems);
42
+ const text = raw ? JSON.stringify(pages, null, 2) : digestSubscriptions(pages);
43
+ return { content: [{ type: 'text', text }] };
44
+ });
45
+ server.registerTool('asc_list_subscription_prices', {
46
+ title: 'List subscription prices',
47
+ description: 'List the current price schedule for a subscription across territories. Auto-paginates to capture all 175 territories. Returns a compact table by default; pass raw:true for the full JSON:API payload.',
48
+ inputSchema: {
49
+ subscriptionId: SubscriptionIdSchema,
50
+ maxItems: z.number().int().positive().max(2000).default(500),
51
+ raw: z.boolean().default(false),
52
+ },
53
+ }, async ({ subscriptionId, maxItems, raw }) => {
54
+ // Apple's /v1/subscriptions/{id}/prices is picky about extra query params:
55
+ // adding fields[subscriptionPricePoints], fields[territories], or limit=200
56
+ // produces a 400 with no detail. Stick to the include and let paginate()
57
+ // walk links.next at the server's default page size.
58
+ const path = `/v1/subscriptions/${encodeURIComponent(subscriptionId)}/prices?include=subscriptionPricePoint,territory`;
59
+ const pages = await paginate(client, path, maxItems);
60
+ const text = raw ? JSON.stringify(pages, null, 2) : digestSubscriptionPrices(pages);
61
+ return { content: [{ type: 'text', text }] };
62
+ });
63
+ server.registerTool('asc_list_subscription_price_points', {
64
+ title: 'List subscription price points',
65
+ description: 'List the valid price points a subscription can be set to in a given territory. Apple rotates these IDs; cache only within a single run.',
66
+ inputSchema: {
67
+ subscriptionId: SubscriptionIdSchema,
68
+ territoryId: TerritoryIdSchema,
69
+ maxItems: z.number().int().positive().max(5000).default(1000),
70
+ raw: z.boolean().default(false),
71
+ },
72
+ }, async ({ subscriptionId, territoryId, maxItems, raw }) => {
73
+ const params = new URLSearchParams();
74
+ params.set('filter[territory]', territoryId);
75
+ params.set('include', 'territory');
76
+ params.set('fields[subscriptionPricePoints]', PRICE_POINT_FIELDS);
77
+ params.set('fields[territories]', TERRITORY_FIELDS);
78
+ params.set('limit', '200');
79
+ const pages = await paginate(client, `/v1/subscriptions/${encodeURIComponent(subscriptionId)}/pricePoints?${params.toString()}`, maxItems);
80
+ const text = raw ? JSON.stringify(pages, null, 2) : digestSubscriptionPricePoints(pages);
81
+ return { content: [{ type: 'text', text }] };
82
+ });
83
+ }
84
+ //# sourceMappingURL=subscriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../src/domains/subscriptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ASCClient } from '../client.js';
3
+ export declare function registerTerritories(server: McpServer, client: ASCClient): void;
4
+ //# sourceMappingURL=territories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"territories.d.ts","sourceRoot":"","sources":["../../src/domains/territories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAoB9E"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import { digestTerritories } from '../digest.js';
3
+ import { paginate } from '../jsonapi.js';
4
+ export function registerTerritories(server, client) {
5
+ server.registerTool('asc_list_territories', {
6
+ title: 'List territories',
7
+ description: 'List App Store territories with their currency codes.',
8
+ inputSchema: {
9
+ maxItems: z.number().int().positive().max(500).default(500),
10
+ raw: z.boolean().default(false),
11
+ },
12
+ }, async ({ maxItems, raw }) => {
13
+ const params = new URLSearchParams();
14
+ params.set('fields[territories]', 'currency');
15
+ params.set('limit', '200');
16
+ const pages = await paginate(client, `/v1/territories?${params.toString()}`, maxItems);
17
+ const text = raw ? JSON.stringify(pages, null, 2) : digestTerritories(pages);
18
+ return { content: [{ type: 'text', text }] };
19
+ });
20
+ }
21
+ //# sourceMappingURL=territories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"territories.js","sourceRoot":"","sources":["../../src/domains/territories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAiB;IACtE,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,uDAAuD;QACpE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3D,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;SAChC;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,mBAAmB,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare class ASCError extends Error {
2
+ readonly status: number;
3
+ readonly details?: unknown | undefined;
4
+ constructor(status: number, message: string, details?: unknown | undefined);
5
+ }
6
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAEf,MAAM,EAAE,MAAM;aAEd,OAAO,CAAC,EAAE,OAAO;gBAFjB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ export class ASCError extends Error {
2
+ status;
3
+ details;
4
+ constructor(status, message, details) {
5
+ super(message);
6
+ this.status = status;
7
+ this.details = details;
8
+ this.name = 'ASCError';
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IAEA;IAHlB,YACkB,MAAc,EAC9B,OAAe,EACC,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QAEd,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { createASCClient } from './client.js';
7
+ import { loadConfig } from './config.js';
8
+ import { registerApps } from './domains/apps.js';
9
+ import { registerPpp } from './domains/ppp.js';
10
+ import { registerPricing } from './domains/pricing.js';
11
+ import { registerSubscriptions } from './domains/subscriptions.js';
12
+ import { registerTerritories } from './domains/territories.js';
13
+ const SCRIPT_PATH = fileURLToPath(import.meta.url);
14
+ function readPackageMeta() {
15
+ const pkgUrl = new URL('../package.json', import.meta.url);
16
+ try {
17
+ const raw = readFileSync(fileURLToPath(pkgUrl), 'utf-8');
18
+ const parsed = JSON.parse(raw);
19
+ return {
20
+ name: parsed.name ?? 'appstoreconnect-mcp',
21
+ version: parsed.version ?? '0.0.0',
22
+ };
23
+ }
24
+ catch {
25
+ return { name: 'appstoreconnect-mcp', version: '0.0.0' };
26
+ }
27
+ }
28
+ const HELP = `appstoreconnect-mcp — Model Context Protocol server for the App Store Connect API.
29
+
30
+ Usage:
31
+ appstoreconnect-mcp Run the MCP server over stdio (default; this is what your MCP client invokes).
32
+ appstoreconnect-mcp init Interactive setup wizard: place .p8, verify auth, register with installed clients.
33
+ appstoreconnect-mcp doctor Read-only diagnostic of keys, client integrations, and live auth.
34
+ appstoreconnect-mcp --version Print the package version.
35
+ appstoreconnect-mcp --help Show this help.
36
+
37
+ Environment variables (read when running as a server):
38
+ ASC_ISSUER_ID App Store Connect issuer UUID.
39
+ ASC_KEY_ID 10-character key ID.
40
+ ASC_PRIVATE_KEY_PATH Path to the .p8 private key file (~ is expanded).
41
+
42
+ Documentation: https://github.com/akoskomuves/appstoreconnect-mcp
43
+ `;
44
+ async function runServer() {
45
+ const meta = readPackageMeta();
46
+ const config = loadConfig();
47
+ const client = createASCClient(config);
48
+ const server = new McpServer({ name: meta.name, version: meta.version });
49
+ registerApps(server, client);
50
+ registerSubscriptions(server, client);
51
+ registerPricing(server, client);
52
+ registerTerritories(server, client);
53
+ registerPpp(server, client);
54
+ const transport = new StdioServerTransport();
55
+ await server.connect(transport);
56
+ }
57
+ async function main() {
58
+ const subcommand = process.argv[2];
59
+ switch (subcommand) {
60
+ case undefined: {
61
+ await runServer();
62
+ return;
63
+ }
64
+ case 'init': {
65
+ const { main: runInit } = await import('./init.js');
66
+ const meta = readPackageMeta();
67
+ await runInit({ execScriptPath: SCRIPT_PATH, pkgName: meta.name });
68
+ return;
69
+ }
70
+ case 'doctor': {
71
+ const { main: runDoctor } = await import('./doctor.js');
72
+ await runDoctor();
73
+ return;
74
+ }
75
+ case '-v':
76
+ case '--version': {
77
+ const meta = readPackageMeta();
78
+ process.stdout.write(`${meta.version}\n`);
79
+ return;
80
+ }
81
+ case '-h':
82
+ case '--help':
83
+ case 'help': {
84
+ process.stdout.write(HELP);
85
+ return;
86
+ }
87
+ default: {
88
+ process.stderr.write(`Unknown subcommand: ${subcommand}\n\n${HELP}`);
89
+ process.exit(1);
90
+ }
91
+ }
92
+ }
93
+ main().catch((err) => {
94
+ const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
95
+ process.stderr.write(`[appstoreconnect-mcp] fatal: ${message}\n`);
96
+ process.exit(1);
97
+ });
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export interface InitDeps {
2
+ execScriptPath: string;
3
+ pkgName: string;
4
+ }
5
+ export declare function main(deps: InitDeps): Promise<void>;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAkQA,MAAM,WAAW,QAAQ;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AA+ED,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxD"}
package/dist/init.js ADDED
@@ -0,0 +1,316 @@
1
+ import { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { basename, isAbsolute, join, resolve } from 'node:path';
4
+ import { checkbox, confirm, input, select } from '@inquirer/prompts';
5
+ import open from 'open';
6
+ import { TokenProvider } from './auth.js';
7
+ import { detectClients, listClients, readServer, resolveServerInvocation, upsertServer, } from './clients.js';
8
+ const HOME = homedir();
9
+ const KEY_DIR = join(HOME, '.appstore');
10
+ const ASC_KEYS_URL = 'https://appstoreconnect.apple.com/access/integrations/api';
11
+ const SERVER_NAME = 'appstoreconnect';
12
+ const KEY_FILENAME_RE = /^AuthKey_([A-Z0-9]{10})\.p8$/i;
13
+ function expandPath(p) {
14
+ if (p.startsWith('~/'))
15
+ return p.replace('~', HOME);
16
+ if (p === '~')
17
+ return HOME;
18
+ return isAbsolute(p) ? p : resolve(process.cwd(), p);
19
+ }
20
+ function looksLikePKCS8(text) {
21
+ return text.includes('-----BEGIN PRIVATE KEY-----');
22
+ }
23
+ function maybeAutoDetectKeyId(p8Path) {
24
+ const match = KEY_FILENAME_RE.exec(basename(p8Path));
25
+ return match?.[1]?.toUpperCase();
26
+ }
27
+ const SCAN_DIRS = [KEY_DIR, join(HOME, 'Downloads'), join(HOME, 'Desktop')];
28
+ function findP8Files() {
29
+ const results = [];
30
+ const seen = new Set();
31
+ for (const dir of SCAN_DIRS) {
32
+ if (!existsSync(dir))
33
+ continue;
34
+ let entries;
35
+ try {
36
+ entries = readdirSync(dir);
37
+ }
38
+ catch {
39
+ continue;
40
+ }
41
+ for (const name of entries) {
42
+ if (!name.toLowerCase().endsWith('.p8'))
43
+ continue;
44
+ const path = join(dir, name);
45
+ if (seen.has(path))
46
+ continue;
47
+ try {
48
+ const stat = statSync(path);
49
+ if (!stat.isFile())
50
+ continue;
51
+ const keyId = maybeAutoDetectKeyId(path);
52
+ results.push(keyId ? { path, mtime: stat.mtime, keyId } : { path, mtime: stat.mtime });
53
+ seen.add(path);
54
+ }
55
+ catch {
56
+ // ignore unreadable
57
+ }
58
+ }
59
+ }
60
+ results.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
61
+ return results;
62
+ }
63
+ function formatTimeAgo(d) {
64
+ const sec = Math.floor((Date.now() - d.getTime()) / 1000);
65
+ if (sec < 60)
66
+ return 'just now';
67
+ const min = Math.floor(sec / 60);
68
+ if (min < 60)
69
+ return `${min}m ago`;
70
+ const hr = Math.floor(min / 60);
71
+ if (hr < 24)
72
+ return `${hr}h ago`;
73
+ const day = Math.floor(hr / 24);
74
+ if (day < 30)
75
+ return `${day}d ago`;
76
+ const mon = Math.floor(day / 30);
77
+ if (mon < 12)
78
+ return `${mon}mo ago`;
79
+ return `${Math.floor(mon / 12)}y ago`;
80
+ }
81
+ function tildify(p) {
82
+ return p.startsWith(`${HOME}/`) ? `~/${p.slice(HOME.length + 1)}` : p;
83
+ }
84
+ async function promptManualPath() {
85
+ while (true) {
86
+ const raw = await input({
87
+ message: 'Path to your .p8 file:',
88
+ default: '~/Downloads/AuthKey_XXXXXXXXXX.p8',
89
+ validate: (v) => v.trim().length > 0 || 'A path is required',
90
+ });
91
+ const expanded = expandPath(raw.trim());
92
+ if (!existsSync(expanded)) {
93
+ console.log(` ✗ File not found: ${expanded}\n`);
94
+ continue;
95
+ }
96
+ if (!looksLikePKCS8(readFileSync(expanded, 'utf-8'))) {
97
+ console.log(` ✗ Doesn't look like a PKCS8 .p8 (no BEGIN PRIVATE KEY header)\n`);
98
+ continue;
99
+ }
100
+ return expanded;
101
+ }
102
+ }
103
+ async function pickFromFound(found) {
104
+ const choices = [
105
+ ...found.map((f) => {
106
+ const tag = f.keyId ? `Key ID ${f.keyId}` : 'unknown key id';
107
+ return {
108
+ name: `${tildify(f.path)} (${tag}, ${formatTimeAgo(f.mtime)})`,
109
+ value: f.path,
110
+ };
111
+ }),
112
+ { name: 'Enter a different path…', value: '__manual__' },
113
+ ];
114
+ const choice = await select({
115
+ message: `Found ${found.length} .p8 ${found.length === 1 ? 'file' : 'files'} — pick one:`,
116
+ choices,
117
+ });
118
+ return choice === '__manual__' ? 'manual' : choice;
119
+ }
120
+ async function locateP8() {
121
+ let found = findP8Files();
122
+ if (found.length === 0) {
123
+ console.log(`No .p8 files found in ~/.appstore, ~/Downloads, or ~/Desktop.`);
124
+ const wantsBrowser = await confirm({
125
+ message: 'Open App Store Connect now to create a key?',
126
+ default: true,
127
+ });
128
+ if (wantsBrowser) {
129
+ try {
130
+ await open(ASC_KEYS_URL);
131
+ }
132
+ catch {
133
+ console.log(`Browser open failed — visit this manually: ${ASC_KEYS_URL}\n`);
134
+ }
135
+ console.log(`Create a key with role 'Admin' (pricing writes) or 'App Manager' (read-only).`);
136
+ console.log(`You can only download the .p8 once — save it somewhere safe.\n`);
137
+ await confirm({
138
+ message: 'Press Enter when you have downloaded the .p8 file.',
139
+ default: true,
140
+ });
141
+ found = findP8Files();
142
+ }
143
+ }
144
+ while (true) {
145
+ if (found.length > 0) {
146
+ const picked = await pickFromFound(found);
147
+ if (picked !== 'manual') {
148
+ if (looksLikePKCS8(readFileSync(picked, 'utf-8')))
149
+ return picked;
150
+ console.log(` ✗ ${picked} doesn't look like a PKCS8 .p8 — try another.\n`);
151
+ found = found.filter((f) => f.path !== picked);
152
+ continue;
153
+ }
154
+ }
155
+ return await promptManualPath();
156
+ }
157
+ }
158
+ async function ensureP8() {
159
+ let p8Path = await locateP8();
160
+ // Copy into ~/.appstore/ unless it's already there.
161
+ if (!p8Path.startsWith(KEY_DIR)) {
162
+ mkdirSync(KEY_DIR, { recursive: true, mode: 0o700 });
163
+ chmodSync(KEY_DIR, 0o700);
164
+ const dest = join(KEY_DIR, basename(p8Path));
165
+ if (existsSync(dest)) {
166
+ const overwrite = await confirm({
167
+ message: `${dest} already exists. Overwrite?`,
168
+ default: false,
169
+ });
170
+ if (!overwrite) {
171
+ console.log(` → Keeping existing ${dest}, ignoring source ${p8Path}.`);
172
+ }
173
+ else {
174
+ copyFileSync(p8Path, dest);
175
+ chmodSync(dest, 0o600);
176
+ console.log(` ✓ Copied to ${dest} (chmod 600)`);
177
+ }
178
+ }
179
+ else {
180
+ copyFileSync(p8Path, dest);
181
+ chmodSync(dest, 0o600);
182
+ console.log(` ✓ Copied to ${dest} (chmod 600)`);
183
+ }
184
+ p8Path = dest;
185
+ }
186
+ else {
187
+ try {
188
+ chmodSync(p8Path, 0o600);
189
+ }
190
+ catch {
191
+ // Best-effort.
192
+ }
193
+ }
194
+ const detectedKeyId = maybeAutoDetectKeyId(p8Path);
195
+ const keyId = await input({
196
+ message: 'Key ID (10 chars, A-Z 0-9):',
197
+ ...(detectedKeyId ? { default: detectedKeyId } : {}),
198
+ validate: (v) => /^[A-Z0-9]{10}$/i.test(v.trim()) || 'Must be 10 alphanumeric characters',
199
+ });
200
+ return { path: p8Path, keyId: keyId.trim().toUpperCase() };
201
+ }
202
+ async function verifyAuth(args) {
203
+ const tokens = new TokenProvider({
204
+ issuerId: args.issuerId,
205
+ keyId: args.keyId,
206
+ privateKey: args.privateKey,
207
+ });
208
+ let token;
209
+ try {
210
+ token = await tokens.getToken();
211
+ }
212
+ catch (err) {
213
+ return { ok: false, error: `JWT signing failed: ${err.message}` };
214
+ }
215
+ const res = await fetch('https://api.appstoreconnect.apple.com/v1/apps?limit=200', {
216
+ headers: { authorization: `Bearer ${token}`, accept: 'application/json' },
217
+ });
218
+ if (!res.ok) {
219
+ let detail = '';
220
+ try {
221
+ const body = (await res.json());
222
+ detail = body.errors?.[0]?.detail ?? '';
223
+ }
224
+ catch {
225
+ // ignore
226
+ }
227
+ return {
228
+ ok: false,
229
+ error: `App Store Connect returned ${res.status}${detail ? `: ${detail}` : ''}`,
230
+ };
231
+ }
232
+ const json = (await res.json());
233
+ return { ok: true, appCount: json.data?.length ?? 0 };
234
+ }
235
+ async function runInit(deps) {
236
+ console.log('\nappstoreconnect-mcp — setup wizard\n');
237
+ const { path: p8Path, keyId } = await ensureP8();
238
+ const issuerId = await input({
239
+ message: 'Issuer ID (UUID at the top of the Keys page):',
240
+ validate: (v) => /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(v.trim()) ||
241
+ 'Must be a UUID',
242
+ });
243
+ console.log('\nVerifying credentials against App Store Connect...');
244
+ const privateKey = readFileSync(p8Path, 'utf-8');
245
+ const verify = await verifyAuth({ issuerId: issuerId.trim(), keyId, privateKey });
246
+ if (!verify.ok) {
247
+ console.error(` ✗ ${verify.error}`);
248
+ console.error(`\nFix the credentials and try again — nothing was written.`);
249
+ process.exit(1);
250
+ }
251
+ console.log(` ✓ ok (${verify.appCount} ${verify.appCount === 1 ? 'app' : 'apps'} visible)\n`);
252
+ const detected = detectClients();
253
+ const allClients = listClients();
254
+ if (detected.length === 0) {
255
+ console.log('No MCP clients detected (Claude Code, Claude Desktop, Cursor, Windsurf).');
256
+ console.log('You can still add this MCP manually using the snippet in the README.\n');
257
+ }
258
+ const choices = allClients.map((c) => ({
259
+ name: `${c.label} (${c.configPath})${detected.includes(c) ? '' : ' — not detected'}`,
260
+ value: c.id,
261
+ checked: detected.includes(c),
262
+ disabled: !detected.includes(c) && 'config not found — install the client first',
263
+ }));
264
+ const selected = (await checkbox({
265
+ message: 'Register the MCP in:',
266
+ choices,
267
+ required: true,
268
+ }));
269
+ const invocation = resolveServerInvocation({
270
+ execScriptPath: deps.execScriptPath,
271
+ pkgName: deps.pkgName,
272
+ });
273
+ const env = {
274
+ ASC_ISSUER_ID: issuerId.trim(),
275
+ ASC_KEY_ID: keyId,
276
+ ASC_PRIVATE_KEY_PATH: p8Path,
277
+ };
278
+ for (const id of selected) {
279
+ const client = allClients.find((c) => c.id === id);
280
+ const existing = readServer(client, SERVER_NAME);
281
+ if (existing) {
282
+ const overwrite = await confirm({
283
+ message: `${client.label} already has a "${SERVER_NAME}" server. Overwrite?`,
284
+ default: true,
285
+ });
286
+ if (!overwrite) {
287
+ console.log(` → Skipped ${client.label}.`);
288
+ continue;
289
+ }
290
+ }
291
+ upsertServer(client, SERVER_NAME, { ...invocation, env });
292
+ console.log(` ✓ Registered "${SERVER_NAME}" in ${client.label} (${client.configPath})`);
293
+ }
294
+ console.log('\nDone.');
295
+ console.log('Restart your MCP client(s) to pick up the new server:');
296
+ for (const id of selected) {
297
+ const client = allClients.find((c) => c.id === id);
298
+ if (client)
299
+ console.log(` - ${client.label}`);
300
+ }
301
+ console.log('\nIn your client, ask: "use appstoreconnect to list my apps".');
302
+ }
303
+ export async function main(deps) {
304
+ try {
305
+ await runInit(deps);
306
+ }
307
+ catch (err) {
308
+ if (err?.name === 'ExitPromptError') {
309
+ console.log('\nCancelled.');
310
+ process.exit(130);
311
+ }
312
+ console.error(`\n[init] error: ${err.message ?? err}`);
313
+ process.exit(1);
314
+ }
315
+ }
316
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}