netintel-mcp 1.0.1 → 1.1.1
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/README.md +12 -1
- package/dist/index.js +195 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# netintel-mcp
|
|
2
2
|
|
|
3
|
-
MCP server for NetIntel —
|
|
3
|
+
MCP server for NetIntel — 36 network intelligence tools for AI agents.
|
|
4
4
|
DNS, SSL, WHOIS, email security, cloud fingerprinting, OSINT and more.
|
|
5
5
|
Pay-per-call via x402 on Base mainnet. No API keys needed — just a wallet with USDC.
|
|
6
6
|
|
|
@@ -58,6 +58,17 @@ Or add manually to your Claude Desktop config:
|
|
|
58
58
|
| netintel_rss_parser | RSS/Atom feed parser | $0.001 |
|
|
59
59
|
| netintel_username_check | Username availability (20+ platforms) | $0.003 |
|
|
60
60
|
| netintel_wayback_lookup | Wayback Machine snapshots | $0.001 |
|
|
61
|
+
| netintel_ip_reputation | IP reputation via AbuseIPDB + AlienVault OTX | $0.010 |
|
|
62
|
+
| netintel_cron_parser | Parse cron expressions, explain schedule | $0.001 |
|
|
63
|
+
| netintel_currency_exchange | Convert between 32 currencies | $0.001 |
|
|
64
|
+
| netintel_github_intel | GitHub repo metrics and maintenance score | $0.001 |
|
|
65
|
+
| netintel_holidays | Public holidays by country | $0.001 |
|
|
66
|
+
| netintel_ip_geo | IP geolocation — country, city, ISP, ASN | $0.001 |
|
|
67
|
+
| netintel_jwt_inspector | Decode JWT tokens, flag security issues | $0.001 |
|
|
68
|
+
| netintel_lang_detect | Detect language with confidence scoring | $0.001 |
|
|
69
|
+
| netintel_npm_intel | npm package analysis and quality score | $0.001 |
|
|
70
|
+
| netintel_sitemap_parser | Parse XML sitemaps, extract URL metadata | $0.001 |
|
|
71
|
+
| netintel_url_safety | Check URL against URLhaus + heuristics | $0.002 |
|
|
61
72
|
|
|
62
73
|
## Payment
|
|
63
74
|
All tools pay automatically via x402 on Base mainnet (USDC).
|
package/dist/index.js
CHANGED
|
@@ -286,12 +286,206 @@ function registerTools(server, api) {
|
|
|
286
286
|
return err(e);
|
|
287
287
|
}
|
|
288
288
|
});
|
|
289
|
+
// 26. IP Reputation
|
|
290
|
+
server.tool("netintel_ip_reputation", "Check IP against AbuseIPDB and AlienVault OTX. Returns composite risk score, threat categories, and malware families.", { ip: z.string() }, async ({ ip }) => {
|
|
291
|
+
try {
|
|
292
|
+
const res = await api.get("/ip-reputation/analyze", { params: { ip } });
|
|
293
|
+
return ok(res.data);
|
|
294
|
+
}
|
|
295
|
+
catch (e) {
|
|
296
|
+
return err(e);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// 27. Cron Parser
|
|
300
|
+
server.tool("netintel_cron_parser", "Parse a cron expression, explain the schedule in plain English, and compute the next 5 run times.", { expression: z.string() }, async ({ expression }) => {
|
|
301
|
+
try {
|
|
302
|
+
const res = await api.get("/cron-parser/explain", { params: { expression } });
|
|
303
|
+
return ok(res.data);
|
|
304
|
+
}
|
|
305
|
+
catch (e) {
|
|
306
|
+
return err(e);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
// 28. Currency Exchange
|
|
310
|
+
server.tool("netintel_currency_exchange", "Convert between 32 currencies with real-time or historical rates. Pass a date (YYYY-MM-DD) for historical lookup.", { from: z.string(), to: z.string(), amount: z.number().optional(), date: z.string().optional() }, async ({ from, to, amount, date }) => {
|
|
311
|
+
try {
|
|
312
|
+
const res = await api.get("/currency-exchange/convert", {
|
|
313
|
+
params: params({ from, to, amount, date }),
|
|
314
|
+
});
|
|
315
|
+
return ok(res.data);
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
return err(e);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// 29. GitHub Intel
|
|
322
|
+
server.tool("netintel_github_intel", "Analyze a GitHub repo — stars, forks, activity, license, open issues, maintenance score. Pass owner/repo format.", { repo: z.string() }, async ({ repo }) => {
|
|
323
|
+
try {
|
|
324
|
+
const res = await api.get("/github-intel/analyze", { params: { repo } });
|
|
325
|
+
return ok(res.data);
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
return err(e);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
// 30. Holidays
|
|
332
|
+
server.tool("netintel_holidays", "Get public holidays by country. Check if a date is a business day or weekend. ISO 3166-1 alpha-2 country codes.", { country: z.string(), year: z.number().optional(), month: z.number().optional() }, async ({ country, year, month }) => {
|
|
333
|
+
try {
|
|
334
|
+
const res = await api.get("/holidays/check", {
|
|
335
|
+
params: params({ country, year, month }),
|
|
336
|
+
});
|
|
337
|
+
return ok(res.data);
|
|
338
|
+
}
|
|
339
|
+
catch (e) {
|
|
340
|
+
return err(e);
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
// 31. IP Geo
|
|
344
|
+
server.tool("netintel_ip_geo", "Geolocate an IP address — country, city, coordinates, ISP, ASN, timezone.", { ip: z.string() }, async ({ ip }) => {
|
|
345
|
+
try {
|
|
346
|
+
const res = await api.get("/ip-geo/locate", { params: { ip } });
|
|
347
|
+
return ok(res.data);
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
return err(e);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
// 32. JWT Inspector
|
|
354
|
+
server.tool("netintel_jwt_inspector", "Decode a JWT token — inspect header and payload, check expiry, flag security issues like weak algorithms.", { token: z.string() }, async ({ token }) => {
|
|
355
|
+
try {
|
|
356
|
+
const res = await api.get("/jwt-inspector/decode", { params: { token } });
|
|
357
|
+
return ok(res.data);
|
|
358
|
+
}
|
|
359
|
+
catch (e) {
|
|
360
|
+
return err(e);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
// 33. Lang Detect (POST)
|
|
364
|
+
server.tool("netintel_lang_detect", "Detect the language of any text with confidence scoring. Supports 50+ languages.", { text: z.string() }, async ({ text }) => {
|
|
365
|
+
try {
|
|
366
|
+
const res = await api.post("/lang-detect/analyze", { text });
|
|
367
|
+
return ok(res.data);
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
return err(e);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
// 34. npm Intel
|
|
374
|
+
server.tool("netintel_npm_intel", "Analyze an npm package — versions, weekly downloads, maintainers, dependencies, quality and maintenance score.", { package: z.string() }, async (args) => {
|
|
375
|
+
try {
|
|
376
|
+
const res = await api.get("/npm-intel/analyze", { params: { package: args.package } });
|
|
377
|
+
return ok(res.data);
|
|
378
|
+
}
|
|
379
|
+
catch (e) {
|
|
380
|
+
return err(e);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
// 35. Sitemap Parser
|
|
384
|
+
server.tool("netintel_sitemap_parser", "Parse an XML sitemap or auto-discover it from a domain. Returns all URLs with metadata including lastmod and priority.", { url: z.string() }, async ({ url }) => {
|
|
385
|
+
try {
|
|
386
|
+
const res = await api.get("/sitemap-parser/fetch", { params: { url } });
|
|
387
|
+
return ok(res.data);
|
|
388
|
+
}
|
|
389
|
+
catch (e) {
|
|
390
|
+
return err(e);
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
// 36. URL Safety
|
|
394
|
+
server.tool("netintel_url_safety", "Check a URL against URLhaus malware database and heuristic analysis. Returns threat classification and risk score.", { url: z.string() }, async ({ url }) => {
|
|
395
|
+
try {
|
|
396
|
+
const res = await api.get("/url-safety/check", { params: { url } });
|
|
397
|
+
return ok(res.data);
|
|
398
|
+
}
|
|
399
|
+
catch (e) {
|
|
400
|
+
return err(e);
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
// 37. Domain Age
|
|
404
|
+
server.tool("netintel_domain_age", "Determine a domain's age from registration data and archival history — returns creation date, age in years, first Wayback Machine capture, total archived snapshots, and a maturity signal so agents can assess domain trustworthiness and…", { domain: z.string() }, async ({ domain }) => {
|
|
405
|
+
try {
|
|
406
|
+
const res = await api.get("/domain-age/check", { params: { domain } });
|
|
407
|
+
return ok(res.data);
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
return err(e);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
// 38. Bulk Domain (POST)
|
|
414
|
+
server.tool("netintel_bulk_domain", "Check availability of many domain names across multiple TLDs in a single call — submit up to 50 name/TLD combinations and get back per-domain registration status, registrar, and expiry concurrently, so agents can scan an entire naming…", { names: z.array(z.string()), tlds: z.array(z.string()).optional() }, async ({ names, tlds }) => {
|
|
415
|
+
try {
|
|
416
|
+
const res = await api.post("/bulk-domain/check", { names, tlds });
|
|
417
|
+
return ok(res.data);
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
return err(e);
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
// 39. Domain Appraise
|
|
424
|
+
server.tool("netintel_domain_appraise", "Estimate the market value tier of a domain name using transparent heuristics — length, TLD premium, dictionary-word presence, pronounceability, keyword value, and numeric/hyphen penalties — returns a value tier and 0-100 quality score so…", { domain: z.string() }, async ({ domain }) => {
|
|
425
|
+
try {
|
|
426
|
+
const res = await api.get("/domain-appraise/estimate", { params: { domain } });
|
|
427
|
+
return ok(res.data);
|
|
428
|
+
}
|
|
429
|
+
catch (e) {
|
|
430
|
+
return err(e);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
// 40. Domain Report
|
|
434
|
+
server.tool("netintel_domain_report", "One call returns a complete intelligence profile for a domain — WHOIS registration, DNS records, SSL certificate, detected tech stack, and blacklist status — aggregated into a single risk-scored report so agents can fully vet a domain…", { domain: z.string() }, async ({ domain }) => {
|
|
435
|
+
try {
|
|
436
|
+
const res = await api.get("/domain-report/analyze", { params: { domain } });
|
|
437
|
+
return ok(res.data);
|
|
438
|
+
}
|
|
439
|
+
catch (e) {
|
|
440
|
+
return err(e);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
// 41. Ip Risk
|
|
444
|
+
server.tool("netintel_ip_risk", "One call returns a complete risk profile for an IP address — geolocation, ASN/network owner, blacklist status across multiple DNSBLs, and proxy/VPN/hosting classification — aggregated into a single verdict so agents can make a block/allow…", { ip: z.string() }, async ({ ip }) => {
|
|
445
|
+
try {
|
|
446
|
+
const res = await api.get("/ip-risk/score", { params: { ip } });
|
|
447
|
+
return ok(res.data);
|
|
448
|
+
}
|
|
449
|
+
catch (e) {
|
|
450
|
+
return err(e);
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
// 42. Name Gen
|
|
454
|
+
server.tool("netintel_name_gen", "Generate brandable startup/product names from a keyword using prefixes, suffixes, blends, and phonetic patterns, then check .com (or any TLD) availability for each via DNS — returns available names ranked by a brandability heuristic so…", { keyword: z.string(), tld: z.string().optional(), limit: z.number().optional() }, async ({ keyword, tld, limit }) => {
|
|
455
|
+
try {
|
|
456
|
+
const res = await api.get("/name-gen/suggest", { params: params({ keyword, tld, limit }) });
|
|
457
|
+
return ok(res.data);
|
|
458
|
+
}
|
|
459
|
+
catch (e) {
|
|
460
|
+
return err(e);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
// 43. Tld Price
|
|
464
|
+
server.tool("netintel_tld_price", "Compare registration, renewal, and transfer prices for a TLD across major registrars, or for a single domain name across many TLDs — returns sorted reference pricing so agents can find the cheapest place to register, budget domain…", { tld: z.string().optional(), name: z.string().optional() }, async ({ tld, name }) => {
|
|
465
|
+
try {
|
|
466
|
+
const res = await api.get("/tld-price/compare", { params: params({ tld, name }) });
|
|
467
|
+
return ok(res.data);
|
|
468
|
+
}
|
|
469
|
+
catch (e) {
|
|
470
|
+
return err(e);
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
// 44. Typosquat
|
|
474
|
+
server.tool("netintel_typosquat", "Generate common typo and look-alike variations of a domain and check which are already registered — catches character swaps, omissions, additions, homoglyphs, and alternate TLDs so agents can detect typosquatting and brand-impersonation…", { domain: z.string(), limit: z.number().optional() }, async ({ domain, limit }) => {
|
|
475
|
+
try {
|
|
476
|
+
const res = await api.get("/typosquat/scan", { params: params({ domain, limit }) });
|
|
477
|
+
return ok(res.data);
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
return err(e);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
289
483
|
}
|
|
290
484
|
async function main() {
|
|
291
485
|
const api = await createClient();
|
|
292
486
|
const server = new McpServer({
|
|
293
487
|
name: "netintel-mcp",
|
|
294
|
-
version: "1.
|
|
488
|
+
version: "1.1.0",
|
|
295
489
|
});
|
|
296
490
|
registerTools(server, api);
|
|
297
491
|
const transport = new StdioServerTransport();
|