netintel-mcp 1.1.58 → 1.1.60
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 -0
- package/dist/index.js +58 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
MCP server for NetIntel — 123 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 — the NetIntel API accepts USDC on Base or Solana; this MCP server pays on Base. No API keys needed — just a wallet with USDC.
|
|
6
|
+
Plus 3 router tools that find the best x402 endpoint for a job from **any** provider — [details below](#find-the-right-x402-endpoint-from-any-provider).
|
|
6
7
|
|
|
7
8
|
## Install as a Claude Code plugin (recommended)
|
|
8
9
|
|
|
@@ -170,6 +171,16 @@ Or add manually to your Claude Desktop config:
|
|
|
170
171
|
| netintel_exa_answer | Ask a question, get a direct answer grounded in a live web search, with… | $0.01 |
|
|
171
172
|
| netintel_pdf_parse | Parse a PDF to text and Markdown: send a PDF url or base64 file, get… | $0.005 |
|
|
172
173
|
|
|
174
|
+
## Find the right x402 endpoint from any provider
|
|
175
|
+
|
|
176
|
+
These tools answer "which x402 endpoint should I call?" over the whole Coinbase Bazaar catalog — every provider, not only NetIntel — ranked by fit, real paying demand, health and price, with the reasons. They call the NetIntel Router (https://router.netintel.dev) with the same wallet and spending limits. NetIntel's own endpoints are labeled and get no boost. Daily rankings for 40 common agent tasks: https://router.netintel.dev/rankings
|
|
177
|
+
|
|
178
|
+
| Tool | Description | Price |
|
|
179
|
+
|------|-------------|-------|
|
|
180
|
+
| netintel_route_search | Find which x402 pay-per-call API endpoint fits a job, from ANY provider… | free |
|
|
181
|
+
| netintel_route_recommend | Get the 3 best x402 endpoints for a job, from three different… | $0.005 |
|
|
182
|
+
| netintel_route_vet | Check one x402 endpoint before relying on it: give its URL as the… | $0.002 |
|
|
183
|
+
|
|
173
184
|
## Payment
|
|
174
185
|
All tools pay automatically via x402 in USDC on Base mainnet.
|
|
175
186
|
Your wallet is charged per call. No subscriptions, no API keys.
|
|
@@ -181,4 +192,5 @@ over x402 with a Solana wallet if you prefer that rail.)
|
|
|
181
192
|
- API manifest: https://netintel.dev/.well-known/x402
|
|
182
193
|
- OpenAPI spec: https://netintel.dev/openapi.json
|
|
183
194
|
- Agent catalog: https://netintel.dev/llms.txt
|
|
195
|
+
- Router (which x402 endpoint to call; daily rankings): https://router.netintel.dev/rankings
|
|
184
196
|
- Source: https://github.com/kjgueye/netintel-mcp
|
package/dist/index.js
CHANGED
|
@@ -19,15 +19,25 @@ function err(e) {
|
|
|
19
19
|
if (status === 402) {
|
|
20
20
|
// The one error a user can act on: the call needs a payment that did not
|
|
21
21
|
// happen. Say what it costs and exactly what to do, instead of "402".
|
|
22
|
-
|
|
22
|
+
// v1 bodies state `price` ("$0.002"); v2 bodies state the atomic USDC `amount` ("2000").
|
|
23
|
+
const first = ax.response?.data?.accepts?.[0];
|
|
24
|
+
const price = first?.price ?? (/^\d+$/.test(String(first?.amount ?? "")) ? `$${Number(first.amount) / 1_000_000}` : undefined);
|
|
23
25
|
const cost = price ? `This tool costs ${price} per call (USDC on Base). ` : "This tool is paid per call (USDC on Base). ";
|
|
24
26
|
const fix = configuredWallet()
|
|
25
27
|
? `The agent wallet ${configuredWallet()} is configured but the payment did not settle — usually an empty wallet. Run netintel_wallet_status to check its USDC balance, then fund it on Base.`
|
|
26
28
|
: `No agent wallet is configured, so it cannot be paid. Set EVM_PRIVATE_KEY to a wallet holding USDC on Base (or enter it in the Claude Code plugin config), then retry.${FREE_TOOLS.length ? ` Without a wallet these tools still work free, up to a quota: ${FREE_TOOLS.join(", ")}.` : ""}`;
|
|
27
29
|
return { content: [{ type: "text", text: `Payment required. ${cost}${fix}` }], isError: true };
|
|
28
30
|
}
|
|
31
|
+
// The server's own words, when it sent any: NetIntel's 4xx bodies name the
|
|
32
|
+
// missing field or say why there is no answer — and that nothing was charged —
|
|
33
|
+
// which tells an agent far more than axios's "Request failed with status code 404".
|
|
34
|
+
const body = ax.response?.data;
|
|
35
|
+
const said = typeof body?.error === "string" ? body.error
|
|
36
|
+
: typeof body?.error?.message === "string" ? body.error.message
|
|
37
|
+
: null;
|
|
38
|
+
const detail = said ? ` — ${said}${typeof body?.code === "string" ? ` [${body.code}]` : ""}` : "";
|
|
29
39
|
return {
|
|
30
|
-
content: [{ type: "text", text: `Error (${status}): ${msg}` }],
|
|
40
|
+
content: [{ type: "text", text: `Error (${status}): ${msg}${detail}` }],
|
|
31
41
|
isError: true,
|
|
32
42
|
};
|
|
33
43
|
}
|
|
@@ -1288,6 +1298,51 @@ function registerTools(server, api) {
|
|
|
1288
1298
|
}
|
|
1289
1299
|
});
|
|
1290
1300
|
}
|
|
1301
|
+
// The NetIntel Router: "which x402 endpoint should I call?" over the whole
|
|
1302
|
+
// Coinbase Bazaar catalog — every provider, not only NetIntel — on its own host.
|
|
1303
|
+
// Deliberately OUTSIDE registerTools(): scripts/sync-ecosystem.ts pairs the tools
|
|
1304
|
+
// in there with netintel.dev API paths; it lists these three on their own,
|
|
1305
|
+
// priced from router/src/prices.ts in the NetIntel repo. Same wallet and the same spending limits: the x402 client pays any
|
|
1306
|
+
// host it is sent to, but only after onBeforePaymentCreation approves the amount.
|
|
1307
|
+
const ROUTER_URL = "https://router.netintel.dev";
|
|
1308
|
+
function registerRouterTools(server, api) {
|
|
1309
|
+
// Router: search (free)
|
|
1310
|
+
server.tool("netintel_route_search", "Find which x402 pay-per-call API endpoint fits a job, from ANY provider (not only NetIntel): ranks every endpoint in the Coinbase Bazaar catalog by fit, real paying demand, health and price, and returns each pick's URL, price, inputs and plain-words reasons. Free (60 searches an hour). Use it before paying an endpoint you do not know; netintel_route_recommend health-checks the top picks live.", {
|
|
1311
|
+
query: z.string().describe("The job, in plain words, e.g. \"check SPF DKIM DMARC for a domain\""),
|
|
1312
|
+
limit: z.number().int().min(1).max(25).optional().describe("Results to return, 1-25 (default 5)"),
|
|
1313
|
+
}, async ({ query, limit }) => {
|
|
1314
|
+
try {
|
|
1315
|
+
const res = await api.get(`${ROUTER_URL}/route/search`, { params: { q: query, limit: limit ?? 5 } });
|
|
1316
|
+
return ok(res.data);
|
|
1317
|
+
}
|
|
1318
|
+
catch (e) {
|
|
1319
|
+
return err(e);
|
|
1320
|
+
}
|
|
1321
|
+
});
|
|
1322
|
+
// Router: recommend (paid)
|
|
1323
|
+
server.tool("netintel_route_recommend", "Get the 3 best x402 endpoints for a job, from three different providers, each health-checked live just now: its live price quote, its input schema and the reasons. Paid per call; not charged when no candidate passes the live check. It does not call the endpoint for you: NetIntel picks map to the netintel_* tools; a third-party pick needs your own x402 client.", { query: z.string().describe("The job, in plain words, e.g. \"geocode an address to latitude and longitude\"") }, async ({ query }) => {
|
|
1324
|
+
try {
|
|
1325
|
+
const res = await api.get(`${ROUTER_URL}/route/recommend`, { params: { q: query } });
|
|
1326
|
+
return ok(res.data);
|
|
1327
|
+
}
|
|
1328
|
+
catch (e) {
|
|
1329
|
+
return err(e);
|
|
1330
|
+
}
|
|
1331
|
+
});
|
|
1332
|
+
// Router: vet (paid)
|
|
1333
|
+
server.tool("netintel_route_vet", "Check one x402 endpoint before relying on it: give its URL as the Coinbase Bazaar lists it and get a live payment-challenge check, its current price quote, its 7/30/90-day check history and paying-wallet trend, and a verdict: ok, slow, unstable or failing. Paid per call; not charged when the URL is not in the catalog.", {
|
|
1334
|
+
url: z.string().describe("The endpoint's resource URL, exactly as listed (netintel_route_search returns it as resource_url)"),
|
|
1335
|
+
method: z.enum(["GET", "POST"]).optional().describe("Only when the URL is listed under both methods"),
|
|
1336
|
+
}, async ({ url, method }) => {
|
|
1337
|
+
try {
|
|
1338
|
+
const res = await api.get(`${ROUTER_URL}/route/vet`, { params: params({ url, method }) });
|
|
1339
|
+
return ok(res.data);
|
|
1340
|
+
}
|
|
1341
|
+
catch (e) {
|
|
1342
|
+
return err(e);
|
|
1343
|
+
}
|
|
1344
|
+
});
|
|
1345
|
+
}
|
|
1291
1346
|
// Wallet status — free, local: lets an agent (or a human) tell "no wallet",
|
|
1292
1347
|
// "empty wallet" and "funded" apart before spending a call on finding out.
|
|
1293
1348
|
// Deliberately OUTSIDE registerTools(): scripts/sync-ecosystem.ts pairs each
|
|
@@ -1318,6 +1373,7 @@ async function main() {
|
|
|
1318
1373
|
version: "1.1.0",
|
|
1319
1374
|
});
|
|
1320
1375
|
registerTools(server, api);
|
|
1376
|
+
registerRouterTools(server, api);
|
|
1321
1377
|
registerWalletTool(server);
|
|
1322
1378
|
const transport = new StdioServerTransport();
|
|
1323
1379
|
await server.connect(transport);
|