@pero-mcp/appstore 0.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/LICENSE +21 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +151 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +293 -0
- package/dist/server.js.map +1 -0
- package/package.json +36 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pero Games
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { AppStoreMCPServer } from './server.js';
|
|
3
|
+
/**
|
|
4
|
+
* CLI 入口
|
|
5
|
+
* 用法: npx @pero-mcp/appstore
|
|
6
|
+
* 环境变量:
|
|
7
|
+
* - APPSTORE_ISSUER_ID: App Store Connect Issuer ID
|
|
8
|
+
* - APPSTORE_KEY_ID: P8 Key ID
|
|
9
|
+
* - APPSTORE_P8_KEY_PATH: P8 私钥文件路径
|
|
10
|
+
*/
|
|
11
|
+
async function main() {
|
|
12
|
+
const server = new AppStoreMCPServer();
|
|
13
|
+
await server.runStdio();
|
|
14
|
+
}
|
|
15
|
+
main().catch((error) => {
|
|
16
|
+
console.error('Failed to start AppStore MCP server:', error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;GAOG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Store Connect API 客户端
|
|
3
|
+
*/
|
|
4
|
+
export declare class AppStoreConnectClient {
|
|
5
|
+
private baseUrl;
|
|
6
|
+
private auth;
|
|
7
|
+
constructor(issuerId: string, keyId: string, privateKey: string);
|
|
8
|
+
/**
|
|
9
|
+
* 通用 GET 请求
|
|
10
|
+
*/
|
|
11
|
+
private get;
|
|
12
|
+
/**
|
|
13
|
+
* 通用 POST 请求
|
|
14
|
+
*/
|
|
15
|
+
private post;
|
|
16
|
+
/**
|
|
17
|
+
* 获取应用列表
|
|
18
|
+
*/
|
|
19
|
+
listApps(limit?: number): Promise<unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* 获取 Beta 组列表
|
|
22
|
+
*/
|
|
23
|
+
listBetaGroups(appId?: string, limit?: number): Promise<unknown>;
|
|
24
|
+
/**
|
|
25
|
+
* 获取 Beta 测试员列表
|
|
26
|
+
*/
|
|
27
|
+
listBetaTesters(betaGroupId?: string, limit?: number): Promise<unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* 创建 Beta 测试员
|
|
30
|
+
*/
|
|
31
|
+
createBetaTester(email: string, firstName: string, lastName: string): Promise<unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* 获取构建列表
|
|
34
|
+
*/
|
|
35
|
+
listBuilds(appId: string, limit?: number): Promise<unknown>;
|
|
36
|
+
/**
|
|
37
|
+
* 获取财务报告
|
|
38
|
+
*/
|
|
39
|
+
downloadSalesReport(vendorNumber: string, reportDate: string, frequency?: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY', reportType?: string, reportSubType?: string): Promise<ArrayBuffer>;
|
|
40
|
+
/**
|
|
41
|
+
* 获取用户列表(团队成员)
|
|
42
|
+
*/
|
|
43
|
+
listUsers(limit?: number): Promise<unknown>;
|
|
44
|
+
/**
|
|
45
|
+
* 邀请用户
|
|
46
|
+
*/
|
|
47
|
+
inviteUser(email: string, roles: string[], firstName?: string, lastName?: string): Promise<unknown>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,IAAI,CAAe;gBAEf,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAI/D;;OAEG;YACW,GAAG;IAwBjB;;OAEG;YACW,IAAI;IAkBlB;;OAEG;IACG,QAAQ,CAAC,KAAK,GAAE,MAAW;IAIjC;;OAEG;IACG,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IAQvD;;OAEG;IACG,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IAQ9D;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAazE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IAOlD;;OAEG;IACG,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAkB,EAC9D,UAAU,GAAE,MAAgB,EAC5B,aAAa,GAAE,MAAkB;IA6BnC;;OAEG;IACG,SAAS,CAAC,KAAK,GAAE,MAAW;IAIlC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;CAavF"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { AppStoreAuth, fetchWithRetry, APIError } from '@pero-mcp/shared';
|
|
2
|
+
/**
|
|
3
|
+
* App Store Connect API 客户端
|
|
4
|
+
*/
|
|
5
|
+
export class AppStoreConnectClient {
|
|
6
|
+
baseUrl = 'https://api.appstoreconnect.apple.com/v1';
|
|
7
|
+
auth;
|
|
8
|
+
constructor(issuerId, keyId, privateKey) {
|
|
9
|
+
this.auth = new AppStoreAuth(issuerId, keyId, privateKey);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 通用 GET 请求
|
|
13
|
+
*/
|
|
14
|
+
async get(endpoint, params) {
|
|
15
|
+
const url = new URL(`${this.baseUrl}${endpoint}`);
|
|
16
|
+
if (params) {
|
|
17
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
18
|
+
url.searchParams.append(key, value);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const response = await fetchWithRetry(url.toString(), {
|
|
22
|
+
method: 'GET',
|
|
23
|
+
headers: {
|
|
24
|
+
...this.auth.getAuthHeader(),
|
|
25
|
+
'Content-Type': 'application/json',
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
const error = await response.text();
|
|
30
|
+
throw new APIError(`AppStore API error: ${error}`, response.status);
|
|
31
|
+
}
|
|
32
|
+
return response.json();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 通用 POST 请求
|
|
36
|
+
*/
|
|
37
|
+
async post(endpoint, body) {
|
|
38
|
+
const response = await fetchWithRetry(`${this.baseUrl}${endpoint}`, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
...this.auth.getAuthHeader(),
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify(body),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const error = await response.text();
|
|
48
|
+
throw new APIError(`AppStore API error: ${error}`, response.status);
|
|
49
|
+
}
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取应用列表
|
|
54
|
+
*/
|
|
55
|
+
async listApps(limit = 50) {
|
|
56
|
+
return this.get('/apps', { limit: limit.toString() });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 获取 Beta 组列表
|
|
60
|
+
*/
|
|
61
|
+
async listBetaGroups(appId, limit = 50) {
|
|
62
|
+
const params = { limit: limit.toString() };
|
|
63
|
+
if (appId) {
|
|
64
|
+
params['filter[app]'] = appId;
|
|
65
|
+
}
|
|
66
|
+
return this.get('/betaGroups', params);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 获取 Beta 测试员列表
|
|
70
|
+
*/
|
|
71
|
+
async listBetaTesters(betaGroupId, limit = 50) {
|
|
72
|
+
const params = { limit: limit.toString() };
|
|
73
|
+
if (betaGroupId) {
|
|
74
|
+
params['filter[betaGroups]'] = betaGroupId;
|
|
75
|
+
}
|
|
76
|
+
return this.get('/betaTesters', params);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 创建 Beta 测试员
|
|
80
|
+
*/
|
|
81
|
+
async createBetaTester(email, firstName, lastName) {
|
|
82
|
+
return this.post('/betaTesters', {
|
|
83
|
+
data: {
|
|
84
|
+
type: 'betaTesters',
|
|
85
|
+
attributes: {
|
|
86
|
+
email,
|
|
87
|
+
firstName,
|
|
88
|
+
lastName,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 获取构建列表
|
|
95
|
+
*/
|
|
96
|
+
async listBuilds(appId, limit = 50) {
|
|
97
|
+
return this.get('/builds', {
|
|
98
|
+
'filter[app]': appId,
|
|
99
|
+
limit: limit.toString(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取财务报告
|
|
104
|
+
*/
|
|
105
|
+
async downloadSalesReport(vendorNumber, reportDate, frequency = 'DAILY', reportType = 'SALES', reportSubType = 'SUMMARY') {
|
|
106
|
+
// Sales and Trends API 使用不同的基础 URL
|
|
107
|
+
const salesBaseUrl = 'https://api.appstoreconnect.apple.com/v1/salesReports';
|
|
108
|
+
const params = new URLSearchParams({
|
|
109
|
+
'filter[frequency]': frequency,
|
|
110
|
+
'filter[reportDate]': reportDate,
|
|
111
|
+
'filter[reportSubType]': reportSubType,
|
|
112
|
+
'filter[reportType]': reportType,
|
|
113
|
+
'filter[vendorNumber]': vendorNumber,
|
|
114
|
+
});
|
|
115
|
+
const response = await fetchWithRetry(`${salesBaseUrl}?${params}`, {
|
|
116
|
+
method: 'GET',
|
|
117
|
+
headers: {
|
|
118
|
+
...this.auth.getAuthHeader(),
|
|
119
|
+
'Accept': 'application/a-gzip',
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
const error = await response.text();
|
|
124
|
+
throw new APIError(`Sales report error: ${error}`, response.status);
|
|
125
|
+
}
|
|
126
|
+
return response.arrayBuffer();
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 获取用户列表(团队成员)
|
|
130
|
+
*/
|
|
131
|
+
async listUsers(limit = 50) {
|
|
132
|
+
return this.get('/users', { limit: limit.toString() });
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 邀请用户
|
|
136
|
+
*/
|
|
137
|
+
async inviteUser(email, roles, firstName, lastName) {
|
|
138
|
+
return this.post('/userInvitations', {
|
|
139
|
+
data: {
|
|
140
|
+
type: 'userInvitations',
|
|
141
|
+
attributes: {
|
|
142
|
+
email,
|
|
143
|
+
firstName,
|
|
144
|
+
lastName,
|
|
145
|
+
roles,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { BaseMCPServer } from '@pero-mcp/core';
|
|
2
|
+
/**
|
|
3
|
+
* App Store Connect MCP Server
|
|
4
|
+
* 提供 TestFlight、财务报告、团队管理等功能
|
|
5
|
+
*/
|
|
6
|
+
export declare class AppStoreMCPServer extends BaseMCPServer {
|
|
7
|
+
private client?;
|
|
8
|
+
private vendorNumber?;
|
|
9
|
+
constructor();
|
|
10
|
+
protected initialize(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* 列出应用
|
|
13
|
+
*/
|
|
14
|
+
private registerListApps;
|
|
15
|
+
/**
|
|
16
|
+
* 列出 Beta 组
|
|
17
|
+
*/
|
|
18
|
+
private registerListBetaGroups;
|
|
19
|
+
/**
|
|
20
|
+
* 列出 Beta 测试员
|
|
21
|
+
*/
|
|
22
|
+
private registerListBetaTesters;
|
|
23
|
+
/**
|
|
24
|
+
* 创建 Beta 测试员
|
|
25
|
+
*/
|
|
26
|
+
private registerCreateBetaTester;
|
|
27
|
+
/**
|
|
28
|
+
* 列出构建
|
|
29
|
+
*/
|
|
30
|
+
private registerListBuilds;
|
|
31
|
+
/**
|
|
32
|
+
* 下载销售报告
|
|
33
|
+
*/
|
|
34
|
+
private registerDownloadSalesReport;
|
|
35
|
+
/**
|
|
36
|
+
* 列出用户
|
|
37
|
+
*/
|
|
38
|
+
private registerListUsers;
|
|
39
|
+
/**
|
|
40
|
+
* 邀请用户
|
|
41
|
+
*/
|
|
42
|
+
private registerInviteUser;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAO,CAAC,MAAM,CAAC,CAAwB;IACvC,OAAO,CAAC,YAAY,CAAC,CAAS;;cAMd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsBxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAsEnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CA2C3B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { BaseMCPServer } from '@pero-mcp/core';
|
|
2
|
+
import { requireEnv, ValidationError } from '@pero-mcp/shared';
|
|
3
|
+
import { AppStoreConnectClient } from './client.js';
|
|
4
|
+
import { writeFileSync } from 'fs';
|
|
5
|
+
import { gunzipSync } from 'zlib';
|
|
6
|
+
/**
|
|
7
|
+
* App Store Connect MCP Server
|
|
8
|
+
* 提供 TestFlight、财务报告、团队管理等功能
|
|
9
|
+
*/
|
|
10
|
+
export class AppStoreMCPServer extends BaseMCPServer {
|
|
11
|
+
client;
|
|
12
|
+
vendorNumber;
|
|
13
|
+
constructor() {
|
|
14
|
+
super('appstore-mcp', '0.1.0');
|
|
15
|
+
}
|
|
16
|
+
async initialize() {
|
|
17
|
+
// 从环境变量获取认证信息
|
|
18
|
+
const issuerId = requireEnv('APP_STORE_CONNECT_ISSUER_ID');
|
|
19
|
+
const keyId = requireEnv('APP_STORE_CONNECT_KEY_ID');
|
|
20
|
+
const privateKey = requireEnv('APP_STORE_CONNECT_P8_KEY');
|
|
21
|
+
const vendorNumber = requireEnv('APP_STORE_CONNECT_VENDOR_NUMBER');
|
|
22
|
+
this.client = new AppStoreConnectClient(issuerId, keyId, privateKey);
|
|
23
|
+
this.vendorNumber = vendorNumber;
|
|
24
|
+
// 注册工具
|
|
25
|
+
this.registerListApps();
|
|
26
|
+
this.registerListBetaGroups();
|
|
27
|
+
this.registerListBetaTesters();
|
|
28
|
+
this.registerCreateBetaTester();
|
|
29
|
+
this.registerListBuilds();
|
|
30
|
+
this.registerDownloadSalesReport();
|
|
31
|
+
this.registerListUsers();
|
|
32
|
+
this.registerInviteUser();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 列出应用
|
|
36
|
+
*/
|
|
37
|
+
registerListApps() {
|
|
38
|
+
this.registerTool({
|
|
39
|
+
name: 'list_apps',
|
|
40
|
+
description: 'List all apps in App Store Connect',
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {
|
|
44
|
+
limit: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
description: 'Maximum number of apps to return (default: 50)',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
}, async (args) => {
|
|
51
|
+
const limit = args.limit || 50;
|
|
52
|
+
return this.client.listApps(limit);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 列出 Beta 组
|
|
57
|
+
*/
|
|
58
|
+
registerListBetaGroups() {
|
|
59
|
+
this.registerTool({
|
|
60
|
+
name: 'list_beta_groups',
|
|
61
|
+
description: 'List TestFlight beta groups',
|
|
62
|
+
inputSchema: {
|
|
63
|
+
type: 'object',
|
|
64
|
+
properties: {
|
|
65
|
+
app_id: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'Filter by app ID (optional)',
|
|
68
|
+
},
|
|
69
|
+
limit: {
|
|
70
|
+
type: 'number',
|
|
71
|
+
description: 'Maximum number of groups to return (default: 50)',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
}, async (args) => {
|
|
76
|
+
const appId = args.app_id;
|
|
77
|
+
const limit = args.limit || 50;
|
|
78
|
+
return this.client.listBetaGroups(appId, limit);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 列出 Beta 测试员
|
|
83
|
+
*/
|
|
84
|
+
registerListBetaTesters() {
|
|
85
|
+
this.registerTool({
|
|
86
|
+
name: 'list_beta_testers',
|
|
87
|
+
description: 'List TestFlight beta testers',
|
|
88
|
+
inputSchema: {
|
|
89
|
+
type: 'object',
|
|
90
|
+
properties: {
|
|
91
|
+
beta_group_id: {
|
|
92
|
+
type: 'string',
|
|
93
|
+
description: 'Filter by beta group ID (optional)',
|
|
94
|
+
},
|
|
95
|
+
limit: {
|
|
96
|
+
type: 'number',
|
|
97
|
+
description: 'Maximum number of testers to return (default: 50)',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
}, async (args) => {
|
|
102
|
+
const betaGroupId = args.beta_group_id;
|
|
103
|
+
const limit = args.limit || 50;
|
|
104
|
+
return this.client.listBetaTesters(betaGroupId, limit);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 创建 Beta 测试员
|
|
109
|
+
*/
|
|
110
|
+
registerCreateBetaTester() {
|
|
111
|
+
this.registerTool({
|
|
112
|
+
name: 'create_beta_tester',
|
|
113
|
+
description: 'Create a new TestFlight beta tester',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
type: 'object',
|
|
116
|
+
properties: {
|
|
117
|
+
email: {
|
|
118
|
+
type: 'string',
|
|
119
|
+
description: 'Tester email address',
|
|
120
|
+
},
|
|
121
|
+
first_name: {
|
|
122
|
+
type: 'string',
|
|
123
|
+
description: 'Tester first name',
|
|
124
|
+
},
|
|
125
|
+
last_name: {
|
|
126
|
+
type: 'string',
|
|
127
|
+
description: 'Tester last name',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
required: ['email', 'first_name', 'last_name'],
|
|
131
|
+
},
|
|
132
|
+
}, async (args) => {
|
|
133
|
+
const email = args.email;
|
|
134
|
+
const firstName = args.first_name;
|
|
135
|
+
const lastName = args.last_name;
|
|
136
|
+
if (!email || !firstName || !lastName) {
|
|
137
|
+
throw new ValidationError('email, first_name, and last_name are required');
|
|
138
|
+
}
|
|
139
|
+
return this.client.createBetaTester(email, firstName, lastName);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 列出构建
|
|
144
|
+
*/
|
|
145
|
+
registerListBuilds() {
|
|
146
|
+
this.registerTool({
|
|
147
|
+
name: 'list_builds',
|
|
148
|
+
description: 'List builds for an app',
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: 'object',
|
|
151
|
+
properties: {
|
|
152
|
+
app_id: {
|
|
153
|
+
type: 'string',
|
|
154
|
+
description: 'App ID',
|
|
155
|
+
},
|
|
156
|
+
limit: {
|
|
157
|
+
type: 'number',
|
|
158
|
+
description: 'Maximum number of builds to return (default: 50)',
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
required: ['app_id'],
|
|
162
|
+
},
|
|
163
|
+
}, async (args) => {
|
|
164
|
+
const appId = args.app_id;
|
|
165
|
+
const limit = args.limit || 50;
|
|
166
|
+
if (!appId) {
|
|
167
|
+
throw new ValidationError('app_id is required');
|
|
168
|
+
}
|
|
169
|
+
return this.client.listBuilds(appId, limit);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 下载销售报告
|
|
174
|
+
*/
|
|
175
|
+
registerDownloadSalesReport() {
|
|
176
|
+
this.registerTool({
|
|
177
|
+
name: 'download_sales_report',
|
|
178
|
+
description: 'Download App Store sales and trends report. The gzipped report will be automatically decompressed and saved as CSV/TSV. Vendor number is loaded from environment variable.',
|
|
179
|
+
inputSchema: {
|
|
180
|
+
type: 'object',
|
|
181
|
+
properties: {
|
|
182
|
+
frequency: {
|
|
183
|
+
type: 'string',
|
|
184
|
+
description: 'Report frequency. Allowed values depend on report_type (see combinations below).',
|
|
185
|
+
enum: ['DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY'],
|
|
186
|
+
},
|
|
187
|
+
report_date: {
|
|
188
|
+
type: 'string',
|
|
189
|
+
description: 'Report date. Format MUST match frequency: DAILY=YYYY-MM-DD (e.g., 2024-01-15), WEEKLY=YYYY-MM-DD (Sunday date), MONTHLY=YYYY-MM (e.g., 2024-01), YEARLY=YYYY (e.g., 2024). Note: DAILY reports do NOT require a date parameter.',
|
|
190
|
+
},
|
|
191
|
+
report_type: {
|
|
192
|
+
type: 'string',
|
|
193
|
+
description: 'Type of report to download. Common values: SALES (sales/revenue data), SUBSCRIPTION (subscription events), SUBSCRIBER (subscriber details), INSTALLS (install data), PRE_ORDER, NEWSSTAND, SUBSCRIPTION_EVENT, SUBSCRIPTION_OFFER_CODE_REDEMPTION, FIRST_ANNUAL, WIN_BACK_ELIGIBILITY. Default: SALES',
|
|
194
|
+
enum: ['SALES', 'PRE_ORDER', 'NEWSSTAND', 'SUBSCRIPTION', 'SUBSCRIPTION_EVENT', 'SUBSCRIBER', 'SUBSCRIPTION_OFFER_CODE_REDEMPTION', 'INSTALLS', 'FIRST_ANNUAL', 'WIN_BACK_ELIGIBILITY'],
|
|
195
|
+
default: 'SALES',
|
|
196
|
+
},
|
|
197
|
+
report_sub_type: {
|
|
198
|
+
type: 'string',
|
|
199
|
+
description: 'Report detail level. SUMMARY (aggregated), DETAILED (transaction-level), SUMMARY_INSTALL_TYPE, SUMMARY_TERRITORY, SUMMARY_CHANNEL. Allowed values depend on report_type. Default: SUMMARY',
|
|
200
|
+
enum: ['SUMMARY', 'SUMMARY_INSTALL_TYPE', 'SUMMARY_TERRITORY', 'SUMMARY_CHANNEL'],
|
|
201
|
+
default: 'SUMMARY',
|
|
202
|
+
},
|
|
203
|
+
output_path: {
|
|
204
|
+
type: 'string',
|
|
205
|
+
description: 'Full file path to save the decompressed report (e.g., /opt/test/sales_2024-01.csv). Will be saved as TSV (tab-separated) format.',
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
required: ['frequency', 'report_date', 'output_path'],
|
|
209
|
+
},
|
|
210
|
+
}, async (args) => {
|
|
211
|
+
const frequency = args.frequency;
|
|
212
|
+
const reportDate = args.report_date;
|
|
213
|
+
const reportType = args.report_type || 'SALES';
|
|
214
|
+
const reportSubType = args.report_sub_type || 'SUMMARY';
|
|
215
|
+
const outputPath = args.output_path;
|
|
216
|
+
if (!frequency || !reportDate || !outputPath) {
|
|
217
|
+
throw new ValidationError('frequency, report_date and output_path are required');
|
|
218
|
+
}
|
|
219
|
+
const data = await this.client.downloadSalesReport(this.vendorNumber, reportDate, frequency, reportType, reportSubType);
|
|
220
|
+
// 解压 gzip 数据
|
|
221
|
+
const decompressed = gunzipSync(Buffer.from(data));
|
|
222
|
+
// 将解压后的数据写入文件
|
|
223
|
+
writeFileSync(outputPath, decompressed);
|
|
224
|
+
// 只返回路径信息,不返回文件内容
|
|
225
|
+
return {
|
|
226
|
+
file_path: outputPath,
|
|
227
|
+
};
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 列出用户
|
|
232
|
+
*/
|
|
233
|
+
registerListUsers() {
|
|
234
|
+
this.registerTool({
|
|
235
|
+
name: 'list_users',
|
|
236
|
+
description: 'List team members in App Store Connect',
|
|
237
|
+
inputSchema: {
|
|
238
|
+
type: 'object',
|
|
239
|
+
properties: {
|
|
240
|
+
limit: {
|
|
241
|
+
type: 'number',
|
|
242
|
+
description: 'Maximum number of users to return (default: 50)',
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
}, async (args) => {
|
|
247
|
+
const limit = args.limit || 50;
|
|
248
|
+
return this.client.listUsers(limit);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 邀请用户
|
|
253
|
+
*/
|
|
254
|
+
registerInviteUser() {
|
|
255
|
+
this.registerTool({
|
|
256
|
+
name: 'invite_user',
|
|
257
|
+
description: 'Invite a new user to App Store Connect',
|
|
258
|
+
inputSchema: {
|
|
259
|
+
type: 'object',
|
|
260
|
+
properties: {
|
|
261
|
+
email: {
|
|
262
|
+
type: 'string',
|
|
263
|
+
description: 'User email address',
|
|
264
|
+
},
|
|
265
|
+
roles: {
|
|
266
|
+
type: 'array',
|
|
267
|
+
items: { type: 'string' },
|
|
268
|
+
description: 'User roles (e.g., ADMIN, DEVELOPER, MARKETING)',
|
|
269
|
+
},
|
|
270
|
+
first_name: {
|
|
271
|
+
type: 'string',
|
|
272
|
+
description: 'User first name (optional)',
|
|
273
|
+
},
|
|
274
|
+
last_name: {
|
|
275
|
+
type: 'string',
|
|
276
|
+
description: 'User last name (optional)',
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
required: ['email', 'roles'],
|
|
280
|
+
},
|
|
281
|
+
}, async (args) => {
|
|
282
|
+
const email = args.email;
|
|
283
|
+
const roles = args.roles;
|
|
284
|
+
const firstName = args.first_name;
|
|
285
|
+
const lastName = args.last_name;
|
|
286
|
+
if (!email || !roles || roles.length === 0) {
|
|
287
|
+
throw new ValidationError('email and roles are required');
|
|
288
|
+
}
|
|
289
|
+
return this.client.inviteUser(email, roles, firstName, lastName);
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pero-mcp/appstore",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for App Store Connect API (TestFlight, Sales, Team Management)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"appstore-mcp": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
19
|
+
"@pero-mcp/core": "0.1.0",
|
|
20
|
+
"@pero-mcp/shared": "0.1.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^22.10.5",
|
|
24
|
+
"typescript": "^5.7.2"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"dev": "tsc --watch",
|
|
32
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
33
|
+
"lint": "tsc --noEmit",
|
|
34
|
+
"start": "node dist/cli.js"
|
|
35
|
+
}
|
|
36
|
+
}
|