@yoonion/mimi-seed-mcp 0.3.28 → 0.3.30
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/auth/google-auth.js
CHANGED
|
@@ -12,6 +12,7 @@ const SCOPES = [
|
|
|
12
12
|
'https://www.googleapis.com/auth/admob.readonly',
|
|
13
13
|
'https://www.googleapis.com/auth/admob.monetization',
|
|
14
14
|
'https://www.googleapis.com/auth/androidpublisher',
|
|
15
|
+
'https://www.googleapis.com/auth/adwords', // Google Ads API (googleads_* tools)
|
|
15
16
|
];
|
|
16
17
|
// Primary config dir. Legacy `~/.preseed` is read as a fallback during the
|
|
17
18
|
// rebrand so existing auth sessions don't force a re-login; new writes go to
|
|
@@ -214,7 +215,7 @@ export function startAuth(clientId, clientSecret, options = {}) {
|
|
|
214
215
|
<html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
|
|
215
216
|
<div style="text-align:center">
|
|
216
217
|
<h1>✅ Mimi Seed 인증 완료!</h1>
|
|
217
|
-
<p>이 창을 닫고 Claude Code 또는 Codex로 돌아가세요.</p>
|
|
218
|
+
<p>이 창을 닫고 Claude Code 또는 Codex로 돌아가세요.</p>
|
|
218
219
|
</div>
|
|
219
220
|
</body></html>
|
|
220
221
|
`);
|
package/dist/googleads/config.js
CHANGED
|
@@ -24,7 +24,16 @@ export function loadConfig() {
|
|
|
24
24
|
if (!fs.existsSync(CONFIG_PATH))
|
|
25
25
|
return null;
|
|
26
26
|
try {
|
|
27
|
-
|
|
27
|
+
const cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
|
|
28
|
+
// 읽기 시점에도 정규화 — 하이픈 포함 값이 손으로 적히거나 구버전이 쓴 경우에도
|
|
29
|
+
// URL/login-customer-id 헤더가 항상 숫자만 포함하도록 보장 (write 경로 의존 제거).
|
|
30
|
+
return {
|
|
31
|
+
...cfg,
|
|
32
|
+
customerId: normalizeCustomerId(cfg.customerId),
|
|
33
|
+
loginCustomerId: cfg.loginCustomerId
|
|
34
|
+
? normalizeCustomerId(cfg.loginCustomerId)
|
|
35
|
+
: undefined,
|
|
36
|
+
};
|
|
28
37
|
}
|
|
29
38
|
catch {
|
|
30
39
|
return null;
|
package/dist/googleads/tools.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// Google Ads API는 ~13개월 주기로 sunset (항상 최신 3개 major만 유지).
|
|
2
|
+
// v24 = 2026-06 기준 현행 major. 새 major 출시 시 갱신 필요.
|
|
3
|
+
// https://developers.google.com/google-ads/api/docs/sunset-dates
|
|
4
|
+
const API_VERSION = 'v24';
|
|
2
5
|
const BASE = `https://googleads.googleapis.com/${API_VERSION}`;
|
|
3
6
|
// ─── 내부 헬퍼 ───────────────────────────────────────────────
|
|
4
7
|
async function getAccessToken(auth) {
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
2
3
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
5
|
import { registerFirebaseTools } from './registers/firebase.js';
|
|
@@ -16,9 +17,12 @@ import { registerFacebookTools } from './registers/facebook.js';
|
|
|
16
17
|
import { registerGoogleAdsTools } from './registers/googleads.js';
|
|
17
18
|
import { registerPrompts } from './prompts.js';
|
|
18
19
|
import { registerResources } from './resources.js';
|
|
20
|
+
// dist/index.js 기준 ../package.json — npm 패키지 루트의 버전을 단일 출처로 사용.
|
|
21
|
+
// 하드코딩하면 publish 때마다 serverInfo.version 이 드리프트하므로 런타임에 읽는다.
|
|
22
|
+
const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
|
|
19
23
|
const server = new McpServer({
|
|
20
24
|
name: 'mimi-seed',
|
|
21
|
-
version
|
|
25
|
+
version,
|
|
22
26
|
});
|
|
23
27
|
registerFirebaseTools(server);
|
|
24
28
|
registerAdmobTools(server);
|
package/dist/playstore/tools.js
CHANGED
|
@@ -62,23 +62,32 @@ export async function withEdit(auth, packageName, fn, commit = false) {
|
|
|
62
62
|
export async function getStatistics(auth, packageName, query) {
|
|
63
63
|
const metricSet = query.metricSet ?? 'anrRate';
|
|
64
64
|
const resource = METRIC_SET_RESOURCE[metricSet];
|
|
65
|
-
const
|
|
65
|
+
const period = query.aggregationPeriod ?? 'DAILY';
|
|
66
|
+
// Reporting API는 집계 단위별 지원 timezone이 고정: HOURLY=UTC, DAILY=America/Los_Angeles.
|
|
67
|
+
// 단일 default를 모든 period에 쓰면 HOURLY가 INVALID_ARGUMENT로 실패한다.
|
|
68
|
+
const timeZone = query.timeZone ?? (period === 'HOURLY' ? 'UTC' : 'America/Los_Angeles');
|
|
69
|
+
// errorCountMetricSet은 reportType dimension이 필수 — default에 포함하지 않으면 실패.
|
|
70
|
+
const dimensions = query.dimensions ??
|
|
71
|
+
(metricSet === 'errorCount' ? ['reportType', 'versionCode'] : ['versionCode']);
|
|
66
72
|
const url = `${REPORTING_API_BASE}/apps/${encodeURIComponent(packageName)}/${resource}:query`;
|
|
67
73
|
const res = await auth.request({
|
|
68
74
|
url,
|
|
69
75
|
method: 'POST',
|
|
70
76
|
data: {
|
|
71
77
|
timelineSpec: {
|
|
72
|
-
aggregationPeriod:
|
|
78
|
+
aggregationPeriod: period,
|
|
73
79
|
startTime: dateToReportingDateTime(query.startDate, timeZone),
|
|
74
80
|
endTime: dateToReportingDateTime(query.endDate, timeZone),
|
|
75
81
|
},
|
|
76
|
-
dimensions
|
|
82
|
+
dimensions,
|
|
77
83
|
metrics: query.metrics ?? DEFAULT_METRICS[metricSet],
|
|
78
84
|
...(query.filter ? { filter: query.filter } : {}),
|
|
79
85
|
...(query.pageSize ? { pageSize: query.pageSize } : {}),
|
|
80
86
|
...(query.pageToken ? { pageToken: query.pageToken } : {}),
|
|
81
|
-
|
|
87
|
+
// userCohort는 anrRate/crashRate만 지원 (errorCount에 보내면 INVALID_ARGUMENT).
|
|
88
|
+
...(query.userCohort && metricSet !== 'errorCount'
|
|
89
|
+
? { userCohort: query.userCohort }
|
|
90
|
+
: {}),
|
|
82
91
|
},
|
|
83
92
|
});
|
|
84
93
|
return res.data;
|
|
@@ -46,6 +46,9 @@ export function registerPlaystoreTools(server) {
|
|
|
46
46
|
endDate: z.string().describe('종료일 YYYY-MM-DD (보통 exclusive처럼 다음날 지정 권장)'),
|
|
47
47
|
aggregationPeriod: z.enum(['DAILY', 'HOURLY']).default('DAILY').describe('집계 단위'),
|
|
48
48
|
dimensions: z.array(z.enum([
|
|
49
|
+
'reportType', // errorCount metricSet 필수
|
|
50
|
+
'issueId', // errorCount 전용
|
|
51
|
+
'osBuild', // OS_BETA cohort 전용
|
|
49
52
|
'apiLevel',
|
|
50
53
|
'versionCode',
|
|
51
54
|
'deviceModel',
|
|
@@ -64,7 +67,7 @@ export function registerPlaystoreTools(server) {
|
|
|
64
67
|
'deviceGlEsVersion',
|
|
65
68
|
'deviceScreenSize',
|
|
66
69
|
'deviceScreenDpi',
|
|
67
|
-
])).optional().describe('분해 차원. 기본: ["versionCode"]'),
|
|
70
|
+
])).optional().describe('분해 차원. 기본: ["versionCode"] (errorCount는 ["reportType","versionCode"]). reportType/issueId는 errorCount 전용, countryCode/deviceBrand는 anrRate/crashRate 전용'),
|
|
68
71
|
metrics: z.array(z.string()).optional().describe('조회 metric. 기본은 metricSet별 핵심 metric + distinctUsers'),
|
|
69
72
|
filter: z.string().optional().describe('AIP-160 필터. 예: versionCode = 42'),
|
|
70
73
|
pageSize: z.number().int().min(1).max(100000).optional().describe('최대 행 수'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yoonion/mimi-seed-mcp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.30",
|
|
4
4
|
"description": "Mimi Seed MCP server — Firebase + AdMob + Google Play + App Store management for Claude Code / Codex / Cursor / any MCP client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"homepage": "https://mimi-seed.pryzm.gg",
|
|
38
38
|
"repository": {
|
|
39
39
|
"type": "git",
|
|
40
|
-
"url": "git+https://github.com/jeonghwanko/mimi-seed.git",
|
|
40
|
+
"url": "git+https://github.com/jeonghwanko/mimi-seed-sdk.git",
|
|
41
41
|
"directory": "packages/mcp-server"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|