@tensorfeed/mcp-server 1.9.1 → 1.11.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 +14 -0
- package/LICENSE +21 -0
- package/README.md +5 -2
- package/dist/index.js +118 -75
- package/package.json +1 -1
- package/server.json +8 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the [TensorFeed.ai MCP server](https://github.com/RipperMercs/tensorfeed/tree/main/mcp-server). 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.11.0 - 2026-04-29
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `probe_latest` tool — last 24 hours of measured LLM endpoint latency and availability per provider (Anthropic, OpenAI, Google, Mistral, Cohere). TensorFeed pings each provider's chat completion endpoint every 15 min and records ttfb / total / status. The data is unique because it is measured, not self-reported. Free, no auth.
|
|
9
|
+
- `probe_series` tool — daily SLA series for one provider with ttfb/total p50/p95/p99 and incident-hour count, 90-day max range. 1 credit per call. Pairs with `premium_routing` for picking a model whose SLA you can verify.
|
|
10
|
+
|
|
11
|
+
## 1.10.0 - 2026-04-29
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- `mcp_registry_snapshot` tool — today's summary of the official Model Context Protocol server registry: total servers, by-status breakdown, top namespaces, 1-day deltas (newly added, reactivated, deprecated). Free, no auth.
|
|
15
|
+
- `mcp_registry_series` tool — multi-day time series of MCP registry growth and churn. Range capped at 90 days, default 30 days back. 1 credit per call.
|
|
16
|
+
|
|
17
|
+
The new tools are backed by a fresh daily cron capture of registry.modelcontextprotocol.io. The registry itself is open data, but a 30/90-day trend requires daily capture started weeks before the question is asked.
|
|
18
|
+
|
|
5
19
|
## 1.7.0 - 2026-04-27
|
|
6
20
|
|
|
7
21
|
### Added
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pizza Robot Studios LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -11,6 +11,9 @@ A [Model Context Protocol](https://modelcontextprotocol.io) server that gives AI
|
|
|
11
11
|
| `is_service_down` | Check if a specific AI service is down |
|
|
12
12
|
| `get_model_pricing` | Compare pricing across all major AI model providers |
|
|
13
13
|
| `get_ai_today` | Summary of top AI stories from the last 24 hours |
|
|
14
|
+
| `get_agent_activity` | Live AI bot traffic on TensorFeed.ai with top-bot breakdown |
|
|
15
|
+
| `mcp_registry_snapshot` | Today's summary of the official MCP server registry: total servers, top namespaces, newly added/reactivated/deprecated names |
|
|
16
|
+
| `probe_latest` | Last 24h of measured LLM endpoint latency and availability per provider (ttfb/total p50/p95/p99). Unique because measured, not self-reported |
|
|
14
17
|
|
|
15
18
|
## Premium Tools (paid in USDC on Base)
|
|
16
19
|
|
|
@@ -24,14 +27,14 @@ These tools require a `TENSORFEED_TOKEN` env var. Buy credits at [tensorfeed.ai/
|
|
|
24
27
|
| `pricing_series` | 1 credit | Daily price points for one model with min/max/delta summary |
|
|
25
28
|
| `benchmark_series` | 1 credit | Score evolution for a benchmark on one model |
|
|
26
29
|
| `status_uptime` | 1 credit | Daily uptime % for one provider with incident-day list |
|
|
27
|
-
| `history_compare` | 1 credit | Diff two daily snapshots: added, removed, changed entries |
|
|
28
30
|
| `premium_agents_directory` | 1 credit | Enriched agents catalog with live status, news, traffic, trending_score |
|
|
29
31
|
| `news_search` | 1 credit | Full-text news search with date/provider/category filters and relevance scoring |
|
|
30
32
|
| `cost_projection` | 1 credit | Project workload cost across 1-10 AI models with 4 time horizons and cheapest-monthly ranking |
|
|
31
|
-
| `forecast` | 1 credit | Linear-regression forecast for a price field or benchmark score with 95% CI and confidence label |
|
|
32
33
|
| `provider_deepdive` | 1 credit | One provider's full profile: status, all models with benchmarks joined, recent news, traffic |
|
|
33
34
|
| `compare_models` | 1 credit | Side-by-side comparison of 2-5 models with normalized benchmarks and rankings |
|
|
34
35
|
| `whats_new` | 1 credit | Agent morning brief: pricing changes, incidents, top news from last 1-7 days |
|
|
36
|
+
| `mcp_registry_series` | 1 credit | Multi-day MCP registry growth and churn series, 90-day max range |
|
|
37
|
+
| `probe_series` | 1 credit | Daily SLA series for one LLM provider with ttfb/total p50/p95/p99 and incident-hour count, 90-day max range |
|
|
35
38
|
| `list_watches` | Free | List active webhook watches owned by the token |
|
|
36
39
|
| `create_price_watch` | 1 credit | Register a webhook watch on a model price change |
|
|
37
40
|
| `create_status_watch` | 1 credit | Register a webhook watch on a service status transition |
|
package/dist/index.js
CHANGED
|
@@ -294,48 +294,6 @@ server.tool('status_uptime', 'Daily uptime rollup for one provider with operatio
|
|
|
294
294
|
],
|
|
295
295
|
};
|
|
296
296
|
});
|
|
297
|
-
// ── Tool: history_compare (1 credit) ────────────────────────────────
|
|
298
|
-
server.tool('history_compare', 'Diff two daily snapshots: returns added, removed, and changed entries with deltas. Costs 1 credit.', {
|
|
299
|
-
from: z.string().describe('Earlier snapshot date YYYY-MM-DD'),
|
|
300
|
-
to: z.string().describe('Later snapshot date YYYY-MM-DD'),
|
|
301
|
-
type: z.enum(['pricing', 'benchmarks']).optional().describe('Snapshot type (default: pricing)'),
|
|
302
|
-
}, async ({ from, to, type }) => {
|
|
303
|
-
const params = new URLSearchParams({ from, to, type: type ?? 'pricing' });
|
|
304
|
-
const data = (await fetchJSON(`/premium/history/compare?${params}`, { auth: true }));
|
|
305
|
-
if (data.type === 'pricing') {
|
|
306
|
-
const changes = data.changed
|
|
307
|
-
.map(c => ` ${c.model} ${c.field}: ${c.from} -> ${c.to} (${c.delta_pct ?? 'n/a'}%)`)
|
|
308
|
-
.join('\n');
|
|
309
|
-
return {
|
|
310
|
-
content: [
|
|
311
|
-
{
|
|
312
|
-
type: 'text',
|
|
313
|
-
text: `Pricing diff ${from} -> ${to}\n` +
|
|
314
|
-
` added: ${data.added.length} (${data.added.map(a => a.model).join(', ') || 'none'})\n` +
|
|
315
|
-
` removed: ${data.removed.length} (${data.removed.map(r => r.model).join(', ') || 'none'})\n` +
|
|
316
|
-
` unchanged: ${data.unchanged_count}\n\n` +
|
|
317
|
-
(changes || ' no field changes') +
|
|
318
|
-
`\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
319
|
-
},
|
|
320
|
-
],
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
const changes = data.changed
|
|
324
|
-
.map(c => ` ${c.model} ${c.benchmark}: ${c.from} -> ${c.to} (delta ${c.delta_pp} pp)`)
|
|
325
|
-
.join('\n');
|
|
326
|
-
return {
|
|
327
|
-
content: [
|
|
328
|
-
{
|
|
329
|
-
type: 'text',
|
|
330
|
-
text: `Benchmark diff ${from} -> ${to}\n` +
|
|
331
|
-
` added: ${data.added_models.length} (${data.added_models.join(', ') || 'none'})\n` +
|
|
332
|
-
` removed: ${data.removed_models.length} (${data.removed_models.join(', ') || 'none'})\n\n` +
|
|
333
|
-
(changes || ' no score changes') +
|
|
334
|
-
`\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
335
|
-
},
|
|
336
|
-
],
|
|
337
|
-
};
|
|
338
|
-
});
|
|
339
297
|
// ── Tool: premium_agents_directory (1 credit) ───────────────────────
|
|
340
298
|
server.tool('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.', {
|
|
341
299
|
category: z.string().optional().describe('coding, research, general, creative, frameworks'),
|
|
@@ -462,39 +420,6 @@ server.tool('provider_deepdive', 'Everything about an AI provider in one call: l
|
|
|
462
420
|
],
|
|
463
421
|
};
|
|
464
422
|
});
|
|
465
|
-
// ── Tool: forecast (1 credit) ───────────────────────────────────────
|
|
466
|
-
server.tool('forecast', 'Conservative statistical forecast for an AI model price or benchmark series. Linear least-squares fit on 7-90 days of history projected forward 1-30 days with a 95% prediction interval and confidence label. Costs 1 credit.', {
|
|
467
|
-
target: z.enum(['price', 'benchmark']).describe('Forecast a price field or a benchmark score'),
|
|
468
|
-
model: z.string().describe('Model id or display name'),
|
|
469
|
-
field: z.enum(['inputPrice', 'outputPrice', 'blended']).optional().describe('Required when target=price'),
|
|
470
|
-
benchmark: z.string().optional().describe('Required when target=benchmark (e.g. swe_bench, mmlu_pro)'),
|
|
471
|
-
lookback: z.number().min(7).max(90).optional().describe('Days of history to fit on (default 30)'),
|
|
472
|
-
horizon: z.number().min(1).max(30).optional().describe('Days into the future to project (default 7)'),
|
|
473
|
-
}, async ({ target, model, field, benchmark, lookback, horizon }) => {
|
|
474
|
-
const params = new URLSearchParams({ target, model });
|
|
475
|
-
if (field)
|
|
476
|
-
params.set('field', field);
|
|
477
|
-
if (benchmark)
|
|
478
|
-
params.set('benchmark', benchmark);
|
|
479
|
-
if (typeof lookback === 'number')
|
|
480
|
-
params.set('lookback', String(lookback));
|
|
481
|
-
if (typeof horizon === 'number')
|
|
482
|
-
params.set('horizon', String(horizon));
|
|
483
|
-
const data = (await fetchJSON(`/premium/forecast?${params}`, { auth: true }));
|
|
484
|
-
const what = target === 'price' ? `${data.model} ${data.field}` : `${data.model} ${data.benchmark}`;
|
|
485
|
-
const trendLine = `current=${data.current_value}, slope=${data.trend.slope_per_day}/day, r2=${data.trend.r_squared}, confidence=${data.confidence.label} (${data.confidence.score})`;
|
|
486
|
-
const forecastLines = data.forecast
|
|
487
|
-
.map(p => ` ${p.date}: ${p.predicted} (95% CI [${p.lower}, ${p.upper}])`)
|
|
488
|
-
.join('\n');
|
|
489
|
-
return {
|
|
490
|
-
content: [
|
|
491
|
-
{
|
|
492
|
-
type: 'text',
|
|
493
|
-
text: `Forecast: ${what}\n${trendLine}\n\n${forecastLines}\n\nNotes: ${data.notes.join(' ')}\n\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
494
|
-
},
|
|
495
|
-
],
|
|
496
|
-
};
|
|
497
|
-
});
|
|
498
423
|
// ── Tool: cost_projection (1 credit) ────────────────────────────────
|
|
499
424
|
server.tool('cost_projection', 'Project the cost of a token-usage workload across 1-10 AI models. Returns daily/weekly/monthly/yearly totals per model and a ranking by cheapest monthly. Costs 1 credit.', {
|
|
500
425
|
models: z.string().describe('One model or comma-separated list of up to 10 (e.g. "Claude Opus 4.7,GPT-5.5,Gemini 3"). Names or ids both work.'),
|
|
@@ -662,6 +587,124 @@ server.tool('delete_watch', 'Delete one of your active webhook watches by id. Fr
|
|
|
662
587
|
await fetchJSON(`/premium/watches/${watch_id}`, { method: 'DELETE', auth: true });
|
|
663
588
|
return { content: [{ type: 'text', text: `Deleted watch ${watch_id}.` }] };
|
|
664
589
|
});
|
|
590
|
+
// ── Tool: probe_latest (free) ───────────────────────────────────────
|
|
591
|
+
server.tool('probe_latest', 'Last 24 hours of measured LLM endpoint latency and availability per provider (Anthropic, OpenAI, Google, Mistral, Cohere). TensorFeed pings each provider\'s chat completion endpoint every 15 min and records time-to-first-byte, total response time, and HTTP status. Returns per-provider success rate and ttfb/total p50/p95/p99 latency. The data is unique because we measure it ourselves, not self-reported by the providers. Useful when an agent needs to pick a provider whose SLA you can verify, or to detect ongoing incidents before they hit a status page. Free, no auth.', {}, async () => {
|
|
592
|
+
const data = (await fetchJSON('/probe/latest'));
|
|
593
|
+
const s = data.summary;
|
|
594
|
+
if (s.providers.length === 0) {
|
|
595
|
+
return { content: [{ type: 'text', text: 'No probe data yet. Probing starts as soon as TensorFeed has at least one provider key configured.' }] };
|
|
596
|
+
}
|
|
597
|
+
const rows = s.providers
|
|
598
|
+
.sort((a, b) => b.ok_pct - a.ok_pct)
|
|
599
|
+
.map(p => {
|
|
600
|
+
const okPct = (p.ok_pct * 100).toFixed(1);
|
|
601
|
+
const ttfb = p.ttfb.p50 !== null ? `p50 ${p.ttfb.p50}ms / p95 ${p.ttfb.p95}ms / p99 ${p.ttfb.p99}ms` : 'no successful probes';
|
|
602
|
+
const total = p.total.p50 !== null ? `p50 ${p.total.p50}ms / p95 ${p.total.p95}ms / p99 ${p.total.p99}ms` : 'no successful probes';
|
|
603
|
+
const err = p.last_error ? `\n last error: ${p.last_error}` : '';
|
|
604
|
+
return ` ${p.provider}: ${okPct}% ok over ${p.count} probes\n ttfb: ${ttfb}\n total: ${total}${err}`;
|
|
605
|
+
})
|
|
606
|
+
.join('\n\n');
|
|
607
|
+
return {
|
|
608
|
+
content: [
|
|
609
|
+
{
|
|
610
|
+
type: 'text',
|
|
611
|
+
text: `LLM Endpoint SLA (${s.window_label}, computed ${s.computed_at})\n\n${rows}\n\nSource: TensorFeed measured probes, not self-reported.`,
|
|
612
|
+
},
|
|
613
|
+
],
|
|
614
|
+
};
|
|
615
|
+
});
|
|
616
|
+
// ── Tool: probe_series (1 credit) ───────────────────────────────────
|
|
617
|
+
server.tool('probe_series', 'Daily SLA series for one LLM provider, measured by TensorFeed. Returns per-day count, success rate, ttfb p50/p95/p99, total p50/p95/p99, and incident-hour count across the requested window. Provider status pages are politically managed; this is the measured truth. Pairs naturally with premium_routing for picking a model whose SLA you can verify. Costs 1 credit.', {
|
|
618
|
+
provider: z.enum(['anthropic', 'openai', 'google', 'mistral', 'cohere']).describe('LLM provider key'),
|
|
619
|
+
from: z.string().optional().describe('Inclusive start YYYY-MM-DD (default: 30 days before to)'),
|
|
620
|
+
to: z.string().optional().describe('Inclusive end YYYY-MM-DD (default: today UTC)'),
|
|
621
|
+
}, async ({ provider, from, to }) => {
|
|
622
|
+
const params = new URLSearchParams();
|
|
623
|
+
params.set('provider', provider);
|
|
624
|
+
if (from)
|
|
625
|
+
params.set('from', from);
|
|
626
|
+
if (to)
|
|
627
|
+
params.set('to', to);
|
|
628
|
+
const data = (await fetchJSON(`/premium/probe/series?${params}`, { auth: true }));
|
|
629
|
+
const lines = data.points
|
|
630
|
+
.map(p => p.has_data
|
|
631
|
+
? ` ${p.date} ${(p.ok_pct * 100).toFixed(1)}% ok ttfb p50/p95: ${p.ttfb_p50}/${p.ttfb_p95}ms total p50/p95: ${p.total_p50}/${p.total_p95}ms incidents: ${p.incident_hours}h`
|
|
632
|
+
: ` ${p.date} (no data)`)
|
|
633
|
+
.join('\n');
|
|
634
|
+
const overall = data.summary.overall_uptime_pct !== null
|
|
635
|
+
? `${(data.summary.overall_uptime_pct * 100).toFixed(2)}%`
|
|
636
|
+
: 'insufficient data';
|
|
637
|
+
const notes = data.notes.length ? '\nNotes: ' + data.notes.join('; ') : '';
|
|
638
|
+
return {
|
|
639
|
+
content: [
|
|
640
|
+
{
|
|
641
|
+
type: 'text',
|
|
642
|
+
text: `${data.provider} measured SLA, ${data.from} -> ${data.to}\nOverall uptime: ${overall} (${data.summary.days_with_data} days with data, ${data.summary.days_with_incidents} with incidents)\n\n${lines}${notes}\n\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
643
|
+
},
|
|
644
|
+
],
|
|
645
|
+
};
|
|
646
|
+
});
|
|
647
|
+
// ── Tool: mcp_registry_snapshot (free) ──────────────────────────────
|
|
648
|
+
server.tool('mcp_registry_snapshot', 'Today\'s summary of the official Model Context Protocol server registry. Returns total servers, by-status breakdown, top namespaces, and 1-day deltas (newly added, reactivated, deprecated). Captured daily at 9:30 AM UTC from registry.modelcontextprotocol.io. Useful when an agent wants to see how the MCP ecosystem is growing or detect freshly-deprecated servers it may be using. Free, no auth.', {}, async () => {
|
|
649
|
+
const data = (await fetchJSON('/mcp/registry/snapshot'));
|
|
650
|
+
const s = data.summary;
|
|
651
|
+
const statusLine = Object.entries(s.by_status)
|
|
652
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
653
|
+
.join(', ');
|
|
654
|
+
const topNs = s.top_namespaces.slice(0, 10).map(n => ` ${n.namespace}: ${n.count}`).join('\n');
|
|
655
|
+
const delta = s.delta_vs_yesterday
|
|
656
|
+
? `Day over day: +${s.delta_vs_yesterday.added} new, -${s.delta_vs_yesterday.removed} removed, net ${s.delta_vs_yesterday.net >= 0 ? '+' : ''}${s.delta_vs_yesterday.net}`
|
|
657
|
+
: 'Day over day: not available (first snapshot)';
|
|
658
|
+
const newToday = s.new_today.count > 0
|
|
659
|
+
? `\nNewly listed today (${s.new_today.count}):\n` + s.new_today.names.slice(0, 10).map(n => ` ${n}`).join('\n')
|
|
660
|
+
: '';
|
|
661
|
+
const deprecatedToday = s.deprecated_today.count > 0
|
|
662
|
+
? `\nDeprecated today (${s.deprecated_today.count}):\n` + s.deprecated_today.names.slice(0, 10).map(n => ` ${n}`).join('\n')
|
|
663
|
+
: '';
|
|
664
|
+
return {
|
|
665
|
+
content: [
|
|
666
|
+
{
|
|
667
|
+
type: 'text',
|
|
668
|
+
text: `MCP Server Registry — ${s.date}\n` +
|
|
669
|
+
`Total servers: ${s.total_servers} (across ${s.total_versions} versioned entries)\n` +
|
|
670
|
+
`Status: ${statusLine}\n${delta}\n\n` +
|
|
671
|
+
`Top namespaces:\n${topNs}` +
|
|
672
|
+
newToday + deprecatedToday +
|
|
673
|
+
`\n\nSource: registry.modelcontextprotocol.io`,
|
|
674
|
+
},
|
|
675
|
+
],
|
|
676
|
+
};
|
|
677
|
+
});
|
|
678
|
+
// ── Tool: mcp_registry_series (1 credit) ────────────────────────────
|
|
679
|
+
server.tool('mcp_registry_series', 'Multi-day series of MCP server registry growth and churn. Returns per-day total servers, active count, and daily added/removed counts across the requested window. The registry itself is open data, but a 30/90-day trend requires daily capture started weeks ago, which TensorFeed has been running. Costs 1 credit.', {
|
|
680
|
+
from: z.string().optional().describe('Inclusive start date YYYY-MM-DD (default: 30 days before to)'),
|
|
681
|
+
to: z.string().optional().describe('Inclusive end date YYYY-MM-DD (default: today UTC)'),
|
|
682
|
+
}, async ({ from, to }) => {
|
|
683
|
+
const params = new URLSearchParams();
|
|
684
|
+
if (from)
|
|
685
|
+
params.set('from', from);
|
|
686
|
+
if (to)
|
|
687
|
+
params.set('to', to);
|
|
688
|
+
const data = (await fetchJSON(`/premium/mcp/registry/series?${params}`, { auth: true }));
|
|
689
|
+
const lines = data.points
|
|
690
|
+
.map(p => p.has_data
|
|
691
|
+
? ` ${p.date} total=${p.total_servers} +${p.added ?? 0}/-${p.removed ?? 0}`
|
|
692
|
+
: ` ${p.date} (no snapshot captured)`)
|
|
693
|
+
.join('\n');
|
|
694
|
+
const w = data.delta_in_window;
|
|
695
|
+
const summary = w.start_total !== null && w.end_total !== null
|
|
696
|
+
? `Window ${data.from} -> ${data.to}: ${w.start_total} -> ${w.end_total} (net ${w.net >= 0 ? '+' : ''}${w.net})`
|
|
697
|
+
: `Window ${data.from} -> ${data.to}: insufficient data`;
|
|
698
|
+
const notes = data.notes.length ? '\nNotes: ' + data.notes.join('; ') : '';
|
|
699
|
+
return {
|
|
700
|
+
content: [
|
|
701
|
+
{
|
|
702
|
+
type: 'text',
|
|
703
|
+
text: `${summary}\n\n${lines}${notes}\n\nCredits remaining: ${data.billing?.credits_remaining ?? '?'}`,
|
|
704
|
+
},
|
|
705
|
+
],
|
|
706
|
+
};
|
|
707
|
+
});
|
|
665
708
|
// ── Start ───────────────────────────────────────────────────────────
|
|
666
709
|
async function main() {
|
|
667
710
|
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.11.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
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "ai.tensorfeed/mcp-server",
|
|
4
4
|
"title": "TensorFeed",
|
|
5
|
-
"description": "
|
|
6
|
-
"version": "1.
|
|
5
|
+
"description": "AI news, model pricing, service status, and machine-payable premium tools. AFTA-certified.",
|
|
6
|
+
"version": "1.11.0",
|
|
7
7
|
"websiteUrl": "https://tensorfeed.ai/developers/agent-payments",
|
|
8
8
|
"repository": {
|
|
9
9
|
"url": "https://github.com/RipperMercs/tensorfeed",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"registryType": "npm",
|
|
16
16
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
17
17
|
"identifier": "@tensorfeed/mcp-server",
|
|
18
|
-
"version": "1.
|
|
18
|
+
"version": "1.11.0",
|
|
19
19
|
"runtimeHint": "npx",
|
|
20
20
|
"transport": {
|
|
21
21
|
"type": "stdio"
|
|
@@ -43,21 +43,23 @@
|
|
|
43
43
|
"is_service_down",
|
|
44
44
|
"get_model_pricing",
|
|
45
45
|
"get_ai_today",
|
|
46
|
-
"get_agent_activity"
|
|
46
|
+
"get_agent_activity",
|
|
47
|
+
"mcp_registry_snapshot",
|
|
48
|
+
"probe_latest"
|
|
47
49
|
],
|
|
48
50
|
"premiumTools": [
|
|
49
51
|
"premium_routing",
|
|
50
52
|
"pricing_series",
|
|
51
53
|
"benchmark_series",
|
|
52
54
|
"status_uptime",
|
|
53
|
-
"history_compare",
|
|
54
55
|
"premium_agents_directory",
|
|
55
56
|
"news_search",
|
|
56
57
|
"cost_projection",
|
|
57
|
-
"forecast",
|
|
58
58
|
"provider_deepdive",
|
|
59
59
|
"compare_models",
|
|
60
60
|
"whats_new",
|
|
61
|
+
"mcp_registry_series",
|
|
62
|
+
"probe_series",
|
|
61
63
|
"list_watches",
|
|
62
64
|
"create_price_watch",
|
|
63
65
|
"create_status_watch",
|