@tensorfeed/mcp-server 1.31.0 → 1.33.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 +22 -0
- package/dist/index.js +70 -30
- package/package.json +1 -1
- package/server.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
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.33.0 - 2026-05-25 (AI-CVE intelligence tools)
|
|
6
|
+
|
|
7
|
+
### Added (free tier)
|
|
8
|
+
Three new free tools wrapping the AI-CVE endpoints that went live on the TF Worker:
|
|
9
|
+
|
|
10
|
+
- `get_ai_cves_latest`: metadata for the most-recent AI-stack CVE batch plus the first 25 papers. Returns cve_ids, affected_products, affected_version_ranges, fixed_versions, exploited_in_wild, severity_label, and source_url per paper. Source: GitHub Security Advisories (CC BY 4.0).
|
|
11
|
+
- `get_ai_cves_feed`: paginated slice of the latest batch. limit capped at 50; for bulk consumption agents are pointed at the paid /api/premium/ai-cves/ai-stack-cves endpoint which delivers the categorized AI-stack subset in one call.
|
|
12
|
+
- `get_ai_cves_stats`: aggregate counts (by_severity, by_exploitation, top_vendors). Case-insensitive vendor bucketing so OpenClaw and openclaw merge into a single tally.
|
|
13
|
+
|
|
14
|
+
### Background
|
|
15
|
+
TF Worker shipped the ingest endpoint, three free reads, and three premium derivatives (ai-stack-cves, exploited-in-wild, cve lookup) earlier today. First production batch landed (job #79, 387 papers, 10 AI-flagged, 211 unique CVEs indexed). The MCP server now exposes the free read surface so agents discovering TF via the recommend-loop (MCP registry, Anthropic Connectors directory, glama.ai, mcp.directory, mcp.so) can pull AI-CVE intelligence in their first session.
|
|
16
|
+
|
|
17
|
+
Each tool response includes a tip line pointing to the paid endpoints for agents that need the AI-stack-filtered + categorized + sorted view, the exploited-in-wild subset, or single-CVE lookups.
|
|
18
|
+
|
|
19
|
+
## 1.32.0 - 2026-05-14 (Off-thesis tool cull)
|
|
20
|
+
|
|
21
|
+
### Removed
|
|
22
|
+
- `mcp_registry_series` tool: dropped. MCP registry is open data; a 30/90-day TF capture didn't clear the "saves >$0.02 per call" bar that Gemini 3's external analysis articulated and that TF has been operating under for premium endpoints. Agents that need the time-series can scrape the registry's open API directly.
|
|
23
|
+
|
|
24
|
+
### Background
|
|
25
|
+
Premium endpoint audit (2026-05-14) through the lens "does this clearly save the agent more than 2¢ in tokens/latency/decision-time?" identified six TF Worker endpoints off-thesis: macro digest, FDA aggregate, EIA series, NASA POWER daily/hourly, and MCP registry series. All six pulled from the public manifest, OpenAPI, llms.txt, /developers, and /api/meta in the same commit. Only the MCP registry series has an MCP-server tool wrapper, so it's the only tool-side change in this release.
|
|
26
|
+
|
|
5
27
|
## 1.31.0 - 2026-05-14 (Commit B repricing)
|
|
6
28
|
|
|
7
29
|
### Changed (pricing)
|
package/dist/index.js
CHANGED
|
@@ -1139,36 +1139,6 @@ registerTool('mcp_registry_snapshot', 'Today\'s summary of the official Model Co
|
|
|
1139
1139
|
],
|
|
1140
1140
|
};
|
|
1141
1141
|
});
|
|
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 ($0.02).', {
|
|
1144
|
-
from: z.string().optional().describe('Inclusive start date YYYY-MM-DD (default: 30 days before to)'),
|
|
1145
|
-
to: z.string().optional().describe('Inclusive end date YYYY-MM-DD (default: today UTC)'),
|
|
1146
|
-
}, async ({ from, to }) => {
|
|
1147
|
-
const params = new URLSearchParams();
|
|
1148
|
-
if (from)
|
|
1149
|
-
params.set('from', from);
|
|
1150
|
-
if (to)
|
|
1151
|
-
params.set('to', to);
|
|
1152
|
-
const data = (await fetchJSON(`/premium/mcp/registry/series?${params}`, { auth: true }));
|
|
1153
|
-
const lines = data.points
|
|
1154
|
-
.map(p => p.has_data
|
|
1155
|
-
? ` ${p.date} total=${p.total_servers} +${p.added ?? 0}/-${p.removed ?? 0}`
|
|
1156
|
-
: ` ${p.date} (no snapshot captured)`)
|
|
1157
|
-
.join('\n');
|
|
1158
|
-
const w = data.delta_in_window;
|
|
1159
|
-
const summary = w.start_total !== null && w.end_total !== null
|
|
1160
|
-
? `Window ${data.from} -> ${data.to}: ${w.start_total} -> ${w.end_total} (net ${w.net >= 0 ? '+' : ''}${w.net})`
|
|
1161
|
-
: `Window ${data.from} -> ${data.to}: insufficient data`;
|
|
1162
|
-
const notes = data.notes.length ? '\nNotes: ' + data.notes.join('; ') : '';
|
|
1163
|
-
return {
|
|
1164
|
-
content: [
|
|
1165
|
-
{
|
|
1166
|
-
type: 'text',
|
|
1167
|
-
text: `${summary}\n\n${lines}${notes}\n\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
1168
|
-
},
|
|
1169
|
-
],
|
|
1170
|
-
};
|
|
1171
|
-
});
|
|
1172
1142
|
// ── Tool: get_ai_papers_trending (free) ─────────────────────────────
|
|
1173
1143
|
registerTool('get_ai_papers_trending', 'Daily curated AI/ML research papers ranked by citation count. Sourced from Semantic Scholar across five fan-out queries (large language model, transformer, RLHF, AI agents, diffusion model), deduped by paperId, top 30 returned. Each paper carries title, abstract, authors, year, venue, citation count, arxivId, doi, and fields of study. Refreshed daily at 11:00 UTC. Use this when an agent wants the citation-ranked top of the AI research literature. Free, no auth.', {}, async () => {
|
|
1174
1144
|
const data = (await fetchJSON('/papers/ai-trending'));
|
|
@@ -1625,6 +1595,76 @@ registerTool('get_ai_ecosystem_today', 'One-shot composite AI morning brief. Cal
|
|
|
1625
1595
|
],
|
|
1626
1596
|
};
|
|
1627
1597
|
});
|
|
1598
|
+
// ── Tool: get_ai_cves_latest ────────────────────────────────────────
|
|
1599
|
+
registerTool('get_ai_cves_latest', 'Get metadata for the most-recent AI-stack CVE batch plus the first 25 papers. Source: TensorFeed AI-CVE intelligence feed, derived from GitHub Security Advisories (CC BY 4.0). Each paper carries cve_ids, affected_products, affected_version_ranges, fixed_versions, exploited_in_wild, severity_label, and source_url. For the full set use get_ai_cves_feed with offset; for AI-stack-filtered + categorized + sorted papers use the paid /api/premium/ai-cves/* endpoints. Free, no auth.', {}, async () => {
|
|
1600
|
+
const data = (await fetchJSON('/ai-cves/latest'));
|
|
1601
|
+
if (!data.batch_id) {
|
|
1602
|
+
return { content: [{ type: 'text', text: 'No AI-CVE batch ingested yet. Check back once TensorFeed CC has POSTed the next clean batch from the extraction pipeline.' }] };
|
|
1603
|
+
}
|
|
1604
|
+
const head = `AI-CVE batch ${data.batch_id} extracted ${data.extracted_at}. Total ${data.total_papers} papers, ${data.ai_flagged_count} AI-flagged. License ${data.source_license} (${data.source_attribution}).`;
|
|
1605
|
+
const lines = data.papers
|
|
1606
|
+
.map((p, i) => {
|
|
1607
|
+
const cves = p.cve_ids.length > 0 ? p.cve_ids.join(', ') : '(no CVE)';
|
|
1608
|
+
const products = p.affected_products.slice(0, 3).join(', ');
|
|
1609
|
+
return `${i + 1}. ${cves} | ${products} | sev=${p.severity_label} | exploited=${p.exploited_in_wild}\n ${p.source_url}`;
|
|
1610
|
+
})
|
|
1611
|
+
.join('\n');
|
|
1612
|
+
return {
|
|
1613
|
+
content: [
|
|
1614
|
+
{
|
|
1615
|
+
type: 'text',
|
|
1616
|
+
text: `${head}\n\nFirst 25 papers:\n${lines}\n\nFor AI-stack-filtered + categorized + sorted papers: /api/premium/ai-cves/ai-stack-cves (1 credit, x402-paid). For only papers actively exploited in the wild: /api/premium/ai-cves/exploited-in-wild (1 credit). For single-CVE lookup: /api/premium/ai-cves/cve?id=CVE-YYYY-NNNNN (1 credit).`,
|
|
1617
|
+
},
|
|
1618
|
+
],
|
|
1619
|
+
};
|
|
1620
|
+
});
|
|
1621
|
+
// ── Tool: get_ai_cves_feed ──────────────────────────────────────────
|
|
1622
|
+
registerTool('get_ai_cves_feed', 'Get a paginated slice of the most-recent AI-stack CVE batch. limit is capped at 50 (the premium tier handles bulk). Source: TensorFeed AI-CVE feed, derived from GitHub Security Advisories (CC BY 4.0). Free, no auth.', {
|
|
1623
|
+
limit: z.number().min(1).max(50).optional().describe('Number of papers to return (default 25, max 50).'),
|
|
1624
|
+
offset: z.number().min(0).optional().describe('Pagination offset (default 0).'),
|
|
1625
|
+
}, async ({ limit, offset }) => {
|
|
1626
|
+
const params = new URLSearchParams();
|
|
1627
|
+
if (typeof limit === 'number')
|
|
1628
|
+
params.set('limit', String(limit));
|
|
1629
|
+
if (typeof offset === 'number')
|
|
1630
|
+
params.set('offset', String(offset));
|
|
1631
|
+
const path = `/ai-cves/feed${params.toString() ? `?${params.toString()}` : ''}`;
|
|
1632
|
+
const data = (await fetchJSON(path));
|
|
1633
|
+
if (!data.batch_id) {
|
|
1634
|
+
return { content: [{ type: 'text', text: 'No AI-CVE batch ingested yet.' }] };
|
|
1635
|
+
}
|
|
1636
|
+
const head = `AI-CVE feed batch ${data.batch_id}: showing offset ${data.offset} to ${data.offset + data.papers.length} of ${data.total} total.`;
|
|
1637
|
+
const lines = data.papers
|
|
1638
|
+
.map((p, i) => {
|
|
1639
|
+
const cves = p.cve_ids.length > 0 ? p.cve_ids.join(', ') : '(no CVE)';
|
|
1640
|
+
const products = p.affected_products.slice(0, 3).join(', ');
|
|
1641
|
+
return `${i + 1}. ${cves} | ${products} | sev=${p.severity_label} | exploited=${p.exploited_in_wild}\n ${p.source_url}`;
|
|
1642
|
+
})
|
|
1643
|
+
.join('\n');
|
|
1644
|
+
return { content: [{ type: 'text', text: `${head}\n\n${lines}` }] };
|
|
1645
|
+
});
|
|
1646
|
+
// ── Tool: get_ai_cves_stats ─────────────────────────────────────────
|
|
1647
|
+
registerTool('get_ai_cves_stats', 'Get aggregate counts across the most-recent AI-stack CVE batch: distribution by severity (critical/high/medium/low/unstated), distribution by exploitation status (stated_yes/stated_no/unstated), and top 10 vendors by frequency. Source: TensorFeed AI-CVE feed (GitHub Security Advisories, CC BY 4.0). Free, no auth.', {}, async () => {
|
|
1648
|
+
const data = (await fetchJSON('/ai-cves/stats'));
|
|
1649
|
+
if (!data.batch_id) {
|
|
1650
|
+
return { content: [{ type: 'text', text: 'No AI-CVE batch ingested yet.' }] };
|
|
1651
|
+
}
|
|
1652
|
+
const sev = Object.entries(data.by_severity)
|
|
1653
|
+
.map(([k, v]) => ` ${k}: ${v}`)
|
|
1654
|
+
.join('\n');
|
|
1655
|
+
const exp = Object.entries(data.by_exploitation)
|
|
1656
|
+
.map(([k, v]) => ` ${k}: ${v}`)
|
|
1657
|
+
.join('\n');
|
|
1658
|
+
const vendors = data.top_vendors.map((v, i) => ` ${i + 1}. ${v.vendor}: ${v.count}`).join('\n');
|
|
1659
|
+
return {
|
|
1660
|
+
content: [
|
|
1661
|
+
{
|
|
1662
|
+
type: 'text',
|
|
1663
|
+
text: `AI-CVE batch ${data.batch_id}: ${data.total_papers} total papers.\n\nBy severity:\n${sev}\n\nBy exploited-in-wild:\n${exp}\n\nTop vendors:\n${vendors}`,
|
|
1664
|
+
},
|
|
1665
|
+
],
|
|
1666
|
+
};
|
|
1667
|
+
});
|
|
1628
1668
|
// ── Start ───────────────────────────────────────────────────────────
|
|
1629
1669
|
async function main() {
|
|
1630
1670
|
const transport = new StdioServerTransport();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensorfeed/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.33.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.28.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.28.0",
|
|
24
24
|
"runtimeHint": "npx",
|
|
25
25
|
"transport": {
|
|
26
26
|
"type": "stdio"
|
|
@@ -65,7 +65,10 @@
|
|
|
65
65
|
"pricing_series_free",
|
|
66
66
|
"benchmark_series_free",
|
|
67
67
|
"status_uptime_free",
|
|
68
|
-
"status_leaderboard_free"
|
|
68
|
+
"status_leaderboard_free",
|
|
69
|
+
"get_ai_cves_latest",
|
|
70
|
+
"get_ai_cves_feed",
|
|
71
|
+
"get_ai_cves_stats"
|
|
69
72
|
],
|
|
70
73
|
"premiumTools": [
|
|
71
74
|
"premium_routing",
|