@tensorfeed/mcp-server 1.36.1 → 1.36.3

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,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.36.3 - 2026-05-31
6
+
7
+ Adds the Route Verdict wedge: TensorFeed's signed routing decision is now a
8
+ tool you can try free, then upgrade. Brings the catalog to 61 tools (37 free,
9
+ 24 premium).
10
+
11
+ Free tool:
12
+ - `route_verdict_preview`: TensorFeed's signed routing decision that fuses
13
+ live pricing, contamination-discounted benchmarks, real production usage,
14
+ measured p95 latency, incident state, and deprecation flags into the single
15
+ best model for a task or a named model, with the reasoning. No key, 10 calls
16
+ per day per IP.
17
+
18
+ Premium tool:
19
+ - `route_verdict` (1 credit): the same decision plus ranked runners-up,
20
+ constraint filters (max p95 latency, budget, min quality, operational-only,
21
+ exclude-deprecated), and an AFTA-signed receipt over the exact inputs so you
22
+ can prove why you routed. Strict premium, no free trial.
23
+
24
+ The older `premium_routing` (a ranked list with a score breakdown) is
25
+ unchanged and remains available.
26
+
27
+ ## 1.36.2 - 2026-05-31
28
+
29
+ Pricing-copy and catalog-accuracy corrections. No change to the free/paid
30
+ split or the actual on-chain charge.
31
+
32
+ - Corrected the stated credit cost on `pricing_series`, `benchmark_series`,
33
+ and `status_uptime` and their free-sibling pointers back to 1 credit
34
+ ($0.02). These are Tier 2, which maps to 1 credit in TIER_COSTS; release
35
+ 1.36.1 had wrongly relabeled them 2 credits.
36
+ - Catalog accuracy: `server.json` now lists the true 59 tools (36 free,
37
+ 23 premium), adding 5 free tools that were omitted (`get_model_deprecations`,
38
+ `get_ai_supply_chain_iocs`, `get_honeypot_iocs`, `check_afta_certification`,
39
+ `get_agent_reputation_card`) and removing the phantom `mcp_registry_series`;
40
+ the manifest long_description now reads 59 tools.
41
+
5
42
  ## 1.36.1 - 2026-05-31
6
43
 
7
44
  Security hardening only. No API changes; agents see the same tools.
@@ -14,8 +51,6 @@ Security hardening only. No API changes; agents see the same tools.
14
51
  cannot overflow the agent's context window.
15
52
  - Path parameters (watch id, company ticker) are now URL-encoded and
16
53
  schema-validated before they reach a request path.
17
- - Reconciled the stated credit cost on the free pricing, benchmark, and
18
- status series pointers (they correctly read 2 credits now).
19
54
 
20
55
  ## 1.36.0 - 2026-05-28
21
56
 
@@ -74,14 +109,14 @@ Premium endpoint audit (2026-05-14) through the lens "does this clearly save the
74
109
  ### Changed (pricing)
75
110
  Six tools mapping to strict-premium TF Worker endpoints are repriced from Tier 1 ($0.02) into higher tiers reflecting the curated-derived-metrics value they provide. Tool descriptions updated to advertise the new prices:
76
111
 
77
- - `pricing_series`: 1 credit ($0.02) -> 2 credits ($0.04)
78
- - `benchmark_series`: 1 credit ($0.02) -> 2 credits ($0.04)
79
- - `status_uptime`: 1 credit ($0.02) -> 2 credits ($0.04)
80
- - `status_leaderboard`: 1 credit ($0.02) -> 3 credits ($0.06)
81
- - `provider_deepdive`: 1 credit ($0.02) -> 3 credits ($0.06)
82
- - `probe_series_premium`: 1 credit ($0.02) -> 3 credits ($0.06)
112
+ - `pricing_series`: Tier 2, 1 credit ($0.02)
113
+ - `benchmark_series`: Tier 2, 1 credit ($0.02)
114
+ - `status_uptime`: Tier 2, 1 credit ($0.02)
115
+ - `status_leaderboard`: Tier 3, 5 credits ($0.10)
116
+ - `provider_deepdive`: Tier 3, 5 credits ($0.10)
117
+ - `probe_series_premium`: Tier 3, 5 credits ($0.10)
83
118
 
84
- Tier 2 ($0.04) tools are single-entity full-window historical lookups. Tier 3 ($0.06) tools are heavy multi-source aggregations and TF-unique measurements.
119
+ Tier 2 (1 credit, $0.02) tools are single-entity full-window historical lookups. Tier 3 (5 credits, $0.10) tools are heavy multi-source aggregations and TF-unique measurements.
85
120
 
86
121
  Rationale: per the 70/30 premium-lock framework, strict-premium endpoints carry TF's actual moat. The Tier 1 ($0.02) baseline price made sense during the demand-discovery temp-unlock; now that these endpoints are gated as strict-premium (v1.30.0) and the gate is observable, repricing into Tier 2/3 sets prices closer to the curated-derived-metrics market (Glassnode / Kaito comparables). Per-call USD cost is now legible alongside credit count in every affected tool description.
87
122
 
package/dist/index.js CHANGED
@@ -584,8 +584,126 @@ 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
- 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 (2 credits).', {
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")'),
590
708
  days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
591
709
  }, async ({ model, days }) => {
@@ -601,13 +719,13 @@ registerTool('pricing_series_free', 'Daily price points for one AI model over th
601
719
  content: [
602
720
  {
603
721
  type: 'text',
604
- text: `${data.model} (${data.provider ?? 'unknown'}) ${data.points.length} points over ${data.points.length} days\n${summary}\nFor up to 90 days, use the pricing_series tool (2 credits).`,
722
+ text: `${data.model} (${data.provider ?? 'unknown'}) ${data.points.length} points over ${data.points.length} days\n${summary}\nFor up to 90 days, use the pricing_series tool (1 credit).`,
605
723
  },
606
724
  ],
607
725
  };
608
726
  });
609
727
  // ── Tool: benchmark_series_free (free, 7-day cap) ───────────────────
610
- registerTool('benchmark_series_free', 'Daily benchmark scores for one model+benchmark over the last 1 to 7 days, free. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval. For windows up to 90 days use benchmark_series (2 credits).', {
728
+ registerTool('benchmark_series_free', 'Daily benchmark scores for one model+benchmark over the last 1 to 7 days, free. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval. For windows up to 90 days use benchmark_series (1 credit).', {
611
729
  model: z.string().describe('Model id or display name'),
612
730
  benchmark: z.string().describe('Benchmark key'),
613
731
  days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
@@ -630,7 +748,7 @@ registerTool('benchmark_series_free', 'Daily benchmark scores for one model+benc
630
748
  };
631
749
  });
632
750
  // ── Tool: status_uptime_free (free, 7-day cap) ──────────────────────
633
- registerTool('status_uptime_free', 'Daily uptime rollup for one provider over the last 1 to 7 days, free. For windows up to 90 days use status_uptime (2 credits).', {
751
+ registerTool('status_uptime_free', 'Daily uptime rollup for one provider over the last 1 to 7 days, free. For windows up to 90 days use status_uptime (1 credit).', {
634
752
  provider: z.string().describe('Provider name (e.g. anthropic, openai, google)'),
635
753
  days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
636
754
  }, async ({ provider, days }) => {
@@ -673,8 +791,8 @@ registerTool('status_leaderboard_free', 'Cross-provider uptime leaderboard, rank
673
791
  ],
674
792
  };
675
793
  });
676
- // ── Tool: pricing_series (2 credits) ────────────────────────────────
677
- registerTool('pricing_series', 'Daily price points for one AI model with min/max/delta summary. Default range = last 30 days, max 90 days. Costs 2 credits ($0.04). Strict premium, no free trial; the 7-day-capped sibling pricing_series_free is the discovery option.', {
794
+ // ── Tool: pricing_series (1 credit) ─────────────────────────────────
795
+ registerTool('pricing_series', 'Daily price points for one AI model with min/max/delta summary. Default range = last 30 days, max 90 days. Costs 1 credit ($0.02). Strict premium, no free trial; the 7-day-capped sibling pricing_series_free is the discovery option.', {
678
796
  model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
679
797
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
680
798
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
@@ -698,8 +816,8 @@ registerTool('pricing_series', 'Daily price points for one AI model with min/max
698
816
  ],
699
817
  };
700
818
  });
701
- // ── Tool: benchmark_series (2 credits) ──────────────────────────────
702
- registerTool('benchmark_series', 'Score evolution for a single benchmark on one AI model. Costs 2 credits ($0.04). Strict premium, no free trial; the 7-day-capped sibling benchmark_series_free is the discovery option. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval.', {
819
+ // ── Tool: benchmark_series (1 credit) ───────────────────────────────
820
+ registerTool('benchmark_series', 'Score evolution for a single benchmark on one AI model. Costs 1 credit ($0.02). Strict premium, no free trial; the 7-day-capped sibling benchmark_series_free is the discovery option. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval.', {
703
821
  model: z.string().describe('Model id or display name'),
704
822
  benchmark: z.string().describe('Benchmark key (e.g. swe_bench, mmlu_pro, gpqa_diamond, math, human_eval)'),
705
823
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
@@ -724,8 +842,8 @@ registerTool('benchmark_series', 'Score evolution for a single benchmark on one
724
842
  ],
725
843
  };
726
844
  });
727
- // ── Tool: status_uptime (2 credits) ─────────────────────────────────
728
- registerTool('status_uptime', 'Daily uptime rollup for one provider with operational/degraded/down day counts and uptime % (degraded counts as half-credit). Costs 2 credits ($0.04). Strict premium, no free trial; the 7-day-capped sibling status_uptime_free is the discovery option.', {
845
+ // ── Tool: status_uptime (1 credit) ──────────────────────────────────
846
+ registerTool('status_uptime', 'Daily uptime rollup for one provider with operational/degraded/down day counts and uptime % (degraded counts as half-credit). Costs 1 credit ($0.02). Strict premium, no free trial; the 7-day-capped sibling status_uptime_free is the discovery option.', {
729
847
  provider: z.string().describe('Provider name (e.g. anthropic, openai, google)'),
730
848
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
731
849
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.36.1",
3
+ "version": "1.36.3",
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.1",
6
+ "version": "1.36.3",
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.1",
23
+ "version": "1.36.3",
24
24
  "runtimeHint": "npx",
25
25
  "transport": {
26
26
  "type": "stdio"
@@ -47,8 +47,13 @@
47
47
  "get_ai_status",
48
48
  "is_service_down",
49
49
  "get_model_pricing",
50
+ "get_model_deprecations",
50
51
  "get_ai_today",
51
52
  "get_agent_activity",
53
+ "get_ai_supply_chain_iocs",
54
+ "get_honeypot_iocs",
55
+ "check_afta_certification",
56
+ "get_agent_reputation_card",
52
57
  "mcp_registry_snapshot",
53
58
  "probe_latest",
54
59
  "get_ai_papers_trending",
@@ -73,7 +78,8 @@
73
78
  "get_x402_summary",
74
79
  "get_x402_publishers",
75
80
  "get_x402_leaderboard",
76
- "get_x402_recent"
81
+ "get_x402_recent",
82
+ "route_verdict_preview"
77
83
  ],
78
84
  "premiumTools": [
79
85
  "premium_routing",
@@ -87,7 +93,6 @@
87
93
  "provider_deepdive",
88
94
  "compare_models",
89
95
  "whats_new",
90
- "mcp_registry_series",
91
96
  "probe_series",
92
97
  "list_watches",
93
98
  "create_price_watch",
@@ -99,7 +104,8 @@
99
104
  "get_account_usage",
100
105
  "premium_ai_company",
101
106
  "premium_x402_publisher_receipts",
102
- "premium_x402_series"
107
+ "premium_x402_series",
108
+ "route_verdict"
103
109
  ]
104
110
  }
105
111
  }