@tensorfeed/mcp-server 1.22.0 → 1.24.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,17 @@
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.24.0 - 2026-05-06
6
+
7
+ ### Added
8
+ - `get_model_deprecations` tool (free). Wraps the new `/api/model-deprecations` endpoint. Returns the provider-by-provider model retirement and deprecation calendar with announced / deprecation / sunset dates, recommended replacement model id, and a source URL pointing at the provider's own announcement. Optional `provider` and `status` filters. Agents that depend on a specific model id can now ask one question and learn whether the model will keep accepting traffic and, if not, what to migrate to. Closes the most-frequent agent-operator surprise in the production lifecycle.
9
+
10
+ ## 1.23.0 - 2026-05-05
11
+
12
+ ### Added
13
+ - `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.
14
+ - 5 additional providers covered by every status tool: OpenRouter, ElevenLabs, Stability AI, Runway, Luma. Brings total monitored to 20.
15
+
5
16
  ## 1.22.0 - 2026-05-04
6
17
 
7
18
  ### Added
package/dist/index.js CHANGED
@@ -134,6 +134,66 @@ registerTool('get_model_pricing', 'Get AI model pricing comparison across all ma
134
134
  .join('\n\n');
135
135
  return { content: [{ type: 'text', text: `AI Model Pricing (per 1M tokens):\n\n${text}` }] };
136
136
  });
137
+ // ── Tool: get_model_deprecations ────────────────────────────────────
138
+ registerTool('get_model_deprecations', "Get the AI model deprecation calendar. Provider-by-provider registry of model retirements and deprecation announcements (OpenAI, Anthropic, Google, Cohere, and others). Each entry carries the announced/deprecation/sunset dates, the recommended replacement model, and a source URL pointing at the provider's own announcement. Useful for agents who need to know when a model they depend on will stop accepting traffic and what to migrate to.", {
139
+ provider: z
140
+ .string()
141
+ .optional()
142
+ .describe('Filter to a single provider (e.g. "OpenAI", "Anthropic", "Google", "Cohere"). Case-insensitive.'),
143
+ status: z
144
+ .enum(['announced', 'deprecated', 'sunsetted'])
145
+ .optional()
146
+ .describe('Filter by lifecycle stage. announced = deprecation announced but model still serves at full capacity; deprecated = past deprecation date, migration required; sunsetted = no longer accepts traffic.'),
147
+ }, async ({ provider, status }) => {
148
+ const params = new URLSearchParams();
149
+ if (provider)
150
+ params.set('provider', provider);
151
+ if (status)
152
+ params.set('status', status);
153
+ const qs = params.toString();
154
+ const data = await fetchJSON(`/model-deprecations${qs ? `?${qs}` : ''}`);
155
+ const entries = data.deprecations ?? [];
156
+ if (entries.length === 0) {
157
+ return {
158
+ content: [
159
+ {
160
+ type: 'text',
161
+ text: 'No model deprecations matched the filter. The full calendar is at https://tensorfeed.ai/model-deprecations.',
162
+ },
163
+ ],
164
+ };
165
+ }
166
+ // Group by provider for readable output.
167
+ const byProvider = new Map();
168
+ for (const d of entries) {
169
+ const list = byProvider.get(d.provider) ?? [];
170
+ list.push(d);
171
+ byProvider.set(d.provider, list);
172
+ }
173
+ const sections = Array.from(byProvider.entries())
174
+ .sort(([a], [b]) => a.localeCompare(b))
175
+ .map(([prov, list]) => {
176
+ const rows = list
177
+ .map(d => {
178
+ const dates = [
179
+ d.announcedDate ? `announced ${d.announcedDate}` : null,
180
+ d.deprecationDate ? `deprecated ${d.deprecationDate}` : null,
181
+ d.sunsetDate ? `sunset ${d.sunsetDate}` : null,
182
+ ]
183
+ .filter(Boolean)
184
+ .join(', ');
185
+ const display = d.modelDisplay ? ` (${d.modelDisplay})` : '';
186
+ const repl = d.replacement ? `\n replacement: ${d.replacement}` : '';
187
+ const note = d.notes ? `\n note: ${d.notes}` : '';
188
+ return ` ${d.model}${display} [${d.status.toUpperCase()}]\n ${dates}${repl}${note}\n source: ${d.sourceUrl}`;
189
+ })
190
+ .join('\n');
191
+ return `${prov}:\n${rows}`;
192
+ })
193
+ .join('\n\n');
194
+ const header = `AI Model Deprecation Calendar (${entries.length} ${entries.length === 1 ? 'entry' : 'entries'}, last updated ${data.lastUpdated ?? 'recently'}):\n\n`;
195
+ return { content: [{ type: 'text', text: header + sections }] };
196
+ });
137
197
  // ── Tool: get_ai_today ──────────────────────────────────────────────
138
198
  registerTool('get_ai_today', 'Get a summary of what happened in AI today. Returns the top stories from the last 24 hours.', {
139
199
  limit: z.number().min(1).max(20).optional().describe('Number of stories (default 5)'),
@@ -714,6 +774,33 @@ registerTool('create_digest_watch', 'Register a scheduled digest webhook that fi
714
774
  ],
715
775
  };
716
776
  });
777
+ // ── Tool: create_leaderboard_rank_watch (1 credit) ──────────────────
778
+ 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.', {
779
+ provider: z.string().describe('Provider name or slug (case-insensitive). e.g. claude, openai, gemini, bedrock, azure'),
780
+ op: z.enum(['drops_below', 'rises_above', 'changes']).describe('Trigger condition'),
781
+ threshold: z.number().int().min(1).optional().describe('Required for drops_below / rises_above. Integer rank position.'),
782
+ callback_url: z.string().describe('HTTPS URL to POST to when the watch fires'),
783
+ secret: z.string().optional().describe('Optional HMAC shared secret'),
784
+ }, async ({ provider, op, threshold, callback_url, secret }) => {
785
+ const spec = { type: 'leaderboard_rank', provider, op };
786
+ if (threshold !== undefined)
787
+ spec.threshold = threshold;
788
+ const body = { spec, callback_url };
789
+ if (secret !== undefined)
790
+ body.secret = secret;
791
+ const data = (await fetchJSON('/premium/watches', { method: 'POST', body, auth: true }));
792
+ const desc = op === 'changes'
793
+ ? `${provider} rank changes`
794
+ : `${provider} ${op.replace('_', ' ')} #${threshold}`;
795
+ return {
796
+ content: [
797
+ {
798
+ type: 'text',
799
+ text: `Created leaderboard rank watch ${data.watch.id} (${desc}). Expires ${data.watch.expires_at}. Credits remaining: ${data.billing?.credits_remaining ?? '?'}`,
800
+ },
801
+ ],
802
+ };
803
+ });
717
804
  // ── Tool: delete_watch ──────────────────────────────────────────────
718
805
  registerTool('delete_watch', 'Delete one of your active webhook watches by id. Free, requires TENSORFEED_TOKEN.', {
719
806
  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.22.0",
3
+ "version": "1.24.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.22.0",
6
+ "version": "1.24.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.22.0",
17
+ "version": "1.24.0",
18
18
  "runtimeHint": "npx",
19
19
  "transport": {
20
20
  "type": "stdio"
@@ -76,6 +76,7 @@
76
76
  "create_price_watch",
77
77
  "create_status_watch",
78
78
  "create_digest_watch",
79
+ "create_leaderboard_rank_watch",
79
80
  "delete_watch",
80
81
  "get_account_balance",
81
82
  "get_account_usage"