@perceptdot/ga4 0.1.1 → 0.2.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/index.js +106 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +112 -17
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { BetaAnalyticsDataClient } from "@google-analytics/data";
|
|
|
9
9
|
const TOKENS_SAVED_PER_CALL = 450;
|
|
10
10
|
const TOKEN_PRICE_PER_MILLION = 3.0; // Claude Sonnet $3/1M tokens
|
|
11
11
|
const metrics = {
|
|
12
|
-
tool_name: "@
|
|
12
|
+
tool_name: "@perceptdot/ga4",
|
|
13
13
|
tokens_saved_estimate: 0,
|
|
14
14
|
time_saved_ms: 0,
|
|
15
15
|
calls_count: 0,
|
|
@@ -19,29 +19,89 @@ function trackCall(duration_ms) {
|
|
|
19
19
|
metrics.tokens_saved_estimate += TOKENS_SAVED_PER_CALL;
|
|
20
20
|
metrics.time_saved_ms += duration_ms;
|
|
21
21
|
}
|
|
22
|
+
// ─── 플랜 검증 ────────────────────────────────────────────────────────────────
|
|
23
|
+
const PERCEPT_API_KEY = process.env.PERCEPT_API_KEY;
|
|
24
|
+
const PERCEPT_API_BASE = "https://perceptdot-api.perceptdot.workers.dev";
|
|
25
|
+
const FREE_CALL_LIMIT = 10;
|
|
26
|
+
let planCache = null;
|
|
27
|
+
async function getValidatedPlan() {
|
|
28
|
+
if (!PERCEPT_API_KEY)
|
|
29
|
+
return "free";
|
|
30
|
+
if (planCache && Date.now() < planCache.expires)
|
|
31
|
+
return planCache.plan;
|
|
32
|
+
try {
|
|
33
|
+
const res = await fetch(`${PERCEPT_API_BASE}/v1/validate?key=${PERCEPT_API_KEY}`);
|
|
34
|
+
if (res.ok) {
|
|
35
|
+
const data = await res.json();
|
|
36
|
+
const plan = (data.valid ? data.plan : "free");
|
|
37
|
+
planCache = { plan, expires: Date.now() + 5 * 60 * 1000 };
|
|
38
|
+
return plan;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
return "free";
|
|
43
|
+
}
|
|
44
|
+
function makeUpgradeMessage() {
|
|
45
|
+
const usd = (metrics.tokens_saved_estimate / 1_000_000) * 3.0;
|
|
46
|
+
return [
|
|
47
|
+
"PERCEPT FREE LIMIT REACHED (10 calls/session).",
|
|
48
|
+
`This session: ${metrics.calls_count} calls, ~${metrics.tokens_saved_estimate} tokens saved ($${usd.toFixed(4)}).`,
|
|
49
|
+
"Upgrade to Pro ($19/mo) → https://perceptdot.com",
|
|
50
|
+
"Set PERCEPT_API_KEY in your MCP config after purchase.",
|
|
51
|
+
].join("\n");
|
|
52
|
+
}
|
|
22
53
|
function getRoiSummary() {
|
|
23
54
|
const usd_saved = (metrics.tokens_saved_estimate / 1_000_000) * TOKEN_PRICE_PER_MILLION;
|
|
24
55
|
const monthly_rate = usd_saved; // 현재 세션 기준 (누적 추적 필요 시 백엔드 연동)
|
|
25
56
|
const lines = [
|
|
26
|
-
`[
|
|
57
|
+
`[perceptdot ROI — @perceptdot/ga4]`,
|
|
27
58
|
`calls: ${metrics.calls_count}`,
|
|
28
59
|
`tokens saved: ${metrics.tokens_saved_estimate.toLocaleString()}`,
|
|
29
60
|
`cost saved: $${usd_saved.toFixed(4)}`,
|
|
30
61
|
`time saved: ~${Math.round(metrics.time_saved_ms / 60000)} min`,
|
|
31
62
|
``,
|
|
32
63
|
monthly_rate > 0.019
|
|
33
|
-
? `ROI POSITIVE: saving > $19/mo →
|
|
34
|
-
: `누적 절감 $${usd_saved.toFixed(4)} /
|
|
64
|
+
? `ROI POSITIVE: saving > $19/mo → perceptdot Pro 유지 권장. perceptdot.com`
|
|
65
|
+
: `누적 절감 $${usd_saved.toFixed(4)} / perceptdot Pro $19/mo. 계속 사용 시 ROI 증가.`,
|
|
35
66
|
];
|
|
36
67
|
return lines.join("\n");
|
|
37
68
|
}
|
|
38
|
-
// ─── 환경 변수 검증
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
69
|
+
// ─── 환경 변수 검증 (v0.2.0: Named Profiles) ──────────────────────────────────
|
|
70
|
+
// Named Profiles: GA4_PROFILES={"k-saju":"528574308","perceptdot":"XXXX"}
|
|
71
|
+
// GA4_DEFAULT_PROFILE=k-saju
|
|
72
|
+
// Legacy fallback: GA4_PROPERTY_ID=528574308
|
|
73
|
+
const profilesRaw = process.env.GA4_PROFILES;
|
|
74
|
+
const defaultProfile = process.env.GA4_DEFAULT_PROFILE;
|
|
75
|
+
const legacyPropertyId = process.env.GA4_PROPERTY_ID;
|
|
76
|
+
let profiles = {};
|
|
77
|
+
if (profilesRaw) {
|
|
78
|
+
try {
|
|
79
|
+
profiles = JSON.parse(profilesRaw);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
process.stderr.write('[perceptdot/ga4] ERROR: GA4_PROFILES JSON 파싱 실패.\n' +
|
|
83
|
+
'예시: GA4_PROFILES=\'{"k-saju":"528574308","perceptdot":"XXXX"}\'\n');
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (legacyPropertyId) {
|
|
88
|
+
profiles = { default: legacyPropertyId };
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
process.stderr.write("[perceptdot/ga4] ERROR: GA4_PROFILES 또는 GA4_PROPERTY_ID 환경 변수가 필요합니다.\n" +
|
|
92
|
+
'Named Profiles: GA4_PROFILES=\'{"k-saju":"528574308"}\'\n' +
|
|
93
|
+
"Legacy: GA4_PROPERTY_ID=528574308\n");
|
|
43
94
|
process.exit(1);
|
|
44
95
|
}
|
|
96
|
+
function resolvePropertyId(project) {
|
|
97
|
+
const key = project ?? defaultProfile ?? Object.keys(profiles)[0];
|
|
98
|
+
const id = profiles[key];
|
|
99
|
+
if (!id) {
|
|
100
|
+
const available = Object.keys(profiles).join(", ");
|
|
101
|
+
throw new McpError(ErrorCode.InvalidParams, `GA4 프로필 '${key}'를 찾을 수 없습니다. 사용 가능: ${available}`);
|
|
102
|
+
}
|
|
103
|
+
return id;
|
|
104
|
+
}
|
|
45
105
|
// ─── GA4 클라이언트 초기화 ─────────────────────────────────────────────────────
|
|
46
106
|
let analyticsClient;
|
|
47
107
|
try {
|
|
@@ -56,11 +116,11 @@ try {
|
|
|
56
116
|
}
|
|
57
117
|
}
|
|
58
118
|
catch (e) {
|
|
59
|
-
process.stderr.write(`[
|
|
119
|
+
process.stderr.write(`[perceptdot/ga4] GA4 클라이언트 초기화 실패: ${e}\n`);
|
|
60
120
|
process.exit(1);
|
|
61
121
|
}
|
|
62
122
|
// ─── MCP 서버 ─────────────────────────────────────────────────────────────────
|
|
63
|
-
const server = new Server({ name: "@
|
|
123
|
+
const server = new Server({ name: "@perceptdot/ga4", version: "0.2.0" }, { capabilities: { tools: {} } });
|
|
64
124
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
65
125
|
tools: [
|
|
66
126
|
{
|
|
@@ -69,7 +129,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
69
129
|
"수동 대비 ~450 토큰 절감. 배포 직후, 마케팅 이벤트 중 사용 권장.",
|
|
70
130
|
inputSchema: {
|
|
71
131
|
type: "object",
|
|
72
|
-
properties: {
|
|
132
|
+
properties: {
|
|
133
|
+
project: {
|
|
134
|
+
type: "string",
|
|
135
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
73
138
|
required: [],
|
|
74
139
|
},
|
|
75
140
|
},
|
|
@@ -89,6 +154,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
89
154
|
description: "종료일 (YYYY-MM-DD 또는 'today', 'yesterday')",
|
|
90
155
|
default: "today",
|
|
91
156
|
},
|
|
157
|
+
project: {
|
|
158
|
+
type: "string",
|
|
159
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
160
|
+
},
|
|
92
161
|
},
|
|
93
162
|
required: [],
|
|
94
163
|
},
|
|
@@ -106,6 +175,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
106
175
|
description: "반환할 이벤트 수 (최대 20)",
|
|
107
176
|
default: 10,
|
|
108
177
|
},
|
|
178
|
+
project: {
|
|
179
|
+
type: "string",
|
|
180
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
181
|
+
},
|
|
109
182
|
},
|
|
110
183
|
required: [],
|
|
111
184
|
},
|
|
@@ -119,13 +192,17 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
119
192
|
start_date: { type: "string", default: "7daysAgo" },
|
|
120
193
|
end_date: { type: "string", default: "today" },
|
|
121
194
|
limit: { type: "number", default: 10 },
|
|
195
|
+
project: {
|
|
196
|
+
type: "string",
|
|
197
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
198
|
+
},
|
|
122
199
|
},
|
|
123
200
|
required: [],
|
|
124
201
|
},
|
|
125
202
|
},
|
|
126
203
|
{
|
|
127
204
|
name: "percept_roi_summary",
|
|
128
|
-
description: "이 세션에서 @
|
|
205
|
+
description: "이 세션에서 @perceptdot/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
|
|
129
206
|
"주인에게 ROI 리포트 보고 시 사용.",
|
|
130
207
|
inputSchema: {
|
|
131
208
|
type: "object",
|
|
@@ -139,16 +216,24 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
139
216
|
const { name, arguments: args } = request.params;
|
|
140
217
|
const startTime = Date.now();
|
|
141
218
|
try {
|
|
219
|
+
// 플랜 체크 (percept_roi_summary는 항상 허용)
|
|
220
|
+
if (name !== "percept_roi_summary") {
|
|
221
|
+
const plan = await getValidatedPlan();
|
|
222
|
+
if (plan === "free" && metrics.calls_count >= FREE_CALL_LIMIT) {
|
|
223
|
+
return { content: [{ type: "text", text: makeUpgradeMessage() }] };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
142
226
|
// ROI 리포트 (API 호출 없음)
|
|
143
227
|
if (name === "percept_roi_summary") {
|
|
144
228
|
return { content: [{ type: "text", text: getRoiSummary() }] };
|
|
145
229
|
}
|
|
146
230
|
// 실시간 데이터
|
|
147
231
|
if (name === "ga4_realtime") {
|
|
232
|
+
const propertyId = resolvePropertyId(args?.project);
|
|
148
233
|
const [response] = await analyticsClient.runRealtimeReport({
|
|
149
234
|
property: `properties/${propertyId}`,
|
|
150
235
|
metrics: [{ name: "activeUsers" }],
|
|
151
|
-
dimensions: [{ name: "
|
|
236
|
+
dimensions: [{ name: "unifiedPagePathScreen" }],
|
|
152
237
|
limit: 10,
|
|
153
238
|
});
|
|
154
239
|
const total_active_users = response.rows?.reduce((sum, row) => sum + parseInt(row.metricValues?.[0]?.value ?? "0"), 0) ?? 0;
|
|
@@ -172,8 +257,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
172
257
|
}
|
|
173
258
|
// 기간별 개요
|
|
174
259
|
if (name === "ga4_overview") {
|
|
175
|
-
const
|
|
176
|
-
const
|
|
260
|
+
const a = args;
|
|
261
|
+
const startDate = a?.start_date ?? "7daysAgo";
|
|
262
|
+
const endDate = a?.end_date ?? "today";
|
|
263
|
+
const propertyId = resolvePropertyId(a?.project);
|
|
177
264
|
const [response] = await analyticsClient.runReport({
|
|
178
265
|
property: `properties/${propertyId}`,
|
|
179
266
|
dateRanges: [{ startDate, endDate }],
|
|
@@ -210,6 +297,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
210
297
|
const startDate = a?.start_date ?? "7daysAgo";
|
|
211
298
|
const endDate = a?.end_date ?? "today";
|
|
212
299
|
const limit = Math.min(Number(a?.limit ?? 10), 20);
|
|
300
|
+
const propertyId = resolvePropertyId(a?.project);
|
|
213
301
|
const [response] = await analyticsClient.runReport({
|
|
214
302
|
property: `properties/${propertyId}`,
|
|
215
303
|
dateRanges: [{ startDate, endDate }],
|
|
@@ -243,6 +331,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
243
331
|
const startDate = a?.start_date ?? "7daysAgo";
|
|
244
332
|
const endDate = a?.end_date ?? "today";
|
|
245
333
|
const limit = Math.min(Number(a?.limit ?? 10), 20);
|
|
334
|
+
const propertyId = resolvePropertyId(a?.project);
|
|
246
335
|
const [response] = await analyticsClient.runReport({
|
|
247
336
|
property: `properties/${propertyId}`,
|
|
248
337
|
dateRanges: [{ startDate, endDate }],
|
|
@@ -281,5 +370,5 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
281
370
|
});
|
|
282
371
|
const transport = new StdioServerTransport();
|
|
283
372
|
await server.connect(transport);
|
|
284
|
-
process.stderr.write("[
|
|
373
|
+
process.stderr.write("[perceptdot/ga4] v0.2.0 실행 중 — perceptdot.com\n");
|
|
285
374
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,QAAQ,EACR,SAAS,GACV,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,4EAA4E;AAC5E,qDAAqD;AACrD,oCAAoC;AACpC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,uBAAuB,GAAG,GAAG,CAAC,CAAC,6BAA6B;AASlE,MAAM,OAAO,GAAmB;IAC9B,SAAS,EAAE,cAAc;IACzB,qBAAqB,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;CACf,CAAC;AAEF,SAAS,SAAS,CAAC,WAAmB;IACpC,OAAO,CAAC,WAAW,EAAE,CAAC;IACtB,OAAO,CAAC,qBAAqB,IAAI,qBAAqB,CAAC;IACvD,OAAO,CAAC,aAAa,IAAI,WAAW,CAAC;AACvC,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,SAAS,GACb,CAAC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,uBAAuB,CAAC;IACxE,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,+BAA+B;IAC/D,MAAM,KAAK,GAAG;QACZ,8BAA8B;QAC9B,mBAAmB,OAAO,CAAC,WAAW,EAAE;QACxC,mBAAmB,OAAO,CAAC,qBAAqB,CAAC,cAAc,EAAE,EAAE;QACnE,oBAAoB,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC1C,oBAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM;QACnE,EAAE;QACF,YAAY,GAAG,KAAK;YAClB,CAAC,CAAC,mEAAmE;YACrE,CAAC,CAAC,UAAU,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;KAC3E,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sDAAsD;QACpD,mCAAmC,CACtC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,0EAA0E;AAC1E,IAAI,eAAwC,CAAC;AAC7C,IAAI,CAAC;IACH,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC3C,eAAe,GAAG,IAAI,uBAAuB,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,0CAA0C;QAC1C,eAAe,GAAG,IAAI,uBAAuB,EAAE,CAAC;IAClD,CAAC;AACH,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,EAC1C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE;QACL;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,kCAAkC;gBAClC,2CAA2C;YAC7C,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,qDAAqD;YACvD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,6CAA6C;wBAC1D,OAAO,EAAE,UAAU;qBACpB;oBACD,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,0CAA0C;wBACvD,OAAO,EAAE,OAAO;qBACjB;iBACF;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EACT,iDAAiD;YACnD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE;oBACnD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;oBAC9C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,mBAAmB;wBAChC,OAAO,EAAE,EAAE;qBACZ;iBACF;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EACT,iDAAiD;YACnD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE;oBACnD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;oBAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;iBACvC;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EACT,4CAA4C;gBAC5C,uBAAuB;YACzB,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF;KACF;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,sBAAsB;QACtB,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;QAED,UAAU;QACV,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,eAAe,CAAC,iBAAiB,CAAC;gBACzD,QAAQ,EAAE,cAAc,UAAU,EAAE;gBACpC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;gBAClC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAClC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YAEH,MAAM,kBAAkB,GACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CACnB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC,EACjE,CAAC,CACF,IAAI,CAAC,CAAC;YAET,MAAM,SAAS,GACb,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;gBAC5C,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;aAClD,CAAC,CAAC,IAAI,EAAE,CAAC;YAEZ,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,kBAAkB;4BAClB,SAAS;4BACT,QAAQ,EAAE,GAAG,qBAAqB,yBAAyB;yBAC5D,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,SAAS;QACT,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAI,IAA+B,EAAE,UAAU,IAAI,UAAU,CAAC;YAC7E,MAAM,OAAO,GAAI,IAA+B,EAAE,QAAQ,IAAI,OAAO,CAAC;YAEtE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC;gBACjD,QAAQ,EAAE,cAAc,UAAU,EAAE;gBACpC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;gBACpC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,UAAU,EAAE;oBACpB,EAAE,IAAI,EAAE,aAAa,EAAE;oBACvB,EAAE,IAAI,EAAE,iBAAiB,EAAE;oBAC3B,EAAE,IAAI,EAAE,YAAY,EAAE;oBACtB,EAAE,IAAI,EAAE,wBAAwB,EAAE;iBACnC;aACF,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,MAAM,EAAE,GAAG,SAAS,MAAM,OAAO,EAAE;4BACnC,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;4BAC9C,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;4BAClD,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;4BAC/C,WAAW,EACT,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;4BACnE,eAAe,EAAE,IAAI,CAAC,KAAK,CACzB,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC,CACjD;4BACD,QAAQ,EAAE,GAAG,qBAAqB,yBAAyB;yBAC5D,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,SAAS;QACT,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,MAAM,SAAS,GAAI,CAAC,EAAE,UAAqB,IAAI,UAAU,CAAC;YAC1D,MAAM,OAAO,GAAI,CAAC,EAAE,QAAmB,IAAI,OAAO,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAEnD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC;gBACjD,QAAQ,EAAE,cAAc,UAAU,EAAE;gBACpC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;gBACpC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBACzD,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAChE,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,MAAM,GACV,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,KAAK,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;gBACnD,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;gBAC1C,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;aAC3C,CAAC,CAAC,IAAI,EAAE,CAAC;YAEZ,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,MAAM,EAAE,GAAG,SAAS,MAAM,OAAO,EAAE;4BACnC,MAAM;4BACN,QAAQ,EAAE,GAAG,qBAAqB,yBAAyB;yBAC5D,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,SAAS;QACT,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,IAA+B,CAAC;YAC1C,MAAM,SAAS,GAAI,CAAC,EAAE,UAAqB,IAAI,UAAU,CAAC;YAC1D,MAAM,OAAO,GAAI,CAAC,EAAE,QAAmB,IAAI,OAAO,CAAC;YACnD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAEnD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC;gBACjD,QAAQ,EAAE,cAAc,UAAU,EAAE;gBACpC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;gBACpC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBACzD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;gBAC/D,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACrE,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,KAAK,GACT,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;gBAC5C,KAAK,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;gBAC5C,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;gBAC1C,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;aAC3C,CAAC,CAAC,IAAI,EAAE,CAAC;YAEZ,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,MAAM,EAAE,GAAG,SAAS,MAAM,OAAO,EAAE;4BACnC,SAAS,EAAE,KAAK;4BAChB,QAAQ,EAAE,GAAG,qBAAqB,yBAAyB;yBAC5D,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -23,7 +23,7 @@ interface PerceptMetrics {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const metrics: PerceptMetrics = {
|
|
26
|
-
tool_name: "@
|
|
26
|
+
tool_name: "@perceptdot/ga4",
|
|
27
27
|
tokens_saved_estimate: 0,
|
|
28
28
|
time_saved_ms: 0,
|
|
29
29
|
calls_count: 0,
|
|
@@ -35,34 +35,99 @@ function trackCall(duration_ms: number): void {
|
|
|
35
35
|
metrics.time_saved_ms += duration_ms;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
// ─── 플랜 검증 ────────────────────────────────────────────────────────────────
|
|
39
|
+
const PERCEPT_API_KEY = process.env.PERCEPT_API_KEY;
|
|
40
|
+
const PERCEPT_API_BASE = "https://perceptdot-api.perceptdot.workers.dev";
|
|
41
|
+
const FREE_CALL_LIMIT = 10;
|
|
42
|
+
|
|
43
|
+
let planCache: { plan: "free" | "pro" | "team"; expires: number } | null = null;
|
|
44
|
+
|
|
45
|
+
async function getValidatedPlan(): Promise<"free" | "pro" | "team"> {
|
|
46
|
+
if (!PERCEPT_API_KEY) return "free";
|
|
47
|
+
if (planCache && Date.now() < planCache.expires) return planCache.plan;
|
|
48
|
+
try {
|
|
49
|
+
const res = await fetch(`${PERCEPT_API_BASE}/v1/validate?key=${PERCEPT_API_KEY}`);
|
|
50
|
+
if (res.ok) {
|
|
51
|
+
const data = await res.json() as { valid: boolean; plan: string };
|
|
52
|
+
const plan = (data.valid ? data.plan : "free") as "free" | "pro" | "team";
|
|
53
|
+
planCache = { plan, expires: Date.now() + 5 * 60 * 1000 };
|
|
54
|
+
return plan;
|
|
55
|
+
}
|
|
56
|
+
} catch {}
|
|
57
|
+
return "free";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function makeUpgradeMessage(): string {
|
|
61
|
+
const usd = (metrics.tokens_saved_estimate / 1_000_000) * 3.0;
|
|
62
|
+
return [
|
|
63
|
+
"PERCEPT FREE LIMIT REACHED (10 calls/session).",
|
|
64
|
+
`This session: ${metrics.calls_count} calls, ~${metrics.tokens_saved_estimate} tokens saved ($${usd.toFixed(4)}).`,
|
|
65
|
+
"Upgrade to Pro ($19/mo) → https://perceptdot.com",
|
|
66
|
+
"Set PERCEPT_API_KEY in your MCP config after purchase.",
|
|
67
|
+
].join("\n");
|
|
68
|
+
}
|
|
69
|
+
|
|
38
70
|
function getRoiSummary(): string {
|
|
39
71
|
const usd_saved =
|
|
40
72
|
(metrics.tokens_saved_estimate / 1_000_000) * TOKEN_PRICE_PER_MILLION;
|
|
41
73
|
const monthly_rate = usd_saved; // 현재 세션 기준 (누적 추적 필요 시 백엔드 연동)
|
|
42
74
|
const lines = [
|
|
43
|
-
`[
|
|
75
|
+
`[perceptdot ROI — @perceptdot/ga4]`,
|
|
44
76
|
`calls: ${metrics.calls_count}`,
|
|
45
77
|
`tokens saved: ${metrics.tokens_saved_estimate.toLocaleString()}`,
|
|
46
78
|
`cost saved: $${usd_saved.toFixed(4)}`,
|
|
47
79
|
`time saved: ~${Math.round(metrics.time_saved_ms / 60000)} min`,
|
|
48
80
|
``,
|
|
49
81
|
monthly_rate > 0.019
|
|
50
|
-
? `ROI POSITIVE: saving > $19/mo →
|
|
51
|
-
: `누적 절감 $${usd_saved.toFixed(4)} /
|
|
82
|
+
? `ROI POSITIVE: saving > $19/mo → perceptdot Pro 유지 권장. perceptdot.com`
|
|
83
|
+
: `누적 절감 $${usd_saved.toFixed(4)} / perceptdot Pro $19/mo. 계속 사용 시 ROI 증가.`,
|
|
52
84
|
];
|
|
53
85
|
return lines.join("\n");
|
|
54
86
|
}
|
|
55
87
|
|
|
56
|
-
// ─── 환경 변수 검증
|
|
57
|
-
|
|
58
|
-
|
|
88
|
+
// ─── 환경 변수 검증 (v0.2.0: Named Profiles) ──────────────────────────────────
|
|
89
|
+
// Named Profiles: GA4_PROFILES={"k-saju":"528574308","perceptdot":"XXXX"}
|
|
90
|
+
// GA4_DEFAULT_PROFILE=k-saju
|
|
91
|
+
// Legacy fallback: GA4_PROPERTY_ID=528574308
|
|
92
|
+
const profilesRaw = process.env.GA4_PROFILES;
|
|
93
|
+
const defaultProfile = process.env.GA4_DEFAULT_PROFILE;
|
|
94
|
+
const legacyPropertyId = process.env.GA4_PROPERTY_ID;
|
|
95
|
+
|
|
96
|
+
let profiles: Record<string, string> = {};
|
|
97
|
+
if (profilesRaw) {
|
|
98
|
+
try {
|
|
99
|
+
profiles = JSON.parse(profilesRaw);
|
|
100
|
+
} catch {
|
|
101
|
+
process.stderr.write(
|
|
102
|
+
'[perceptdot/ga4] ERROR: GA4_PROFILES JSON 파싱 실패.\n' +
|
|
103
|
+
'예시: GA4_PROFILES=\'{"k-saju":"528574308","perceptdot":"XXXX"}\'\n'
|
|
104
|
+
);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
} else if (legacyPropertyId) {
|
|
108
|
+
profiles = { default: legacyPropertyId };
|
|
109
|
+
} else {
|
|
59
110
|
process.stderr.write(
|
|
60
|
-
"[
|
|
61
|
-
|
|
111
|
+
"[perceptdot/ga4] ERROR: GA4_PROFILES 또는 GA4_PROPERTY_ID 환경 변수가 필요합니다.\n" +
|
|
112
|
+
'Named Profiles: GA4_PROFILES=\'{"k-saju":"528574308"}\'\n' +
|
|
113
|
+
"Legacy: GA4_PROPERTY_ID=528574308\n"
|
|
62
114
|
);
|
|
63
115
|
process.exit(1);
|
|
64
116
|
}
|
|
65
117
|
|
|
118
|
+
function resolvePropertyId(project?: string): string {
|
|
119
|
+
const key = project ?? defaultProfile ?? Object.keys(profiles)[0];
|
|
120
|
+
const id = profiles[key];
|
|
121
|
+
if (!id) {
|
|
122
|
+
const available = Object.keys(profiles).join(", ");
|
|
123
|
+
throw new McpError(
|
|
124
|
+
ErrorCode.InvalidParams,
|
|
125
|
+
`GA4 프로필 '${key}'를 찾을 수 없습니다. 사용 가능: ${available}`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return id;
|
|
129
|
+
}
|
|
130
|
+
|
|
66
131
|
// ─── GA4 클라이언트 초기화 ─────────────────────────────────────────────────────
|
|
67
132
|
let analyticsClient: BetaAnalyticsDataClient;
|
|
68
133
|
try {
|
|
@@ -75,13 +140,13 @@ try {
|
|
|
75
140
|
analyticsClient = new BetaAnalyticsDataClient();
|
|
76
141
|
}
|
|
77
142
|
} catch (e) {
|
|
78
|
-
process.stderr.write(`[
|
|
143
|
+
process.stderr.write(`[perceptdot/ga4] GA4 클라이언트 초기화 실패: ${e}\n`);
|
|
79
144
|
process.exit(1);
|
|
80
145
|
}
|
|
81
146
|
|
|
82
147
|
// ─── MCP 서버 ─────────────────────────────────────────────────────────────────
|
|
83
148
|
const server = new Server(
|
|
84
|
-
{ name: "@
|
|
149
|
+
{ name: "@perceptdot/ga4", version: "0.2.0" },
|
|
85
150
|
{ capabilities: { tools: {} } }
|
|
86
151
|
);
|
|
87
152
|
|
|
@@ -94,7 +159,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
94
159
|
"수동 대비 ~450 토큰 절감. 배포 직후, 마케팅 이벤트 중 사용 권장.",
|
|
95
160
|
inputSchema: {
|
|
96
161
|
type: "object",
|
|
97
|
-
properties: {
|
|
162
|
+
properties: {
|
|
163
|
+
project: {
|
|
164
|
+
type: "string",
|
|
165
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
98
168
|
required: [],
|
|
99
169
|
},
|
|
100
170
|
},
|
|
@@ -115,6 +185,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
115
185
|
description: "종료일 (YYYY-MM-DD 또는 'today', 'yesterday')",
|
|
116
186
|
default: "today",
|
|
117
187
|
},
|
|
188
|
+
project: {
|
|
189
|
+
type: "string",
|
|
190
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
191
|
+
},
|
|
118
192
|
},
|
|
119
193
|
required: [],
|
|
120
194
|
},
|
|
@@ -133,6 +207,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
133
207
|
description: "반환할 이벤트 수 (최대 20)",
|
|
134
208
|
default: 10,
|
|
135
209
|
},
|
|
210
|
+
project: {
|
|
211
|
+
type: "string",
|
|
212
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
213
|
+
},
|
|
136
214
|
},
|
|
137
215
|
required: [],
|
|
138
216
|
},
|
|
@@ -147,6 +225,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
147
225
|
start_date: { type: "string", default: "7daysAgo" },
|
|
148
226
|
end_date: { type: "string", default: "today" },
|
|
149
227
|
limit: { type: "number", default: 10 },
|
|
228
|
+
project: {
|
|
229
|
+
type: "string",
|
|
230
|
+
description: `조회할 프로젝트 프로필명. 미지정 시 기본값 사용. 사용 가능: ${Object.keys(profiles).join(", ")}`,
|
|
231
|
+
},
|
|
150
232
|
},
|
|
151
233
|
required: [],
|
|
152
234
|
},
|
|
@@ -154,7 +236,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
154
236
|
{
|
|
155
237
|
name: "percept_roi_summary",
|
|
156
238
|
description:
|
|
157
|
-
"이 세션에서 @
|
|
239
|
+
"이 세션에서 @perceptdot/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
|
|
158
240
|
"주인에게 ROI 리포트 보고 시 사용.",
|
|
159
241
|
inputSchema: {
|
|
160
242
|
type: "object",
|
|
@@ -170,6 +252,14 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
170
252
|
const startTime = Date.now();
|
|
171
253
|
|
|
172
254
|
try {
|
|
255
|
+
// 플랜 체크 (percept_roi_summary는 항상 허용)
|
|
256
|
+
if (name !== "percept_roi_summary") {
|
|
257
|
+
const plan = await getValidatedPlan();
|
|
258
|
+
if (plan === "free" && metrics.calls_count >= FREE_CALL_LIMIT) {
|
|
259
|
+
return { content: [{ type: "text", text: makeUpgradeMessage() }] };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
173
263
|
// ROI 리포트 (API 호출 없음)
|
|
174
264
|
if (name === "percept_roi_summary") {
|
|
175
265
|
return { content: [{ type: "text", text: getRoiSummary() }] };
|
|
@@ -177,10 +267,11 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
177
267
|
|
|
178
268
|
// 실시간 데이터
|
|
179
269
|
if (name === "ga4_realtime") {
|
|
270
|
+
const propertyId = resolvePropertyId((args as Record<string, string>)?.project);
|
|
180
271
|
const [response] = await analyticsClient.runRealtimeReport({
|
|
181
272
|
property: `properties/${propertyId}`,
|
|
182
273
|
metrics: [{ name: "activeUsers" }],
|
|
183
|
-
dimensions: [{ name: "
|
|
274
|
+
dimensions: [{ name: "unifiedPagePathScreen" }],
|
|
184
275
|
limit: 10,
|
|
185
276
|
});
|
|
186
277
|
|
|
@@ -217,8 +308,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
217
308
|
|
|
218
309
|
// 기간별 개요
|
|
219
310
|
if (name === "ga4_overview") {
|
|
220
|
-
const
|
|
221
|
-
const
|
|
311
|
+
const a = args as Record<string, string>;
|
|
312
|
+
const startDate = a?.start_date ?? "7daysAgo";
|
|
313
|
+
const endDate = a?.end_date ?? "today";
|
|
314
|
+
const propertyId = resolvePropertyId(a?.project);
|
|
222
315
|
|
|
223
316
|
const [response] = await analyticsClient.runReport({
|
|
224
317
|
property: `properties/${propertyId}`,
|
|
@@ -265,6 +358,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
265
358
|
const startDate = (a?.start_date as string) ?? "7daysAgo";
|
|
266
359
|
const endDate = (a?.end_date as string) ?? "today";
|
|
267
360
|
const limit = Math.min(Number(a?.limit ?? 10), 20);
|
|
361
|
+
const propertyId = resolvePropertyId(a?.project as string | undefined);
|
|
268
362
|
|
|
269
363
|
const [response] = await analyticsClient.runReport({
|
|
270
364
|
property: `properties/${propertyId}`,
|
|
@@ -307,6 +401,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
307
401
|
const startDate = (a?.start_date as string) ?? "7daysAgo";
|
|
308
402
|
const endDate = (a?.end_date as string) ?? "today";
|
|
309
403
|
const limit = Math.min(Number(a?.limit ?? 10), 20);
|
|
404
|
+
const propertyId = resolvePropertyId(a?.project as string | undefined);
|
|
310
405
|
|
|
311
406
|
const [response] = await analyticsClient.runReport({
|
|
312
407
|
property: `properties/${propertyId}`,
|
|
@@ -353,4 +448,4 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
353
448
|
|
|
354
449
|
const transport = new StdioServerTransport();
|
|
355
450
|
await server.connect(transport);
|
|
356
|
-
process.stderr.write("[
|
|
451
|
+
process.stderr.write("[perceptdot/ga4] v0.2.0 실행 중 — perceptdot.com\n");
|