@tensorfeed/mcp-server 1.34.0 → 1.36.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 +25 -0
- package/dist/index.js +187 -0
- package/package.json +1 -1
- package/server.json +12 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
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.0 - 2026-05-28
|
|
6
|
+
|
|
7
|
+
Adds 6 tools wrapping the x402 settlement index endpoints (Wave 20)
|
|
8
|
+
that shipped earlier today as the first-mover ecosystem-level index
|
|
9
|
+
of x402 USDC settlements on Base mainnet.
|
|
10
|
+
|
|
11
|
+
Free tools:
|
|
12
|
+
- `get_x402_summary`: ecosystem-level rollup across 24h/7d/30d window.
|
|
13
|
+
- `get_x402_publishers`: canonical list of x402-compliant publishers
|
|
14
|
+
TensorFeed is currently indexing, auto-discovered from
|
|
15
|
+
/.well-known/x402.json crawls.
|
|
16
|
+
- `get_x402_leaderboard`: top publishers by volume in the window.
|
|
17
|
+
- `get_x402_recent`: most recent settlement events newest-first.
|
|
18
|
+
|
|
19
|
+
Premium tools (1 credit, AFTA-signed):
|
|
20
|
+
- `premium_x402_publisher_receipts`: per-publisher feed with daily
|
|
21
|
+
series + avg_amount + attribution.
|
|
22
|
+
- `premium_x402_series`: time-series of ecosystem or per-publisher
|
|
23
|
+
volume / count across a date range.
|
|
24
|
+
|
|
25
|
+
Each premium tool's description includes an explicit VS FREE
|
|
26
|
+
differentiator (per the upsell-copy memory): Anthropic-side LLMs
|
|
27
|
+
repeat tool descriptions verbatim when deciding whether to recommend
|
|
28
|
+
paying.
|
|
29
|
+
|
|
5
30
|
## 1.33.0 - 2026-05-25 (AI-CVE intelligence tools, unified versioning)
|
|
6
31
|
|
|
7
32
|
Versions across npm + MCP Registry + MCPB manifest are now all 1.33.0
|
package/dist/index.js
CHANGED
|
@@ -1665,6 +1665,193 @@ registerTool('get_ai_cves_stats', 'Get aggregate counts across the most-recent A
|
|
|
1665
1665
|
],
|
|
1666
1666
|
};
|
|
1667
1667
|
});
|
|
1668
|
+
// ── Tool: get_ai_company_filings (free) ─────────────────────────────
|
|
1669
|
+
registerTool('get_ai_company_filings', 'Get recent SEC filings (10-K, 10-Q, 8-K, etc.) for one AI bellwether ticker. Cohort: NVDA, AMD, AVGO, TSM, ARM, MSFT, GOOGL, AMZN, ORCL, PLTR, SMCI, AAPL, META, TSLA. Source: data.sec.gov, public domain. Refreshed every 6 hours. Free, no auth.', {
|
|
1670
|
+
ticker: z.string().describe('AI bellwether ticker (case-insensitive). One of NVDA, AMD, AVGO, TSM, ARM, MSFT, GOOGL, AMZN, ORCL, PLTR, SMCI, AAPL, META, TSLA.'),
|
|
1671
|
+
limit: z.number().min(1).max(50).optional().describe('Max filings to return (default 10, max 50).'),
|
|
1672
|
+
}, async ({ ticker, limit }) => {
|
|
1673
|
+
const params = new URLSearchParams({ ticker: ticker.toUpperCase() });
|
|
1674
|
+
params.set('limit', String(limit ?? 10));
|
|
1675
|
+
const data = (await fetchJSON(`/sec/filings/recent?${params}`));
|
|
1676
|
+
if (!data.ok || !data.filings || data.filings.length === 0) {
|
|
1677
|
+
return {
|
|
1678
|
+
content: [
|
|
1679
|
+
{
|
|
1680
|
+
type: 'text',
|
|
1681
|
+
text: `No filings returned for ${ticker.toUpperCase()}. The ticker may not be in the AI bellwether cohort; supported tickers: NVDA, AMD, AVGO, TSM, ARM, MSFT, GOOGL, AMZN, ORCL, PLTR, SMCI, AAPL, META, TSLA.`,
|
|
1682
|
+
},
|
|
1683
|
+
],
|
|
1684
|
+
};
|
|
1685
|
+
}
|
|
1686
|
+
const lines = data.filings
|
|
1687
|
+
.map((f, i) => `${i + 1}. ${f.form} on ${f.filing_date}\n ${f.primary_doc_description}\n ${f.primary_doc_url}`)
|
|
1688
|
+
.join('\n\n');
|
|
1689
|
+
return {
|
|
1690
|
+
content: [
|
|
1691
|
+
{
|
|
1692
|
+
type: 'text',
|
|
1693
|
+
text: `${ticker.toUpperCase()} recent SEC filings (captured ${data.capturedAt ?? 'unknown'}, ${data.filings_count} returned):\n\n${lines}`,
|
|
1694
|
+
},
|
|
1695
|
+
],
|
|
1696
|
+
};
|
|
1697
|
+
});
|
|
1698
|
+
// ── Tool: premium_ai_company (1 credit) ─────────────────────────────
|
|
1699
|
+
registerTool('premium_ai_company', 'Get the per-ticker AI intelligence envelope for one AI bellwether: latest 10 SEC filings, latest 10 AI-tagged news mentions filtered by curated aliases, strategic and equity funding rounds where the company is a lead or notable investor, and cohort metadata. One call replaces four free siblings (sec/filings, news, funding, cohort) plus the agent-side alias filter. Costs 1 credit ($0.02). Strict-premium; ticker must be in the cohort.', {
|
|
1700
|
+
ticker: z.string().describe('AI bellwether ticker (case-insensitive). One of NVDA, AMD, AVGO, TSM, ARM, MSFT, GOOGL, AMZN, ORCL, PLTR, SMCI, AAPL, META, TSLA.'),
|
|
1701
|
+
}, async ({ ticker }) => {
|
|
1702
|
+
const upper = ticker.toUpperCase();
|
|
1703
|
+
const data = (await fetchJSON(`/premium/ai-companies/${upper}`, { auth: true }));
|
|
1704
|
+
const filingsList = data.filings.items
|
|
1705
|
+
.slice(0, 10)
|
|
1706
|
+
.map((f, i) => ` ${i + 1}. ${f.form} on ${f.filing_date}: ${f.primary_doc_description}`)
|
|
1707
|
+
.join('\n');
|
|
1708
|
+
const newsList = data.news.items
|
|
1709
|
+
.slice(0, 10)
|
|
1710
|
+
.map((n, i) => ` ${i + 1}. ${n.title}\n ${n.source} (${n.publishedAt})`)
|
|
1711
|
+
.join('\n\n');
|
|
1712
|
+
const fundingList = data.funding_as_investor.items
|
|
1713
|
+
.map((r, i) => ` ${i + 1}. ${r.company} ${r.stage}, $${r.amountM}M, ${r.announcedDate}`)
|
|
1714
|
+
.join('\n');
|
|
1715
|
+
const billing = data.billing
|
|
1716
|
+
? `\n\nCharged ${data.billing.credits_charged} credit. Remaining: ${data.billing.credits_remaining ?? '?'}.`
|
|
1717
|
+
: '';
|
|
1718
|
+
return {
|
|
1719
|
+
content: [
|
|
1720
|
+
{
|
|
1721
|
+
type: 'text',
|
|
1722
|
+
text: `${data.ticker} (${data.company.display_name}, ${data.company.exchange}, ${data.company.category})\nAI angle: ${data.company.ai_angle}\nCaptured: ${data.capturedAt}\n\nRecent SEC filings (${data.filings.count}):\n${filingsList || ' none'}\n\nAI news mentions (${data.news.count}, aliases: ${data.news.aliases_used.join(', ')}):\n${newsList || ' none'}\n\nFunding rounds as lead or notable investor (${data.funding_as_investor.count}):\n${fundingList || ' none'}${billing}`,
|
|
1723
|
+
},
|
|
1724
|
+
],
|
|
1725
|
+
};
|
|
1726
|
+
});
|
|
1727
|
+
// ── Tool: get_x402_summary (free) ───────────────────────────────────
|
|
1728
|
+
registerTool('get_x402_summary', 'Get ecosystem-level x402 USDC settlement rollup on Base mainnet. Returns volume_usdc, count, unique_publishers, and change_vs_prior_window across a 24h, 7d, or 30d window. TensorFeed indexes Base USDC Transfer events filtered to wallets self-published by x402-compliant publishers in their /.well-known/x402.json manifests. Forward-only from 2026-05-28; ~6 min worst-case freshness (10 min SLA). Free, capped to one window per call.', {
|
|
1729
|
+
window: z.enum(['24h', '7d', '30d']).optional().describe('Aggregation window. Defaults to 24h if omitted.'),
|
|
1730
|
+
}, async ({ window }) => {
|
|
1731
|
+
const w = window ?? '24h';
|
|
1732
|
+
const data = (await fetchJSON(`/x402-index/summary?window=${w}`));
|
|
1733
|
+
return {
|
|
1734
|
+
content: [
|
|
1735
|
+
{
|
|
1736
|
+
type: 'text',
|
|
1737
|
+
text: `x402 settlement rollup (window ${data.window}, captured ${data.captured_at}):\n volume_usdc: ${data.volume_usdc}\n count: ${data.count}\n unique_publishers: ${data.unique_publishers}\n change vs prior window: volume ${data.change_vs_prior_window.volume_pct}%, count ${data.change_vs_prior_window.count_pct}%`,
|
|
1738
|
+
},
|
|
1739
|
+
],
|
|
1740
|
+
};
|
|
1741
|
+
});
|
|
1742
|
+
// ── Tool: get_x402_publishers (free) ────────────────────────────────
|
|
1743
|
+
registerTool('get_x402_publishers', 'List x402-compliant publishers TensorFeed currently indexes. Each entry: domain, pay_to_wallets, first_seen, last_crawled, last_event_at, last_crawl_error. Publishers are auto-discovered daily via /.well-known/x402.json crawls. Use this to enumerate which publishers can then be queried in depth via premium_x402_publisher_receipts. Free, no input.', {}, async () => {
|
|
1744
|
+
const data = (await fetchJSON('/x402-index/publishers'));
|
|
1745
|
+
if (data.count === 0) {
|
|
1746
|
+
return { content: [{ type: 'text', text: 'No x402 publishers indexed yet.' }] };
|
|
1747
|
+
}
|
|
1748
|
+
const lines = data.publishers
|
|
1749
|
+
.map((p, i) => `${i + 1}. ${p.domain}\n wallets: ${p.pay_to_wallets.join(', ')}\n first_seen: ${p.first_seen}${p.last_event_at ? `\n last_event_at: ${p.last_event_at}` : ''}${p.last_crawled ? `\n last_crawled: ${p.last_crawled}` : ''}${p.last_crawl_error ? `\n last_crawl_error: ${p.last_crawl_error}` : ''}`)
|
|
1750
|
+
.join('\n\n');
|
|
1751
|
+
return {
|
|
1752
|
+
content: [
|
|
1753
|
+
{
|
|
1754
|
+
type: 'text',
|
|
1755
|
+
text: `x402 publishers (${data.count}, captured ${data.captured_at}):\n\n${lines}`,
|
|
1756
|
+
},
|
|
1757
|
+
],
|
|
1758
|
+
};
|
|
1759
|
+
});
|
|
1760
|
+
// ── Tool: get_x402_leaderboard (free) ───────────────────────────────
|
|
1761
|
+
registerTool('get_x402_leaderboard', 'Top publishers by x402 USDC settlement volume across a 24h, 7d, or 30d window. Each leader: rank, domain, volume_usdc, count, share_pct of the sliced total. Limit clamped 1 to 25. Useful for surfacing which x402 services are receiving the most agent traffic. Free.', {
|
|
1762
|
+
window: z.enum(['24h', '7d', '30d']).optional().describe('Aggregation window. Defaults to 24h.'),
|
|
1763
|
+
limit: z.number().min(1).max(25).optional().describe('Top N publishers to return. Default 10, max 25.'),
|
|
1764
|
+
}, async ({ window, limit }) => {
|
|
1765
|
+
const w = window ?? '24h';
|
|
1766
|
+
const l = limit ?? 10;
|
|
1767
|
+
const data = (await fetchJSON(`/x402-index/leaderboard?window=${w}&limit=${l}`));
|
|
1768
|
+
if (data.leaders.length === 0) {
|
|
1769
|
+
return { content: [{ type: 'text', text: `No x402 leaders for window ${data.window}.` }] };
|
|
1770
|
+
}
|
|
1771
|
+
const lines = data.leaders
|
|
1772
|
+
.map((e) => ` ${e.rank}. ${e.domain}: $${e.volume_usdc} across ${e.count} settlements (${e.share_pct}% share)`)
|
|
1773
|
+
.join('\n');
|
|
1774
|
+
return {
|
|
1775
|
+
content: [
|
|
1776
|
+
{
|
|
1777
|
+
type: 'text',
|
|
1778
|
+
text: `x402 leaderboard (window ${data.window}, captured ${data.captured_at}):\n${lines}`,
|
|
1779
|
+
},
|
|
1780
|
+
],
|
|
1781
|
+
};
|
|
1782
|
+
});
|
|
1783
|
+
// ── Tool: get_x402_recent (free) ────────────────────────────────────
|
|
1784
|
+
registerTool('get_x402_recent', 'Most recent x402 USDC settlement events newest-first. Each event: tx_hash, block, ts, from_address, to_address, amount_usdc, publisher_domain, base_explorer_url (basescan.org link). Backed by a 100-event ring buffer updated on every indexer cron tick. Limit clamped 1 to 50, default 20. Free.', {
|
|
1785
|
+
limit: z.number().min(1).max(50).optional().describe('Number of most-recent events. Default 20, max 50.'),
|
|
1786
|
+
}, async ({ limit }) => {
|
|
1787
|
+
const l = limit ?? 20;
|
|
1788
|
+
const data = (await fetchJSON(`/x402-index/recent?limit=${l}`));
|
|
1789
|
+
if (data.count === 0) {
|
|
1790
|
+
return { content: [{ type: 'text', text: 'No recent x402 settlement events.' }] };
|
|
1791
|
+
}
|
|
1792
|
+
const lines = data.events
|
|
1793
|
+
.map((e, i) => `${i + 1}. ${e.ts} block ${e.block}\n ${e.publisher_domain}: $${e.amount_usdc} USDC\n from ${e.from_address} to ${e.to_address}\n ${e.base_explorer_url}`)
|
|
1794
|
+
.join('\n\n');
|
|
1795
|
+
return {
|
|
1796
|
+
content: [
|
|
1797
|
+
{
|
|
1798
|
+
type: 'text',
|
|
1799
|
+
text: `Recent x402 settlements (${data.count}, captured ${data.captured_at}):\n\n${lines}`,
|
|
1800
|
+
},
|
|
1801
|
+
],
|
|
1802
|
+
};
|
|
1803
|
+
});
|
|
1804
|
+
// ── Tool: premium_x402_publisher_receipts (1 credit) ────────────────
|
|
1805
|
+
registerTool('premium_x402_publisher_receipts', 'Per-publisher receipt feed for one x402-compliant domain across a from/to date range. Returns publisher meta (domain, pay_to_wallets, first_seen), window rollup (volume_usdc, count, avg_amount, daily_series), and attribution. \n\nVS FREE: get_x402_publishers tells you WHICH publishers exist but only with rolled-up scalar counters. This endpoint composes the per-day rollup across a date range with avg_amount, daily series for charts, and structured attribution license metadata in one paid call. An agent building a per-publisher analytics dashboard would otherwise need to call get_x402_publishers + reconstruct daily series from get_x402_summary per-day (impossible because /summary returns ecosystem totals not per-publisher) or wait for the next free-tier expansion. The premium endpoint saves the integration overhead and serves a forensic / compliance-grade payload for $0.02. \n\nForward-only index. Costs 1 credit ($0.02). Strict-premium; domain must exist in get_x402_publishers, otherwise 404.', {
|
|
1806
|
+
domain: z.string().describe('Publisher domain to query, e.g. tensorfeed.ai. Must exist in get_x402_publishers result.'),
|
|
1807
|
+
from: z.string().describe('Inclusive start date YYYY-MM-DD.'),
|
|
1808
|
+
to: z.string().describe('Inclusive end date YYYY-MM-DD.'),
|
|
1809
|
+
}, async ({ domain, from, to }) => {
|
|
1810
|
+
const params = new URLSearchParams({ from, to });
|
|
1811
|
+
const data = (await fetchJSON(`/premium/x402-index/publisher/${encodeURIComponent(domain)}?${params}`, { auth: true }));
|
|
1812
|
+
const series = data.rollup.daily_series
|
|
1813
|
+
.map((d) => ` ${d.date}: $${d.volume_usdc} across ${d.count}`)
|
|
1814
|
+
.join('\n');
|
|
1815
|
+
const billing = data.billing
|
|
1816
|
+
? `\n\nCharged ${data.billing.credits_charged} credit. Remaining: ${data.billing.credits_remaining ?? '?'}.`
|
|
1817
|
+
: '';
|
|
1818
|
+
return {
|
|
1819
|
+
content: [
|
|
1820
|
+
{
|
|
1821
|
+
type: 'text',
|
|
1822
|
+
text: `${data.publisher.domain} (first_seen ${data.publisher.first_seen})\nwallets: ${data.publisher.pay_to_wallets.join(', ')}\nwindow: ${data.window.from} to ${data.window.to} (${data.window.days} days)\n\nRollup:\n volume_usdc: ${data.rollup.volume_usdc}\n count: ${data.rollup.count}\n avg_amount: ${data.rollup.avg_amount}\n\nDaily series:\n${series || ' none'}\n\nAttribution: ${data.attribution}\nLicense: ${data.license}${billing}`,
|
|
1823
|
+
},
|
|
1824
|
+
],
|
|
1825
|
+
};
|
|
1826
|
+
});
|
|
1827
|
+
// ── Tool: premium_x402_series (1 credit) ────────────────────────────
|
|
1828
|
+
registerTool('premium_x402_series', 'Time-series of ecosystem or per-publisher x402 settlement volume or count across a from/to date range, chart-feeding. Required: metric (volume or count), granularity (day or hour), from + to (YYYY-MM-DD). Optional: domain filter (omit for ecosystem). \n\nVS FREE: get_x402_summary returns one rolled-up scalar per call for a fixed window length (24h / 7d / 30d). For ANY chart or dashboard, the caller needs a series, not a scalar. The premium endpoint returns the full series in one call instead of N calls + N rate-limit budget burns. For a publisher-scoped series, it is the ONLY way to get per-publisher daily data (get_x402_summary is ecosystem-only). \n\nMVP supports granularity=day; hour returns an empty series with an attribution note (hourly rollups land in a future indexer version). Costs 1 credit ($0.02).', {
|
|
1829
|
+
metric: z.enum(['volume', 'count']).describe('Which series to return.'),
|
|
1830
|
+
granularity: z.enum(['day', 'hour']).describe('Bucket size. MVP: day only; hour returns empty series.'),
|
|
1831
|
+
from: z.string().describe('Inclusive start date YYYY-MM-DD.'),
|
|
1832
|
+
to: z.string().describe('Inclusive end date YYYY-MM-DD.'),
|
|
1833
|
+
domain: z.string().optional().describe('Optional publisher domain filter. Omit for ecosystem-wide series.'),
|
|
1834
|
+
}, async ({ metric, granularity, from, to, domain }) => {
|
|
1835
|
+
const params = new URLSearchParams({ metric, granularity, from, to });
|
|
1836
|
+
if (domain)
|
|
1837
|
+
params.set('domain', domain);
|
|
1838
|
+
const data = (await fetchJSON(`/premium/x402-index/series?${params}`, { auth: true }));
|
|
1839
|
+
const scope = domain ? `domain=${domain}` : 'ecosystem-wide';
|
|
1840
|
+
const seriesLines = data.series.length
|
|
1841
|
+
? data.series.map((p) => ` ${p.ts}: ${p.value}`).join('\n')
|
|
1842
|
+
: ' (empty)';
|
|
1843
|
+
const billing = data.billing
|
|
1844
|
+
? `\n\nCharged ${data.billing.credits_charged} credit. Remaining: ${data.billing.credits_remaining ?? '?'}.`
|
|
1845
|
+
: '';
|
|
1846
|
+
return {
|
|
1847
|
+
content: [
|
|
1848
|
+
{
|
|
1849
|
+
type: 'text',
|
|
1850
|
+
text: `x402 ${data.metric} series (${data.granularity}, ${scope})\nwindow: ${data.window.from} to ${data.window.to}\n\nSeries:\n${seriesLines}\n\nAttribution: ${data.attribution}${billing}`,
|
|
1851
|
+
},
|
|
1852
|
+
],
|
|
1853
|
+
};
|
|
1854
|
+
});
|
|
1668
1855
|
// ── Start ───────────────────────────────────────────────────────────
|
|
1669
1856
|
async function main() {
|
|
1670
1857
|
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.36.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.36.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.36.0",
|
|
24
24
|
"runtimeHint": "npx",
|
|
25
25
|
"transport": {
|
|
26
26
|
"type": "stdio"
|
|
@@ -68,7 +68,12 @@
|
|
|
68
68
|
"status_leaderboard_free",
|
|
69
69
|
"get_ai_cves_latest",
|
|
70
70
|
"get_ai_cves_feed",
|
|
71
|
-
"get_ai_cves_stats"
|
|
71
|
+
"get_ai_cves_stats",
|
|
72
|
+
"get_ai_company_filings",
|
|
73
|
+
"get_x402_summary",
|
|
74
|
+
"get_x402_publishers",
|
|
75
|
+
"get_x402_leaderboard",
|
|
76
|
+
"get_x402_recent"
|
|
72
77
|
],
|
|
73
78
|
"premiumTools": [
|
|
74
79
|
"premium_routing",
|
|
@@ -91,7 +96,10 @@
|
|
|
91
96
|
"create_leaderboard_rank_watch",
|
|
92
97
|
"delete_watch",
|
|
93
98
|
"get_account_balance",
|
|
94
|
-
"get_account_usage"
|
|
99
|
+
"get_account_usage",
|
|
100
|
+
"premium_ai_company",
|
|
101
|
+
"premium_x402_publisher_receipts",
|
|
102
|
+
"premium_x402_series"
|
|
95
103
|
]
|
|
96
104
|
}
|
|
97
105
|
}
|