market-data-analyzer 2.0.1 → 2.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.
- package/dist/index.js +55 -6
- 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 +55 -6
- package/src/license.ts +143 -0
package/dist/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { handleAnalyzePortfolio } from "./tools/analyze_portfolio.js";
|
|
|
19
19
|
import { handleCompareAssets } from "./tools/compare_assets.js";
|
|
20
20
|
import { handleMarketOverview } from "./tools/market_overview.js";
|
|
21
21
|
import { handleCryptoAnalysis } from "./tools/crypto_analysis.js";
|
|
22
|
+
import { checkLicense } from "./license.js";
|
|
22
23
|
// ---------------------------------------------------------------------------
|
|
23
24
|
// Tool registration helper (reused for per-session servers in SSE mode)
|
|
24
25
|
// ---------------------------------------------------------------------------
|
|
@@ -31,9 +32,17 @@ function registerTools(server) {
|
|
|
31
32
|
.string()
|
|
32
33
|
.describe("Stock ticker symbol (e.g. 'AAPL', 'MSFT', 'TSLA')"),
|
|
33
34
|
}, async ({ symbol }) => {
|
|
35
|
+
const license = checkLicense("market-data-analyzer");
|
|
36
|
+
if (!license.valid) {
|
|
37
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
38
|
+
}
|
|
34
39
|
try {
|
|
35
40
|
const result = await handleAnalyzeStock(symbol.toUpperCase());
|
|
36
|
-
|
|
41
|
+
const content = [{ type: "text", text: result }];
|
|
42
|
+
if (license.trial && license.message) {
|
|
43
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
44
|
+
}
|
|
45
|
+
return { content };
|
|
37
46
|
}
|
|
38
47
|
catch (err) {
|
|
39
48
|
return {
|
|
@@ -73,9 +82,17 @@ function registerTools(server) {
|
|
|
73
82
|
.optional()
|
|
74
83
|
.describe("Max results to return (default: 25)"),
|
|
75
84
|
}, async (criteria) => {
|
|
85
|
+
const license = checkLicense("market-data-analyzer");
|
|
86
|
+
if (!license.valid) {
|
|
87
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
88
|
+
}
|
|
76
89
|
try {
|
|
77
90
|
const result = await handleScreenStocks(criteria);
|
|
78
|
-
|
|
91
|
+
const content = [{ type: "text", text: result }];
|
|
92
|
+
if (license.trial && license.message) {
|
|
93
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
94
|
+
}
|
|
95
|
+
return { content };
|
|
79
96
|
}
|
|
80
97
|
catch (err) {
|
|
81
98
|
return {
|
|
@@ -102,9 +119,17 @@ function registerTools(server) {
|
|
|
102
119
|
.min(1)
|
|
103
120
|
.describe("Array of portfolio holdings"),
|
|
104
121
|
}, async ({ holdings }) => {
|
|
122
|
+
const license = checkLicense("market-data-analyzer");
|
|
123
|
+
if (!license.valid) {
|
|
124
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
125
|
+
}
|
|
105
126
|
try {
|
|
106
127
|
const result = await handleAnalyzePortfolio(holdings);
|
|
107
|
-
|
|
128
|
+
const content = [{ type: "text", text: result }];
|
|
129
|
+
if (license.trial && license.message) {
|
|
130
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
131
|
+
}
|
|
132
|
+
return { content };
|
|
108
133
|
}
|
|
109
134
|
catch (err) {
|
|
110
135
|
return {
|
|
@@ -132,9 +157,17 @@ function registerTools(server) {
|
|
|
132
157
|
.optional()
|
|
133
158
|
.describe("Comparison period (default: '6mo')"),
|
|
134
159
|
}, async ({ symbols, period }) => {
|
|
160
|
+
const license = checkLicense("market-data-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 = await handleCompareAssets(symbols.map((s) => s.toUpperCase()), period ?? "6mo");
|
|
137
|
-
|
|
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 };
|
|
138
171
|
}
|
|
139
172
|
catch (err) {
|
|
140
173
|
return {
|
|
@@ -152,9 +185,17 @@ function registerTools(server) {
|
|
|
152
185
|
// Tool: market_overview
|
|
153
186
|
// ---------------------------------------------------------------------------
|
|
154
187
|
server.tool("market_overview", "Current market snapshot: major indices (S&P 500, NASDAQ, DOW), sector performance via ETFs, market breadth indicators, VIX, crypto, and commodities. Live data from Yahoo Finance.", {}, async () => {
|
|
188
|
+
const license = checkLicense("market-data-analyzer");
|
|
189
|
+
if (!license.valid) {
|
|
190
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
191
|
+
}
|
|
155
192
|
try {
|
|
156
193
|
const result = await handleMarketOverview();
|
|
157
|
-
|
|
194
|
+
const content = [{ type: "text", text: result }];
|
|
195
|
+
if (license.trial && license.message) {
|
|
196
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
197
|
+
}
|
|
198
|
+
return { content };
|
|
158
199
|
}
|
|
159
200
|
catch (err) {
|
|
160
201
|
return {
|
|
@@ -176,9 +217,17 @@ function registerTools(server) {
|
|
|
176
217
|
.string()
|
|
177
218
|
.describe("Cryptocurrency symbol or name (e.g. 'BTC', 'ETH', 'SOL', 'bitcoin')"),
|
|
178
219
|
}, async ({ symbol }) => {
|
|
220
|
+
const license = checkLicense("market-data-analyzer");
|
|
221
|
+
if (!license.valid) {
|
|
222
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
223
|
+
}
|
|
179
224
|
try {
|
|
180
225
|
const result = await handleCryptoAnalysis(symbol);
|
|
181
|
-
|
|
226
|
+
const content = [{ type: "text", text: result }];
|
|
227
|
+
if (license.trial && license.message) {
|
|
228
|
+
content.push({ type: "text", text: "\n\n" + license.message });
|
|
229
|
+
}
|
|
230
|
+
return { content };
|
|
182
231
|
}
|
|
183
232
|
catch (err) {
|
|
184
233
|
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": "market-data-analyzer",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "MCP server for financial market data analysis -- live stock analysis, screening, portfolio analytics, crypto analysis, and market overview using free APIs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/index.ts
CHANGED
|
@@ -22,6 +22,7 @@ import { handleAnalyzePortfolio } from "./tools/analyze_portfolio.js";
|
|
|
22
22
|
import { handleCompareAssets } from "./tools/compare_assets.js";
|
|
23
23
|
import { handleMarketOverview } from "./tools/market_overview.js";
|
|
24
24
|
import { handleCryptoAnalysis } from "./tools/crypto_analysis.js";
|
|
25
|
+
import { checkLicense } from "./license.js";
|
|
25
26
|
|
|
26
27
|
// ---------------------------------------------------------------------------
|
|
27
28
|
// Tool registration helper (reused for per-session servers in SSE mode)
|
|
@@ -42,9 +43,17 @@ server.tool(
|
|
|
42
43
|
.describe("Stock ticker symbol (e.g. 'AAPL', 'MSFT', 'TSLA')"),
|
|
43
44
|
},
|
|
44
45
|
async ({ symbol }) => {
|
|
46
|
+
const license = checkLicense("market-data-analyzer");
|
|
47
|
+
if (!license.valid) {
|
|
48
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
49
|
+
}
|
|
45
50
|
try {
|
|
46
51
|
const result = await handleAnalyzeStock(symbol.toUpperCase());
|
|
47
|
-
|
|
52
|
+
const content = [{ type: "text" as const, text: result }];
|
|
53
|
+
if (license.trial && license.message) {
|
|
54
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
55
|
+
}
|
|
56
|
+
return { content };
|
|
48
57
|
} catch (err) {
|
|
49
58
|
return {
|
|
50
59
|
content: [
|
|
@@ -90,9 +99,17 @@ server.tool(
|
|
|
90
99
|
.describe("Max results to return (default: 25)"),
|
|
91
100
|
},
|
|
92
101
|
async (criteria) => {
|
|
102
|
+
const license = checkLicense("market-data-analyzer");
|
|
103
|
+
if (!license.valid) {
|
|
104
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
105
|
+
}
|
|
93
106
|
try {
|
|
94
107
|
const result = await handleScreenStocks(criteria);
|
|
95
|
-
|
|
108
|
+
const content = [{ type: "text" as const, text: result }];
|
|
109
|
+
if (license.trial && license.message) {
|
|
110
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
111
|
+
}
|
|
112
|
+
return { content };
|
|
96
113
|
} catch (err) {
|
|
97
114
|
return {
|
|
98
115
|
content: [
|
|
@@ -127,9 +144,17 @@ server.tool(
|
|
|
127
144
|
.describe("Array of portfolio holdings"),
|
|
128
145
|
},
|
|
129
146
|
async ({ holdings }) => {
|
|
147
|
+
const license = checkLicense("market-data-analyzer");
|
|
148
|
+
if (!license.valid) {
|
|
149
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
150
|
+
}
|
|
130
151
|
try {
|
|
131
152
|
const result = await handleAnalyzePortfolio(holdings);
|
|
132
|
-
|
|
153
|
+
const content = [{ type: "text" as const, text: result }];
|
|
154
|
+
if (license.trial && license.message) {
|
|
155
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
156
|
+
}
|
|
157
|
+
return { content };
|
|
133
158
|
} catch (err) {
|
|
134
159
|
return {
|
|
135
160
|
content: [
|
|
@@ -163,12 +188,20 @@ server.tool(
|
|
|
163
188
|
.describe("Comparison period (default: '6mo')"),
|
|
164
189
|
},
|
|
165
190
|
async ({ symbols, period }) => {
|
|
191
|
+
const license = checkLicense("market-data-analyzer");
|
|
192
|
+
if (!license.valid) {
|
|
193
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
194
|
+
}
|
|
166
195
|
try {
|
|
167
196
|
const result = await handleCompareAssets(
|
|
168
197
|
symbols.map((s) => s.toUpperCase()),
|
|
169
198
|
period ?? "6mo",
|
|
170
199
|
);
|
|
171
|
-
|
|
200
|
+
const content = [{ type: "text" as const, text: result }];
|
|
201
|
+
if (license.trial && license.message) {
|
|
202
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
203
|
+
}
|
|
204
|
+
return { content };
|
|
172
205
|
} catch (err) {
|
|
173
206
|
return {
|
|
174
207
|
content: [
|
|
@@ -192,9 +225,17 @@ server.tool(
|
|
|
192
225
|
"Current market snapshot: major indices (S&P 500, NASDAQ, DOW), sector performance via ETFs, market breadth indicators, VIX, crypto, and commodities. Live data from Yahoo Finance.",
|
|
193
226
|
{},
|
|
194
227
|
async () => {
|
|
228
|
+
const license = checkLicense("market-data-analyzer");
|
|
229
|
+
if (!license.valid) {
|
|
230
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
231
|
+
}
|
|
195
232
|
try {
|
|
196
233
|
const result = await handleMarketOverview();
|
|
197
|
-
|
|
234
|
+
const content = [{ type: "text" as const, text: result }];
|
|
235
|
+
if (license.trial && license.message) {
|
|
236
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
237
|
+
}
|
|
238
|
+
return { content };
|
|
198
239
|
} catch (err) {
|
|
199
240
|
return {
|
|
200
241
|
content: [
|
|
@@ -222,9 +263,17 @@ server.tool(
|
|
|
222
263
|
.describe("Cryptocurrency symbol or name (e.g. 'BTC', 'ETH', 'SOL', 'bitcoin')"),
|
|
223
264
|
},
|
|
224
265
|
async ({ symbol }) => {
|
|
266
|
+
const license = checkLicense("market-data-analyzer");
|
|
267
|
+
if (!license.valid) {
|
|
268
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
269
|
+
}
|
|
225
270
|
try {
|
|
226
271
|
const result = await handleCryptoAnalysis(symbol);
|
|
227
|
-
|
|
272
|
+
const content = [{ type: "text" as const, text: result }];
|
|
273
|
+
if (license.trial && license.message) {
|
|
274
|
+
content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
275
|
+
}
|
|
276
|
+
return { content };
|
|
228
277
|
} catch (err) {
|
|
229
278
|
return {
|
|
230
279
|
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
|
+
}
|