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 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) => queryStocks(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) => fetchWebpage(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) => searchNews(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) => queryWeather(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) => queryExchangeRates(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) => queryPublicData(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) => queryStocks(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) => fetchWebpage(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) => searchNews(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) => queryWeather(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) => queryExchangeRates(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) => queryPublicData(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"}
@@ -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.1",
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) => queryStocks(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) => fetchWebpage(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) => searchNews(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) => queryWeather(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) => queryExchangeRates(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) => queryPublicData(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) => queryStocks(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) => fetchWebpage(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) => searchNews(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) => queryWeather(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) => queryExchangeRates(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) => queryPublicData(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
+ }