@yoonion/mimi-seed-mcp 0.17.0 → 0.17.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.
- package/dist/appstore/sales.d.ts +13 -0
- package/dist/appstore/sales.js +65 -0
- package/dist/registers/appstore.js +14 -1
- package/package.json +1 -1
package/dist/appstore/sales.d.ts
CHANGED
|
@@ -40,6 +40,19 @@ export declare function getSalesReport(options: {
|
|
|
40
40
|
reportSubType?: string;
|
|
41
41
|
version?: string;
|
|
42
42
|
}): Promise<SalesSummary>;
|
|
43
|
+
/**
|
|
44
|
+
* 리포트 접근 가능 여부만 싸게 확인한다 (appstore_verify_credentials 용).
|
|
45
|
+
*
|
|
46
|
+
* 왜 별도 프로브가 필요한가: 리포트 엔드포인트는 **다른 ASC API 와 요구 롤이 다르다.**
|
|
47
|
+
* App Manager 키는 GET /apps 가 멀쩡히 되므로 기존 검증은 전부 통과하는데, 매출 도구만
|
|
48
|
+
* 403 으로 죽는다. 그 사실이 첫 매출 조회 때까지 드러나지 않으면 "도구가 고장났다" 로
|
|
49
|
+
* 오진하게 된다 — Play 쪽 playstore_verify_service_account 가 'View financial data' 를
|
|
50
|
+
* 함께 확인하는 것과 같은 이유다.
|
|
51
|
+
*/
|
|
52
|
+
export declare function probeReportsAccess(): Promise<{
|
|
53
|
+
status: 'ok' | 'no_vendor_number' | 'forbidden' | 'error';
|
|
54
|
+
detail: string;
|
|
55
|
+
}>;
|
|
43
56
|
export declare function getFinanceReport(options: {
|
|
44
57
|
vendorNumber?: string;
|
|
45
58
|
/** YYYY-MM. **Apple 회계월**이라 달력월과 어긋날 수 있다 — 도구 설명 참고. */
|
package/dist/appstore/sales.js
CHANGED
|
@@ -48,6 +48,26 @@ async function fetchReport(resourcePath, params) {
|
|
|
48
48
|
});
|
|
49
49
|
if (response.status === 404)
|
|
50
50
|
return { notFound: true, rows: [], raw: '' };
|
|
51
|
+
if (response.status === 403) {
|
|
52
|
+
// 일반 403 안내("키 role 확인")로는 못 고친다 — 리포트 엔드포인트만 요구 롤이 다르다.
|
|
53
|
+
// 앱 메타데이터가 멀쩡히 조회되는 키에서도 여기서만 막히는 게 정상 동작이라,
|
|
54
|
+
// "키가 깨졌나" 로 헤매기 쉽다.
|
|
55
|
+
throw new Error([
|
|
56
|
+
'❌ 매출 리포트 접근 거부 (403) — 키는 정상인데 **롤이 부족**하다.',
|
|
57
|
+
'',
|
|
58
|
+
'리포트 엔드포인트는 다른 App Store Connect API 와 요구 롤이 다르다:',
|
|
59
|
+
' 필요: **Admin / Finance / Sales and Reports(ACCESS_TO_REPORTS)** 중 하나',
|
|
60
|
+
'App Manager·Developer 키는 앱 메타데이터는 다 되는데 여기서만 막힌다 —',
|
|
61
|
+
'다른 도구가 잘 도는 것은 이 403 과 아무 관계가 없다.',
|
|
62
|
+
'',
|
|
63
|
+
'App Store Connect > 사용자 및 액세스 > 통합 > App Store Connect API 에서',
|
|
64
|
+
'해당 키의 액세스 권한을 확인할 것. 키의 롤은 나중에 못 바꾸는 경우가 있으니,',
|
|
65
|
+
'그때는 위 롤로 **새 키를 발급**하고 다시 등록한다:',
|
|
66
|
+
' npx -p @yoonion/mimi-seed-mcp mimi-seed-appstore-auth',
|
|
67
|
+
'',
|
|
68
|
+
'⚠️ 이 키를 바꾸면 배포 파이프라인이 같은 키를 쓰는지도 함께 확인할 것.',
|
|
69
|
+
].join('\n'));
|
|
70
|
+
}
|
|
51
71
|
if (!response.ok) {
|
|
52
72
|
throw friendlyAppStoreError(response.status, await response.text());
|
|
53
73
|
}
|
|
@@ -165,6 +185,51 @@ export async function getSalesReport(options) {
|
|
|
165
185
|
}
|
|
166
186
|
return { datesWithData, datesWithoutData, lines, proceedsByCurrency, paidUnits, freeUnits };
|
|
167
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* 리포트 접근 가능 여부만 싸게 확인한다 (appstore_verify_credentials 용).
|
|
190
|
+
*
|
|
191
|
+
* 왜 별도 프로브가 필요한가: 리포트 엔드포인트는 **다른 ASC API 와 요구 롤이 다르다.**
|
|
192
|
+
* App Manager 키는 GET /apps 가 멀쩡히 되므로 기존 검증은 전부 통과하는데, 매출 도구만
|
|
193
|
+
* 403 으로 죽는다. 그 사실이 첫 매출 조회 때까지 드러나지 않으면 "도구가 고장났다" 로
|
|
194
|
+
* 오진하게 된다 — Play 쪽 playstore_verify_service_account 가 'View financial data' 를
|
|
195
|
+
* 함께 확인하는 것과 같은 이유다.
|
|
196
|
+
*/
|
|
197
|
+
export async function probeReportsAccess() {
|
|
198
|
+
let vendorNumber;
|
|
199
|
+
try {
|
|
200
|
+
vendorNumber = resolveVendorNumber();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return {
|
|
204
|
+
status: 'no_vendor_number',
|
|
205
|
+
detail: 'vendorNumber 미설정 — ~/.mimi-seed/appstore.json 에 추가하면 매출 리포트를 쓸 수 있다.',
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
// 어제 날짜 하루치. 데이터가 없어 404 여도 **권한 확인 목적은 달성**된다 —
|
|
209
|
+
// 403 이 아니라는 것 자체가 롤이 충분하다는 뜻이다.
|
|
210
|
+
const probeDate = new Date(Date.now() - 86_400_000).toISOString().slice(0, 10);
|
|
211
|
+
try {
|
|
212
|
+
await fetchReport('/salesReports', {
|
|
213
|
+
'filter[frequency]': 'DAILY',
|
|
214
|
+
'filter[reportType]': 'SALES',
|
|
215
|
+
'filter[reportSubType]': 'SUMMARY',
|
|
216
|
+
'filter[vendorNumber]': vendorNumber,
|
|
217
|
+
'filter[reportDate]': probeDate,
|
|
218
|
+
'filter[version]': '1_0',
|
|
219
|
+
});
|
|
220
|
+
return { status: 'ok', detail: `매출 리포트 접근 가능 (vendorNumber ${vendorNumber})` };
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const message = err?.message ?? '';
|
|
224
|
+
if (message.includes('403')) {
|
|
225
|
+
return {
|
|
226
|
+
status: 'forbidden',
|
|
227
|
+
detail: '매출 리포트 403 — 키 롤 부족 (Admin / Finance / Sales and Reports 필요)',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return { status: 'error', detail: message.split('\n')[0] };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
168
233
|
export async function getFinanceReport(options) {
|
|
169
234
|
return fetchReport('/financeReports', {
|
|
170
235
|
'filter[vendorNumber]': resolveVendorNumber(options.vendorNumber),
|
|
@@ -24,9 +24,18 @@ export function registerAppstoreTools(server) {
|
|
|
24
24
|
const apps = await appstore.listApps();
|
|
25
25
|
return jsonResult(apps);
|
|
26
26
|
});
|
|
27
|
-
server.tool('appstore_verify_credentials',
|
|
27
|
+
server.tool('appstore_verify_credentials', [
|
|
28
|
+
'App Store Connect API 키(appstore.json) 유효성 검증 — JWT 서명 + GET /apps 호출로',
|
|
29
|
+
'creds/sign/auth/api 단계별 진단. 첫 도구 호출에서 401로 늦게 터지기 전에 setup 직후 확인용.',
|
|
30
|
+
'매출 리포트 접근 가능 여부도 함께 확인한다 — 그쪽만 요구 롤이 달라서',
|
|
31
|
+
'(Admin/Finance/Sales and Reports) 앱 메타데이터는 다 되는데 매출만 403 인 키가 흔하다.',
|
|
32
|
+
'인자 없음.',
|
|
33
|
+
].join(' '), {}, async () => {
|
|
28
34
|
const r = await appstore.verifyAppStoreCredentials();
|
|
29
35
|
if (r.ok) {
|
|
36
|
+
// 키가 유효할 때만 물어본다 — 인증 자체가 깨졌으면 403/401 구분이 무의미하다.
|
|
37
|
+
const reports = await appstoreSales.probeReportsAccess();
|
|
38
|
+
const reportsIcon = reports.status === 'ok' ? '✓' : reports.status === 'forbidden' ? '✗' : '·';
|
|
30
39
|
return {
|
|
31
40
|
content: [{
|
|
32
41
|
type: 'text',
|
|
@@ -34,6 +43,10 @@ export function registerAppstoreTools(server) {
|
|
|
34
43
|
'✓ App Store Connect 인증 유효',
|
|
35
44
|
r.appCount != null ? ` 접근 가능 앱: ${r.appCount}개` : '',
|
|
36
45
|
r.firstApp ? ` 예: ${r.firstApp.name ?? r.firstApp.id}` : '',
|
|
46
|
+
`${reportsIcon} 매출 리포트: ${reports.detail}`,
|
|
47
|
+
reports.status === 'forbidden'
|
|
48
|
+
? ' → 키 롤은 나중에 못 바꾸는 경우가 있다. 그때는 위 롤로 새 키를 발급해 다시 등록할 것.'
|
|
49
|
+
: '',
|
|
37
50
|
].filter(Boolean).join('\n'),
|
|
38
51
|
}],
|
|
39
52
|
};
|
package/package.json
CHANGED