@tensorfeed/mcp-server 1.39.0 → 2.0.1
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 +72 -0
- package/README.md +39 -7
- package/dist/discovery.d.ts +9 -0
- package/dist/discovery.js +38 -0
- package/dist/index.js +554 -1846
- package/dist/meta-snapshot.json +1 -0
- package/package.json +7 -5
- package/server.json +45 -60
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,78 @@
|
|
|
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
|
+
## 2.0.1 - 2026-07-03
|
|
6
|
+
|
|
7
|
+
Docs release, no code changes to the stdio server. The README now documents
|
|
8
|
+
the hosted remote endpoint (https://mcp.tensorfeed.ai/mcp, 33-tool curated
|
|
9
|
+
subset) and its wallet-native x402 payment surfaces: premium tools
|
|
10
|
+
(route_verdict, whats_new) are payable per call with a funded USDC wallet
|
|
11
|
+
(Base or Solana) via arguments.payment or an X-PAYMENT header, with strict
|
|
12
|
+
HTTP-402 transport for auto-pay wrappers at
|
|
13
|
+
https://mcp.tensorfeed.ai/mcp?x402=strict. No account, no signup, no API key.
|
|
14
|
+
Bearer credits tokens keep working everywhere.
|
|
15
|
+
|
|
16
|
+
## 2.0.0 - 2026-06-07
|
|
17
|
+
|
|
18
|
+
Major tool-surface rework. BREAKING: the catalog drops from about 78 tools to
|
|
19
|
+
exactly 24. The old surface had grown wide enough that agents picked the wrong
|
|
20
|
+
tool or stalled across near-duplicate names; 24 sharp tools make tool-selection
|
|
21
|
+
reliable. No HTTP endpoint was removed. Everything still works at
|
|
22
|
+
tensorfeed.ai; this release only changes which slices are first-class MCP tools.
|
|
23
|
+
|
|
24
|
+
### Migration
|
|
25
|
+
|
|
26
|
+
If your code called any of the names below, switch to the replacement:
|
|
27
|
+
|
|
28
|
+
- The eight signed verdicts collapse from preview plus paid pairs into one tool
|
|
29
|
+
each with a `tier` parameter. `<family>_verdict_preview` and
|
|
30
|
+
`<family>_verdict` are now a single `<family>_verdict`, where `tier` is
|
|
31
|
+
`preview` (free, the default) or `full` (1 credit, AFTA-signed). Affected
|
|
32
|
+
families: route, provider_reliability, x402_settlement, x402_publisher,
|
|
33
|
+
stack_safety, benchmark_trust, failover, ssvc.
|
|
34
|
+
- The four time series collapse from free plus paid pairs into one tool each
|
|
35
|
+
with a `days` parameter. `pricing_series_free` and `pricing_series` are now a
|
|
36
|
+
single `pricing_series`; the same applies to `benchmark_series`,
|
|
37
|
+
`status_uptime`, and `status_leaderboard`. Pass `days` 1 to 7 for the free
|
|
38
|
+
window or 8 to 90 for the paid window.
|
|
39
|
+
- The four watch creators merge into one `create_watch` with a `type`
|
|
40
|
+
parameter. `create_price_watch`, `create_status_watch`, `create_digest_watch`,
|
|
41
|
+
and `create_leaderboard_rank_watch` are now `create_watch` with `type` set to
|
|
42
|
+
`price`, `status`, `digest`, or `leaderboard_rank`.
|
|
43
|
+
- `get_ai_today` folds into `get_ai_news`. Pass `digest: true` for the daily
|
|
44
|
+
brief that `get_ai_today` used to return.
|
|
45
|
+
- `get_account_balance` and `get_account_usage` merge into one `account_status`
|
|
46
|
+
that returns both the balance and the usage view.
|
|
47
|
+
|
|
48
|
+
### Removed from the tool list (still live as HTTP endpoints)
|
|
49
|
+
|
|
50
|
+
About 40 long-tail standalone tools were dropped from the MCP surface, including
|
|
51
|
+
the model-deprecation, agent-activity, IOC, AFTA-certification,
|
|
52
|
+
agent-reputation, agent-readiness, crawler-access, MCP-registry-snapshot,
|
|
53
|
+
probe, paper and trending feeds, Reddit, OpenRouter, ecosystem-today,
|
|
54
|
+
earthquake, weather-alert, agent-opportunity, AI-CVE, company-filings, x402
|
|
55
|
+
market, and the standalone routing, news-search, cost-projection, and
|
|
56
|
+
agents-directory tools. None of these went away on the server. Each one is
|
|
57
|
+
still callable as an HTTP endpoint on tensorfeed.ai, and the new
|
|
58
|
+
`find_tensorfeed_data` tool helps an agent discover the right one on demand.
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
|
|
62
|
+
- `find_tensorfeed_data`: a discovery tool. Describe the AI-ecosystem data you
|
|
63
|
+
want and it returns the matching TensorFeed endpoints, with the path and
|
|
64
|
+
parameters to call, so an agent can reach the full catalog without a dedicated
|
|
65
|
+
tool for every feed.
|
|
66
|
+
|
|
67
|
+
### The 24 tools
|
|
68
|
+
|
|
69
|
+
`get_ai_news`, `get_ai_status`, `is_service_down`, `get_model_pricing`,
|
|
70
|
+
`route_verdict`, `provider_reliability_verdict`, `x402_settlement_verdict`,
|
|
71
|
+
`x402_publisher_verdict`, `stack_safety_verdict`, `benchmark_trust_verdict`,
|
|
72
|
+
`failover_verdict`, `ssvc_verdict`, `whats_new`, `compare_models`,
|
|
73
|
+
`provider_deepdive`, `pricing_series`, `benchmark_series`, `status_uptime`,
|
|
74
|
+
`status_leaderboard`, `account_status`, `list_watches`, `create_watch`,
|
|
75
|
+
`delete_watch`, `find_tensorfeed_data`.
|
|
76
|
+
|
|
5
77
|
## 1.39.0 - 2026-06-04
|
|
6
78
|
|
|
7
79
|
Surfaces TensorFeed's full signed-verdict family in the stdio server. Adds the
|
package/README.md
CHANGED
|
@@ -6,6 +6,38 @@
|
|
|
6
6
|
|
|
7
7
|
This subfolder remains in the main `tensorfeed` repo as the **publishing source** for the npm package (`@tensorfeed/mcp-server`) and the [official MCP registry](https://registry.modelcontextprotocol.io/v0/servers/ai.tensorfeed/mcp-server) entry. Edits to `src/`, `server.json`, `package.json`, etc. happen here and get pushed to the standalone repo on release.
|
|
8
8
|
|
|
9
|
+
## Hosted remote endpoint (zero install, wallet-payable)
|
|
10
|
+
|
|
11
|
+
You do not need to install this package to use TensorFeed over MCP. A hosted Streamable HTTP endpoint serves a curated 33-tool subset (31 free + 2 premium), and the premium tools are payable per call with nothing but a funded USDC wallet: no account, no signup, no API key.
|
|
12
|
+
|
|
13
|
+
| Surface | URL |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Canonical endpoint | `https://mcp.tensorfeed.ai/mcp` |
|
|
16
|
+
| Same endpoint, legacy path | `https://tensorfeed.ai/api/mcp` |
|
|
17
|
+
| Strict x402 transport (for auto-pay wrappers) | `https://mcp.tensorfeed.ai/mcp?x402=strict` |
|
|
18
|
+
|
|
19
|
+
Connect any MCP client with an HTTP transport:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"tensorfeed": { "type": "http", "url": "https://mcp.tensorfeed.ai/mcp" }
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`GET` the endpoint for machine-readable discovery info (tool count, payment surfaces, spec version). `POST` a JSON-RPC 2.0 envelope for `initialize`, `tools/list`, `tools/call`, and `ping`.
|
|
30
|
+
|
|
31
|
+
### Paying premium tools per call (x402)
|
|
32
|
+
|
|
33
|
+
The two premium tools, `route_verdict` (the signed model-routing decision) and `whats_new` (the full AFTA-signed morning brief), cost 1 credit ($0.02 in USDC, Base or Solana) per call. Three payment paths, pick whichever your client supports:
|
|
34
|
+
|
|
35
|
+
1. **`arguments.payment`**: call the tool unpaid, read the canonical x402 requirements from the response (`accepts` array), sign, then retry the same call with the base64 payment payload in the `payment` argument. Works in every MCP client, no header access needed.
|
|
36
|
+
2. **`X-PAYMENT` header**: send the same base64 payload as an `X-PAYMENT` (or `PAYMENT-SIGNATURE`) header on the POST.
|
|
37
|
+
3. **Bearer credits**: `Authorization: Bearer tf_live_...` token from [tensorfeed.ai/developers/agent-payments](https://tensorfeed.ai/developers/agent-payments).
|
|
38
|
+
|
|
39
|
+
x402 client wrappers that auto-pay on HTTP 402 should point at the strict URL (`?x402=strict`): unpaid premium calls there return a real HTTP 402 with a `PAYMENT-REQUIRED` header, the wrapper signs and retries, and the settled response carries a `PAYMENT-RESPONSE` header plus the AFTA-signed receipt in the body. No USDC yet? Claim free trial credits by signing a wallet message at `https://tensorfeed.ai/api/payment/trial-credits` (no payment required).
|
|
40
|
+
|
|
9
41
|
## Featured: Route Verdict
|
|
10
42
|
|
|
11
43
|
The single best model to use right now, as one signed call. `route_verdict` fuses live pricing, contamination-discounted benchmark capability, real production usage, measured p95 latency probes, live incident state, and deprecation flags into one ranked decision, with an AFTA-signed receipt over the exact inputs. Instead of stitching together pricing pages, benchmark leaderboards, status dashboards, and your own latency tests, you get a current, defensible routing answer in one request.
|
|
@@ -43,17 +75,17 @@ Swap `task` for `reasoning`, `creative`, or `general`, or pass `?model=<id-or-na
|
|
|
43
75
|
|
|
44
76
|
### The agent path (MCP)
|
|
45
77
|
|
|
46
|
-
With `@tensorfeed/mcp-server` installed, an agent gets
|
|
78
|
+
With `@tensorfeed/mcp-server` installed, an agent gets one `route_verdict` tool with a `tier` parameter. Call it with the default free tier for the pick, then `tier="full"` when it needs to defend the choice:
|
|
47
79
|
|
|
48
80
|
```text
|
|
49
|
-
# Free taste: the top pick + reasoning, no token (10/IP/day)
|
|
50
|
-
|
|
81
|
+
# Free taste: the top pick + reasoning, no token (10/IP/day). tier defaults to "preview".
|
|
82
|
+
route_verdict({ task: "code" })
|
|
51
83
|
|
|
52
84
|
# 1 credit: ranked runners-up, constraint filters, AFTA-signed receipt
|
|
53
|
-
route_verdict({ task: "code", max_latency_p95_ms: 1500, budget: 8, min_quality: 0.6 })
|
|
85
|
+
route_verdict({ task: "code", tier: "full", max_latency_p95_ms: 1500, budget: 8, min_quality: 0.6 })
|
|
54
86
|
```
|
|
55
87
|
|
|
56
|
-
`
|
|
88
|
+
`tier="full"` adds the ranked runners-up, the constraint filters (`max_latency_p95_ms`, `budget`, `min_quality`, `require_operational`, `exclude_deprecated`), and the AFTA-signed receipt the agent can audit later. Credits come from [tensorfeed.ai/developers/agent-payments](https://tensorfeed.ai/developers/agent-payments).
|
|
57
89
|
|
|
58
90
|
### Why it matters
|
|
59
91
|
|
|
@@ -61,11 +93,11 @@ Models, prices, and latency move week to week. `route_verdict` is one signed cal
|
|
|
61
93
|
|
|
62
94
|
## Catalog
|
|
63
95
|
|
|
64
|
-
|
|
96
|
+
24 tools on this stdio package. The core flagships, the eight signed verdicts, the time-series tools, and the webhook watches are dedicated tools; the rest of the 100+ TensorFeed endpoints are reachable through the `find_tensorfeed_data` discovery tool and callable over HTTP. Free tiers need no token; paid tiers charge USDC on Base via x402 and return an AFTA-signed receipt. The hosted HTTP endpoint above carries a different, broader 33-tool curated subset (SEC EDGAR, openFDA, EIA, USGS, NWS, AI papers, and more). The full tool reference lives in the [standalone repo](https://github.com/RipperMercs/tensorfeed-mcp).
|
|
65
97
|
|
|
66
98
|
### Verdict family
|
|
67
99
|
|
|
68
|
-
|
|
100
|
+
Eight signed decisions (route_verdict is featured above). Each is a single tool with a `tier` parameter: `tier="preview"` (default) is free, `tier="full"` costs 1 credit ($0.02) and adds the full ranking and an AFTA-signed receipt:
|
|
69
101
|
|
|
70
102
|
- **provider_reliability_verdict**: the safest AI provider to build on, ranked by availability and tail consistency over TensorFeed's own probes.
|
|
71
103
|
- **x402_settlement_verdict**: the x402 settlement momentum, concentration, and leading publisher over a 24h, 7d, or 30d window.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface EndpointRow {
|
|
2
|
+
key: string;
|
|
3
|
+
path: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
/** Flatten the /api/meta `api` object ({key: 'path (desc)'}) into rows. */
|
|
7
|
+
export declare function flattenCatalog(meta: unknown): EndpointRow[];
|
|
8
|
+
/** Keyword-overlap score of a query against each row's key + description. Returns top N with score > 0. */
|
|
9
|
+
export declare function scoreEndpoints(rows: EndpointRow[], query: string, limit: number): EndpointRow[];
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Flatten the /api/meta `api` object ({key: 'path (desc)'}) into rows. */
|
|
2
|
+
export function flattenCatalog(meta) {
|
|
3
|
+
const api = meta?.api;
|
|
4
|
+
if (!api || typeof api !== 'object')
|
|
5
|
+
return [];
|
|
6
|
+
const rows = [];
|
|
7
|
+
for (const [key, val] of Object.entries(api)) {
|
|
8
|
+
if (typeof val !== 'string')
|
|
9
|
+
continue;
|
|
10
|
+
const m = val.match(/^(\S+)\s*(.*)$/);
|
|
11
|
+
const path = m ? m[1] : val;
|
|
12
|
+
const description = m ? m[2].replace(/^\(/, '').replace(/\)$/, '') : '';
|
|
13
|
+
rows.push({ key, path, description });
|
|
14
|
+
}
|
|
15
|
+
return rows;
|
|
16
|
+
}
|
|
17
|
+
const STOP = new Set(['the', 'a', 'an', 'for', 'of', 'to', 'and', 'or', 'in', 'on', 'with', 'me', 'get', 'find', 'data', 'i', 'need', 'want', 'my']);
|
|
18
|
+
function tokenize(s) {
|
|
19
|
+
return s.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 2 && !STOP.has(t));
|
|
20
|
+
}
|
|
21
|
+
/** Keyword-overlap score of a query against each row's key + description. Returns top N with score > 0. */
|
|
22
|
+
export function scoreEndpoints(rows, query, limit) {
|
|
23
|
+
const q = new Set(tokenize(query));
|
|
24
|
+
if (q.size === 0)
|
|
25
|
+
return [];
|
|
26
|
+
const scored = rows
|
|
27
|
+
.map((r) => {
|
|
28
|
+
const hay = tokenize(r.key + ' ' + r.description);
|
|
29
|
+
let score = 0;
|
|
30
|
+
for (const t of hay)
|
|
31
|
+
if (q.has(t))
|
|
32
|
+
score += 1;
|
|
33
|
+
return { r, score };
|
|
34
|
+
})
|
|
35
|
+
.filter((x) => x.score > 0)
|
|
36
|
+
.sort((a, b) => b.score - a.score);
|
|
37
|
+
return scored.slice(0, limit).map((x) => x.r);
|
|
38
|
+
}
|