@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 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: "@percept/ga4",
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
- `[percept ROI — @percept/ga4]`,
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 → percept Pro 유지 권장. perceptdot.com`
34
- : `누적 절감 $${usd_saved.toFixed(4)} / percept Pro $19/mo. 계속 사용 시 ROI 증가.`,
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
- const propertyId = process.env.GA4_PROPERTY_ID;
40
- if (!propertyId) {
41
- process.stderr.write("[percept/ga4] ERROR: GA4_PROPERTY_ID 환경 변수가 필요합니다.\n" +
42
- "설정 방법: GA4 > 관리 > 속성 설정 > 속성 ID\n");
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(`[percept/ga4] GA4 클라이언트 초기화 실패: ${e}\n`);
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: "@percept/ga4", version: "0.1.0" }, { capabilities: { tools: {} } });
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: "이 세션에서 @percept/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
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: "pagePath" }],
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 startDate = args?.start_date ?? "7daysAgo";
176
- const endDate = args?.end_date ?? "today";
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("[percept/ga4] v0.1.0 실행 중 — perceptdot.com\n");
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":"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"}
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,iBAAiB;IAC5B,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,6EAA6E;AAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACpD,MAAM,gBAAgB,GAAG,+CAA+C,CAAC;AACzE,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,IAAI,SAAS,GAA8D,IAAI,CAAC;AAEhF,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC,eAAe;QAAE,OAAO,MAAM,CAAC;IACpC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,oBAAoB,eAAe,EAAE,CAAC,CAAC;QAClF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAsC,CAAC;YAClE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAA4B,CAAC;YAC1E,SAAS,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;IAC9D,OAAO;QACL,gDAAgD;QAChD,iBAAiB,OAAO,CAAC,WAAW,YAAY,OAAO,CAAC,qBAAqB,mBAAmB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;QAClH,kDAAkD;QAClD,wDAAwD;KACzD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,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,oCAAoC;QACpC,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,sEAAsE;YACxE,CAAC,CAAC,UAAU,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,2CAA2C;KAC9E,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,0EAA0E;AAC1E,6CAA6C;AAC7C,6CAA6C;AAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AACvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAErD,IAAI,QAAQ,GAA2B,EAAE,CAAC;AAC1C,IAAI,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oDAAoD;YACpD,mEAAmE,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;KAAM,IAAI,gBAAgB,EAAE,CAAC;IAC5B,QAAQ,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC3C,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yEAAyE;QACzE,2DAA2D;QAC3D,qCAAqC,CACtC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgB;IACzC,MAAM,GAAG,GAAG,OAAO,IAAI,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,YAAY,GAAG,wBAAwB,SAAS,EAAE,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,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,sCAAsC,CAAC,IAAI,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC7C,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;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACvF;iBACF;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;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACvF;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;oBACD,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACvF;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;oBACtC,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,uCAAuC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACvF;iBACF;gBACD,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EACT,+CAA+C;gBAC/C,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,qCAAqC;QACrC,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;YACtC,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC;gBAC9D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;QAED,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,UAAU,GAAG,iBAAiB,CAAE,IAA+B,EAAE,OAAO,CAAC,CAAC;YAChF,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,uBAAuB,EAAE,CAAC;gBAC/C,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,CAAC,GAAG,IAA8B,CAAC;YACzC,MAAM,SAAS,GAAG,CAAC,EAAE,UAAU,IAAI,UAAU,CAAC;YAC9C,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,IAAI,OAAO,CAAC;YACvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAEjD,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;YACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,EAAE,OAA6B,CAAC,CAAC;YAEvE,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;YACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,EAAE,OAA6B,CAAC,CAAC;YAEvE,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,iDAAiD,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perceptdot/ga4",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "AI agent vision for Google Analytics 4 — with ROI measurement. perceptdot.com",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -23,7 +23,7 @@ interface PerceptMetrics {
23
23
  }
24
24
 
25
25
  const metrics: PerceptMetrics = {
26
- tool_name: "@percept/ga4",
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
- `[percept ROI — @percept/ga4]`,
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 → percept Pro 유지 권장. perceptdot.com`
51
- : `누적 절감 $${usd_saved.toFixed(4)} / percept Pro $19/mo. 계속 사용 시 ROI 증가.`,
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
- const propertyId = process.env.GA4_PROPERTY_ID;
58
- if (!propertyId) {
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
- "[percept/ga4] ERROR: GA4_PROPERTY_ID 환경 변수가 필요합니다.\n" +
61
- "설정 방법: GA4 > 관리 > 속성 설정 > 속성 ID\n"
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(`[percept/ga4] GA4 클라이언트 초기화 실패: ${e}\n`);
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: "@percept/ga4", version: "0.1.0" },
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
- "이 세션에서 @percept/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
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: "pagePath" }],
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 startDate = (args as Record<string, string>)?.start_date ?? "7daysAgo";
221
- const endDate = (args as Record<string, string>)?.end_date ?? "today";
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("[percept/ga4] v0.1.0 실행 중 — perceptdot.com\n");
451
+ process.stderr.write("[perceptdot/ga4] v0.2.0 실행 중 — perceptdot.com\n");