@perceptdot/ga4 0.2.0 → 0.2.2

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
@@ -19,6 +19,59 @@ 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 SESSION_FREE_LIMIT = 10;
26
+ let planCache = null;
27
+ async function checkAndUse() {
28
+ if (!PERCEPT_API_KEY) {
29
+ if (metrics.calls_count >= SESSION_FREE_LIMIT) {
30
+ return { allowed: false, needs_feedback: false, message: "PERCEPT FREE LIMIT REACHED (10 calls/session).\nGet a free key for 200 calls → https://perceptdot.com" };
31
+ }
32
+ return { allowed: true, needs_feedback: false };
33
+ }
34
+ if (PERCEPT_API_KEY.startsWith("pd_free_")) {
35
+ try {
36
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/use`, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/json" },
39
+ body: JSON.stringify({ key: PERCEPT_API_KEY }),
40
+ });
41
+ if (res.ok) {
42
+ const data = await res.json();
43
+ if (!data.allowed)
44
+ return { allowed: false, needs_feedback: data.needs_feedback ?? false, message: data.message };
45
+ return { allowed: true, needs_feedback: false };
46
+ }
47
+ }
48
+ catch { }
49
+ return { allowed: true, needs_feedback: false };
50
+ }
51
+ if (planCache && Date.now() < planCache.expires)
52
+ return { allowed: true, needs_feedback: false };
53
+ try {
54
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/validate?key=${PERCEPT_API_KEY}`);
55
+ if (res.ok) {
56
+ const data = await res.json();
57
+ planCache = { plan: (data.valid ? data.plan : "free"), expires: Date.now() + 5 * 60 * 1000 };
58
+ if (!data.valid)
59
+ return { allowed: false, needs_feedback: false, message: "Invalid PERCEPT_API_KEY. Check your key at perceptdot.com" };
60
+ }
61
+ }
62
+ catch { }
63
+ return { allowed: true, needs_feedback: false };
64
+ }
65
+ function makeFeedbackRequestMessage() {
66
+ const usd = (metrics.tokens_saved_estimate / 1_000_000) * 3.0;
67
+ return [
68
+ "PERCEPT FREE QUOTA REACHED (100 calls).",
69
+ `This session: ${metrics.calls_count} calls, ~${metrics.tokens_saved_estimate} tokens saved ($${usd.toFixed(4)}).`,
70
+ "",
71
+ "Submit feedback to unlock 100 more calls → use `percept_feedback` tool with rating (1-5) and comment (max 150 chars).",
72
+ "Or upgrade to Pro ($19/mo) → https://perceptdot.com",
73
+ ].join("\n");
74
+ }
22
75
  function getRoiSummary() {
23
76
  const usd_saved = (metrics.tokens_saved_estimate / 1_000_000) * TOKEN_PRICE_PER_MILLION;
24
77
  const monthly_rate = usd_saved; // 현재 세션 기준 (누적 추적 필요 시 백엔드 연동)
@@ -89,7 +142,7 @@ catch (e) {
89
142
  process.exit(1);
90
143
  }
91
144
  // ─── MCP 서버 ─────────────────────────────────────────────────────────────────
92
- const server = new Server({ name: "@perceptdot/ga4", version: "0.2.0" }, { capabilities: { tools: {} } });
145
+ const server = new Server({ name: "@perceptdot/ga4", version: "0.2.2" }, { capabilities: { tools: {} } });
93
146
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
94
147
  tools: [
95
148
  {
@@ -173,10 +226,19 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
173
226
  name: "percept_roi_summary",
174
227
  description: "이 세션에서 @perceptdot/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
175
228
  "주인에게 ROI 리포트 보고 시 사용.",
229
+ inputSchema: { type: "object", properties: {}, required: [] },
230
+ },
231
+ {
232
+ name: "percept_feedback",
233
+ description: "무료 플랜 100콜 도달 시 피드백을 제출하여 100콜을 추가로 잠금 해제합니다. " +
234
+ "rating(1~5)과 comment(최대 150자)를 입력하세요.",
176
235
  inputSchema: {
177
236
  type: "object",
178
- properties: {},
179
- required: [],
237
+ properties: {
238
+ rating: { type: "number", description: "별점 1~5", minimum: 1, maximum: 5 },
239
+ comment: { type: "string", description: "사용 후기 (최대 150자). 솔직하게 작성.", maxLength: 150 },
240
+ },
241
+ required: ["rating", "comment"],
180
242
  },
181
243
  },
182
244
  ],
@@ -185,10 +247,43 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
185
247
  const { name, arguments: args } = request.params;
186
248
  const startTime = Date.now();
187
249
  try {
250
+ // 플랜 체크 (percept_roi_summary, percept_feedback는 항상 허용)
251
+ if (name !== "percept_roi_summary" && name !== "percept_feedback") {
252
+ const usage = await checkAndUse();
253
+ if (!usage.allowed) {
254
+ const msg = usage.needs_feedback ? makeFeedbackRequestMessage() : (usage.message ?? "Call limit reached → https://perceptdot.com");
255
+ return { content: [{ type: "text", text: msg }] };
256
+ }
257
+ }
188
258
  // ROI 리포트 (API 호출 없음)
189
259
  if (name === "percept_roi_summary") {
190
260
  return { content: [{ type: "text", text: getRoiSummary() }] };
191
261
  }
262
+ // 피드백 제출 (무료 키 전용)
263
+ if (name === "percept_feedback") {
264
+ if (!PERCEPT_API_KEY || !PERCEPT_API_KEY.startsWith("pd_free_")) {
265
+ return { content: [{ type: "text", text: "percept_feedback is for free plan only. You have unlimited calls." }] };
266
+ }
267
+ const a = args;
268
+ if (!a.rating || a.rating < 1 || a.rating > 5)
269
+ return { content: [{ type: "text", text: "rating must be 1-5." }] };
270
+ if (!a.comment || a.comment.trim().length === 0)
271
+ return { content: [{ type: "text", text: "comment is required (max 150 chars)." }] };
272
+ try {
273
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/feedback`, {
274
+ method: "POST",
275
+ headers: { "Content-Type": "application/json" },
276
+ body: JSON.stringify({ key: PERCEPT_API_KEY, rating: Math.round(a.rating), comment: a.comment.trim().slice(0, 150) }),
277
+ });
278
+ const data = await res.json();
279
+ if (data.ok)
280
+ return { content: [{ type: "text", text: `Feedback submitted! ${data.message ?? ""}\nCalls remaining: ${data.calls_remaining ?? "unknown"}` }] };
281
+ return { content: [{ type: "text", text: `Feedback error: ${data.error ?? "unknown"}` }] };
282
+ }
283
+ catch (e) {
284
+ return { content: [{ type: "text", text: `Failed to submit feedback: ${e}` }] };
285
+ }
286
+ }
192
287
  // 실시간 데이터
193
288
  if (name === "ga4_realtime") {
194
289
  const propertyId = resolvePropertyId(args?.project);
@@ -332,5 +427,5 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
332
427
  });
333
428
  const transport = new StdioServerTransport();
334
429
  await server.connect(transport);
335
- process.stderr.write("[perceptdot/ga4] v0.2.0 실행 중 — perceptdot.com\n");
430
+ process.stderr.write("[perceptdot/ga4] v0.2.2 실행 중 — perceptdot.com\n");
336
431
  //# 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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perceptdot/ga4",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
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
@@ -35,6 +35,60 @@ 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 SESSION_FREE_LIMIT = 10;
42
+
43
+ let planCache: { plan: "free" | "pro" | "team"; expires: number } | null = null;
44
+
45
+ interface UseResult { allowed: boolean; needs_feedback: boolean; message?: string; }
46
+
47
+ async function checkAndUse(): Promise<UseResult> {
48
+ if (!PERCEPT_API_KEY) {
49
+ if (metrics.calls_count >= SESSION_FREE_LIMIT) {
50
+ return { allowed: false, needs_feedback: false, message: "PERCEPT FREE LIMIT REACHED (10 calls/session).\nGet a free key for 200 calls → https://perceptdot.com" };
51
+ }
52
+ return { allowed: true, needs_feedback: false };
53
+ }
54
+ if (PERCEPT_API_KEY.startsWith("pd_free_")) {
55
+ try {
56
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/use`, {
57
+ method: "POST",
58
+ headers: { "Content-Type": "application/json" },
59
+ body: JSON.stringify({ key: PERCEPT_API_KEY }),
60
+ });
61
+ if (res.ok) {
62
+ const data = await res.json() as { allowed: boolean; needs_feedback?: boolean; message?: string };
63
+ if (!data.allowed) return { allowed: false, needs_feedback: data.needs_feedback ?? false, message: data.message };
64
+ return { allowed: true, needs_feedback: false };
65
+ }
66
+ } catch {}
67
+ return { allowed: true, needs_feedback: false };
68
+ }
69
+ if (planCache && Date.now() < planCache.expires) return { allowed: true, needs_feedback: false };
70
+ try {
71
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/validate?key=${PERCEPT_API_KEY}`);
72
+ if (res.ok) {
73
+ const data = await res.json() as { valid: boolean; plan: string };
74
+ planCache = { plan: (data.valid ? data.plan : "free") as "free" | "pro" | "team", expires: Date.now() + 5 * 60 * 1000 };
75
+ if (!data.valid) return { allowed: false, needs_feedback: false, message: "Invalid PERCEPT_API_KEY. Check your key at perceptdot.com" };
76
+ }
77
+ } catch {}
78
+ return { allowed: true, needs_feedback: false };
79
+ }
80
+
81
+ function makeFeedbackRequestMessage(): string {
82
+ const usd = (metrics.tokens_saved_estimate / 1_000_000) * 3.0;
83
+ return [
84
+ "PERCEPT FREE QUOTA REACHED (100 calls).",
85
+ `This session: ${metrics.calls_count} calls, ~${metrics.tokens_saved_estimate} tokens saved ($${usd.toFixed(4)}).`,
86
+ "",
87
+ "Submit feedback to unlock 100 more calls → use `percept_feedback` tool with rating (1-5) and comment (max 150 chars).",
88
+ "Or upgrade to Pro ($19/mo) → https://perceptdot.com",
89
+ ].join("\n");
90
+ }
91
+
38
92
  function getRoiSummary(): string {
39
93
  const usd_saved =
40
94
  (metrics.tokens_saved_estimate / 1_000_000) * TOKEN_PRICE_PER_MILLION;
@@ -114,7 +168,7 @@ try {
114
168
 
115
169
  // ─── MCP 서버 ─────────────────────────────────────────────────────────────────
116
170
  const server = new Server(
117
- { name: "@perceptdot/ga4", version: "0.2.0" },
171
+ { name: "@perceptdot/ga4", version: "0.2.2" },
118
172
  { capabilities: { tools: {} } }
119
173
  );
120
174
 
@@ -206,10 +260,20 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
206
260
  description:
207
261
  "이 세션에서 @perceptdot/ga4가 절감한 토큰·비용·시간을 보고합니다. " +
208
262
  "주인에게 ROI 리포트 보고 시 사용.",
263
+ inputSchema: { type: "object", properties: {}, required: [] },
264
+ },
265
+ {
266
+ name: "percept_feedback",
267
+ description:
268
+ "무료 플랜 100콜 도달 시 피드백을 제출하여 100콜을 추가로 잠금 해제합니다. " +
269
+ "rating(1~5)과 comment(최대 150자)를 입력하세요.",
209
270
  inputSchema: {
210
271
  type: "object",
211
- properties: {},
212
- required: [],
272
+ properties: {
273
+ rating: { type: "number", description: "별점 1~5", minimum: 1, maximum: 5 },
274
+ comment: { type: "string", description: "사용 후기 (최대 150자). 솔직하게 작성.", maxLength: 150 },
275
+ },
276
+ required: ["rating", "comment"],
213
277
  },
214
278
  },
215
279
  ],
@@ -220,11 +284,42 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
220
284
  const startTime = Date.now();
221
285
 
222
286
  try {
287
+ // 플랜 체크 (percept_roi_summary, percept_feedback는 항상 허용)
288
+ if (name !== "percept_roi_summary" && name !== "percept_feedback") {
289
+ const usage = await checkAndUse();
290
+ if (!usage.allowed) {
291
+ const msg = usage.needs_feedback ? makeFeedbackRequestMessage() : (usage.message ?? "Call limit reached → https://perceptdot.com");
292
+ return { content: [{ type: "text", text: msg }] };
293
+ }
294
+ }
295
+
223
296
  // ROI 리포트 (API 호출 없음)
224
297
  if (name === "percept_roi_summary") {
225
298
  return { content: [{ type: "text", text: getRoiSummary() }] };
226
299
  }
227
300
 
301
+ // 피드백 제출 (무료 키 전용)
302
+ if (name === "percept_feedback") {
303
+ if (!PERCEPT_API_KEY || !PERCEPT_API_KEY.startsWith("pd_free_")) {
304
+ return { content: [{ type: "text", text: "percept_feedback is for free plan only. You have unlimited calls." }] };
305
+ }
306
+ const a = args as { rating?: number; comment?: string };
307
+ if (!a.rating || a.rating < 1 || a.rating > 5) return { content: [{ type: "text", text: "rating must be 1-5." }] };
308
+ if (!a.comment || a.comment.trim().length === 0) return { content: [{ type: "text", text: "comment is required (max 150 chars)." }] };
309
+ try {
310
+ const res = await fetch(`${PERCEPT_API_BASE}/v1/feedback`, {
311
+ method: "POST",
312
+ headers: { "Content-Type": "application/json" },
313
+ body: JSON.stringify({ key: PERCEPT_API_KEY, rating: Math.round(a.rating), comment: a.comment.trim().slice(0, 150) }),
314
+ });
315
+ const data = await res.json() as { ok?: boolean; message?: string; error?: string; calls_remaining?: number };
316
+ if (data.ok) return { content: [{ type: "text", text: `Feedback submitted! ${data.message ?? ""}\nCalls remaining: ${data.calls_remaining ?? "unknown"}` }] };
317
+ return { content: [{ type: "text", text: `Feedback error: ${data.error ?? "unknown"}` }] };
318
+ } catch (e) {
319
+ return { content: [{ type: "text", text: `Failed to submit feedback: ${e}` }] };
320
+ }
321
+ }
322
+
228
323
  // 실시간 데이터
229
324
  if (name === "ga4_realtime") {
230
325
  const propertyId = resolvePropertyId((args as Record<string, string>)?.project);
@@ -408,4 +503,4 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
408
503
 
409
504
  const transport = new StdioServerTransport();
410
505
  await server.connect(transport);
411
- process.stderr.write("[perceptdot/ga4] v0.2.0 실행 중 — perceptdot.com\n");
506
+ process.stderr.write("[perceptdot/ga4] v0.2.2 실행 중 — perceptdot.com\n");