data-aggregator-mcp 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 data-aggregator-mcp might be problematic. Click here for more details.
- package/dist/index.js +133 -12
- 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 +133 -12
- package/src/license.ts +143 -0
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ import { queryWeather } from "./tools/weather.js";
|
|
|
20
20
|
import { queryExchangeRates } from "./tools/exchange.js";
|
|
21
21
|
import { queryPublicData } from "./tools/public-data.js";
|
|
22
22
|
import { cache } from "./utils/cache.js";
|
|
23
|
+
import { checkLicense } from "./license.js";
|
|
23
24
|
// ─── Server Setup ──────────────────────────────────────────────────────────
|
|
24
25
|
const server = new McpServer({
|
|
25
26
|
name: "data-aggregator",
|
|
@@ -40,7 +41,17 @@ server.tool("query_stocks", "Fetch real-time stock and cryptocurrency market dat
|
|
|
40
41
|
.optional()
|
|
41
42
|
.default("auto")
|
|
42
43
|
.describe('Asset type. "auto" detects based on symbol. Use "stock" or "crypto" to force.'),
|
|
43
|
-
}, async (args) =>
|
|
44
|
+
}, async (args) => {
|
|
45
|
+
const license = checkLicense("data-aggregator");
|
|
46
|
+
if (!license.valid) {
|
|
47
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
48
|
+
}
|
|
49
|
+
const result = await queryStocks(args);
|
|
50
|
+
if (license.trial && license.message) {
|
|
51
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
});
|
|
44
55
|
// 2. fetch_webpage
|
|
45
56
|
server.tool("fetch_webpage", "Scrape and extract structured data from any web page. Returns title, meta description, headings, main text content, and links. Optionally extract specific content using a CSS selector (#id, .class, or tag name).", {
|
|
46
57
|
url: z.string().url().describe("The URL to scrape"),
|
|
@@ -48,7 +59,17 @@ server.tool("fetch_webpage", "Scrape and extract structured data from any web pa
|
|
|
48
59
|
.string()
|
|
49
60
|
.optional()
|
|
50
61
|
.describe('Optional CSS-like selector to extract specific content (e.g., "#main", ".article-body", "article")'),
|
|
51
|
-
}, async (args) =>
|
|
62
|
+
}, async (args) => {
|
|
63
|
+
const license = checkLicense("data-aggregator");
|
|
64
|
+
if (!license.valid) {
|
|
65
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
66
|
+
}
|
|
67
|
+
const result = await fetchWebpage(args);
|
|
68
|
+
if (license.trial && license.message) {
|
|
69
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
});
|
|
52
73
|
// 3. search_news
|
|
53
74
|
server.tool("search_news", "Search and aggregate news articles from multiple sources. Uses NewsAPI.org (if API key configured) or Google News RSS (free, no key). Filter by keyword, category, source, date range, and language.", {
|
|
54
75
|
query: z
|
|
@@ -92,7 +113,17 @@ server.tool("search_news", "Search and aggregate news articles from multiple sou
|
|
|
92
113
|
.optional()
|
|
93
114
|
.default(10)
|
|
94
115
|
.describe("Maximum number of articles to return (1-100, default: 10)"),
|
|
95
|
-
}, async (args) =>
|
|
116
|
+
}, async (args) => {
|
|
117
|
+
const license = checkLicense("data-aggregator");
|
|
118
|
+
if (!license.valid) {
|
|
119
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
120
|
+
}
|
|
121
|
+
const result = await searchNews(args);
|
|
122
|
+
if (license.trial && license.message) {
|
|
123
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
});
|
|
96
127
|
// 4. query_weather
|
|
97
128
|
server.tool("query_weather", "Get current weather conditions and 7-day forecast. Uses Open-Meteo API (free, no API key required). Accepts city name or coordinates. Returns temperature, humidity, wind, precipitation, and daily forecasts.", {
|
|
98
129
|
city: z
|
|
@@ -116,7 +147,17 @@ server.tool("query_weather", "Get current weather conditions and 7-day forecast.
|
|
|
116
147
|
.optional()
|
|
117
148
|
.default("celsius")
|
|
118
149
|
.describe("Temperature units (default: celsius)"),
|
|
119
|
-
}, async (args) =>
|
|
150
|
+
}, async (args) => {
|
|
151
|
+
const license = checkLicense("data-aggregator");
|
|
152
|
+
if (!license.valid) {
|
|
153
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
154
|
+
}
|
|
155
|
+
const result = await queryWeather(args);
|
|
156
|
+
if (license.trial && license.message) {
|
|
157
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
});
|
|
120
161
|
// 5. query_exchange_rates
|
|
121
162
|
server.tool("query_exchange_rates", "Get currency exchange rates and perform conversions. Supports all major fiat currencies (USD, EUR, GBP, JPY, etc.) and popular cryptocurrencies (BTC, ETH, SOL, etc.). Can fetch historical rates by date.", {
|
|
122
163
|
base: z
|
|
@@ -135,7 +176,17 @@ server.tool("query_exchange_rates", "Get currency exchange rates and perform con
|
|
|
135
176
|
.string()
|
|
136
177
|
.optional()
|
|
137
178
|
.describe("Historical date in YYYY-MM-DD format (fiat only). Omit for current rates."),
|
|
138
|
-
}, async (args) =>
|
|
179
|
+
}, async (args) => {
|
|
180
|
+
const license = checkLicense("data-aggregator");
|
|
181
|
+
if (!license.valid) {
|
|
182
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
183
|
+
}
|
|
184
|
+
const result = await queryExchangeRates(args);
|
|
185
|
+
if (license.trial && license.message) {
|
|
186
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
});
|
|
139
190
|
// 6. query_public_data
|
|
140
191
|
server.tool("query_public_data", "Access miscellaneous public data APIs: Wikipedia summaries, IP geolocation, DNS lookups, and URL expansion. Select the sub-command and provide the relevant parameters.", {
|
|
141
192
|
command: z
|
|
@@ -167,7 +218,17 @@ server.tool("query_public_data", "Access miscellaneous public data APIs: Wikiped
|
|
|
167
218
|
.optional()
|
|
168
219
|
.default("en")
|
|
169
220
|
.describe("Language code for Wikipedia (default: en)"),
|
|
170
|
-
}, async (args) =>
|
|
221
|
+
}, async (args) => {
|
|
222
|
+
const license = checkLicense("data-aggregator");
|
|
223
|
+
if (!license.valid) {
|
|
224
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
225
|
+
}
|
|
226
|
+
const result = await queryPublicData(args);
|
|
227
|
+
if (license.trial && license.message) {
|
|
228
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
});
|
|
171
232
|
// ─── Transport Selection & Startup ─────────────────────────────────────────
|
|
172
233
|
async function main() {
|
|
173
234
|
const args = process.argv.slice(2);
|
|
@@ -280,12 +341,32 @@ function registerTools(s) {
|
|
|
280
341
|
symbol: z.string().describe("Ticker symbol (e.g., AAPL, BTC)"),
|
|
281
342
|
type: z.enum(["stock", "crypto", "auto"]).optional().default("auto")
|
|
282
343
|
.describe('Asset type. "auto" detects based on symbol.'),
|
|
283
|
-
}, async (args) =>
|
|
344
|
+
}, async (args) => {
|
|
345
|
+
const license = checkLicense("data-aggregator");
|
|
346
|
+
if (!license.valid) {
|
|
347
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
348
|
+
}
|
|
349
|
+
const result = await queryStocks(args);
|
|
350
|
+
if (license.trial && license.message) {
|
|
351
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
352
|
+
}
|
|
353
|
+
return result;
|
|
354
|
+
});
|
|
284
355
|
s.tool("fetch_webpage", "Scrape and extract structured data from any web page.", {
|
|
285
356
|
url: z.string().url().describe("The URL to scrape"),
|
|
286
357
|
selector: z.string().optional()
|
|
287
358
|
.describe("Optional CSS-like selector to extract specific content"),
|
|
288
|
-
}, async (args) =>
|
|
359
|
+
}, async (args) => {
|
|
360
|
+
const license = checkLicense("data-aggregator");
|
|
361
|
+
if (!license.valid) {
|
|
362
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
363
|
+
}
|
|
364
|
+
const result = await fetchWebpage(args);
|
|
365
|
+
if (license.trial && license.message) {
|
|
366
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
367
|
+
}
|
|
368
|
+
return result;
|
|
369
|
+
});
|
|
289
370
|
s.tool("search_news", "Search and aggregate news articles from multiple sources.", {
|
|
290
371
|
query: z.string().optional().describe("Search keyword or phrase"),
|
|
291
372
|
category: z.enum(["business", "entertainment", "general", "health", "science", "sports", "technology"]).optional(),
|
|
@@ -294,19 +375,49 @@ function registerTools(s) {
|
|
|
294
375
|
from: z.string().optional().describe("Start date (YYYY-MM-DD)"),
|
|
295
376
|
to: z.string().optional().describe("End date (YYYY-MM-DD)"),
|
|
296
377
|
maxResults: z.number().int().min(1).max(100).optional().default(10),
|
|
297
|
-
}, async (args) =>
|
|
378
|
+
}, async (args) => {
|
|
379
|
+
const license = checkLicense("data-aggregator");
|
|
380
|
+
if (!license.valid) {
|
|
381
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
382
|
+
}
|
|
383
|
+
const result = await searchNews(args);
|
|
384
|
+
if (license.trial && license.message) {
|
|
385
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
386
|
+
}
|
|
387
|
+
return result;
|
|
388
|
+
});
|
|
298
389
|
s.tool("query_weather", "Get current weather conditions and 7-day forecast via Open-Meteo.", {
|
|
299
390
|
city: z.string().optional().describe("City name"),
|
|
300
391
|
latitude: z.number().min(-90).max(90).optional(),
|
|
301
392
|
longitude: z.number().min(-180).max(180).optional(),
|
|
302
393
|
units: z.enum(["celsius", "fahrenheit"]).optional().default("celsius"),
|
|
303
|
-
}, async (args) =>
|
|
394
|
+
}, async (args) => {
|
|
395
|
+
const license = checkLicense("data-aggregator");
|
|
396
|
+
if (!license.valid) {
|
|
397
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
398
|
+
}
|
|
399
|
+
const result = await queryWeather(args);
|
|
400
|
+
if (license.trial && license.message) {
|
|
401
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
402
|
+
}
|
|
403
|
+
return result;
|
|
404
|
+
});
|
|
304
405
|
s.tool("query_exchange_rates", "Get currency exchange rates and perform conversions.", {
|
|
305
406
|
base: z.string().describe("Base currency code"),
|
|
306
407
|
target: z.string().describe("Target currency code"),
|
|
307
408
|
amount: z.number().positive().optional().default(1),
|
|
308
409
|
date: z.string().optional().describe("Historical date (YYYY-MM-DD)"),
|
|
309
|
-
}, async (args) =>
|
|
410
|
+
}, async (args) => {
|
|
411
|
+
const license = checkLicense("data-aggregator");
|
|
412
|
+
if (!license.valid) {
|
|
413
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
414
|
+
}
|
|
415
|
+
const result = await queryExchangeRates(args);
|
|
416
|
+
if (license.trial && license.message) {
|
|
417
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
418
|
+
}
|
|
419
|
+
return result;
|
|
420
|
+
});
|
|
310
421
|
s.tool("query_public_data", "Access Wikipedia, IP geolocation, DNS lookup, and URL expansion.", {
|
|
311
422
|
command: z.enum(["wikipedia", "ip_geolocation", "dns_lookup", "expand_url"]),
|
|
312
423
|
query: z.string().optional(),
|
|
@@ -315,7 +426,17 @@ function registerTools(s) {
|
|
|
315
426
|
recordType: z.enum(["A", "AAAA", "MX", "TXT", "NS", "CNAME", "SOA"]).optional().default("A"),
|
|
316
427
|
url: z.string().optional(),
|
|
317
428
|
language: z.string().optional().default("en"),
|
|
318
|
-
}, async (args) =>
|
|
429
|
+
}, async (args) => {
|
|
430
|
+
const license = checkLicense("data-aggregator");
|
|
431
|
+
if (!license.valid) {
|
|
432
|
+
return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
|
|
433
|
+
}
|
|
434
|
+
const result = await queryPublicData(args);
|
|
435
|
+
if (license.trial && license.message) {
|
|
436
|
+
result.content.push({ type: "text", text: "\n\n" + license.message });
|
|
437
|
+
}
|
|
438
|
+
return result;
|
|
439
|
+
});
|
|
319
440
|
}
|
|
320
441
|
// ─── Graceful shutdown ─────────────────────────────────────────────────────
|
|
321
442
|
function shutdown() {
|
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": "data-aggregator-mcp",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "A unified MCP server replacing 5-10 separate data servers. Stocks, weather, news, web scraping, exchange rates, and public data APIs in one package.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/src/index.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { queryWeather } from "./tools/weather.js";
|
|
|
23
23
|
import { queryExchangeRates } from "./tools/exchange.js";
|
|
24
24
|
import { queryPublicData } from "./tools/public-data.js";
|
|
25
25
|
import { cache } from "./utils/cache.js";
|
|
26
|
+
import { checkLicense } from "./license.js";
|
|
26
27
|
|
|
27
28
|
// ─── Server Setup ──────────────────────────────────────────────────────────
|
|
28
29
|
|
|
@@ -58,7 +59,17 @@ server.tool(
|
|
|
58
59
|
'Asset type. "auto" detects based on symbol. Use "stock" or "crypto" to force.'
|
|
59
60
|
),
|
|
60
61
|
},
|
|
61
|
-
async (args) =>
|
|
62
|
+
async (args) => {
|
|
63
|
+
const license = checkLicense("data-aggregator");
|
|
64
|
+
if (!license.valid) {
|
|
65
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
66
|
+
}
|
|
67
|
+
const result = await queryStocks(args);
|
|
68
|
+
if (license.trial && license.message) {
|
|
69
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
62
73
|
);
|
|
63
74
|
|
|
64
75
|
// 2. fetch_webpage
|
|
@@ -74,7 +85,17 @@ server.tool(
|
|
|
74
85
|
'Optional CSS-like selector to extract specific content (e.g., "#main", ".article-body", "article")'
|
|
75
86
|
),
|
|
76
87
|
},
|
|
77
|
-
async (args) =>
|
|
88
|
+
async (args) => {
|
|
89
|
+
const license = checkLicense("data-aggregator");
|
|
90
|
+
if (!license.valid) {
|
|
91
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
92
|
+
}
|
|
93
|
+
const result = await fetchWebpage(args);
|
|
94
|
+
if (license.trial && license.message) {
|
|
95
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
78
99
|
);
|
|
79
100
|
|
|
80
101
|
// 3. search_news
|
|
@@ -124,7 +145,17 @@ server.tool(
|
|
|
124
145
|
.default(10)
|
|
125
146
|
.describe("Maximum number of articles to return (1-100, default: 10)"),
|
|
126
147
|
},
|
|
127
|
-
async (args) =>
|
|
148
|
+
async (args) => {
|
|
149
|
+
const license = checkLicense("data-aggregator");
|
|
150
|
+
if (!license.valid) {
|
|
151
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
152
|
+
}
|
|
153
|
+
const result = await searchNews(args);
|
|
154
|
+
if (license.trial && license.message) {
|
|
155
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
128
159
|
);
|
|
129
160
|
|
|
130
161
|
// 4. query_weather
|
|
@@ -154,7 +185,17 @@ server.tool(
|
|
|
154
185
|
.default("celsius")
|
|
155
186
|
.describe("Temperature units (default: celsius)"),
|
|
156
187
|
},
|
|
157
|
-
async (args) =>
|
|
188
|
+
async (args) => {
|
|
189
|
+
const license = checkLicense("data-aggregator");
|
|
190
|
+
if (!license.valid) {
|
|
191
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
192
|
+
}
|
|
193
|
+
const result = await queryWeather(args);
|
|
194
|
+
if (license.trial && license.message) {
|
|
195
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
196
|
+
}
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
158
199
|
);
|
|
159
200
|
|
|
160
201
|
// 5. query_exchange_rates
|
|
@@ -185,7 +226,17 @@ server.tool(
|
|
|
185
226
|
"Historical date in YYYY-MM-DD format (fiat only). Omit for current rates."
|
|
186
227
|
),
|
|
187
228
|
},
|
|
188
|
-
async (args) =>
|
|
229
|
+
async (args) => {
|
|
230
|
+
const license = checkLicense("data-aggregator");
|
|
231
|
+
if (!license.valid) {
|
|
232
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
233
|
+
}
|
|
234
|
+
const result = await queryExchangeRates(args);
|
|
235
|
+
if (license.trial && license.message) {
|
|
236
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
237
|
+
}
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
189
240
|
);
|
|
190
241
|
|
|
191
242
|
// 6. query_public_data
|
|
@@ -227,7 +278,17 @@ server.tool(
|
|
|
227
278
|
.default("en")
|
|
228
279
|
.describe("Language code for Wikipedia (default: en)"),
|
|
229
280
|
},
|
|
230
|
-
async (args) =>
|
|
281
|
+
async (args) => {
|
|
282
|
+
const license = checkLicense("data-aggregator");
|
|
283
|
+
if (!license.valid) {
|
|
284
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
285
|
+
}
|
|
286
|
+
const result = await queryPublicData(args);
|
|
287
|
+
if (license.trial && license.message) {
|
|
288
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
231
292
|
);
|
|
232
293
|
|
|
233
294
|
// ─── Transport Selection & Startup ─────────────────────────────────────────
|
|
@@ -373,7 +434,17 @@ function registerTools(s: McpServer): void {
|
|
|
373
434
|
type: z.enum(["stock", "crypto", "auto"]).optional().default("auto")
|
|
374
435
|
.describe('Asset type. "auto" detects based on symbol.'),
|
|
375
436
|
},
|
|
376
|
-
async (args) =>
|
|
437
|
+
async (args) => {
|
|
438
|
+
const license = checkLicense("data-aggregator");
|
|
439
|
+
if (!license.valid) {
|
|
440
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
441
|
+
}
|
|
442
|
+
const result = await queryStocks(args);
|
|
443
|
+
if (license.trial && license.message) {
|
|
444
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
445
|
+
}
|
|
446
|
+
return result;
|
|
447
|
+
}
|
|
377
448
|
);
|
|
378
449
|
|
|
379
450
|
s.tool(
|
|
@@ -384,7 +455,17 @@ function registerTools(s: McpServer): void {
|
|
|
384
455
|
selector: z.string().optional()
|
|
385
456
|
.describe("Optional CSS-like selector to extract specific content"),
|
|
386
457
|
},
|
|
387
|
-
async (args) =>
|
|
458
|
+
async (args) => {
|
|
459
|
+
const license = checkLicense("data-aggregator");
|
|
460
|
+
if (!license.valid) {
|
|
461
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
462
|
+
}
|
|
463
|
+
const result = await fetchWebpage(args);
|
|
464
|
+
if (license.trial && license.message) {
|
|
465
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
466
|
+
}
|
|
467
|
+
return result;
|
|
468
|
+
}
|
|
388
469
|
);
|
|
389
470
|
|
|
390
471
|
s.tool(
|
|
@@ -399,7 +480,17 @@ function registerTools(s: McpServer): void {
|
|
|
399
480
|
to: z.string().optional().describe("End date (YYYY-MM-DD)"),
|
|
400
481
|
maxResults: z.number().int().min(1).max(100).optional().default(10),
|
|
401
482
|
},
|
|
402
|
-
async (args) =>
|
|
483
|
+
async (args) => {
|
|
484
|
+
const license = checkLicense("data-aggregator");
|
|
485
|
+
if (!license.valid) {
|
|
486
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
487
|
+
}
|
|
488
|
+
const result = await searchNews(args);
|
|
489
|
+
if (license.trial && license.message) {
|
|
490
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
491
|
+
}
|
|
492
|
+
return result;
|
|
493
|
+
}
|
|
403
494
|
);
|
|
404
495
|
|
|
405
496
|
s.tool(
|
|
@@ -411,7 +502,17 @@ function registerTools(s: McpServer): void {
|
|
|
411
502
|
longitude: z.number().min(-180).max(180).optional(),
|
|
412
503
|
units: z.enum(["celsius", "fahrenheit"]).optional().default("celsius"),
|
|
413
504
|
},
|
|
414
|
-
async (args) =>
|
|
505
|
+
async (args) => {
|
|
506
|
+
const license = checkLicense("data-aggregator");
|
|
507
|
+
if (!license.valid) {
|
|
508
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
509
|
+
}
|
|
510
|
+
const result = await queryWeather(args);
|
|
511
|
+
if (license.trial && license.message) {
|
|
512
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
513
|
+
}
|
|
514
|
+
return result;
|
|
515
|
+
}
|
|
415
516
|
);
|
|
416
517
|
|
|
417
518
|
s.tool(
|
|
@@ -423,7 +524,17 @@ function registerTools(s: McpServer): void {
|
|
|
423
524
|
amount: z.number().positive().optional().default(1),
|
|
424
525
|
date: z.string().optional().describe("Historical date (YYYY-MM-DD)"),
|
|
425
526
|
},
|
|
426
|
-
async (args) =>
|
|
527
|
+
async (args) => {
|
|
528
|
+
const license = checkLicense("data-aggregator");
|
|
529
|
+
if (!license.valid) {
|
|
530
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
531
|
+
}
|
|
532
|
+
const result = await queryExchangeRates(args);
|
|
533
|
+
if (license.trial && license.message) {
|
|
534
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
535
|
+
}
|
|
536
|
+
return result;
|
|
537
|
+
}
|
|
427
538
|
);
|
|
428
539
|
|
|
429
540
|
s.tool(
|
|
@@ -438,7 +549,17 @@ function registerTools(s: McpServer): void {
|
|
|
438
549
|
url: z.string().optional(),
|
|
439
550
|
language: z.string().optional().default("en"),
|
|
440
551
|
},
|
|
441
|
-
async (args) =>
|
|
552
|
+
async (args) => {
|
|
553
|
+
const license = checkLicense("data-aggregator");
|
|
554
|
+
if (!license.valid) {
|
|
555
|
+
return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
|
|
556
|
+
}
|
|
557
|
+
const result = await queryPublicData(args);
|
|
558
|
+
if (license.trial && license.message) {
|
|
559
|
+
result.content.push({ type: "text" as const, text: "\n\n" + license.message });
|
|
560
|
+
}
|
|
561
|
+
return result;
|
|
562
|
+
}
|
|
442
563
|
);
|
|
443
564
|
}
|
|
444
565
|
|
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
|
+
}
|