@tensorfeed/mcp-server 1.36.2 → 1.36.4

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 CHANGED
@@ -2,6 +2,34 @@
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.36.4 - 2026-05-31
6
+
7
+ Docs-only release. The README now opens with the Route Verdict quickstart: a
8
+ zero-install curl against the free preview plus the `route_verdict_preview` and
9
+ `route_verdict` tools. No tool, pricing, or behavior changes from 1.36.3.
10
+
11
+ ## 1.36.3 - 2026-05-31
12
+
13
+ Adds the Route Verdict wedge: TensorFeed's signed routing decision is now a
14
+ tool you can try free, then upgrade. Brings the catalog to 61 tools (37 free,
15
+ 24 premium).
16
+
17
+ Free tool:
18
+ - `route_verdict_preview`: TensorFeed's signed routing decision that fuses
19
+ live pricing, contamination-discounted benchmarks, real production usage,
20
+ measured p95 latency, incident state, and deprecation flags into the single
21
+ best model for a task or a named model, with the reasoning. No key, 10 calls
22
+ per day per IP.
23
+
24
+ Premium tool:
25
+ - `route_verdict` (1 credit): the same decision plus ranked runners-up,
26
+ constraint filters (max p95 latency, budget, min quality, operational-only,
27
+ exclude-deprecated), and an AFTA-signed receipt over the exact inputs so you
28
+ can prove why you routed. Strict premium, no free trial.
29
+
30
+ The older `premium_routing` (a ranked list with a score breakdown) is
31
+ unchanged and remains available.
32
+
5
33
  ## 1.36.2 - 2026-05-31
6
34
 
7
35
  Pricing-copy and catalog-accuracy corrections. No change to the free/paid
package/README.md CHANGED
@@ -6,6 +6,59 @@
6
6
 
7
7
  This subfolder remains in the main `tensorfeed` repo as the **publishing source** for the npm package (`@tensorfeed/mcp-server`) and the [official MCP registry](https://registry.modelcontextprotocol.io/v0/servers/ai.tensorfeed/mcp-server) entry. Edits to `src/`, `server.json`, `package.json`, etc. happen here and get pushed to the standalone repo on release.
8
8
 
9
+ ## Featured: Route Verdict
10
+
11
+ The single best model to use right now, as one signed call. `route_verdict` fuses live pricing, contamination-discounted benchmark capability, real production usage, measured p95 latency probes, live incident state, and deprecation flags into one ranked decision, with an AFTA-signed receipt over the exact inputs. Instead of stitching together pricing pages, benchmark leaderboards, status dashboards, and your own latency tests, you get a current, defensible routing answer in one request.
12
+
13
+ ### Zero install, no key, one command (works today)
14
+
15
+ ```bash
16
+ curl -s -A "tensorfeed-cc-quickstart" "https://tensorfeed.ai/api/preview/route-verdict?task=code"
17
+ ```
18
+
19
+ Swap `task` for `reasoning`, `creative`, or `general`, or pass `?model=<id-or-name>` to score a specific model. The free preview is 10 calls per day per IP, no token. Abridged real response:
20
+
21
+ ```json
22
+ {
23
+ "ok": true,
24
+ "preview": true,
25
+ "query": { "task": "code", "model": null },
26
+ "verdict": {
27
+ "rank": 1,
28
+ "model": { "name": "Gemini 2.5 Pro", "provider": "google" },
29
+ "pricing": { "blended": 5.625, "unit": "per 1M tokens" },
30
+ "quality": { "trust_discounted": 0.6498 },
31
+ "latency": { "measured_p95_ms": 1223, "source": "measured_probe" },
32
+ "operational": { "ok": true, "status": "operational" },
33
+ "composite_score": 0.8449,
34
+ "why": "code quality 0.6498 after trust discount; corroborated by real usage (rank 5, 6.5% share, flat); measured p95 1223 ms; operational; blended $5.625 / 1M"
35
+ },
36
+ "rate_limit": { "limit": 10, "remaining": 9, "scope": "per IP per UTC day" },
37
+ "upgrade": {
38
+ "premium_endpoint": "/api/premium/route-verdict",
39
+ "adds": ["runners_up", "AFTA-signed receipt", "filter params", "no rate limit"]
40
+ }
41
+ }
42
+ ```
43
+
44
+ ### The agent path (MCP)
45
+
46
+ With `@tensorfeed/mcp-server` installed, an agent gets two tools. Call the free one for the pick, then the paid one when it needs to defend the choice:
47
+
48
+ ```text
49
+ # Free taste: the top pick + reasoning, no token (10/IP/day)
50
+ route_verdict_preview({ task: "code" })
51
+
52
+ # 1 credit: ranked runners-up, constraint filters, AFTA-signed receipt
53
+ route_verdict({ task: "code", max_latency_p95_ms: 1500, budget: 8, min_quality: 0.6 })
54
+ ```
55
+
56
+ `route_verdict` adds the ranked runners-up, the constraint filters (`max_latency_p95_ms`, `budget`, `min_quality`, `require_operational`, `exclude_deprecated`), and the AFTA-signed receipt the agent can audit later. Credits come from [tensorfeed.ai/developers/agent-payments](https://tensorfeed.ai/developers/agent-payments).
57
+
58
+ ### Why it matters
59
+
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
+
9
62
  ## Publish a new version
10
63
 
11
64
  From the main tensorfeed repo:
package/dist/index.js CHANGED
@@ -584,6 +584,124 @@ registerTool('premium_routing', 'Get a ranked list of recommended AI models for
584
584
  : '';
585
585
  return { content: [{ type: 'text', text: `Routing for "${data.task}":\n\n${list}${billing}` }] };
586
586
  });
587
+ registerTool('route_verdict_preview', "Free. TensorFeed's signed routing decision that fuses live pricing, contamination-discounted benchmarks, real production usage, MEASURED p95 latency, incident state, and deprecation flags into the single best model for a task or a named model, with the reasoning. For ranked runners-up, constraint filters, and an AFTA-signed receipt you can audit, use route_verdict. 10 calls per day per IP.", {
588
+ task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type to route for (code, reasoning, creative, general). Provide task or model.'),
589
+ model: z.string().optional().describe('Model id or display name to narrow the verdict to one model (e.g. "Claude Opus 4.7" or "claude-opus-4-7"). Provide task or model.'),
590
+ }, async ({ task, model }) => {
591
+ if (!task && !model) {
592
+ return {
593
+ content: [
594
+ {
595
+ type: 'text',
596
+ text: 'Provide a task (code, reasoning, creative, general) or a model id/name to get a routing verdict.',
597
+ },
598
+ ],
599
+ };
600
+ }
601
+ const params = new URLSearchParams();
602
+ if (task)
603
+ params.set('task', task);
604
+ if (model)
605
+ params.set('model', model);
606
+ const data = (await fetchJSON(`/preview/route-verdict?${params}`));
607
+ if (!data.verdict) {
608
+ return {
609
+ content: [{ type: 'text', text: `No routing verdict available for that query.\n${data.claim ?? ''}` }],
610
+ };
611
+ }
612
+ const v = data.verdict;
613
+ const t = data.trust;
614
+ const fresh = [
615
+ data.data_freshness.pricing ? `pricing ${data.data_freshness.pricing}` : null,
616
+ data.data_freshness.probe ? `latency ${data.data_freshness.probe}` : null,
617
+ data.data_freshness.status ? `status ${data.data_freshness.status}` : null,
618
+ ]
619
+ .filter(Boolean)
620
+ .join(', ');
621
+ const trustLine = `Trust: usage ${t.usage_corroborated ? 'corroborated' : 'uncorroborated'}, benchmark contamination ${t.benchmark_contamination}, operational ${t.operational_layer}, latency ${t.latency_layer}`;
622
+ const rl = data.rate_limit ? `\nPreview: ${data.rate_limit.remaining} of ${data.rate_limit.limit} calls left today (${data.rate_limit.scope}).` : '';
623
+ return {
624
+ content: [
625
+ {
626
+ type: 'text',
627
+ text: `Route Verdict: ${v.model.name} (${v.model.provider})\n` +
628
+ `Why: ${v.why}\n` +
629
+ `Blended price: $${v.pricing.blended}/1M tokens (in $${v.pricing.input}, out $${v.pricing.output})\n` +
630
+ `${trustLine}${fresh ? `\nData freshness: ${fresh}` : ''}\n` +
631
+ `Upgrade: route_verdict (1 credit) adds ranked runners-up, constraint filters, and an AFTA-signed receipt you can audit.${rl}`,
632
+ },
633
+ ],
634
+ };
635
+ });
636
+ // ── Tool: route_verdict (1 credit) ──────────────────────────────────
637
+ // The signed routing decision. Single best model plus ranked runners-up
638
+ // for a task or named model, with constraint filters and an AFTA-signed
639
+ // receipt over the exact inputs. Strict premium, no free trial. The free
640
+ // route_verdict_preview is the no-auth taste of the same engine.
641
+ registerTool('route_verdict', "Costs 1 credit ($0.02). The signed routing decision: TensorFeed's single best model plus ranked runners-up for your task or a named model, fused from live pricing, contamination-discounted benchmarks, real production usage, MEASURED p95 latency, incident state, and deprecation flags, with an AFTA-signed receipt over the exact inputs so you can prove why you routed. Versus the free route_verdict_preview it adds ranked runners-up, constraint filters (max p95 latency, budget, min quality, operational-only, exclude-deprecated), the signed receipt, and no rate limit. Get credits at tensorfeed.ai/developers/agent-payments. Strict premium, no free trial.", {
642
+ task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type to route for (code, reasoning, creative, general). Provide task or model.'),
643
+ model: z.string().optional().describe('Model id or display name to narrow the verdict to one model. Provide task or model.'),
644
+ max_latency_p95_ms: z.number().optional().describe('Drop candidates whose measured p95 latency exceeds this value (ms).'),
645
+ budget: z.number().optional().describe('Max blended USD per 1M tokens'),
646
+ min_quality: z.number().min(0).max(1).optional().describe('Minimum trust-discounted quality score in [0, 1]'),
647
+ require_operational: z.boolean().optional().describe('Default true. Set false to keep candidates known down or in failover.'),
648
+ exclude_deprecated: z.boolean().optional().describe('Default true. Set false to keep deprecated or sunsetted models.'),
649
+ }, async ({ task, model, max_latency_p95_ms, budget, min_quality, require_operational, exclude_deprecated }) => {
650
+ if (!task && !model) {
651
+ return {
652
+ content: [
653
+ {
654
+ type: 'text',
655
+ text: 'Provide a task (code, reasoning, creative, general) or a model id/name to get a signed routing verdict.',
656
+ },
657
+ ],
658
+ };
659
+ }
660
+ const params = new URLSearchParams();
661
+ if (task)
662
+ params.set('task', task);
663
+ if (model)
664
+ params.set('model', model);
665
+ if (typeof max_latency_p95_ms === 'number')
666
+ params.set('max_latency_p95_ms', String(max_latency_p95_ms));
667
+ if (typeof budget === 'number')
668
+ params.set('budget', String(budget));
669
+ if (typeof min_quality === 'number')
670
+ params.set('min_quality', String(min_quality));
671
+ if (typeof require_operational === 'boolean')
672
+ params.set('require_operational', String(require_operational));
673
+ if (typeof exclude_deprecated === 'boolean')
674
+ params.set('exclude_deprecated', String(exclude_deprecated));
675
+ const data = (await fetchJSON(`/premium/route-verdict?${params}`, { auth: true }));
676
+ if (!data.verdict) {
677
+ return {
678
+ content: [{ type: 'text', text: `No routing verdict matched your filters.\n${data.claim ?? ''}` }],
679
+ };
680
+ }
681
+ const v = data.verdict;
682
+ const t = data.trust;
683
+ const f = data.filters_applied;
684
+ const runners = (data.runners_up ?? [])
685
+ .map((r) => ` #${r.rank} ${r.model.name} (${r.model.provider}) blended $${r.pricing.blended}/1M\n ${r.why}`)
686
+ .join('\n');
687
+ const trustLine = `Trust: usage ${t.usage_corroborated ? 'corroborated' : 'uncorroborated'}, benchmark contamination ${t.benchmark_contamination}, operational ${t.operational_layer}, latency ${t.latency_layer}`;
688
+ const filterLine = `Filters: max p95 ${f.max_latency_p95_ms ?? 'none'}ms, require_operational ${f.require_operational}, exclude_deprecated ${f.exclude_deprecated}`;
689
+ const billing = data.billing
690
+ ? `\n\nCharged ${data.billing.credits_charged} credit. Remaining: ${data.billing.credits_remaining}.`
691
+ : '';
692
+ return {
693
+ content: [
694
+ {
695
+ type: 'text',
696
+ text: `Route Verdict: ${v.model.name} (${v.model.provider}) score ${v.composite_score}\n` +
697
+ `Why: ${v.why}\n` +
698
+ `Blended price: $${v.pricing.blended}/1M tokens (in $${v.pricing.input}, out $${v.pricing.output})\n\n` +
699
+ `Runners-up:\n${runners || ' (none)'}\n\n` +
700
+ `${trustLine}\n${filterLine}\n\nClaim: ${data.claim}${billing}`,
701
+ },
702
+ ],
703
+ };
704
+ });
587
705
  // ── Tool: pricing_series_free (free, 7-day cap) ─────────────────────
588
706
  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).', {
589
707
  model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.36.2",
3
+ "version": "1.36.4",
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.36.2",
6
+ "version": "1.36.4",
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.36.2",
23
+ "version": "1.36.4",
24
24
  "runtimeHint": "npx",
25
25
  "transport": {
26
26
  "type": "stdio"
@@ -78,7 +78,8 @@
78
78
  "get_x402_summary",
79
79
  "get_x402_publishers",
80
80
  "get_x402_leaderboard",
81
- "get_x402_recent"
81
+ "get_x402_recent",
82
+ "route_verdict_preview"
82
83
  ],
83
84
  "premiumTools": [
84
85
  "premium_routing",
@@ -103,7 +104,8 @@
103
104
  "get_account_usage",
104
105
  "premium_ai_company",
105
106
  "premium_x402_publisher_receipts",
106
- "premium_x402_series"
107
+ "premium_x402_series",
108
+ "route_verdict"
107
109
  ]
108
110
  }
109
111
  }