@tensorfeed/mcp-server 1.36.4 → 1.38.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,30 @@
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.38.0 - 2026-06-03
6
+
7
+ Description-only release. Sharpens the six foundational free tools (get_ai_news,
8
+ get_ai_status, is_service_down, get_model_pricing, get_ai_today, premium_routing)
9
+ so each states what it returns, why to call it instead of polling sources
10
+ directly, and its tier. get_ai_today drops an inaccurate 24-hour-window claim
11
+ (it returns the latest stories, not a strict time window). premium_routing now
12
+ points at its signed sibling route_verdict. No tool, pricing, or behavior
13
+ changes from 1.37.0.
14
+
15
+ ## 1.37.0 - 2026-06-02
16
+
17
+ Adds four free agentic-web tools, bringing the catalog to 65 tools (41 free, 24
18
+ premium):
19
+ - `check_agent_ready`: score how agent-ready any tracked site is, 0 to 100, from
20
+ its x402 manifest, agent.json, OpenAPI spec, llms.txt, AI-bot crawlability,
21
+ and ai.txt.
22
+ - `agent_ready_summary`: the cross-domain readiness picture across about 500
23
+ curated domains, with per-surface adoption shares and a top-10 leaderboard.
24
+ - `check_crawler_access`: whether a site allows or blocks GPTBot, ClaudeBot, and
25
+ other AI crawlers, plus its llms.txt and ai.txt signals.
26
+ - `crawler_access_summary`: the aggregate AI-crawler access map across the
27
+ tracked domain set.
28
+
5
29
  ## 1.36.4 - 2026-05-31
6
30
 
7
31
  Docs-only release. The README now opens with the Route Verdict quickstart: a
package/dist/index.js CHANGED
@@ -178,7 +178,7 @@ server.registerResource('latest_news', 'tensorfeed://news/latest', {
178
178
  };
179
179
  });
180
180
  // ── Tool: get_ai_news ───────────────────────────────────────────────
181
- registerTool('get_ai_news', 'Get the latest AI news articles from TensorFeed.ai. Aggregates from 15+ sources including Anthropic, OpenAI, Google, TechCrunch, The Verge, arXiv, and more.', {
181
+ registerTool('get_ai_news', 'Get the latest AI news from TensorFeed.ai as a ranked list with title, source, URL, snippet, and publish time, filterable by category (e.g. "anthropic", "openai", "research", "tools"). Aggregates 15+ sources (Anthropic, OpenAI, Google, TechCrunch, The Verge, arXiv, and more) into one normalized feed, so an agent reads one schema instead of polling each outlet. Free, no auth.', {
182
182
  category: z.string().optional().describe('Filter by category (e.g. "anthropic", "openai", "research", "tools")'),
183
183
  limit: z.number().min(1).max(50).optional().describe('Number of articles to return (default 10, max 50)'),
184
184
  }, async ({ category, limit }) => {
@@ -193,7 +193,7 @@ registerTool('get_ai_news', 'Get the latest AI news articles from TensorFeed.ai.
193
193
  return { content: [{ type: 'text', text: text || 'No articles found.' }] };
194
194
  });
195
195
  // ── Tool: get_ai_status ─────────────────────────────────────────────
196
- registerTool('get_ai_status', 'Get real-time operational status of major AI services (Claude, OpenAI, Gemini, Mistral, Cohere, Replicate, Hugging Face).', {}, async () => {
196
+ registerTool('get_ai_status', 'Get the real-time operational status of major AI services (Claude, OpenAI, Gemini, Mistral, Cohere, Replicate, Hugging Face), including per-component breakdowns and an operational/degraded/down rollup per provider. One cross-provider status call instead of checking each vendor\'s status page, useful before an agent routes a request to a model that may be impaired. Free, no auth.', {}, async () => {
197
197
  const data = await fetchJSON('/status');
198
198
  const text = data.services
199
199
  .map(s => {
@@ -206,7 +206,7 @@ registerTool('get_ai_status', 'Get real-time operational status of major AI serv
206
206
  return { content: [{ type: 'text', text: `AI Service Status:\n${text}` }] };
207
207
  });
208
208
  // ── Tool: is_service_down ───────────────────────────────────────────
209
- registerTool('is_service_down', 'Check if a specific AI service is currently down or experiencing issues.', {
209
+ 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.', {
210
210
  service: z.string().describe('Service name to check (e.g. "claude", "openai", "gemini", "mistral", "cohere", "hugging face", "replicate")'),
211
211
  }, async ({ service }) => {
212
212
  const data = await fetchJSON('/status');
@@ -226,8 +226,63 @@ 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
- registerTool('get_model_pricing', 'Get AI model pricing comparison across all major providers (Anthropic, OpenAI, Google, Meta, Mistral, Cohere). Prices per 1M tokens.', {}, async () => {
285
+ registerTool('get_model_pricing', 'Get AI model pricing across major providers (Anthropic, OpenAI, Google, Meta, Mistral, Cohere) in one normalized table: input and output price per 1M tokens, context window, and release date per model. One cross-provider comparison instead of scraping six pricing pages, so an agent can pick the cheapest model that fits its context and budget. Free, no auth.', {}, async () => {
231
286
  const data = await fetchJSON('/models');
232
287
  const text = data.providers
233
288
  .map(p => {
@@ -307,7 +362,7 @@ registerTool('get_model_deprecations', "Get the AI model deprecation calendar. P
307
362
  return { content: [{ type: 'text', text: header + sections }] };
308
363
  });
309
364
  // ── Tool: get_ai_today ──────────────────────────────────────────────
310
- registerTool('get_ai_today', 'Get a summary of what happened in AI today. Returns the top stories from the last 24 hours.', {
365
+ registerTool('get_ai_today', 'Get a quick digest of the top AI stories from the latest TensorFeed news feed, each with title, source, and URL. A shorter, headline-only companion to get_ai_news for when an agent just needs a fast read on what is happening in AI right now rather than the full article set. Free, no auth.', {
311
366
  limit: z.number().min(1).max(20).optional().describe('Number of stories (default 5)'),
312
367
  }, async ({ limit }) => {
313
368
  const data = await fetchJSON(`/news?limit=${limit || 5}`);
@@ -557,7 +612,7 @@ registerTool('get_account_usage', 'Show per-endpoint usage for the configured Te
557
612
  };
558
613
  });
559
614
  // ── Tool: premium_routing (1 credit) ────────────────────────────────
560
- 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).', {
615
+ registerTool('premium_routing', 'Get a ranked list of recommended AI models for a task (code, reasoning, creative, or general), each with a composite score plus the quality, availability, cost, and latency components that produced it, and the per-model input/output pricing. Constrain with budget, min_quality, and top_n so the ranking reflects your actual limits instead of a generic leaderboard. Costs 1 credit ($0.02), billed against your TENSORFEED_TOKEN. For a single signed routing decision with reasoning, see route_verdict.', {
561
616
  task: z.enum(['code', 'reasoning', 'creative', 'general']).optional().describe('Task type the model needs to be good at (default: general)'),
562
617
  budget: z.number().optional().describe('Max blended USD per 1M tokens'),
563
618
  min_quality: z.number().min(0).max(1).optional().describe('Minimum quality score in [0, 1]'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.36.4",
3
+ "version": "1.38.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.4",
6
+ "version": "1.38.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.4",
23
+ "version": "1.38.0",
24
24
  "runtimeHint": "npx",
25
25
  "transport": {
26
26
  "type": "stdio"
@@ -54,6 +54,10 @@
54
54
  "get_honeypot_iocs",
55
55
  "check_afta_certification",
56
56
  "get_agent_reputation_card",
57
+ "check_agent_ready",
58
+ "agent_ready_summary",
59
+ "check_crawler_access",
60
+ "crawler_access_summary",
57
61
  "mcp_registry_snapshot",
58
62
  "probe_latest",
59
63
  "get_ai_papers_trending",