@tensorfeed/mcp-server 1.20.0 → 1.21.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 +5 -0
- package/dist/index.js +64 -1
- package/package.json +1 -1
- package/server.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
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.21.0 - 2026-05-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Three free history-series tools: `pricing_series_free`, `benchmark_series_free`, `status_uptime_free`. Each returns up to 7 days of daily snapshots (price/score/uptime) for one model or provider. Max range capped at 7 days; for the full 90-day window keep using the paid `pricing_series`, `benchmark_series`, `status_uptime` tools (1 credit each). Reason for the split: agents discovering the data need a free way to see "yes, TensorFeed actually has historical pricing for this model" before deciding to spend a credit. The 7-day teaser shows the trend without giving away the long tail.
|
|
9
|
+
|
|
5
10
|
## 1.20.0 - 2026-05-04
|
|
6
11
|
|
|
7
12
|
### Changed
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { sanitizeToolResponse } from './sanitize.js';
|
|
6
6
|
const API_BASE = 'https://tensorfeed.ai/api';
|
|
7
|
-
const SDK_VERSION = '1.
|
|
7
|
+
const SDK_VERSION = '1.10.0';
|
|
8
8
|
async function fetchJSON(path, opts = {}) {
|
|
9
9
|
const headers = {
|
|
10
10
|
'User-Agent': `TensorFeed-MCP/${SDK_VERSION}`,
|
|
@@ -235,6 +235,69 @@ registerTool('premium_routing', 'Get a ranked list of recommended AI models for
|
|
|
235
235
|
: '';
|
|
236
236
|
return { content: [{ type: 'text', text: `Routing for "${data.task}":\n\n${list}${billing}` }] };
|
|
237
237
|
});
|
|
238
|
+
// ── Tool: pricing_series_free (free, 7-day cap) ─────────────────────
|
|
239
|
+
registerTool('pricing_series_free', 'Daily price points for one AI model over the last 1 to 7 days, free. For windows up to 90 days use pricing_series (1 credit).', {
|
|
240
|
+
model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
|
|
241
|
+
days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
|
|
242
|
+
}, async ({ model, days }) => {
|
|
243
|
+
const params = new URLSearchParams({ model });
|
|
244
|
+
if (typeof days === 'number')
|
|
245
|
+
params.set('days', String(days));
|
|
246
|
+
const data = (await fetchJSON(`/history/pricing/series?${params}`));
|
|
247
|
+
const s = data.summary;
|
|
248
|
+
const summary = s.first && s.latest
|
|
249
|
+
? `${s.first.date} blended $${s.first.blended} -> ${s.latest.date} blended $${s.latest.blended} (${s.delta_pct_blended}%, min $${s.min_blended}, max $${s.max_blended})`
|
|
250
|
+
: 'no data points in range';
|
|
251
|
+
return {
|
|
252
|
+
content: [
|
|
253
|
+
{
|
|
254
|
+
type: 'text',
|
|
255
|
+
text: `${data.model} (${data.provider ?? 'unknown'}) ${data.points.length} points over ${data.points.length} days\n${summary}\nFor up to 90 days, use the pricing_series tool (1 credit).`,
|
|
256
|
+
},
|
|
257
|
+
],
|
|
258
|
+
};
|
|
259
|
+
});
|
|
260
|
+
// ── Tool: benchmark_series_free (free, 7-day cap) ───────────────────
|
|
261
|
+
registerTool('benchmark_series_free', 'Daily benchmark scores for one model+benchmark over the last 1 to 7 days, free. Benchmark keys: swe_bench, mmlu_pro, gpqa_diamond, math, human_eval. For windows up to 90 days use benchmark_series (1 credit).', {
|
|
262
|
+
model: z.string().describe('Model id or display name'),
|
|
263
|
+
benchmark: z.string().describe('Benchmark key'),
|
|
264
|
+
days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
|
|
265
|
+
}, async ({ model, benchmark, days }) => {
|
|
266
|
+
const params = new URLSearchParams({ model, benchmark });
|
|
267
|
+
if (typeof days === 'number')
|
|
268
|
+
params.set('days', String(days));
|
|
269
|
+
const data = (await fetchJSON(`/history/benchmarks/series?${params}`));
|
|
270
|
+
const s = data.summary;
|
|
271
|
+
const summary = s.first && s.latest
|
|
272
|
+
? `${s.first.date} score ${s.first.score} -> ${s.latest.date} score ${s.latest.score} (delta ${s.delta_pp} pp)`
|
|
273
|
+
: 'no data in range';
|
|
274
|
+
return {
|
|
275
|
+
content: [
|
|
276
|
+
{
|
|
277
|
+
type: 'text',
|
|
278
|
+
text: `${data.model} on ${data.benchmark}: ${data.points.length} points\n${summary}`,
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
});
|
|
283
|
+
// ── Tool: status_uptime_free (free, 7-day cap) ──────────────────────
|
|
284
|
+
registerTool('status_uptime_free', 'Daily uptime rollup for one provider over the last 1 to 7 days, free. For windows up to 90 days use status_uptime (1 credit).', {
|
|
285
|
+
provider: z.string().describe('Provider name (e.g. anthropic, openai, google)'),
|
|
286
|
+
days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
|
|
287
|
+
}, async ({ provider, days }) => {
|
|
288
|
+
const params = new URLSearchParams({ provider });
|
|
289
|
+
if (typeof days === 'number')
|
|
290
|
+
params.set('days', String(days));
|
|
291
|
+
const data = (await fetchJSON(`/history/status/uptime?${params}`));
|
|
292
|
+
return {
|
|
293
|
+
content: [
|
|
294
|
+
{
|
|
295
|
+
type: 'text',
|
|
296
|
+
text: `${data.provider} over ${data.days_total} days: ${data.uptime_pct ?? '?'}% uptime (${data.days_operational} operational, ${data.days_degraded} degraded, ${data.days_down} down)`,
|
|
297
|
+
},
|
|
298
|
+
],
|
|
299
|
+
};
|
|
300
|
+
});
|
|
238
301
|
// ── Tool: pricing_series (1 credit) ─────────────────────────────────
|
|
239
302
|
registerTool('pricing_series', 'Daily price points for one AI model with min/max/delta summary. Default range = last 30 days, max 90 days. Costs 1 credit.', {
|
|
240
303
|
model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensorfeed/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.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
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
16
16
|
"identifier": "@tensorfeed/mcp-server",
|
|
17
|
-
"version": "1.
|
|
17
|
+
"version": "1.21.0",
|
|
18
18
|
"runtimeHint": "npx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -52,7 +52,10 @@
|
|
|
52
52
|
"get_reddit_trending",
|
|
53
53
|
"get_openrouter_models",
|
|
54
54
|
"get_hf_daily_papers",
|
|
55
|
-
"get_ai_ecosystem_today"
|
|
55
|
+
"get_ai_ecosystem_today",
|
|
56
|
+
"pricing_series_free",
|
|
57
|
+
"benchmark_series_free",
|
|
58
|
+
"status_uptime_free"
|
|
56
59
|
],
|
|
57
60
|
"premiumTools": [
|
|
58
61
|
"premium_routing",
|