@tensorfeed/mcp-server 1.38.0 → 1.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -11
- package/README.md +16 -0
- package/dist/index.js +450 -7
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the [TensorFeed.ai MCP server](https://github.com/RipperMercs/tensorfeed-mcp). Free tools work without configuration; premium tools require a bearer token via the `TENSORFEED_TOKEN` env var. Buy credits at [tensorfeed.ai/developers/agent-payments](https://tensorfeed.ai/developers/agent-payments).
|
|
4
4
|
|
|
5
|
+
## 1.39.0 - 2026-06-04
|
|
6
|
+
|
|
7
|
+
Surfaces TensorFeed's full signed-verdict family in the stdio server. Adds the
|
|
8
|
+
seven verdicts below, each shipping as a free preview tool plus a 1-credit
|
|
9
|
+
($0.02) signed premium tool with an AFTA-signed receipt. This brings the catalog
|
|
10
|
+
to 79 tools (48 free, 31 premium):
|
|
11
|
+
- `provider_reliability_verdict_preview` / `provider_reliability_verdict`:
|
|
12
|
+
the signed dependability ruling over TensorFeed's own latency and availability
|
|
13
|
+
probes, scoring availability and tail consistency to name the safest provider
|
|
14
|
+
to build on.
|
|
15
|
+
- `x402_settlement_verdict_preview` / `x402_settlement_verdict`: the settlement
|
|
16
|
+
momentum, concentration, and leading-publisher read over the on-chain x402
|
|
17
|
+
index for a 24h, 7d, or 30d window.
|
|
18
|
+
- `x402_publisher_verdict_preview` / `x402_publisher_verdict`: the signed trust
|
|
19
|
+
verdict on one publisher domain (actively settling, recently quiet, registered
|
|
20
|
+
with no settlement, unreachable, no Base payTo, or not indexed) before you
|
|
21
|
+
pay it.
|
|
22
|
+
- `stack_safety_verdict_preview` / `stack_safety_verdict`: the GO, HOLD, or
|
|
23
|
+
BLOCK deploy gate over a list of package@version pins, with the matched-CVE
|
|
24
|
+
and KEV evidence for the worst offender.
|
|
25
|
+
- `benchmark_trust_verdict_preview` / `benchmark_trust_verdict`: the trust band
|
|
26
|
+
and 0 to 100 score for a benchmark or category, flagging saturation,
|
|
27
|
+
contamination, and held-out status.
|
|
28
|
+
- `failover_verdict_preview` / `failover_verdict`: when a provider is degraded,
|
|
29
|
+
the signed ruling on the single best operational provider to fail over to,
|
|
30
|
+
with ranked alternatives.
|
|
31
|
+
- `ssvc_verdict_preview` / `ssvc_verdict`: the CISA SSVC Act, Attend, Track, or
|
|
32
|
+
Track* decision for one CVE, with the decision points and a live KEV
|
|
33
|
+
cross-check.
|
|
34
|
+
|
|
35
|
+
Adds contextual pointers so an agent discovers the matching verdict from a tool
|
|
36
|
+
it already uses: `is_service_down` points to `failover_verdict`,
|
|
37
|
+
`get_ai_cves_latest` points to `ssvc_verdict` and `stack_safety_verdict`,
|
|
38
|
+
`get_x402_publishers` points to `x402_publisher_verdict`, and
|
|
39
|
+
`status_leaderboard_free` points to `provider_reliability_verdict`. No behavior
|
|
40
|
+
change to those four tools.
|
|
41
|
+
|
|
5
42
|
## 1.38.0 - 2026-06-03
|
|
6
43
|
|
|
7
44
|
Description-only release. Sharpens the six foundational free tools (get_ai_news,
|
|
@@ -290,46 +327,46 @@ All three are backed by the worker endpoints shipped in the same monorepo commit
|
|
|
290
327
|
## 1.11.0 - 2026-04-29
|
|
291
328
|
|
|
292
329
|
### Added
|
|
293
|
-
- `probe_latest` tool
|
|
294
|
-
- `probe_series` tool
|
|
330
|
+
- `probe_latest` tool: last 24 hours of measured LLM endpoint latency and availability per provider (Anthropic, OpenAI, Google, Mistral, Cohere). TensorFeed pings each provider's chat completion endpoint every 15 min and records ttfb / total / status. The data is unique because it is measured, not self-reported. Free, no auth.
|
|
331
|
+
- `probe_series` tool: daily SLA series for one provider with ttfb/total p50/p95/p99 and incident-hour count, 90-day max range. 1 credit per call. Pairs with `premium_routing` for picking a model whose SLA you can verify.
|
|
295
332
|
|
|
296
333
|
## 1.10.0 - 2026-04-29
|
|
297
334
|
|
|
298
335
|
### Added
|
|
299
|
-
- `mcp_registry_snapshot` tool
|
|
300
|
-
- `mcp_registry_series` tool
|
|
336
|
+
- `mcp_registry_snapshot` tool: today's summary of the official Model Context Protocol server registry: total servers, by-status breakdown, top namespaces, 1-day deltas (newly added, reactivated, deprecated). Free, no auth.
|
|
337
|
+
- `mcp_registry_series` tool: multi-day time series of MCP registry growth and churn. Range capped at 90 days, default 30 days back. 1 credit per call.
|
|
301
338
|
|
|
302
339
|
The new tools are backed by a fresh daily cron capture of registry.modelcontextprotocol.io. The registry itself is open data, but a 30/90-day trend requires daily capture started weeks before the question is asked.
|
|
303
340
|
|
|
304
341
|
## 1.7.0 - 2026-04-27
|
|
305
342
|
|
|
306
343
|
### Added
|
|
307
|
-
- `compare_models` tool
|
|
344
|
+
- `compare_models` tool: side-by-side comparison of 2-5 AI models with normalized benchmarks (union-of-keys with null for missing scores) and rankings (cheapest blended, most context, per-benchmark leaderboard). 1 credit per call.
|
|
308
345
|
|
|
309
346
|
## 1.6.0 - 2026-04-27
|
|
310
347
|
|
|
311
348
|
### Added
|
|
312
|
-
- `provider_deepdive` tool
|
|
349
|
+
- `provider_deepdive` tool: one provider's full profile in a single call: live status with components, all models with pricing + tier + benchmark scores joined, recent news, agent traffic. 1 credit per call.
|
|
313
350
|
|
|
314
351
|
## 1.5.0 - 2026-04-27
|
|
315
352
|
|
|
316
353
|
### Added
|
|
317
|
-
- `create_digest_watch` tool
|
|
354
|
+
- `create_digest_watch` tool: register a scheduled daily/weekly digest watch. Fires HMAC-signed POST to your callback URL with a curated pricing-changes summary regardless of whether anything dramatic happened. 1 credit per registration.
|
|
318
355
|
|
|
319
356
|
## 1.4.0 - 2026-04-27
|
|
320
357
|
|
|
321
358
|
### Added
|
|
322
|
-
- `forecast` tool
|
|
359
|
+
- `forecast` tool: conservative linear-regression forecast for a price field or benchmark score with 95% prediction interval and confidence label. 1 credit per call.
|
|
323
360
|
|
|
324
361
|
## 1.3.0 - 2026-04-27
|
|
325
362
|
|
|
326
363
|
### Added
|
|
327
|
-
- `cost_projection` tool
|
|
364
|
+
- `cost_projection` tool: project workload cost across 1-10 AI models with four time horizons and cheapest-monthly ranking. 1 credit per call.
|
|
328
365
|
|
|
329
366
|
## 1.2.0 - 2026-04-27
|
|
330
367
|
|
|
331
368
|
### Added
|
|
332
|
-
- `news_search` tool
|
|
369
|
+
- `news_search` tool: full-text search over the AI news corpus with date/provider/category filters and relevance scoring. 1 credit per call.
|
|
333
370
|
|
|
334
371
|
## 1.1.0 - 2026-04-27
|
|
335
372
|
|
|
@@ -339,7 +376,7 @@ The new tools are backed by a fresh daily cron capture of registry.modelcontextp
|
|
|
339
376
|
- `mcp-server/server.json` manifest authored against the official MCP registry schema (`ai.tensorfeed/mcp-server`).
|
|
340
377
|
- README expanded with per-tier tool tables and `env` config examples for Claude Desktop / Code.
|
|
341
378
|
|
|
342
|
-
## 1.0.0
|
|
379
|
+
## 1.0.0 - 2026-04-26 (initial release)
|
|
343
380
|
|
|
344
381
|
### Added
|
|
345
382
|
- 5 free tools: `get_ai_news`, `get_ai_status`, `is_service_down`, `get_model_pricing`, `get_ai_today`. No auth, no install beyond `npx -y @tensorfeed/mcp-server`.
|
package/README.md
CHANGED
|
@@ -59,6 +59,22 @@ route_verdict({ task: "code", max_latency_p95_ms: 1500, budget: 8, min_quality:
|
|
|
59
59
|
|
|
60
60
|
Models, prices, and latency move week to week. `route_verdict` is one signed call an agent can act on now and later prove why it routed the way it did, without rebuilding the comparison from scratch each time.
|
|
61
61
|
|
|
62
|
+
## Catalog
|
|
63
|
+
|
|
64
|
+
79 tools (48 free, 31 premium). Free tools need no token; premium tools charge USDC on Base via x402 and return an AFTA-signed receipt. The full tool reference lives in the [standalone repo](https://github.com/RipperMercs/tensorfeed-mcp).
|
|
65
|
+
|
|
66
|
+
### Verdict family
|
|
67
|
+
|
|
68
|
+
Seven signed decisions, each with a free preview tool plus a 1-credit ($0.02) AFTA-signed premium version:
|
|
69
|
+
|
|
70
|
+
- **provider_reliability_verdict**: the safest AI provider to build on, ranked by availability and tail consistency over TensorFeed's own probes.
|
|
71
|
+
- **x402_settlement_verdict**: the x402 settlement momentum, concentration, and leading publisher over a 24h, 7d, or 30d window.
|
|
72
|
+
- **x402_publisher_verdict**: a signed trust verdict on one publisher domain before you pay it.
|
|
73
|
+
- **stack_safety_verdict**: a GO, HOLD, or BLOCK deploy gate over your package@version pins, with the worst CVE or KEV match.
|
|
74
|
+
- **benchmark_trust_verdict**: a trust band and 0 to 100 score for a benchmark, flagging saturation, contamination, and held-out status.
|
|
75
|
+
- **failover_verdict**: when a provider is degraded, the single best operational provider to fail over to, with ranked alternatives.
|
|
76
|
+
- **ssvc_verdict**: the CISA SSVC Act, Attend, Track, or Track* decision for one CVE, with a live KEV cross-check.
|
|
77
|
+
|
|
62
78
|
## Publish a new version
|
|
63
79
|
|
|
64
80
|
From the main tensorfeed repo:
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,15 @@ const API_BASE = 'https://tensorfeed.ai/api';
|
|
|
14
14
|
const REQUEST_TIMEOUT_MS = 20000;
|
|
15
15
|
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
|
|
16
16
|
const SDK_VERSION = JSON.parse(readFileSync(pkgPath, 'utf-8')).version;
|
|
17
|
+
// Upsell footer appended to the free routing-precursor tools (get_ai_status,
|
|
18
|
+
// get_model_pricing). Each is a signal an agent gathers before choosing a
|
|
19
|
+
// model, so each points at the one premium tool that fuses them into a signed
|
|
20
|
+
// decision. Mirrors the hosted /api/mcp `next` field. Honest, zero em dashes.
|
|
21
|
+
const ROUTE_VERDICT_FOOTER = '\n\nNext: route_verdict (1 credit, $0.02) fuses live pricing, contamination-discounted ' +
|
|
22
|
+
'benchmarks, real production usage, measured p95 latency, incident state, and deprecation ' +
|
|
23
|
+
'flags into a signed best-fit model decision with ranked runners-up and an AFTA-signed ' +
|
|
24
|
+
'receipt. No USDC yet? Sign a wallet message at tensorfeed.ai/api/payment/trial-credits ' +
|
|
25
|
+
'for 25 free credits.';
|
|
17
26
|
async function fetchJSON(path, opts = {}) {
|
|
18
27
|
const headers = {
|
|
19
28
|
'User-Agent': `TensorFeed-MCP/${SDK_VERSION}`,
|
|
@@ -203,7 +212,7 @@ registerTool('get_ai_status', 'Get the real-time operational status of major AI
|
|
|
203
212
|
return ` ${s.status === 'operational' ? 'OK' : s.status.toUpperCase()} ${s.name} (${s.provider})${components}`;
|
|
204
213
|
})
|
|
205
214
|
.join('\n');
|
|
206
|
-
return { content: [{ type: 'text', text: `AI Service Status:\n${text}` }] };
|
|
215
|
+
return { content: [{ type: 'text', text: `AI Service Status:\n${text}${ROUTE_VERDICT_FOOTER}` }] };
|
|
207
216
|
});
|
|
208
217
|
// ── Tool: is_service_down ───────────────────────────────────────────
|
|
209
218
|
registerTool('is_service_down', 'Check whether one named AI service (e.g. "claude", "openai", "gemini", "mistral", "cohere", "hugging face", "replicate") is currently operational, degraded, or down, with its component-level breakdown. Matches on service or provider name and lists available services if there is no match, so an agent can gate a call on live status before sending traffic. Free, no auth.', {
|
|
@@ -222,7 +231,7 @@ registerTool('is_service_down', 'Check whether one named AI service (e.g. "claud
|
|
|
222
231
|
return {
|
|
223
232
|
content: [{
|
|
224
233
|
type: 'text',
|
|
225
|
-
text: `${statusEmoji} ${match.name} (${match.provider}) is ${match.status}${components}
|
|
234
|
+
text: `${statusEmoji} ${match.name} (${match.provider}) is ${match.status}${components}\n\nIf it is degraded, failover_verdict ranks the best operational alternative to fail over to right now.`
|
|
226
235
|
}]
|
|
227
236
|
};
|
|
228
237
|
});
|
|
@@ -299,7 +308,7 @@ registerTool('get_model_pricing', 'Get AI model pricing across major providers (
|
|
|
299
308
|
return ` ${p.name}:\n${models}`;
|
|
300
309
|
})
|
|
301
310
|
.join('\n\n');
|
|
302
|
-
return { content: [{ type: 'text', text: `AI Model Pricing (per 1M tokens):\n\n${text}` }] };
|
|
311
|
+
return { content: [{ type: 'text', text: `AI Model Pricing (per 1M tokens):\n\n${text}${ROUTE_VERDICT_FOOTER}` }] };
|
|
303
312
|
});
|
|
304
313
|
// ── Tool: get_model_deprecations ────────────────────────────────────
|
|
305
314
|
registerTool('get_model_deprecations', "Get the AI model deprecation calendar. Provider-by-provider registry of model retirements and deprecation announcements (OpenAI, Anthropic, Google, Cohere, and others). Each entry carries the announced/deprecation/sunset dates, the recommended replacement model, and a source URL pointing at the provider's own announcement. Useful for agents who need to know when a model they depend on will stop accepting traffic and what to migrate to.", {
|
|
@@ -683,7 +692,7 @@ registerTool('route_verdict_preview', "Free. TensorFeed's signed routing decisio
|
|
|
683
692
|
`Why: ${v.why}\n` +
|
|
684
693
|
`Blended price: $${v.pricing.blended}/1M tokens (in $${v.pricing.input}, out $${v.pricing.output})\n` +
|
|
685
694
|
`${trustLine}${fresh ? `\nData freshness: ${fresh}` : ''}\n` +
|
|
686
|
-
`Upgrade: route_verdict (1 credit) adds ranked runners-up, constraint filters, and an AFTA-signed receipt you can audit.${rl}`,
|
|
695
|
+
`Upgrade: route_verdict (1 credit, $0.02) adds ranked runners-up, constraint filters, and an AFTA-signed receipt you can audit. No USDC yet? Sign a wallet message at tensorfeed.ai/api/payment/trial-credits for 25 free credits.${rl}`,
|
|
687
696
|
},
|
|
688
697
|
],
|
|
689
698
|
};
|
|
@@ -757,6 +766,440 @@ registerTool('route_verdict', "Costs 1 credit ($0.02). The signed routing decisi
|
|
|
757
766
|
],
|
|
758
767
|
};
|
|
759
768
|
});
|
|
769
|
+
// ════════════════════════════════════════════════════════════════════
|
|
770
|
+
// Verdict family: 7 signed decisions, each a free preview tool plus a
|
|
771
|
+
// 1-credit premium tool. Each preview calls fetchJSON('/preview/<x>')
|
|
772
|
+
// (no auth, 10 calls per IP per day); each premium calls
|
|
773
|
+
// fetchJSON('/premium/<x>', { auth: true }) and burns 1 credit. The
|
|
774
|
+
// shapes below mirror the worker builder result interfaces exactly.
|
|
775
|
+
// ════════════════════════════════════════════════════════════════════
|
|
776
|
+
// Shared upsell tail for the preview tools. Mirrors ROUTE_VERDICT_FOOTER
|
|
777
|
+
// cadence. `tool` is the matching premium tool, `adds` names what the
|
|
778
|
+
// paid tier adds over the free preview, `rl` is the optional remaining
|
|
779
|
+
// calls suffix.
|
|
780
|
+
function verdictUpsell(tool, adds, rl) {
|
|
781
|
+
return (`Upgrade: ${tool} (1 credit, $0.02) adds ${adds} and an AFTA-signed receipt. ` +
|
|
782
|
+
`No USDC yet? Sign a wallet message at tensorfeed.ai/api/payment/trial-credits for 25 free credits.${rl}`);
|
|
783
|
+
}
|
|
784
|
+
function verdictBilling(billing) {
|
|
785
|
+
return billing ? `\n\nCharged ${billing.credits_charged} credit. Remaining: ${billing.credits_remaining}.` : '';
|
|
786
|
+
}
|
|
787
|
+
function previewRateLine(rate) {
|
|
788
|
+
return rate ? ` Preview: ${rate.remaining} of ${rate.limit} calls left today.` : '';
|
|
789
|
+
}
|
|
790
|
+
registerTool('provider_reliability_verdict_preview', "Free. TensorFeed's signed dependability ruling over its OWN measured latency and availability probes of the frontier AI providers. Names the single most-dependable provider to build on and the riskiest, scoring availability and tail consistency (p50 over p95) equally because an agent retry loop feels the tail, not the median. For the full per-provider ranking and an AFTA-signed receipt, use provider_reliability_verdict. 10 calls per day per IP.", {}, async () => {
|
|
791
|
+
const data = (await fetchJSON('/preview/provider-reliability-verdict'));
|
|
792
|
+
const v = data.verdict;
|
|
793
|
+
if (!v || !v.most_dependable) {
|
|
794
|
+
return { content: [{ type: 'text', text: `No reliability verdict available right now.\n${data.claim ?? ''}` }] };
|
|
795
|
+
}
|
|
796
|
+
const cov = data.coverage;
|
|
797
|
+
const rl = previewRateLine(data.rate_limit);
|
|
798
|
+
return {
|
|
799
|
+
content: [
|
|
800
|
+
{
|
|
801
|
+
type: 'text',
|
|
802
|
+
text: `Provider Reliability Verdict: most dependable ${v.most_dependable}` +
|
|
803
|
+
(v.riskiest ? `, riskiest ${v.riskiest}` : '') +
|
|
804
|
+
'\n' +
|
|
805
|
+
`Claim: ${data.claim}\n` +
|
|
806
|
+
`Coverage: ${cov.providers_ranked} providers ranked (${cov.fully_measured} fully measured, ${cov.availability_only} availability only)` +
|
|
807
|
+
(data.captured_at ? `, captured ${data.captured_at}` : '') +
|
|
808
|
+
'\n' +
|
|
809
|
+
verdictUpsell('provider_reliability_verdict', 'the full per-provider ranking with availability, tail spread, and measured p50/p95/p99', rl),
|
|
810
|
+
},
|
|
811
|
+
],
|
|
812
|
+
};
|
|
813
|
+
});
|
|
814
|
+
// ── Tool: provider_reliability_verdict (1 credit) ───────────────────
|
|
815
|
+
registerTool('provider_reliability_verdict', "Costs 1 credit ($0.02). The signed provider dependability ruling over TensorFeed's OWN measured probes: ranks every probed frontier provider by availability and tail consistency (p50 over p95), names the most dependable and the riskiest, and ships the full per-provider ranking with an AFTA-signed receipt over the measurements. Versus the free provider_reliability_verdict_preview it adds the complete ranking with each provider's measured availability, p50/p95/p99, and tail spread, plus the receipt and no rate limit. 30-minute freshness SLA, no-charge when stale. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {}, async () => {
|
|
816
|
+
const data = (await fetchJSON('/premium/provider-reliability-verdict', { auth: true }));
|
|
817
|
+
const v = data.verdict;
|
|
818
|
+
if (!v || !v.most_dependable) {
|
|
819
|
+
return { content: [{ type: 'text', text: `No reliability verdict available right now.\n${data.claim ?? ''}` }] };
|
|
820
|
+
}
|
|
821
|
+
const ranking = (data.ranking ?? [])
|
|
822
|
+
.map((r) => ` #${r.rank} ${r.provider}: ${r.note}`)
|
|
823
|
+
.join('\n');
|
|
824
|
+
return {
|
|
825
|
+
content: [
|
|
826
|
+
{
|
|
827
|
+
type: 'text',
|
|
828
|
+
text: `Provider Reliability Verdict: most dependable ${v.most_dependable}` +
|
|
829
|
+
(v.riskiest ? `, riskiest ${v.riskiest}` : '') +
|
|
830
|
+
'\n\n' +
|
|
831
|
+
`Ranking:\n${ranking || ' (none)'}\n\n` +
|
|
832
|
+
`Claim: ${data.claim}` +
|
|
833
|
+
verdictBilling(data.billing),
|
|
834
|
+
},
|
|
835
|
+
],
|
|
836
|
+
};
|
|
837
|
+
});
|
|
838
|
+
registerTool('x402_settlement_verdict_preview', "Free. TensorFeed's signed ruling on the state of the x402 USDC settlement market on Base, computed over its OWN on-chain settlement index: market momentum versus the prior window, concentration, and the leading publisher. For the full per-publisher ranking, ecosystem totals, the Herfindahl concentration index, an optional window, and an AFTA-signed receipt, use x402_settlement_verdict. Covers the publishers TensorFeed indexes on Base, forward-only from launch. 10 calls per day per IP.", {}, async () => {
|
|
839
|
+
const data = (await fetchJSON('/preview/x402-settlement-verdict'));
|
|
840
|
+
const v = data.verdict;
|
|
841
|
+
const rl = previewRateLine(data.rate_limit);
|
|
842
|
+
return {
|
|
843
|
+
content: [
|
|
844
|
+
{
|
|
845
|
+
type: 'text',
|
|
846
|
+
text: `x402 Settlement Verdict (${data.window_label ?? '7d'}): momentum ${v.momentum}, concentration ${v.concentration}` +
|
|
847
|
+
(v.leading_publisher ? `, leading publisher ${v.leading_publisher}` : ', no leading publisher this window') +
|
|
848
|
+
'\n' +
|
|
849
|
+
`Claim: ${data.claim}` +
|
|
850
|
+
(data.captured_at ? `\nIndex captured ${data.captured_at}` : '') +
|
|
851
|
+
'\n' +
|
|
852
|
+
verdictUpsell('x402_settlement_verdict', 'the full per-publisher ranking, ecosystem volume and count totals, the Herfindahl concentration index, and an optional 24h/7d/30d window', rl),
|
|
853
|
+
},
|
|
854
|
+
],
|
|
855
|
+
};
|
|
856
|
+
});
|
|
857
|
+
// ── Tool: x402_settlement_verdict (1 credit) ────────────────────────
|
|
858
|
+
registerTool('x402_settlement_verdict', "Costs 1 credit ($0.02). The signed ruling on the Base x402 USDC settlement market over TensorFeed's OWN settlement index: momentum versus the prior window of equal length, concentration by the Herfindahl index over publisher volume share, and the leading publisher, plus the full per-publisher ranking and an AFTA-signed receipt. Versus the free x402_settlement_verdict_preview it adds the per-publisher ranking with volume share, the ecosystem totals and concentration index, an optional window, and the receipt, with no rate limit. 10-minute freshness SLA, no-charge when stale. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
859
|
+
window: z.enum(['24h', '7d', '30d']).optional().describe('Settlement window to rule over (24h, 7d, 30d). Default 7d.'),
|
|
860
|
+
}, async ({ window }) => {
|
|
861
|
+
const params = new URLSearchParams();
|
|
862
|
+
if (window)
|
|
863
|
+
params.set('window', window);
|
|
864
|
+
const qs = params.toString();
|
|
865
|
+
const data = (await fetchJSON(`/premium/x402-settlement-verdict${qs ? `?${qs}` : ''}`, { auth: true }));
|
|
866
|
+
const v = data.verdict;
|
|
867
|
+
const e = data.ecosystem;
|
|
868
|
+
const ranking = (data.ranking ?? [])
|
|
869
|
+
.map((r) => ` #${r.rank} ${r.domain}: ${r.volume_usdc} USDC over ${r.count} settlements (${r.share_pct}% share)`)
|
|
870
|
+
.join('\n');
|
|
871
|
+
return {
|
|
872
|
+
content: [
|
|
873
|
+
{
|
|
874
|
+
type: 'text',
|
|
875
|
+
text: `x402 Settlement Verdict (${data.window_label ?? '7d'}): momentum ${v.momentum}, concentration ${v.concentration}` +
|
|
876
|
+
(v.leading_publisher ? `, leading publisher ${v.leading_publisher}` : ', no leading publisher this window') +
|
|
877
|
+
'\n' +
|
|
878
|
+
`Ecosystem: ${e.volume_usdc} USDC over ${e.count} settlements across ${e.unique_publishers} publishers` +
|
|
879
|
+
(e.top_publisher_share_pct !== null ? `, top share ${e.top_publisher_share_pct}%` : '') +
|
|
880
|
+
(e.hhi !== null ? `, HHI ${e.hhi}` : '') +
|
|
881
|
+
'\n\n' +
|
|
882
|
+
`Ranking:\n${ranking || ' (none)'}\n\n` +
|
|
883
|
+
`Claim: ${data.claim}` +
|
|
884
|
+
verdictBilling(data.billing),
|
|
885
|
+
},
|
|
886
|
+
],
|
|
887
|
+
};
|
|
888
|
+
});
|
|
889
|
+
// ── Tool: x402_publisher_verdict_preview (free, 10/IP/day) ───────────
|
|
890
|
+
registerTool('x402_publisher_verdict_preview', "Free. TensorFeed's signed trust verdict on one x402 publisher, over its OWN on-chain settlement index: whether a named publisher domain is actively settling, recently quiet, registered with no settlement, unreachable, missing a Base payTo, or not indexed. For the 30-day settlement momentum, the shared-wallet risk flag, the settlement evidence, and an AFTA-signed receipt, use x402_publisher_verdict. Requires a domain. 10 calls per day per IP.", {
|
|
891
|
+
domain: z.string().describe('Publisher domain to rule on, e.g. "x402.tavily.com". Required.'),
|
|
892
|
+
}, async ({ domain }) => {
|
|
893
|
+
if (!domain || !domain.trim()) {
|
|
894
|
+
return { content: [{ type: 'text', text: 'Provide a publisher domain (e.g. domain "x402.tavily.com") to get a trust verdict.' }] };
|
|
895
|
+
}
|
|
896
|
+
const params = new URLSearchParams({ domain: domain.trim() });
|
|
897
|
+
const data = (await fetchJSON(`/preview/x402-publisher-verdict?${params}`));
|
|
898
|
+
const rl = previewRateLine(data.rate_limit);
|
|
899
|
+
return {
|
|
900
|
+
content: [
|
|
901
|
+
{
|
|
902
|
+
type: 'text',
|
|
903
|
+
text: `x402 Publisher Verdict for ${data.domain}: ${data.verdict}\n` +
|
|
904
|
+
`Claim: ${data.claim}` +
|
|
905
|
+
(data.captured_at ? `\nIndex captured ${data.captured_at}` : '') +
|
|
906
|
+
'\n' +
|
|
907
|
+
verdictUpsell('x402_publisher_verdict', 'the 30-day settlement momentum, the shared-wallet risk flag, and the settlement evidence (volume, count, daily series)', rl),
|
|
908
|
+
},
|
|
909
|
+
],
|
|
910
|
+
};
|
|
911
|
+
});
|
|
912
|
+
// ── Tool: x402_publisher_verdict (1 credit) ─────────────────────────
|
|
913
|
+
registerTool('x402_publisher_verdict', "Costs 1 credit ($0.02). The signed trust verdict on a single x402 publisher over TensorFeed's OWN on-chain settlement index: whether its Base payTo is actively settling, its 30-day settlement momentum, a shared-wallet risk flag, and the settlement evidence, with an AFTA-signed receipt. Versus the free x402_publisher_verdict_preview it adds the momentum band, the shared-wallet flag, and the settlement evidence (volume, count, last settled, daily series), with no rate limit. A not-indexed domain is no-charge. 10-minute freshness SLA. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
914
|
+
domain: z.string().describe('Publisher domain to rule on, e.g. "x402.tavily.com". Required.'),
|
|
915
|
+
}, async ({ domain }) => {
|
|
916
|
+
if (!domain || !domain.trim()) {
|
|
917
|
+
return { content: [{ type: 'text', text: 'Provide a publisher domain (e.g. domain "x402.tavily.com") to get a signed trust verdict.' }] };
|
|
918
|
+
}
|
|
919
|
+
const params = new URLSearchParams({ domain: domain.trim() });
|
|
920
|
+
const data = (await fetchJSON(`/premium/x402-publisher-verdict?${params}`, { auth: true }));
|
|
921
|
+
const t = data.trust;
|
|
922
|
+
const ev = data.evidence;
|
|
923
|
+
return {
|
|
924
|
+
content: [
|
|
925
|
+
{
|
|
926
|
+
type: 'text',
|
|
927
|
+
text: `x402 Publisher Verdict for ${data.domain}: ${data.verdict}\n` +
|
|
928
|
+
`Momentum: ${data.momentum}. Shared wallet: ${t.wallet_shared ? 'yes (risk flag)' : 'no'}` +
|
|
929
|
+
(t.last_settled ? `. Last settled ${t.last_settled}` : '') +
|
|
930
|
+
'\n' +
|
|
931
|
+
`Evidence (${ev.window_days}d): ${ev.volume_usdc} USDC over ${ev.count} settlements\n` +
|
|
932
|
+
`Claim: ${data.claim}` +
|
|
933
|
+
verdictBilling(data.billing),
|
|
934
|
+
},
|
|
935
|
+
],
|
|
936
|
+
};
|
|
937
|
+
});
|
|
938
|
+
registerTool('stack_safety_verdict_preview', "Free. TensorFeed's deploy gate for an AI software stack: pass each package name (comma-separated name@version) and get the overall BLOCK / HOLD / PASS / UNKNOWN gate plus a per-package verdict, fusing the ingested AI-stack CVE batch with the CISA KEV catalog. Conservative by design: BLOCK only on an exploited CVE with no fix, HOLD when a known CVE applies and you must verify your version, PASS on no match, UNKNOWN outside the curated AI-stack cohort. For the matched-CVE evidence (ids, ranges, fixes, KEV status), up to 10 packages, and an AFTA-signed receipt, use stack_safety_verdict. Capped at 3 packages, 10 calls per day per IP.", {
|
|
939
|
+
packages: z.string().describe('Comma-separated AI-stack packages as name@version (e.g. "vllm@0.5.0,transformers@4.40.0"). Required. Preview caps at 3.'),
|
|
940
|
+
}, async ({ packages }) => {
|
|
941
|
+
if (!packages || !packages.trim()) {
|
|
942
|
+
return { content: [{ type: 'text', text: 'Provide packages as a comma-separated name@version list (e.g. "vllm@0.5.0,transformers@4.40.0") to get a deploy gate.' }] };
|
|
943
|
+
}
|
|
944
|
+
const params = new URLSearchParams({ packages: packages.trim() });
|
|
945
|
+
const data = (await fetchJSON(`/preview/stack-safety-verdict?${params}`));
|
|
946
|
+
const c = data.counts;
|
|
947
|
+
const worst = (data.packages ?? []).find((p) => p.verdict === 'BLOCK') ?? (data.packages ?? []).find((p) => p.verdict === 'HOLD') ?? null;
|
|
948
|
+
const worstLine = worst
|
|
949
|
+
? `Worst offender: ${worst.package}${worst.version ? `@${worst.version}` : ''} ${worst.verdict} (${worst.matched_cve_count} matched CVE${worst.matched_cve_count === 1 ? '' : 's'}). ${worst.reason}`
|
|
950
|
+
: 'No package hit a BLOCK or HOLD.';
|
|
951
|
+
const rl = previewRateLine(data.rate_limit);
|
|
952
|
+
return {
|
|
953
|
+
content: [
|
|
954
|
+
{
|
|
955
|
+
type: 'text',
|
|
956
|
+
text: `Stack Safety Verdict: gate ${data.gate}\n` +
|
|
957
|
+
`Counts: ${c.block} block, ${c.hold} hold, ${c.pass} pass, ${c.unknown} unknown\n` +
|
|
958
|
+
`${worstLine}\n` +
|
|
959
|
+
`Claim: ${data.claim}\n` +
|
|
960
|
+
verdictUpsell('stack_safety_verdict', 'the matched-CVE evidence (ids, affected ranges, fixed versions, KEV status) and up to 10 packages', rl),
|
|
961
|
+
},
|
|
962
|
+
],
|
|
963
|
+
};
|
|
964
|
+
});
|
|
965
|
+
registerTool('stack_safety_verdict', "Costs 1 credit ($0.02). The signed deploy gate for an AI software stack (up to 10 packages): the overall BLOCK / HOLD / PASS / UNKNOWN gate and a per-package verdict, fusing the ingested AI-stack CVE batch with the CISA KEV catalog, plus the matched-CVE evidence and an AFTA-signed receipt. Versus the free stack_safety_verdict_preview it adds the matched-CVE ids, affected ranges, fixed versions, and KEV status per package, raises the cap to 10 packages, and ships the receipt, with no rate limit. Never-false-confirm: BLOCK only on exploited with no fix. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
966
|
+
packages: z.string().describe('Comma-separated AI-stack packages as name@version (e.g. "vllm@0.5.0,transformers@4.40.0"). Required. Up to 10.'),
|
|
967
|
+
}, async ({ packages }) => {
|
|
968
|
+
if (!packages || !packages.trim()) {
|
|
969
|
+
return { content: [{ type: 'text', text: 'Provide packages as a comma-separated name@version list (e.g. "vllm@0.5.0,transformers@4.40.0") to get a signed deploy gate.' }] };
|
|
970
|
+
}
|
|
971
|
+
const params = new URLSearchParams({ packages: packages.trim() });
|
|
972
|
+
const data = (await fetchJSON(`/premium/stack-safety-verdict?${params}`, { auth: true }));
|
|
973
|
+
const c = data.counts;
|
|
974
|
+
const lines = (data.packages ?? [])
|
|
975
|
+
.map((p) => {
|
|
976
|
+
const cves = p.matched_cves
|
|
977
|
+
.map((m) => `${m.cve_id}${m.on_kev ? ' (KEV)' : ''} ${m.severity_label}`)
|
|
978
|
+
.join('; ');
|
|
979
|
+
return ` ${p.package}${p.version ? `@${p.version}` : ''}: ${p.verdict}. ${p.reason}` + (cves ? `\n CVEs: ${cves}` : '');
|
|
980
|
+
})
|
|
981
|
+
.join('\n');
|
|
982
|
+
return {
|
|
983
|
+
content: [
|
|
984
|
+
{
|
|
985
|
+
type: 'text',
|
|
986
|
+
text: `Stack Safety Verdict: gate ${data.gate}\n` +
|
|
987
|
+
`Counts: ${c.block} block, ${c.hold} hold, ${c.pass} pass, ${c.unknown} unknown\n\n` +
|
|
988
|
+
`${lines || ' (no packages)'}\n\n` +
|
|
989
|
+
`Claim: ${data.claim}` +
|
|
990
|
+
verdictBilling(data.billing),
|
|
991
|
+
},
|
|
992
|
+
],
|
|
993
|
+
};
|
|
994
|
+
});
|
|
995
|
+
registerTool('benchmark_trust_verdict_preview', "Free. TensorFeed's signed ruling on whether an AI benchmark is still a trustworthy capability signal or saturated, contaminated, or near ceiling so a high score should be down-weighted. Returns a trust band (reliable, use_with_caution, saturated, contaminated, deprecated) and a 0-100 trust score per benchmark. Pass benchmark to narrow to one, or category to filter, or neither for the registry. For the per-signal detail (ceiling proximity, frontier compression, contamination) and the down-weight recommendation with an alternative, use benchmark_trust_verdict. 10 calls per day per IP.", {
|
|
996
|
+
benchmark: z.string().optional().describe('Benchmark registry id or name to narrow to one (e.g. "mmlu", "swe-bench"). Optional.'),
|
|
997
|
+
category: z.string().optional().describe('Category to filter the benchmarks (e.g. "coding", "reasoning"). Optional.'),
|
|
998
|
+
}, async ({ benchmark, category }) => {
|
|
999
|
+
const params = new URLSearchParams();
|
|
1000
|
+
if (benchmark)
|
|
1001
|
+
params.set('benchmark', benchmark);
|
|
1002
|
+
if (category)
|
|
1003
|
+
params.set('category', category);
|
|
1004
|
+
const qs = params.toString();
|
|
1005
|
+
const data = (await fetchJSON(`/preview/benchmark-trust-verdict${qs ? `?${qs}` : ''}`));
|
|
1006
|
+
const verdicts = data.verdicts ?? [];
|
|
1007
|
+
if (verdicts.length === 0) {
|
|
1008
|
+
return { content: [{ type: 'text', text: `No benchmark matched that filter.\n${data.claim ?? ''}` }] };
|
|
1009
|
+
}
|
|
1010
|
+
const top = verdicts[0];
|
|
1011
|
+
const list = verdicts
|
|
1012
|
+
.slice(0, 3)
|
|
1013
|
+
.map((v) => ` ${v.name} (${v.category}): ${v.trust_band}, score ${v.trust_score}/100`)
|
|
1014
|
+
.join('\n');
|
|
1015
|
+
const rl = previewRateLine(data.rate_limit);
|
|
1016
|
+
return {
|
|
1017
|
+
content: [
|
|
1018
|
+
{
|
|
1019
|
+
type: 'text',
|
|
1020
|
+
text: `Benchmark Trust Verdict: ${top.name} is ${top.trust_band} (trust score ${top.trust_score}/100)\n` +
|
|
1021
|
+
(data.count > 1 ? `${data.count} benchmarks ruled on. Top:\n${list}\n` : `${list}\n`) +
|
|
1022
|
+
`Claim: ${data.claim}\n` +
|
|
1023
|
+
verdictUpsell('benchmark_trust_verdict', 'the per-signal detail (ceiling proximity, frontier compression, contamination, status) and the down-weight recommendation with an alternative benchmark', rl),
|
|
1024
|
+
},
|
|
1025
|
+
],
|
|
1026
|
+
};
|
|
1027
|
+
});
|
|
1028
|
+
registerTool('benchmark_trust_verdict', "Costs 1 credit ($0.02). The signed ruling on whether an AI benchmark is a trustworthy capability signal or saturated, contaminated, or near ceiling: a trust band and 0-100 score per benchmark, the per-signal detail, a down-weight recommendation with an alternative benchmark, and an AFTA-signed receipt. Versus the free benchmark_trust_verdict_preview it adds the ceiling proximity, frontier compression, and contamination signals, the recommendation, and the receipt, with no rate limit. Pass benchmark to narrow to one, or category to filter, or neither for the registry. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
1029
|
+
benchmark: z.string().optional().describe('Benchmark registry id or name to narrow to one (e.g. "mmlu", "swe-bench"). Optional.'),
|
|
1030
|
+
category: z.string().optional().describe('Category to filter the benchmarks (e.g. "coding", "reasoning"). Optional.'),
|
|
1031
|
+
}, async ({ benchmark, category }) => {
|
|
1032
|
+
const params = new URLSearchParams();
|
|
1033
|
+
if (benchmark)
|
|
1034
|
+
params.set('benchmark', benchmark);
|
|
1035
|
+
if (category)
|
|
1036
|
+
params.set('category', category);
|
|
1037
|
+
const qs = params.toString();
|
|
1038
|
+
const data = (await fetchJSON(`/premium/benchmark-trust-verdict${qs ? `?${qs}` : ''}`, { auth: true }));
|
|
1039
|
+
const verdicts = data.verdicts ?? [];
|
|
1040
|
+
if (verdicts.length === 0) {
|
|
1041
|
+
return { content: [{ type: 'text', text: `No benchmark matched that filter.\n${data.claim ?? ''}` }] };
|
|
1042
|
+
}
|
|
1043
|
+
const lines = verdicts
|
|
1044
|
+
.slice(0, 8)
|
|
1045
|
+
.map((v) => ` ${v.name} (${v.category}): ${v.trust_band}, score ${v.trust_score}/100. Ceiling ${v.signals.ceiling_proximity}, frontier ${v.signals.frontier_compression}.\n ${v.recommendation}`)
|
|
1046
|
+
.join('\n');
|
|
1047
|
+
return {
|
|
1048
|
+
content: [
|
|
1049
|
+
{
|
|
1050
|
+
type: 'text',
|
|
1051
|
+
text: `Benchmark Trust Verdict: ${data.count} benchmark${data.count === 1 ? '' : 's'} ruled on\n\n` +
|
|
1052
|
+
`${lines}\n\n` +
|
|
1053
|
+
`Claim: ${data.claim}` +
|
|
1054
|
+
verdictBilling(data.billing),
|
|
1055
|
+
},
|
|
1056
|
+
],
|
|
1057
|
+
};
|
|
1058
|
+
});
|
|
1059
|
+
registerTool('failover_verdict_preview', "Free. Provider A is degraded; TensorFeed's signed ruling on the single best operational provider to fail over to for a task right now. Confirms A against the live incident-triage feed, then runs the route-verdict fusion with A (and any provider already in failover) excluded. For the full failover candidate (pricing, measured latency, quality), the ranked alternatives, and an AFTA-signed receipt, use failover_verdict. Requires from. 10 calls per day per IP.", {
|
|
1060
|
+
from: z.string().describe('The degraded provider to fail over FROM (e.g. "anthropic", "openai"). Required.'),
|
|
1061
|
+
task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type to optimize the failover target for. Optional.'),
|
|
1062
|
+
}, async ({ from, task }) => {
|
|
1063
|
+
if (!from || !from.trim()) {
|
|
1064
|
+
return { content: [{ type: 'text', text: 'Provide a from provider (the degraded provider to fail over from, e.g. from "anthropic") to get a failover verdict.' }] };
|
|
1065
|
+
}
|
|
1066
|
+
const params = new URLSearchParams({ from: from.trim() });
|
|
1067
|
+
if (task)
|
|
1068
|
+
params.set('task', task);
|
|
1069
|
+
const data = (await fetchJSON(`/preview/failover-verdict?${params}`));
|
|
1070
|
+
const dest = data.failover_to;
|
|
1071
|
+
const rl = previewRateLine(data.rate_limit);
|
|
1072
|
+
if (!dest) {
|
|
1073
|
+
return {
|
|
1074
|
+
content: [
|
|
1075
|
+
{
|
|
1076
|
+
type: 'text',
|
|
1077
|
+
text: `Failover Verdict from ${data.from.provider}: no operational failover target found.\n` +
|
|
1078
|
+
`Why: ${data.why}\n${data.claim}\n` +
|
|
1079
|
+
verdictUpsell('failover_verdict', 'the full failover candidate (pricing, measured latency, quality) and the ranked alternatives', rl),
|
|
1080
|
+
},
|
|
1081
|
+
],
|
|
1082
|
+
};
|
|
1083
|
+
}
|
|
1084
|
+
return {
|
|
1085
|
+
content: [
|
|
1086
|
+
{
|
|
1087
|
+
type: 'text',
|
|
1088
|
+
text: `Failover Verdict from ${data.from.provider}` +
|
|
1089
|
+
(data.from.in_incident ? ' (confirmed in incident)' : '') +
|
|
1090
|
+
`: fail over to ${dest.model.name} (${dest.model.provider})\n` +
|
|
1091
|
+
`Why: ${data.why}\n` +
|
|
1092
|
+
`Excluded: ${data.excluded_providers.length ? data.excluded_providers.join(', ') : 'none'}\n` +
|
|
1093
|
+
`Claim: ${data.claim}\n` +
|
|
1094
|
+
verdictUpsell('failover_verdict', 'the full failover candidate (pricing, measured latency, quality) and the ranked alternatives', rl),
|
|
1095
|
+
},
|
|
1096
|
+
],
|
|
1097
|
+
};
|
|
1098
|
+
});
|
|
1099
|
+
registerTool('failover_verdict', "Costs 1 credit ($0.02). The signed failover ruling: provider A is degraded, this is the best operational provider to fail over to for a task right now, with the full candidate (pricing, measured p95 latency, quality), the ranked alternatives, the confirmed incident on A, and an AFTA-signed receipt. Versus the free failover_verdict_preview it adds the candidate's pricing, measured latency, and quality, the ranked alternatives, and the receipt, with no rate limit. Confirms A against live incident triage and excludes any provider already in failover. 30-minute operational freshness SLA. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
1100
|
+
from: z.string().describe('The degraded provider to fail over FROM (e.g. "anthropic", "openai"). Required.'),
|
|
1101
|
+
task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type to optimize the failover target for. Optional.'),
|
|
1102
|
+
}, async ({ from, task }) => {
|
|
1103
|
+
if (!from || !from.trim()) {
|
|
1104
|
+
return { content: [{ type: 'text', text: 'Provide a from provider (the degraded provider to fail over from, e.g. from "anthropic") to get a signed failover verdict.' }] };
|
|
1105
|
+
}
|
|
1106
|
+
const params = new URLSearchParams({ from: from.trim() });
|
|
1107
|
+
if (task)
|
|
1108
|
+
params.set('task', task);
|
|
1109
|
+
const data = (await fetchJSON(`/premium/failover-verdict?${params}`, { auth: true }));
|
|
1110
|
+
const dest = data.failover_to;
|
|
1111
|
+
const incidentLine = data.from.incident
|
|
1112
|
+
? `Incident on ${data.from.provider}: ${data.from.incident.title} (action ${data.from.incident.recommended_action})\n`
|
|
1113
|
+
: '';
|
|
1114
|
+
if (!dest) {
|
|
1115
|
+
return {
|
|
1116
|
+
content: [
|
|
1117
|
+
{
|
|
1118
|
+
type: 'text',
|
|
1119
|
+
text: `Failover Verdict from ${data.from.provider}: no operational failover target found.\n` +
|
|
1120
|
+
incidentLine +
|
|
1121
|
+
`Why: ${data.why}\nClaim: ${data.claim}` +
|
|
1122
|
+
verdictBilling(data.billing),
|
|
1123
|
+
},
|
|
1124
|
+
],
|
|
1125
|
+
};
|
|
1126
|
+
}
|
|
1127
|
+
const alts = (data.alternatives ?? [])
|
|
1128
|
+
.map((a) => ` #${a.rank} ${a.model.name} (${a.model.provider}) blended $${a.pricing.blended}/1M, p95 ${a.latency.measured_p95_ms ?? 'n/a'}ms, status ${a.operational.status}`)
|
|
1129
|
+
.join('\n');
|
|
1130
|
+
return {
|
|
1131
|
+
content: [
|
|
1132
|
+
{
|
|
1133
|
+
type: 'text',
|
|
1134
|
+
text: `Failover Verdict from ${data.from.provider}: fail over to ${dest.model.name} (${dest.model.provider})\n` +
|
|
1135
|
+
`Why: ${dest.why}\n` +
|
|
1136
|
+
`Blended $${dest.pricing.blended}/1M, p95 ${dest.latency.measured_p95_ms ?? 'n/a'}ms, status ${dest.operational.status}\n` +
|
|
1137
|
+
incidentLine +
|
|
1138
|
+
`Excluded: ${data.excluded_providers.length ? data.excluded_providers.join(', ') : 'none'}\n\n` +
|
|
1139
|
+
`Alternatives:\n${alts || ' (none)'}\n\n` +
|
|
1140
|
+
`Claim: ${data.claim}` +
|
|
1141
|
+
verdictBilling(data.billing),
|
|
1142
|
+
},
|
|
1143
|
+
],
|
|
1144
|
+
};
|
|
1145
|
+
});
|
|
1146
|
+
// ── Tool: ssvc_verdict_preview (free, 10/IP/day) ────────────────────
|
|
1147
|
+
registerTool('ssvc_verdict_preview', "Free. The CISA SSVC decision points for one CVE, read from CISA's Vulnrichment record: exploitation, automatable, and technical impact, plus the decision-tree provenance, WITHOUT the computed Act / Attend / Track / Track* decision (that is the premium ruling). For the computed SSVC decision across the full Mission and Well-being envelope, the per-level reasoning, the live KEV cross-check, and an AFTA-signed receipt, use ssvc_verdict. Requires a CVE id. 10 calls per day per IP.", {
|
|
1148
|
+
cve: z.string().describe('CVE id to rule on, e.g. "CVE-2024-3094". Required.'),
|
|
1149
|
+
}, async ({ cve }) => {
|
|
1150
|
+
if (!cve || !cve.trim()) {
|
|
1151
|
+
return { content: [{ type: 'text', text: 'Provide a CVE id (e.g. cve "CVE-2024-3094") to get the SSVC decision points.' }] };
|
|
1152
|
+
}
|
|
1153
|
+
const params = new URLSearchParams({ cve: cve.trim() });
|
|
1154
|
+
const data = (await fetchJSON(`/preview/security/ssvc-verdict?${params}`));
|
|
1155
|
+
const dp = data.decision_points;
|
|
1156
|
+
const rl = previewRateLine(data.rate_limit);
|
|
1157
|
+
return {
|
|
1158
|
+
content: [
|
|
1159
|
+
{
|
|
1160
|
+
type: 'text',
|
|
1161
|
+
text: `SSVC decision points for ${data.cve}:\n` +
|
|
1162
|
+
` exploitation: ${dp.exploitation}\n` +
|
|
1163
|
+
` automatable: ${dp.automatable}\n` +
|
|
1164
|
+
` technical impact: ${dp.technical_impact}\n` +
|
|
1165
|
+
`Tree: ${data.tree.name} ${data.tree.version}` +
|
|
1166
|
+
(data.scored_at ? `, scored ${data.scored_at}` : '') +
|
|
1167
|
+
'\n' +
|
|
1168
|
+
verdictUpsell('ssvc_verdict', 'the computed SSVC decision (Act, Attend, Track, or Track*) across the low/medium/high Mission and Well-being envelope, the per-level reasoning, and the live KEV cross-check', rl),
|
|
1169
|
+
},
|
|
1170
|
+
],
|
|
1171
|
+
};
|
|
1172
|
+
});
|
|
1173
|
+
// ── Tool: ssvc_verdict (1 credit) ───────────────────────────────────
|
|
1174
|
+
registerTool('ssvc_verdict', "Costs 1 credit ($0.02). The signed SSVC patch-urgency decision for one CVE: applies the CISA SSVC Coordinator decision tree to the three recorded decision points and returns the decision (Act, Attend, Track, or Track*) across the full low/medium/high Mission and Well-being envelope, the per-level reasoning, a live CISA KEV cross-check, and an AFTA-signed receipt. Versus the free ssvc_verdict_preview it adds the computed decision, the envelope, the reasoning trace, the KEV staleness overlay, and the receipt, with no rate limit. A CVE not in Vulnrichment is no-charge. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
|
|
1175
|
+
cve: z.string().describe('CVE id to rule on, e.g. "CVE-2024-3094". Required.'),
|
|
1176
|
+
}, async ({ cve }) => {
|
|
1177
|
+
if (!cve || !cve.trim()) {
|
|
1178
|
+
return { content: [{ type: 'text', text: 'Provide a CVE id (e.g. cve "CVE-2024-3094") to get a signed SSVC decision.' }] };
|
|
1179
|
+
}
|
|
1180
|
+
const params = new URLSearchParams({ cve: cve.trim() });
|
|
1181
|
+
const data = (await fetchJSON(`/premium/security/ssvc-verdict?${params}`, { auth: true }));
|
|
1182
|
+
const dp = data.decision_points;
|
|
1183
|
+
const env = data.decision_envelope;
|
|
1184
|
+
const kev = data.kev_cross_check;
|
|
1185
|
+
const kevLine = kev && kev.checked
|
|
1186
|
+
? `KEV cross-check: ${kev.kev_listed ? 'listed on CISA KEV' : 'not on KEV'}${kev.flag && kev.flag !== 'none' ? ` (${kev.flag})` : ''}`
|
|
1187
|
+
: 'KEV cross-check: unavailable';
|
|
1188
|
+
return {
|
|
1189
|
+
content: [
|
|
1190
|
+
{
|
|
1191
|
+
type: 'text',
|
|
1192
|
+
text: `SSVC Verdict for ${data.cve}: ${data.decision_primary} (Mission and Well-being assumed medium)\n` +
|
|
1193
|
+
`Envelope: low ${env.low}, medium ${env.medium}, high ${env.high}\n` +
|
|
1194
|
+
`Decision points: exploitation ${dp.exploitation}, automatable ${dp.automatable}, technical impact ${dp.technical_impact}\n` +
|
|
1195
|
+
`${kevLine}\n` +
|
|
1196
|
+
`Tree: ${data.tree.name} ${data.tree.version}` +
|
|
1197
|
+
(data.scored_at ? `, scored ${data.scored_at}` : '') +
|
|
1198
|
+
verdictBilling(data.billing),
|
|
1199
|
+
},
|
|
1200
|
+
],
|
|
1201
|
+
};
|
|
1202
|
+
});
|
|
760
1203
|
// ── Tool: pricing_series_free (free, 7-day cap) ─────────────────────
|
|
761
1204
|
registerTool('pricing_series_free', 'Daily price points for one AI model over the last 1 to 7 days, free. For windows up to 90 days use pricing_series (1 credit).', {
|
|
762
1205
|
model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
|
|
@@ -841,7 +1284,7 @@ registerTool('status_leaderboard_free', 'Cross-provider uptime leaderboard, rank
|
|
|
841
1284
|
content: [
|
|
842
1285
|
{
|
|
843
1286
|
type: 'text',
|
|
844
|
-
text: `AI provider uptime leaderboard ${data.range?.from} to ${data.range?.to}\n${lines.join('\n')}
|
|
1287
|
+
text: `AI provider uptime leaderboard ${data.range?.from} to ${data.range?.to}\n${lines.join('\n')}\n\nprovider_reliability_verdict ranks providers by dependability, not just current state.`,
|
|
845
1288
|
},
|
|
846
1289
|
],
|
|
847
1290
|
};
|
|
@@ -1836,7 +2279,7 @@ registerTool('get_ai_cves_latest', 'Get metadata for the most-recent AI-stack CV
|
|
|
1836
2279
|
content: [
|
|
1837
2280
|
{
|
|
1838
2281
|
type: 'text',
|
|
1839
|
-
text: `${head}\n\nFirst 25 papers:\n${lines}\n\nFor AI-stack-filtered + categorized + sorted papers: /api/premium/ai-cves/ai-stack-cves (1 credit, x402-paid). For only papers actively exploited in the wild: /api/premium/ai-cves/exploited-in-wild (1 credit). For single-CVE lookup: /api/premium/ai-cves/cve?id=CVE-YYYY-NNNNN (1 credit).`,
|
|
2282
|
+
text: `${head}\n\nFirst 25 papers:\n${lines}\n\nFor AI-stack-filtered + categorized + sorted papers: /api/premium/ai-cves/ai-stack-cves (1 credit, x402-paid). For only papers actively exploited in the wild: /api/premium/ai-cves/exploited-in-wild (1 credit). For single-CVE lookup: /api/premium/ai-cves/cve?id=CVE-YYYY-NNNNN (1 credit).\n\nssvc_verdict gives the CISA SSVC act/attend/track decision for a CVE; stack_safety_verdict gates your deploy by package.`,
|
|
1840
2283
|
},
|
|
1841
2284
|
],
|
|
1842
2285
|
};
|
|
@@ -1983,7 +2426,7 @@ registerTool('get_x402_publishers', 'List x402-compliant publishers TensorFeed c
|
|
|
1983
2426
|
content: [
|
|
1984
2427
|
{
|
|
1985
2428
|
type: 'text',
|
|
1986
|
-
text: `x402 publishers (${data.count}, captured ${data.captured_at}):\n\n${lines}${more}
|
|
2429
|
+
text: `x402 publishers (${data.count}, captured ${data.captured_at}):\n\n${lines}${more}\n\nx402_publisher_verdict returns a signed trust verdict on one publisher before you pay it.`,
|
|
1987
2430
|
},
|
|
1988
2431
|
],
|
|
1989
2432
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensorfeed/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.39.0",
|
|
4
4
|
"mcpName": "ai.tensorfeed/mcp-server",
|
|
5
5
|
"description": "MCP server for TensorFeed.ai - AI news, status, model data, and premium endpoints (routing, cost projection, forecast, history series, news search, webhook watches with digest tier, enriched directory) for AI agents",
|
|
6
6
|
"main": "dist/index.js",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "ai.tensorfeed/mcp-server",
|
|
4
4
|
"title": "TensorFeed",
|
|
5
5
|
"description": "AI news, model pricing, service status, and machine-payable premium tools. AFTA-certified.",
|
|
6
|
-
"version": "1.
|
|
6
|
+
"version": "1.39.0",
|
|
7
7
|
"websiteUrl": "https://tensorfeed.ai/developers/agent-payments",
|
|
8
8
|
"repository": {
|
|
9
9
|
"url": "https://github.com/RipperMercs/tensorfeed-mcp",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"registryType": "npm",
|
|
21
21
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
22
22
|
"identifier": "@tensorfeed/mcp-server",
|
|
23
|
-
"version": "1.
|
|
23
|
+
"version": "1.39.0",
|
|
24
24
|
"runtimeHint": "npx",
|
|
25
25
|
"transport": {
|
|
26
26
|
"type": "stdio"
|