@tensorfeed/mcp-server 1.36.3 → 1.37.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,12 @@
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
+
5
11
  ## 1.36.3 - 2026-05-31
6
12
 
7
13
  Adds the Route Verdict wedge: TensorFeed's signed routing decision is now a
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
@@ -226,6 +226,61 @@ registerTool('is_service_down', 'Check if a specific AI service is currently dow
226
226
  }]
227
227
  };
228
228
  });
229
+ // Tool: check_agent_ready
230
+ registerTool('check_agent_ready', 'Score how agent-ready a website is, 0 to 100, from its public surfaces: x402 payment manifest, /.well-known/agent.json, an OpenAPI spec, llms.txt, AI-bot crawlability, and ai.txt. Returns the score, the tier (closed, emerging, ready, or advanced), and exactly which surfaces the site exposes. Unlike single-site "is my site agent-ready" scanners, this reads from TensorFeed\'s daily-crawled cross-domain dataset, so the same call works for any tracked domain and the scoring rule is published and identical for every site. Free, no auth.', {
231
+ domain: z.string().describe('Bare domain to score, e.g. "stripe.com" (no scheme, no path)'),
232
+ }, async ({ domain }) => {
233
+ const data = await fetchJSON(`/agent-ready/site?domain=${encodeURIComponent(domain)}`);
234
+ if (!data.found || !data.readiness) {
235
+ return { content: [{ type: 'text', text: `${data.domain} is not in TensorFeed's tracked set yet (no agent-readiness score). About 500 curated domains are tracked.` }] };
236
+ }
237
+ const r = data.readiness;
238
+ const present = Object.entries(r.surfaces).filter(([, v]) => v).map(([k]) => k);
239
+ const text = `${data.domain}: agent-readiness ${r.score}/100 (${r.tier})\n` +
240
+ `Surfaces present: ${present.length ? present.join(', ') : 'none'}\n` +
241
+ `x402=${r.surfaces.x402} agent.json=${r.surfaces.agentJson} openapi=${r.surfaces.openapi} llms.txt=${r.surfaces.llmsTxt} crawlable=${r.surfaces.crawlable} ai.txt=${r.surfaces.aiTxt}\n` +
242
+ `Last checked: ${data.captured_at ?? 'n/a'}`;
243
+ return { content: [{ type: 'text', text }] };
244
+ });
245
+ // Tool: agent_ready_summary
246
+ registerTool('agent_ready_summary', 'Get the state of the agentic web. Across about 500 curated domains, returns the share exposing each agent surface (x402, agent.json, OpenAPI, llms.txt, crawlable, ai.txt), the readiness-tier distribution, and a top-10 leaderboard of the most agent-ready sites. This aggregate, cross-domain view is exactly what a single-site scanner cannot give you. Free, no auth.', {}, async () => {
247
+ const d = await fetchJSON('/agent-ready/summary.json');
248
+ const a = d.adoption_pct;
249
+ const lb = (d.leaderboard || []).slice(0, 10).map((e, i) => `${i + 1}. ${e.domain} (${e.score}, ${e.tier})`).join('\n');
250
+ const text = `Agentic web readiness, ${d.profiled}/${d.domains_tracked} domains profiled (captured ${d.captured_at ?? 'n/a'}):\n` +
251
+ `Surface adoption: x402 ${a.x402}%, agent.json ${a.agentJson}%, openapi ${a.openapi}%, llms.txt ${a.llmsTxt}%, crawlable ${a.crawlable}%, ai.txt ${a.aiTxt}%\n` +
252
+ `Tiers: ${Object.entries(d.tier_distribution || {}).map(([t, n]) => `${t} ${n}`).join(', ')}\n` +
253
+ `Most agent-ready:\n${lb}`;
254
+ return { content: [{ type: 'text', text }] };
255
+ });
256
+ // Tool: check_crawler_access
257
+ registerTool('check_crawler_access', 'Check which AI bots a website allows or blocks in its robots.txt: GPTBot, ClaudeBot, PerplexityBot, CCBot, Google-Extended, Bytespider, and more, with a per-bot verdict (allowed, blocked, partial, or unknown), plus whether the site publishes llms.txt and ai.txt. Reports the site\'s stated policy, not enforcement (robots.txt compliance is voluntary). Free, no auth.', {
258
+ domain: z.string().describe('Bare domain to check, e.g. "nytimes.com" (no scheme, no path)'),
259
+ }, async ({ domain }) => {
260
+ const data = await fetchJSON(`/ai-crawler-access/site?domain=${encodeURIComponent(domain)}`);
261
+ if (!data.found || !data.record) {
262
+ return { content: [{ type: 'text', text: `${data.domain} is not in TensorFeed's tracked set yet. About 500 curated domains are tracked for AI-crawler access.` }] };
263
+ }
264
+ const rec = data.record;
265
+ const bots = Object.entries(rec.bots).map(([b, v]) => ` ${b}: ${v}`).join('\n');
266
+ const text = `${data.domain} (robots.txt HTTP ${rec.robotsStatus ?? 'n/a'}) AI-bot access:\n${bots}\n` +
267
+ `llms.txt: ${rec.hasLlmsTxt ? 'yes' : 'no'}, ai.txt: ${rec.hasAiTxt ? 'yes' : 'no'}\n` +
268
+ `Stated policy only; compliance is voluntary. Last checked: ${data.captured_at ?? 'n/a'}`;
269
+ return { content: [{ type: 'text', text }] };
270
+ });
271
+ // Tool: crawler_access_summary
272
+ registerTool('crawler_access_summary', 'Get the aggregate AI-crawler access map across about 500 curated domains: the percentage of sites that block each AI bot (the publisher-versus-AI-crawler picture), plus llms.txt and ai.txt adoption rates. Unlike a single-site robots.txt checker, this is the cross-domain trend view of who is shutting AI crawlers out. Free, no auth.', {}, async () => {
273
+ const d = await fetchJSON('/ai-crawler-access/summary.json');
274
+ const blocked = Object.entries(d.bot_blocked_pct || {})
275
+ .sort((x, y) => y[1] - x[1])
276
+ .slice(0, 8)
277
+ .map(([b, p]) => ` ${b}: ${p}% blocked`)
278
+ .join('\n');
279
+ const text = `AI-crawler access across ${d.domains_with_data}/${d.domains_tracked} tracked domains (captured ${d.captured_at ?? 'n/a'}):\n` +
280
+ `Most-blocked AI bots:\n${blocked}\n` +
281
+ `llms.txt adoption: ${d.llms_txt_adoption_pct}%, ai.txt adoption: ${d.ai_txt_adoption_pct}%`;
282
+ return { content: [{ type: 'text', text }] };
283
+ });
229
284
  // ── Tool: get_model_pricing ─────────────────────────────────────────
230
285
  registerTool('get_model_pricing', 'Get AI model pricing comparison across all major providers (Anthropic, OpenAI, Google, Meta, Mistral, Cohere). Prices per 1M tokens.', {}, async () => {
231
286
  const data = await fetchJSON('/models');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.36.3",
3
+ "version": "1.37.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.36.3",
6
+ "version": "1.37.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.36.3",
23
+ "version": "1.37.0",
24
24
  "runtimeHint": "npx",
25
25
  "transport": {
26
26
  "type": "stdio"