@tensorfeed/mcp-server 1.29.0 → 1.31.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 CHANGED
@@ -2,6 +2,35 @@
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.31.0 - 2026-05-14 (Commit B repricing)
6
+
7
+ ### Changed (pricing)
8
+ 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:
9
+
10
+ - `pricing_series`: 1 credit ($0.02) -> 2 credits ($0.04)
11
+ - `benchmark_series`: 1 credit ($0.02) -> 2 credits ($0.04)
12
+ - `status_uptime`: 1 credit ($0.02) -> 2 credits ($0.04)
13
+ - `status_leaderboard`: 1 credit ($0.02) -> 3 credits ($0.06)
14
+ - `provider_deepdive`: 1 credit ($0.02) -> 3 credits ($0.06)
15
+ - `probe_series_premium`: 1 credit ($0.02) -> 3 credits ($0.06)
16
+
17
+ 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.
18
+
19
+ 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.
20
+
21
+ Worker changes accompanying this release: `worker/src/index.ts` updates the `requirePayment(..., tier)` and `logPremiumUsage(..., credits)` calls on the 8 strict-premium routes. Two of those routes are not exposed as MCP tools (premium_funding_exposure, premium_packages_momentum) but receive the same tier bump server-side.
22
+
23
+ No behavior change to free-trial-eligible tools (premium_routing stays at Tier 2 as before, all single-query lookups stay where they were). No change to the strict-premium gate itself (v1.30.0). No change to the on-chain x402 facilitator or credit-purchase minimums.
24
+
25
+ ## 1.30.0 - 2026-05-14
26
+
27
+ ### Changed
28
+ - Every paid tool description now advertises the USD price alongside the credit cost. "Costs 1 credit." -> "Costs 1 credit ($0.02).". Lets agents budget calls without needing to look up credit-to-USD conversion separately. No behavior change; pure description metadata.
29
+
30
+ ### Changed (strict-premium tier)
31
+ - Six tools now flagged as "Strict premium, no free trial" in their descriptions: `pricing_series`, `benchmark_series`, `status_uptime`, `status_leaderboard`, `provider_deepdive`, `probe_series_premium`. These map to TF Worker paths in the strict-premium set (worker/src/strict-premium-endpoints.ts) which bypasses the per-IP 100-call/day free trial. Their free 7-day-capped siblings (`pricing_series_free`, `benchmark_series_free`, `status_uptime_free`, `status_leaderboard_free`) remain the discovery option. Agents that hit these without auth get a 402 immediately with a strict-premium-specific message, not the free-trial advert.
32
+ - Rationale: per the TF 70/30 premium-lock framework, full-window historical time-series and heavy aggregations are TF's moat and warrant strict gating during the demand-discovery phase. Pricing per call is unchanged at this version; repricing into a higher tier is a separate future decision.
33
+
5
34
  ## 1.29.0 - 2026-05-13
6
35
 
7
36
  ### Added
package/dist/index.js CHANGED
@@ -511,7 +511,7 @@ registerTool('get_account_usage', 'Show per-endpoint usage for the configured Te
511
511
  };
512
512
  });
513
513
  // ── Tool: premium_routing (1 credit) ────────────────────────────────
514
- registerTool('premium_routing', 'Get a ranked list of recommended AI models for a task with full score breakdown (quality, availability, cost, latency). Costs 1 credit.', {
514
+ registerTool('premium_routing', 'Get a ranked list of recommended AI models for a task with full score breakdown (quality, availability, cost, latency). Costs 1 credit ($0.02).', {
515
515
  task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type the model needs to be good at (default: general)'),
516
516
  budget: z.number().optional().describe('Max blended USD per 1M tokens'),
517
517
  min_quality: z.number().min(0).max(1).optional().describe('Minimum quality score in [0, 1]'),
@@ -628,7 +628,7 @@ registerTool('status_leaderboard_free', 'Cross-provider uptime leaderboard, rank
628
628
  };
629
629
  });
630
630
  // ── Tool: pricing_series (1 credit) ─────────────────────────────────
631
- 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.', {
631
+ 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.', {
632
632
  model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
633
633
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
634
634
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
@@ -653,7 +653,7 @@ registerTool('pricing_series', 'Daily price points for one AI model with min/max
653
653
  };
654
654
  });
655
655
  // ── Tool: benchmark_series (1 credit) ───────────────────────────────
656
- registerTool('benchmark_series', 'Score evolution for a single benchmark on one AI model. Costs 1 credit. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval.', {
656
+ 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.', {
657
657
  model: z.string().describe('Model id or display name'),
658
658
  benchmark: z.string().describe('Benchmark key (e.g. swe_bench, mmlu_pro, gpqa_diamond, math, human_eval)'),
659
659
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
@@ -679,7 +679,7 @@ registerTool('benchmark_series', 'Score evolution for a single benchmark on one
679
679
  };
680
680
  });
681
681
  // ── Tool: status_uptime (1 credit) ──────────────────────────────────
682
- 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.', {
682
+ 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.', {
683
683
  provider: z.string().describe('Provider name (e.g. anthropic, openai, google)'),
684
684
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
685
685
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
@@ -706,7 +706,7 @@ registerTool('status_uptime', 'Daily uptime rollup for one provider with operati
706
706
  };
707
707
  });
708
708
  // ── Tool: status_leaderboard (1 credit) ─────────────────────────────
709
- registerTool('status_leaderboard', 'Cross-provider uptime leaderboard for a custom date range up to 90 days. Same minute-resolution counter source as status_leaderboard_free, but adds incident_count and mttr_minutes (mean time to recover) per provider. Sorted by uptime % DESC. Costs 1 credit.', {
709
+ registerTool('status_leaderboard', 'Cross-provider uptime leaderboard for a custom date range up to 90 days. Same minute-resolution counter source as status_leaderboard_free, but adds incident_count and mttr_minutes (mean time to recover) per provider. Sorted by uptime % DESC. Costs 3 credits ($0.06). Strict premium, no free trial; the 7-day-capped sibling status_leaderboard_free is the discovery option.', {
710
710
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
711
711
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
712
712
  }, async ({ from, to }) => {
@@ -732,7 +732,7 @@ registerTool('status_leaderboard', 'Cross-provider uptime leaderboard for a cust
732
732
  };
733
733
  });
734
734
  // ── Tool: premium_agents_directory (1 credit) ───────────────────────
735
- registerTool('premium_agents_directory', 'Enriched AI agents catalog joined with live status, recent news, agent traffic, flagship pricing, and a 0-100 trending_score. Costs 1 credit.', {
735
+ registerTool('premium_agents_directory', 'Enriched AI agents catalog joined with live status, recent news, agent traffic, flagship pricing, and a 0-100 trending_score. Costs 1 credit ($0.02).', {
736
736
  category: z.string().optional().describe('coding, research, general, creative, frameworks'),
737
737
  status: z.enum(['operational', 'degraded', 'down', 'unknown']).optional(),
738
738
  open_source: z.boolean().optional(),
@@ -765,7 +765,7 @@ registerTool('premium_agents_directory', 'Enriched AI agents catalog joined with
765
765
  };
766
766
  });
767
767
  // ── Tool: whats_new (1 credit) ──────────────────────────────────────
768
- registerTool('whats_new', 'Agent morning brief: pricing changes, new/removed models, status incidents, and top news from the last 1-7 days. The tool to call when your agent boots up. Costs 1 credit.', {
768
+ registerTool('whats_new', 'Agent morning brief: pricing changes, new/removed models, status incidents, and top news from the last 1-7 days. The tool to call when your agent boots up. Costs 1 credit ($0.02).', {
769
769
  days: z.number().min(1).max(7).optional().describe('Window length in days (default 1)'),
770
770
  news_limit: z.number().min(1).max(25).optional().describe('Max news headlines (default 10)'),
771
771
  }, async ({ days, news_limit }) => {
@@ -801,7 +801,7 @@ registerTool('whats_new', 'Agent morning brief: pricing changes, new/removed mod
801
801
  };
802
802
  });
803
803
  // ── Tool: compare_models (1 credit) ─────────────────────────────────
804
- registerTool('compare_models', 'Side-by-side comparison of 2-5 AI models. Returns pricing, benchmarks (normalized to a union of keys with null for missing scores), provider status, and recent news per model, plus rankings (cheapest blended, most context, per-benchmark leaderboard). Costs 1 credit.', {
804
+ registerTool('compare_models', 'Side-by-side comparison of 2-5 AI models. Returns pricing, benchmarks (normalized to a union of keys with null for missing scores), provider status, and recent news per model, plus rankings (cheapest blended, most context, per-benchmark leaderboard). Costs 1 credit ($0.02).', {
805
805
  ids: z.string().describe('Comma-separated list of 2-5 model ids or display names. Examples: "Claude Opus 4.7,GPT-5.5,Gemini 3" or "opus-4-7,gpt-5-5"'),
806
806
  }, async ({ ids }) => {
807
807
  const data = (await fetchJSON(`/premium/compare/models?ids=${encodeURIComponent(ids)}`, { auth: true }));
@@ -828,7 +828,7 @@ registerTool('compare_models', 'Side-by-side comparison of 2-5 AI models. Return
828
828
  };
829
829
  });
830
830
  // ── Tool: provider_deepdive (1 credit) ──────────────────────────────
831
- registerTool('provider_deepdive', 'Everything about an AI provider in one call: live status, all models with pricing + tier + benchmark scores joined in, recent news mentions, and agent traffic. Costs 1 credit. Aggregation IS the value; doing this from free endpoints would take 4 round-trips.', {
831
+ registerTool('provider_deepdive', 'Everything about an AI provider in one call: live status, all models with pricing + tier + benchmark scores joined in, recent news mentions, and agent traffic. Costs 3 credits ($0.06). Strict premium, no free trial. Aggregation IS the value; doing this from free endpoints would take 4 round-trips.', {
832
832
  provider: z.string().describe('Provider id or display name (case-insensitive). Examples: anthropic, openai, google, mistral, cohere'),
833
833
  }, async ({ provider }) => {
834
834
  const data = (await fetchJSON(`/premium/providers/${encodeURIComponent(provider)}`, { auth: true }));
@@ -858,7 +858,7 @@ registerTool('provider_deepdive', 'Everything about an AI provider in one call:
858
858
  };
859
859
  });
860
860
  // ── Tool: cost_projection (1 credit) ────────────────────────────────
861
- registerTool('cost_projection', 'Project the cost of a token-usage workload across 1-10 AI models. Returns daily/weekly/monthly/yearly totals per model and a ranking by cheapest monthly. Costs 1 credit.', {
861
+ registerTool('cost_projection', 'Project the cost of a token-usage workload across 1-10 AI models. Returns daily/weekly/monthly/yearly totals per model and a ranking by cheapest monthly. Costs 1 credit ($0.02).', {
862
862
  models: z.string().describe('One model or comma-separated list of up to 10 (e.g. "Claude Opus 4.7,GPT-5.5,Gemini 3"). Names or ids both work.'),
863
863
  input_tokens_per_day: z.number().min(0).describe('Expected daily input token volume'),
864
864
  output_tokens_per_day: z.number().min(0).describe('Expected daily output token volume'),
@@ -893,7 +893,7 @@ registerTool('cost_projection', 'Project the cost of a token-usage workload acro
893
893
  };
894
894
  });
895
895
  // ── Tool: news_search (1 credit) ────────────────────────────────────
896
- registerTool('news_search', 'Full-text search over the TensorFeed news article corpus with optional date range, provider, and category filters. Relevance scoring with recency boost. Costs 1 credit.', {
896
+ registerTool('news_search', 'Full-text search over the TensorFeed news article corpus with optional date range, provider, and category filters. Relevance scoring with recency boost. Costs 1 credit ($0.02).', {
897
897
  q: z.string().optional().describe('Free-text query, e.g. "claude opus pricing". Omit to browse latest filtered articles.'),
898
898
  from: z.string().optional().describe('Start date YYYY-MM-DD UTC (inclusive)'),
899
899
  to: z.string().optional().describe('End date YYYY-MM-DD UTC (inclusive end-of-day)'),
@@ -947,7 +947,7 @@ registerTool('list_watches', 'List the active webhook watches owned by the confi
947
947
  return { content: [{ type: 'text', text: `${data.count} active watches:\n\n${rows}` }] };
948
948
  });
949
949
  // ── Tool: create_price_watch (1 credit) ─────────────────────────────
950
- registerTool('create_price_watch', 'Register a webhook watch on a model price change. Costs 1 credit. Watch lives 90 days. Each fire is an HMAC-signed POST to callback_url.', {
950
+ registerTool('create_price_watch', 'Register a webhook watch on a model price change. Costs 1 credit ($0.02). Watch lives 90 days. Each fire is an HMAC-signed POST to callback_url.', {
951
951
  model: z.string().describe('Model name (e.g. "Claude Opus 4.7")'),
952
952
  field: z.enum(['inputPrice', 'outputPrice', 'blended']).describe('Which price field to watch'),
953
953
  op: z.enum(['lt', 'gt', 'changes']).describe('Trigger: lt = below threshold, gt = above, changes = any change'),
@@ -972,7 +972,7 @@ registerTool('create_price_watch', 'Register a webhook watch on a model price ch
972
972
  };
973
973
  }, CREATE_TOOL);
974
974
  // ── Tool: create_status_watch (1 credit) ────────────────────────────
975
- registerTool('create_status_watch', 'Register a webhook watch on a service status transition (e.g. anthropic becomes down). Costs 1 credit. Watch lives 90 days.', {
975
+ registerTool('create_status_watch', 'Register a webhook watch on a service status transition (e.g. anthropic becomes down). Costs 1 credit ($0.02). Watch lives 90 days.', {
976
976
  provider: z.string().describe('Provider name (e.g. anthropic, openai)'),
977
977
  op: z.enum(['becomes', 'changes']).describe('becomes = transitions to a specific value; changes = any transition'),
978
978
  value: z.enum(['operational', 'degraded', 'down']).optional().describe('Required when op is becomes'),
@@ -996,7 +996,7 @@ registerTool('create_status_watch', 'Register a webhook watch on a service statu
996
996
  };
997
997
  }, CREATE_TOOL);
998
998
  // ── Tool: create_digest_watch (1 credit) ────────────────────────────
999
- registerTool('create_digest_watch', 'Register a scheduled digest webhook that fires daily or weekly with a curated summary of pricing changes (regardless of whether anything dramatic happened). Costs 1 credit. Watch lives 90 days. Set-and-forget for agents that want a periodic snapshot without subscribing to realtime transitions.', {
999
+ registerTool('create_digest_watch', 'Register a scheduled digest webhook that fires daily or weekly with a curated summary of pricing changes (regardless of whether anything dramatic happened). Costs 1 credit ($0.02). Watch lives 90 days. Set-and-forget for agents that want a periodic snapshot without subscribing to realtime transitions.', {
1000
1000
  cadence: z.enum(['daily', 'weekly']).describe('How often the digest fires'),
1001
1001
  callback_url: z.string().describe('HTTPS URL to POST to when the digest fires'),
1002
1002
  secret: z.string().optional().describe('Optional HMAC shared secret'),
@@ -1018,7 +1018,7 @@ registerTool('create_digest_watch', 'Register a scheduled digest webhook that fi
1018
1018
  };
1019
1019
  }, CREATE_TOOL);
1020
1020
  // ── Tool: create_leaderboard_rank_watch (1 credit) ──────────────────
1021
- registerTool('create_leaderboard_rank_watch', 'Register a webhook that fires when a provider crosses a rank threshold on the cross-provider 7-day uptime leaderboard. Rank 1 = best (highest uptime). drops_below: was rank<=N, now rank>N (got worse). rises_above: was rank>=N, now rank<N (got better). changes: any rank movement. Costs 1 credit at registration. Watch lives 90 days.', {
1021
+ registerTool('create_leaderboard_rank_watch', 'Register a webhook that fires when a provider crosses a rank threshold on the cross-provider 7-day uptime leaderboard. Rank 1 = best (highest uptime). drops_below: was rank<=N, now rank>N (got worse). rises_above: was rank>=N, now rank<N (got better). changes: any rank movement. Costs 1 credit ($0.02) at registration. Watch lives 90 days.', {
1022
1022
  provider: z.string().describe('Provider name or slug (case-insensitive). e.g. claude, openai, gemini, bedrock, azure'),
1023
1023
  op: z.enum(['drops_below', 'rises_above', 'changes']).describe('Trigger condition'),
1024
1024
  threshold: z.number().int().min(1).optional().describe('Required for drops_below / rises_above. Integer rank position.'),
@@ -1078,7 +1078,7 @@ registerTool('probe_latest', 'Last 24 hours of measured LLM endpoint latency and
1078
1078
  };
1079
1079
  });
1080
1080
  // ── Tool: probe_series (1 credit) ───────────────────────────────────
1081
- registerTool('probe_series', 'Daily SLA series for one LLM provider, measured by TensorFeed. Returns per-day count, success rate, ttfb p50/p95/p99, total p50/p95/p99, and incident-hour count across the requested window. Provider status pages are politically managed; this is the measured truth. Pairs naturally with premium_routing for picking a model whose SLA you can verify. Costs 1 credit.', {
1081
+ registerTool('probe_series', 'Daily SLA series for one LLM provider, measured by TensorFeed. Returns per-day count, success rate, ttfb p50/p95/p99, total p50/p95/p99, and incident-hour count across the requested window. Provider status pages are politically managed; this is the measured truth. Pairs naturally with premium_routing for picking a model whose SLA you can verify. Costs 3 credits ($0.06). Strict premium, no free trial.', {
1082
1082
  provider: z.enum(['anthropic', 'openai', 'google', 'mistral', 'cohere']).describe('LLM provider key'),
1083
1083
  from: z.string().optional().describe('Inclusive start YYYY-MM-DD (default: 30 days before to)'),
1084
1084
  to: z.string().optional().describe('Inclusive end YYYY-MM-DD (default: today UTC)'),
@@ -1140,7 +1140,7 @@ registerTool('mcp_registry_snapshot', 'Today\'s summary of the official Model Co
1140
1140
  };
1141
1141
  });
1142
1142
  // ── Tool: mcp_registry_series (1 credit) ────────────────────────────
1143
- registerTool('mcp_registry_series', 'Multi-day series of MCP server registry growth and churn. Returns per-day total servers, active count, and daily added/removed counts across the requested window. The registry itself is open data, but a 30/90-day trend requires daily capture started weeks ago, which TensorFeed has been running. Costs 1 credit.', {
1143
+ registerTool('mcp_registry_series', 'Multi-day series of MCP server registry growth and churn. Returns per-day total servers, active count, and daily added/removed counts across the requested window. The registry itself is open data, but a 30/90-day trend requires daily capture started weeks ago, which TensorFeed has been running. Costs 1 credit ($0.02).', {
1144
1144
  from: z.string().optional().describe('Inclusive start date YYYY-MM-DD (default: 30 days before to)'),
1145
1145
  to: z.string().optional().describe('Inclusive end date YYYY-MM-DD (default: today UTC)'),
1146
1146
  }, async ({ from, to }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.29.0",
3
+ "version": "1.31.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",