@tensorfeed/mcp-server 1.35.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 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
@@ -1724,6 +1724,134 @@ registerTool('premium_ai_company', 'Get the per-ticker AI intelligence envelope
1724
1724
  ],
1725
1725
  };
1726
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
+ });
1727
1855
  // ── Start ───────────────────────────────────────────────────────────
1728
1856
  async function main() {
1729
1857
  const transport = new StdioServerTransport();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tensorfeed/mcp-server",
3
- "version": "1.35.0",
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.35.0",
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.35.0",
23
+ "version": "1.36.0",
24
24
  "runtimeHint": "npx",
25
25
  "transport": {
26
26
  "type": "stdio"
@@ -69,7 +69,11 @@
69
69
  "get_ai_cves_latest",
70
70
  "get_ai_cves_feed",
71
71
  "get_ai_cves_stats",
72
- "get_ai_company_filings"
72
+ "get_ai_company_filings",
73
+ "get_x402_summary",
74
+ "get_x402_publishers",
75
+ "get_x402_leaderboard",
76
+ "get_x402_recent"
73
77
  ],
74
78
  "premiumTools": [
75
79
  "premium_routing",
@@ -93,7 +97,9 @@
93
97
  "delete_watch",
94
98
  "get_account_balance",
95
99
  "get_account_usage",
96
- "premium_ai_company"
100
+ "premium_ai_company",
101
+ "premium_x402_publisher_receipts",
102
+ "premium_x402_series"
97
103
  ]
98
104
  }
99
105
  }