@tensorfeed/mcp-server 1.21.0 → 1.23.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 +12 -0
- package/dist/index.js +79 -0
- package/package.json +1 -1
- package/server.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
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.23.0 - 2026-05-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `create_leaderboard_rank_watch` tool. Premium webhook watch (1 credit) fires when a provider crosses a rank threshold on the cross-provider 7-day uptime leaderboard. Operations: `drops_below`, `rises_above`, `changes`. Use case: SRE / vendor-management teams want a notification when their primary AI provider's relative reliability shifts.
|
|
9
|
+
- 5 additional providers covered by every status tool: OpenRouter, ElevenLabs, Stability AI, Runway, Luma. Brings total monitored to 20.
|
|
10
|
+
|
|
11
|
+
## 1.22.0 - 2026-05-04
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- Cross-provider uptime leaderboard tools: `status_leaderboard_free` (free, 7-day cap) and `status_leaderboard` (premium, 1 credit, up to 90 days). Returns providers ranked by uptime % DESC computed from minute-resolution counters (~720 samples per provider per day at the 2-min poll cadence). Premium adds `incident_count` and `mttr_minutes` (mean time to recover) per provider. Aimed at SRE/ops/procurement teams comparing AI vendor reliability for vendor selection or post-incident reviews.
|
|
15
|
+
- 4 new monitored providers behind every status tool: Google Gemini (via Google Cloud incidents), GitHub Copilot, Perplexity (via Instatus), and Groq. Brings total monitored to 10 major LLM providers.
|
|
16
|
+
|
|
5
17
|
## 1.21.0 - 2026-05-04
|
|
6
18
|
|
|
7
19
|
### Added
|
package/dist/index.js
CHANGED
|
@@ -298,6 +298,32 @@ registerTool('status_uptime_free', 'Daily uptime rollup for one provider over th
|
|
|
298
298
|
],
|
|
299
299
|
};
|
|
300
300
|
});
|
|
301
|
+
// ── Tool: status_leaderboard_free (free, 7-day cap) ─────────────────
|
|
302
|
+
registerTool('status_leaderboard_free', 'Cross-provider uptime leaderboard, ranked by uptime % DESC. Free, 7-day cap. Computed from minute-resolution counters (~720 samples per provider per day). For 90-day windows plus incident_count and mttr_minutes per provider use status_leaderboard (1 credit).', {
|
|
303
|
+
days: z.number().min(1).max(7).optional().describe('Rolling window length 1 to 7 days (default 7)'),
|
|
304
|
+
}, async ({ days }) => {
|
|
305
|
+
const params = new URLSearchParams();
|
|
306
|
+
if (typeof days === 'number')
|
|
307
|
+
params.set('days', String(days));
|
|
308
|
+
const qs = params.toString();
|
|
309
|
+
const data = (await fetchJSON(`/status/leaderboard${qs ? `?${qs}` : ''}`));
|
|
310
|
+
if (!data.ok) {
|
|
311
|
+
return {
|
|
312
|
+
content: [{ type: 'text', text: `Leaderboard unavailable: ${data.error ?? 'unknown'} - ${data.message ?? ''}` }],
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
const lines = (data.entries ?? [])
|
|
316
|
+
.slice(0, 10)
|
|
317
|
+
.map((e) => `#${e.rank} ${e.provider}: ${e.uptime_pct}% (${e.downtime_minutes}m downtime, ${e.hard_down_minutes}m hard-down)`);
|
|
318
|
+
return {
|
|
319
|
+
content: [
|
|
320
|
+
{
|
|
321
|
+
type: 'text',
|
|
322
|
+
text: `AI provider uptime leaderboard ${data.range?.from} to ${data.range?.to}\n${lines.join('\n')}`,
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
};
|
|
326
|
+
});
|
|
301
327
|
// ── Tool: pricing_series (1 credit) ─────────────────────────────────
|
|
302
328
|
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.', {
|
|
303
329
|
model: z.string().describe('Model id or display name (e.g. "Claude Opus 4.7" or "claude-opus-4-7")'),
|
|
@@ -376,6 +402,32 @@ registerTool('status_uptime', 'Daily uptime rollup for one provider with operati
|
|
|
376
402
|
],
|
|
377
403
|
};
|
|
378
404
|
});
|
|
405
|
+
// ── Tool: status_leaderboard (1 credit) ─────────────────────────────
|
|
406
|
+
registerTool('status_leaderboard', 'Cross-provider uptime leaderboard for a custom date range up to 90 days. Same minute-resolution counter source as status_leaderboard_free, but adds incident_count and mttr_minutes (mean time to recover) per provider. Sorted by uptime % DESC. Costs 1 credit.', {
|
|
407
|
+
from: z.string().optional().describe('Start date YYYY-MM-DD UTC (default: 30 days ago)'),
|
|
408
|
+
to: z.string().optional().describe('End date YYYY-MM-DD UTC (default: today)'),
|
|
409
|
+
}, async ({ from, to }) => {
|
|
410
|
+
const params = new URLSearchParams();
|
|
411
|
+
if (from)
|
|
412
|
+
params.set('from', from);
|
|
413
|
+
if (to)
|
|
414
|
+
params.set('to', to);
|
|
415
|
+
const data = (await fetchJSON(`/premium/status/leaderboard?${params}`, { auth: true }));
|
|
416
|
+
if (!data.ok) {
|
|
417
|
+
return {
|
|
418
|
+
content: [{ type: 'text', text: `Leaderboard unavailable: ${data.error ?? 'unknown'} - ${data.message ?? ''}` }],
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
const lines = (data.entries ?? []).map((e) => `#${e.rank} ${e.provider}: ${e.uptime_pct}% uptime, ${e.downtime_minutes}m downtime (${e.hard_down_minutes}m hard-down), ${e.incident_count ?? 0} incidents, MTTR ${e.mttr_minutes ?? 'n/a'}m`);
|
|
422
|
+
return {
|
|
423
|
+
content: [
|
|
424
|
+
{
|
|
425
|
+
type: 'text',
|
|
426
|
+
text: `AI provider uptime leaderboard ${data.range?.from} to ${data.range?.to}\n${lines.join('\n')}\n\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
427
|
+
},
|
|
428
|
+
],
|
|
429
|
+
};
|
|
430
|
+
});
|
|
379
431
|
// ── Tool: premium_agents_directory (1 credit) ───────────────────────
|
|
380
432
|
registerTool('premium_agents_directory', 'Enriched AI agents catalog joined with live status, recent news, agent traffic, flagship pricing, and a 0-100 trending_score. Costs 1 credit.', {
|
|
381
433
|
category: z.string().optional().describe('coding, research, general, creative, frameworks'),
|
|
@@ -662,6 +714,33 @@ registerTool('create_digest_watch', 'Register a scheduled digest webhook that fi
|
|
|
662
714
|
],
|
|
663
715
|
};
|
|
664
716
|
});
|
|
717
|
+
// ── Tool: create_leaderboard_rank_watch (1 credit) ──────────────────
|
|
718
|
+
registerTool('create_leaderboard_rank_watch', 'Register a webhook that fires when a provider crosses a rank threshold on the cross-provider 7-day uptime leaderboard. Rank 1 = best (highest uptime). drops_below: was rank<=N, now rank>N (got worse). rises_above: was rank>=N, now rank<N (got better). changes: any rank movement. Costs 1 credit at registration. Watch lives 90 days.', {
|
|
719
|
+
provider: z.string().describe('Provider name or slug (case-insensitive). e.g. claude, openai, gemini, bedrock, azure'),
|
|
720
|
+
op: z.enum(['drops_below', 'rises_above', 'changes']).describe('Trigger condition'),
|
|
721
|
+
threshold: z.number().int().min(1).optional().describe('Required for drops_below / rises_above. Integer rank position.'),
|
|
722
|
+
callback_url: z.string().describe('HTTPS URL to POST to when the watch fires'),
|
|
723
|
+
secret: z.string().optional().describe('Optional HMAC shared secret'),
|
|
724
|
+
}, async ({ provider, op, threshold, callback_url, secret }) => {
|
|
725
|
+
const spec = { type: 'leaderboard_rank', provider, op };
|
|
726
|
+
if (threshold !== undefined)
|
|
727
|
+
spec.threshold = threshold;
|
|
728
|
+
const body = { spec, callback_url };
|
|
729
|
+
if (secret !== undefined)
|
|
730
|
+
body.secret = secret;
|
|
731
|
+
const data = (await fetchJSON('/premium/watches', { method: 'POST', body, auth: true }));
|
|
732
|
+
const desc = op === 'changes'
|
|
733
|
+
? `${provider} rank changes`
|
|
734
|
+
: `${provider} ${op.replace('_', ' ')} #${threshold}`;
|
|
735
|
+
return {
|
|
736
|
+
content: [
|
|
737
|
+
{
|
|
738
|
+
type: 'text',
|
|
739
|
+
text: `Created leaderboard rank watch ${data.watch.id} (${desc}). Expires ${data.watch.expires_at}. Credits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
740
|
+
},
|
|
741
|
+
],
|
|
742
|
+
};
|
|
743
|
+
});
|
|
665
744
|
// ── Tool: delete_watch ──────────────────────────────────────────────
|
|
666
745
|
registerTool('delete_watch', 'Delete one of your active webhook watches by id. Free, requires TENSORFEED_TOKEN.', {
|
|
667
746
|
watch_id: z.string().describe('The wat_... id from create_price_watch / create_status_watch / list_watches'),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tensorfeed/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.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.23.0",
|
|
7
7
|
"websiteUrl": "https://tensorfeed.ai/developers/agent-payments",
|
|
8
8
|
"repository": {
|
|
9
9
|
"url": "https://github.com/RipperMercs/tensorfeed-mcp",
|
|
@@ -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.23.0",
|
|
18
18
|
"runtimeHint": "npx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -55,13 +55,15 @@
|
|
|
55
55
|
"get_ai_ecosystem_today",
|
|
56
56
|
"pricing_series_free",
|
|
57
57
|
"benchmark_series_free",
|
|
58
|
-
"status_uptime_free"
|
|
58
|
+
"status_uptime_free",
|
|
59
|
+
"status_leaderboard_free"
|
|
59
60
|
],
|
|
60
61
|
"premiumTools": [
|
|
61
62
|
"premium_routing",
|
|
62
63
|
"pricing_series",
|
|
63
64
|
"benchmark_series",
|
|
64
65
|
"status_uptime",
|
|
66
|
+
"status_leaderboard",
|
|
65
67
|
"premium_agents_directory",
|
|
66
68
|
"news_search",
|
|
67
69
|
"cost_projection",
|
|
@@ -74,6 +76,7 @@
|
|
|
74
76
|
"create_price_watch",
|
|
75
77
|
"create_status_watch",
|
|
76
78
|
"create_digest_watch",
|
|
79
|
+
"create_leaderboard_rank_watch",
|
|
77
80
|
"delete_watch",
|
|
78
81
|
"get_account_balance",
|
|
79
82
|
"get_account_usage"
|