ai-cost-analyzer 1.0.1 → 1.1.0
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.
Potentially problematic release.
This version of ai-cost-analyzer might be problematic. Click here for more details.
- package/dist/index.js +46 -15
- package/dist/index.js.map +1 -1
- package/dist/license.d.ts +36 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +110 -0
- package/dist/license.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +46 -15
- package/src/license.ts +143 -0
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { handleEstimateSavings } from "./tools/savings.js";
|
|
|
15
15
|
import { handleOptimizePrompt } from "./tools/optimize.js";
|
|
16
16
|
import { handleCompareModels } from "./tools/compare.js";
|
|
17
17
|
import { handleGetPricing } from "./tools/pricing.js";
|
|
18
|
+
import { checkLicense } from "./license.js";
|
|
18
19
|
// ---------------------------------------------------------------------------
|
|
19
20
|
// Zod schemas for tool inputs
|
|
20
21
|
// ---------------------------------------------------------------------------
|
|
@@ -40,11 +41,17 @@ const server = new McpServer({
|
|
|
40
41
|
server.tool("analyze_usage", "Analyze AI API usage data and return cost breakdowns by model, average cost per request, token waste estimation, and daily/weekly trends.", {
|
|
41
42
|
usage_data: z.array(UsageRecordSchema).describe("Array of API usage records with model, tokens, and timestamps"),
|
|
42
43
|
}, async ({ usage_data }) => {
|
|
44
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
45
|
+
if (!license.valid) {
|
|
46
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
47
|
+
}
|
|
43
48
|
try {
|
|
44
49
|
const result = handleAnalyzeUsage(usage_data);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
const content = [{ type: "text", text: result }];
|
|
51
|
+
if (license.trial && license.message) {
|
|
52
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
53
|
+
}
|
|
54
|
+
return { content };
|
|
48
55
|
}
|
|
49
56
|
catch (err) {
|
|
50
57
|
return {
|
|
@@ -63,11 +70,17 @@ server.tool("estimate_savings", "Estimate potential monthly savings from prompt
|
|
|
63
70
|
usage_data: z.array(UsageRecordSchema).describe("Array of API usage records representing current usage patterns"),
|
|
64
71
|
monthly_multiplier: z.number().min(1).optional().describe("If the usage_data is a sample, multiply costs by this factor to project monthly totals (default: 1)"),
|
|
65
72
|
}, async ({ usage_data, monthly_multiplier }) => {
|
|
73
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
74
|
+
if (!license.valid) {
|
|
75
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
76
|
+
}
|
|
66
77
|
try {
|
|
67
78
|
const result = handleEstimateSavings(usage_data, monthly_multiplier);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
const content = [{ type: "text", text: result }];
|
|
80
|
+
if (license.trial && license.message) {
|
|
81
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
82
|
+
}
|
|
83
|
+
return { content };
|
|
71
84
|
}
|
|
72
85
|
catch (err) {
|
|
73
86
|
return {
|
|
@@ -88,11 +101,17 @@ server.tool("optimize_prompt", "Analyze a system prompt and tool definitions, re
|
|
|
88
101
|
requests_per_month: z.number().int().min(1).optional().describe("Estimated requests per month for cost projection (default: 10,000)"),
|
|
89
102
|
model: z.string().optional().describe("Model name for pricing calculation (default: claude-sonnet)"),
|
|
90
103
|
}, async ({ system_prompt, tool_definitions, requests_per_month, model }) => {
|
|
104
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
105
|
+
if (!license.valid) {
|
|
106
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
107
|
+
}
|
|
91
108
|
try {
|
|
92
109
|
const result = handleOptimizePrompt(system_prompt, tool_definitions, requests_per_month, model);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
110
|
+
const content = [{ type: "text", text: result }];
|
|
111
|
+
if (license.trial && license.message) {
|
|
112
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
113
|
+
}
|
|
114
|
+
return { content };
|
|
96
115
|
}
|
|
97
116
|
catch (err) {
|
|
98
117
|
return {
|
|
@@ -112,11 +131,17 @@ server.tool("compare_models", "Compare cost and quality tradeoffs across Claude,
|
|
|
112
131
|
estimated_input_tokens: z.number().int().min(1).optional().describe("Override estimated input tokens per request"),
|
|
113
132
|
estimated_output_tokens: z.number().int().min(1).optional().describe("Override estimated output tokens per request"),
|
|
114
133
|
}, async ({ task_description, estimated_input_tokens, estimated_output_tokens }) => {
|
|
134
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
135
|
+
if (!license.valid) {
|
|
136
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
137
|
+
}
|
|
115
138
|
try {
|
|
116
139
|
const result = handleCompareModels(task_description, estimated_input_tokens, estimated_output_tokens);
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
140
|
+
const content = [{ type: "text", text: result }];
|
|
141
|
+
if (license.trial && license.message) {
|
|
142
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
143
|
+
}
|
|
144
|
+
return { content };
|
|
120
145
|
}
|
|
121
146
|
catch (err) {
|
|
122
147
|
return {
|
|
@@ -132,11 +157,17 @@ server.tool("compare_models", "Compare cost and quality tradeoffs across Claude,
|
|
|
132
157
|
// Tool: get_pricing
|
|
133
158
|
// ---------------------------------------------------------------------------
|
|
134
159
|
server.tool("get_pricing", "Return current pricing for all major LLM APIs (Claude, OpenAI, Gemini) with input, output, and cached token rates per million tokens.", {}, async () => {
|
|
160
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
161
|
+
if (!license.valid) {
|
|
162
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
163
|
+
}
|
|
135
164
|
try {
|
|
136
165
|
const result = handleGetPricing();
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
166
|
+
const content = [{ type: "text", text: result }];
|
|
167
|
+
if (license.trial && license.message) {
|
|
168
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
169
|
+
}
|
|
170
|
+
return { content };
|
|
140
171
|
}
|
|
141
172
|
catch (err) {
|
|
142
173
|
return {
|
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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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared license validation for AIVP MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* License keys are HMAC-SHA256 signed strings in the format:
|
|
5
|
+
* base64(email:product:expiry):signature
|
|
6
|
+
*
|
|
7
|
+
* The server validates locally — no network call needed.
|
|
8
|
+
*
|
|
9
|
+
* Without a key, users get a free trial (limited calls).
|
|
10
|
+
* With a valid key, usage is unlimited.
|
|
11
|
+
*/
|
|
12
|
+
export interface LicenseResult {
|
|
13
|
+
valid: boolean;
|
|
14
|
+
message?: string;
|
|
15
|
+
trial?: boolean;
|
|
16
|
+
remaining?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate a license key for a given email and product.
|
|
20
|
+
* Used by the key generation script, not by the server itself.
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateLicenseKey(email: string, product: string, expiryDays?: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Validate a license key for a given product.
|
|
25
|
+
* Returns { valid: true } if the key is valid for this product.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateLicenseKey(key: string, product: string): LicenseResult;
|
|
28
|
+
/**
|
|
29
|
+
* Check if the current call is allowed.
|
|
30
|
+
* Call this at the start of every tool handler.
|
|
31
|
+
*
|
|
32
|
+
* - If LICENSE_KEY env var is set and valid: always allowed
|
|
33
|
+
* - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
|
|
34
|
+
*/
|
|
35
|
+
export declare function checkLicense(product: string): LicenseResult;
|
|
36
|
+
//# sourceMappingURL=license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,GACvB,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,aAAa,CAyCf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAkC3D"}
|
package/dist/license.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared license validation for AIVP MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* License keys are HMAC-SHA256 signed strings in the format:
|
|
5
|
+
* base64(email:product:expiry):signature
|
|
6
|
+
*
|
|
7
|
+
* The server validates locally — no network call needed.
|
|
8
|
+
*
|
|
9
|
+
* Without a key, users get a free trial (limited calls).
|
|
10
|
+
* With a valid key, usage is unlimited.
|
|
11
|
+
*/
|
|
12
|
+
import { createHmac } from "node:crypto";
|
|
13
|
+
// This secret is used to sign/verify license keys.
|
|
14
|
+
// In production, this should be injected via env var, but for local
|
|
15
|
+
// validation of HMAC-signed keys, it must be embedded.
|
|
16
|
+
const LICENSE_SECRET = process.env.AIVP_LICENSE_SECRET ?? "aivp-mcp-2026-s3cr3t-k3y";
|
|
17
|
+
const FREE_TRIAL_LIMIT = 3;
|
|
18
|
+
// In-memory call counter for free trial
|
|
19
|
+
const callCounts = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Generate a license key for a given email and product.
|
|
22
|
+
* Used by the key generation script, not by the server itself.
|
|
23
|
+
*/
|
|
24
|
+
export function generateLicenseKey(email, product, expiryDays = 365) {
|
|
25
|
+
const expiry = new Date(Date.now() + expiryDays * 24 * 60 * 60 * 1000).toISOString().split("T")[0];
|
|
26
|
+
const payload = `${email}:${product}:${expiry}`;
|
|
27
|
+
const payloadB64 = Buffer.from(payload).toString("base64url");
|
|
28
|
+
const signature = createHmac("sha256", LICENSE_SECRET)
|
|
29
|
+
.update(payload)
|
|
30
|
+
.digest("base64url");
|
|
31
|
+
return `${payloadB64}.${signature}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate a license key for a given product.
|
|
35
|
+
* Returns { valid: true } if the key is valid for this product.
|
|
36
|
+
*/
|
|
37
|
+
export function validateLicenseKey(key, product) {
|
|
38
|
+
try {
|
|
39
|
+
const [payloadB64, signature] = key.split(".");
|
|
40
|
+
if (!payloadB64 || !signature) {
|
|
41
|
+
return { valid: false, message: "Invalid key format" };
|
|
42
|
+
}
|
|
43
|
+
const payload = Buffer.from(payloadB64, "base64url").toString("utf-8");
|
|
44
|
+
const [email, keyProduct, expiry] = payload.split(":");
|
|
45
|
+
if (!email || !keyProduct || !expiry) {
|
|
46
|
+
return { valid: false, message: "Invalid key format" };
|
|
47
|
+
}
|
|
48
|
+
// Verify signature
|
|
49
|
+
const expectedSignature = createHmac("sha256", LICENSE_SECRET)
|
|
50
|
+
.update(payload)
|
|
51
|
+
.digest("base64url");
|
|
52
|
+
if (signature !== expectedSignature) {
|
|
53
|
+
return { valid: false, message: "Invalid license key" };
|
|
54
|
+
}
|
|
55
|
+
// Check product match (allow "all" for bundle keys)
|
|
56
|
+
if (keyProduct !== product && keyProduct !== "all") {
|
|
57
|
+
return {
|
|
58
|
+
valid: false,
|
|
59
|
+
message: `This key is for "${keyProduct}", not "${product}"`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Check expiry
|
|
63
|
+
const expiryDate = new Date(expiry);
|
|
64
|
+
if (isNaN(expiryDate.getTime()) || expiryDate < new Date()) {
|
|
65
|
+
return { valid: false, message: "License key has expired" };
|
|
66
|
+
}
|
|
67
|
+
return { valid: true };
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return { valid: false, message: "Invalid license key" };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if the current call is allowed.
|
|
75
|
+
* Call this at the start of every tool handler.
|
|
76
|
+
*
|
|
77
|
+
* - If LICENSE_KEY env var is set and valid: always allowed
|
|
78
|
+
* - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
|
|
79
|
+
*/
|
|
80
|
+
export function checkLicense(product) {
|
|
81
|
+
const key = process.env.LICENSE_KEY ?? process.env.AIVP_LICENSE_KEY;
|
|
82
|
+
if (key) {
|
|
83
|
+
const result = validateLicenseKey(key, product);
|
|
84
|
+
if (result.valid) {
|
|
85
|
+
return { valid: true };
|
|
86
|
+
}
|
|
87
|
+
// Invalid key — still return the error, don't fall through to trial
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
// No key — free trial mode
|
|
91
|
+
const count = (callCounts.get(product) ?? 0) + 1;
|
|
92
|
+
callCounts.set(product, count);
|
|
93
|
+
if (count <= FREE_TRIAL_LIMIT) {
|
|
94
|
+
return {
|
|
95
|
+
valid: true,
|
|
96
|
+
trial: true,
|
|
97
|
+
remaining: FREE_TRIAL_LIMIT - count,
|
|
98
|
+
message: count === FREE_TRIAL_LIMIT
|
|
99
|
+
? `⚠️ Free trial ended. Purchase a license at https://aivp-mcp.vercel.app`
|
|
100
|
+
: `Free trial: ${FREE_TRIAL_LIMIT - count} calls remaining. Get unlimited access at https://aivp-mcp.vercel.app`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
valid: false,
|
|
105
|
+
trial: true,
|
|
106
|
+
remaining: 0,
|
|
107
|
+
message: `🔒 Free trial limit reached (${FREE_TRIAL_LIMIT} calls). Purchase a license at https://aivp-mcp.vercel.app to continue using this tool.`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-cost-analyzer",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "MCP server that helps developers understand and reduce their AI API costs through usage analysis, savings estimation, prompt optimization, and model comparison.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import { handleEstimateSavings } from "./tools/savings.js";
|
|
|
18
18
|
import { handleOptimizePrompt } from "./tools/optimize.js";
|
|
19
19
|
import { handleCompareModels } from "./tools/compare.js";
|
|
20
20
|
import { handleGetPricing } from "./tools/pricing.js";
|
|
21
|
+
import { checkLicense } from "./license.js";
|
|
21
22
|
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
24
|
// Zod schemas for tool inputs
|
|
@@ -55,11 +56,17 @@ server.tool(
|
|
|
55
56
|
),
|
|
56
57
|
},
|
|
57
58
|
async ({ usage_data }) => {
|
|
59
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
60
|
+
if (!license.valid) {
|
|
61
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
62
|
+
}
|
|
58
63
|
try {
|
|
59
64
|
const result = handleAnalyzeUsage(usage_data);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
65
|
+
const content = [{ type: "text" as const, text: result }];
|
|
66
|
+
if (license.trial && license.message) {
|
|
67
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
68
|
+
}
|
|
69
|
+
return { content };
|
|
63
70
|
} catch (err) {
|
|
64
71
|
return {
|
|
65
72
|
content: [{
|
|
@@ -88,11 +95,17 @@ server.tool(
|
|
|
88
95
|
),
|
|
89
96
|
},
|
|
90
97
|
async ({ usage_data, monthly_multiplier }) => {
|
|
98
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
99
|
+
if (!license.valid) {
|
|
100
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
101
|
+
}
|
|
91
102
|
try {
|
|
92
103
|
const result = handleEstimateSavings(usage_data, monthly_multiplier);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
104
|
+
const content = [{ type: "text" as const, text: result }];
|
|
105
|
+
if (license.trial && license.message) {
|
|
106
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
107
|
+
}
|
|
108
|
+
return { content };
|
|
96
109
|
} catch (err) {
|
|
97
110
|
return {
|
|
98
111
|
content: [{
|
|
@@ -125,11 +138,17 @@ server.tool(
|
|
|
125
138
|
),
|
|
126
139
|
},
|
|
127
140
|
async ({ system_prompt, tool_definitions, requests_per_month, model }) => {
|
|
141
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
142
|
+
if (!license.valid) {
|
|
143
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
144
|
+
}
|
|
128
145
|
try {
|
|
129
146
|
const result = handleOptimizePrompt(system_prompt, tool_definitions, requests_per_month, model);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
147
|
+
const content = [{ type: "text" as const, text: result }];
|
|
148
|
+
if (license.trial && license.message) {
|
|
149
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
150
|
+
}
|
|
151
|
+
return { content };
|
|
133
152
|
} catch (err) {
|
|
134
153
|
return {
|
|
135
154
|
content: [{
|
|
@@ -161,15 +180,21 @@ server.tool(
|
|
|
161
180
|
),
|
|
162
181
|
},
|
|
163
182
|
async ({ task_description, estimated_input_tokens, estimated_output_tokens }) => {
|
|
183
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
184
|
+
if (!license.valid) {
|
|
185
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
186
|
+
}
|
|
164
187
|
try {
|
|
165
188
|
const result = handleCompareModels(
|
|
166
189
|
task_description,
|
|
167
190
|
estimated_input_tokens,
|
|
168
191
|
estimated_output_tokens,
|
|
169
192
|
);
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
193
|
+
const content = [{ type: "text" as const, text: result }];
|
|
194
|
+
if (license.trial && license.message) {
|
|
195
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
196
|
+
}
|
|
197
|
+
return { content };
|
|
173
198
|
} catch (err) {
|
|
174
199
|
return {
|
|
175
200
|
content: [{
|
|
@@ -191,11 +216,17 @@ server.tool(
|
|
|
191
216
|
"Return current pricing for all major LLM APIs (Claude, OpenAI, Gemini) with input, output, and cached token rates per million tokens.",
|
|
192
217
|
{},
|
|
193
218
|
async () => {
|
|
219
|
+
const license = checkLicense("ai-cost-analyzer");
|
|
220
|
+
if (!license.valid) {
|
|
221
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
222
|
+
}
|
|
194
223
|
try {
|
|
195
224
|
const result = handleGetPricing();
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
225
|
+
const content = [{ type: "text" as const, text: result }];
|
|
226
|
+
if (license.trial && license.message) {
|
|
227
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
228
|
+
}
|
|
229
|
+
return { content };
|
|
199
230
|
} catch (err) {
|
|
200
231
|
return {
|
|
201
232
|
content: [{
|
package/src/license.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared license validation for AIVP MCP servers.
|
|
3
|
+
*
|
|
4
|
+
* License keys are HMAC-SHA256 signed strings in the format:
|
|
5
|
+
* base64(email:product:expiry):signature
|
|
6
|
+
*
|
|
7
|
+
* The server validates locally — no network call needed.
|
|
8
|
+
*
|
|
9
|
+
* Without a key, users get a free trial (limited calls).
|
|
10
|
+
* With a valid key, usage is unlimited.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createHmac } from "node:crypto";
|
|
14
|
+
|
|
15
|
+
// This secret is used to sign/verify license keys.
|
|
16
|
+
// In production, this should be injected via env var, but for local
|
|
17
|
+
// validation of HMAC-signed keys, it must be embedded.
|
|
18
|
+
const LICENSE_SECRET = process.env.AIVP_LICENSE_SECRET ?? "aivp-mcp-2026-s3cr3t-k3y";
|
|
19
|
+
|
|
20
|
+
const FREE_TRIAL_LIMIT = 3;
|
|
21
|
+
|
|
22
|
+
// In-memory call counter for free trial
|
|
23
|
+
const callCounts = new Map<string, number>();
|
|
24
|
+
|
|
25
|
+
export interface LicenseResult {
|
|
26
|
+
valid: boolean;
|
|
27
|
+
message?: string;
|
|
28
|
+
trial?: boolean;
|
|
29
|
+
remaining?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Generate a license key for a given email and product.
|
|
34
|
+
* Used by the key generation script, not by the server itself.
|
|
35
|
+
*/
|
|
36
|
+
export function generateLicenseKey(
|
|
37
|
+
email: string,
|
|
38
|
+
product: string,
|
|
39
|
+
expiryDays: number = 365,
|
|
40
|
+
): string {
|
|
41
|
+
const expiry = new Date(
|
|
42
|
+
Date.now() + expiryDays * 24 * 60 * 60 * 1000,
|
|
43
|
+
).toISOString().split("T")[0];
|
|
44
|
+
const payload = `${email}:${product}:${expiry}`;
|
|
45
|
+
const payloadB64 = Buffer.from(payload).toString("base64url");
|
|
46
|
+
const signature = createHmac("sha256", LICENSE_SECRET)
|
|
47
|
+
.update(payload)
|
|
48
|
+
.digest("base64url");
|
|
49
|
+
return `${payloadB64}.${signature}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Validate a license key for a given product.
|
|
54
|
+
* Returns { valid: true } if the key is valid for this product.
|
|
55
|
+
*/
|
|
56
|
+
export function validateLicenseKey(
|
|
57
|
+
key: string,
|
|
58
|
+
product: string,
|
|
59
|
+
): LicenseResult {
|
|
60
|
+
try {
|
|
61
|
+
const [payloadB64, signature] = key.split(".");
|
|
62
|
+
if (!payloadB64 || !signature) {
|
|
63
|
+
return { valid: false, message: "Invalid key format" };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const payload = Buffer.from(payloadB64, "base64url").toString("utf-8");
|
|
67
|
+
const [email, keyProduct, expiry] = payload.split(":");
|
|
68
|
+
|
|
69
|
+
if (!email || !keyProduct || !expiry) {
|
|
70
|
+
return { valid: false, message: "Invalid key format" };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Verify signature
|
|
74
|
+
const expectedSignature = createHmac("sha256", LICENSE_SECRET)
|
|
75
|
+
.update(payload)
|
|
76
|
+
.digest("base64url");
|
|
77
|
+
|
|
78
|
+
if (signature !== expectedSignature) {
|
|
79
|
+
return { valid: false, message: "Invalid license key" };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Check product match (allow "all" for bundle keys)
|
|
83
|
+
if (keyProduct !== product && keyProduct !== "all") {
|
|
84
|
+
return {
|
|
85
|
+
valid: false,
|
|
86
|
+
message: `This key is for "${keyProduct}", not "${product}"`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Check expiry
|
|
91
|
+
const expiryDate = new Date(expiry);
|
|
92
|
+
if (isNaN(expiryDate.getTime()) || expiryDate < new Date()) {
|
|
93
|
+
return { valid: false, message: "License key has expired" };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return { valid: true };
|
|
97
|
+
} catch {
|
|
98
|
+
return { valid: false, message: "Invalid license key" };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Check if the current call is allowed.
|
|
104
|
+
* Call this at the start of every tool handler.
|
|
105
|
+
*
|
|
106
|
+
* - If LICENSE_KEY env var is set and valid: always allowed
|
|
107
|
+
* - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
|
|
108
|
+
*/
|
|
109
|
+
export function checkLicense(product: string): LicenseResult {
|
|
110
|
+
const key = process.env.LICENSE_KEY ?? process.env.AIVP_LICENSE_KEY;
|
|
111
|
+
|
|
112
|
+
if (key) {
|
|
113
|
+
const result = validateLicenseKey(key, product);
|
|
114
|
+
if (result.valid) {
|
|
115
|
+
return { valid: true };
|
|
116
|
+
}
|
|
117
|
+
// Invalid key — still return the error, don't fall through to trial
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// No key — free trial mode
|
|
122
|
+
const count = (callCounts.get(product) ?? 0) + 1;
|
|
123
|
+
callCounts.set(product, count);
|
|
124
|
+
|
|
125
|
+
if (count <= FREE_TRIAL_LIMIT) {
|
|
126
|
+
return {
|
|
127
|
+
valid: true,
|
|
128
|
+
trial: true,
|
|
129
|
+
remaining: FREE_TRIAL_LIMIT - count,
|
|
130
|
+
message:
|
|
131
|
+
count === FREE_TRIAL_LIMIT
|
|
132
|
+
? `⚠️ Free trial ended. Purchase a license at https://aivp-mcp.vercel.app`
|
|
133
|
+
: `Free trial: ${FREE_TRIAL_LIMIT - count} calls remaining. Get unlimited access at https://aivp-mcp.vercel.app`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
valid: false,
|
|
139
|
+
trial: true,
|
|
140
|
+
remaining: 0,
|
|
141
|
+
message: `🔒 Free trial limit reached (${FREE_TRIAL_LIMIT} calls). Purchase a license at https://aivp-mcp.vercel.app to continue using this tool.`,
|
|
142
|
+
};
|
|
143
|
+
}
|