@tensorfeed/mcp-server 1.36.4 → 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/dist/index.js +55 -0
- package/package.json +1 -1
- package/server.json +2 -2
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.
|
|
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.
|
|
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.
|
|
23
|
+
"version": "1.37.0",
|
|
24
24
|
"runtimeHint": "npx",
|
|
25
25
|
"transport": {
|
|
26
26
|
"type": "stdio"
|