@tensorfeed/mcp-server 1.12.0 → 1.13.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 +9 -0
- package/README.md +21 -3
- package/dist/index.js +79 -0
- package/package.json +1 -1
- package/server.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
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.13.0 - 2026-05-04
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- `get_ai_papers_trending` tool. Daily curated AI/ML research papers ranked by citation count, sourced from Semantic Scholar. Five fan-out queries (LLM, transformer, RLHF, AI agents, diffusion), deduped, top 30. Free.
|
|
9
|
+
- `get_arxiv_recent` tool. Most recent arXiv submissions in cs.AI / cs.LG / cs.CL / cs.CV, top 50 by submission date. Optional `limit` arg for the rendered list. Free.
|
|
10
|
+
- `get_hf_trending` tool. Top 30 most-downloaded models and datasets on Hugging Face. Optional `section` (models / datasets / both) and `limit` args. Free.
|
|
11
|
+
|
|
12
|
+
All three are backed by the worker endpoints shipped in the same monorepo commit and pass through the 1.12.0 output sanitizer automatically.
|
|
13
|
+
|
|
5
14
|
## 1.12.0 - 2026-05-04
|
|
6
15
|
|
|
7
16
|
### Added
|
package/README.md
CHANGED
|
@@ -17,13 +17,31 @@ cd mcp-server
|
|
|
17
17
|
npm run build
|
|
18
18
|
npm publish --access public
|
|
19
19
|
|
|
20
|
-
# 3. Republish to the official MCP registry
|
|
20
|
+
# 3. Republish to the official MCP registry. The script lives at
|
|
21
|
+
# repo-root/scripts/, not mcp-server/scripts/, so step back up first.
|
|
22
|
+
cd ..
|
|
21
23
|
.\scripts\mcp-publish.ps1
|
|
22
24
|
|
|
23
|
-
# 4. Mirror
|
|
24
|
-
#
|
|
25
|
+
# 4. Mirror to the standalone repo - automated. The
|
|
26
|
+
# .github/workflows/mirror-mcp-server.yml workflow runs on every
|
|
27
|
+
# push to main that touches mcp-server/. To trigger a manual sync,
|
|
28
|
+
# go to the Actions tab and run "Mirror MCP server to standalone
|
|
29
|
+
# repo" via workflow_dispatch.
|
|
25
30
|
```
|
|
26
31
|
|
|
32
|
+
### Automated mirror setup (one-time)
|
|
33
|
+
|
|
34
|
+
The mirror workflow needs a personal access token with `contents: write`
|
|
35
|
+
permission on `RipperMercs/tensorfeed-mcp`. Set it once:
|
|
36
|
+
|
|
37
|
+
1. Generate a fine-grained PAT at github.com/settings/personal-access-tokens
|
|
38
|
+
scoped to the standalone repo only, with Repository permissions
|
|
39
|
+
`Contents: Read and write` and `Metadata: Read-only`.
|
|
40
|
+
2. Add it to this monorepo as a repository secret named
|
|
41
|
+
`STANDALONE_REPO_TOKEN` (Settings -> Secrets and variables -> Actions).
|
|
42
|
+
3. The workflow will pick it up on the next push to main that changes
|
|
43
|
+
`mcp-server/**`, or via the manual "Run workflow" button.
|
|
44
|
+
|
|
27
45
|
## Quick links
|
|
28
46
|
|
|
29
47
|
- **User-facing repo (please star):** https://github.com/RipperMercs/tensorfeed-mcp
|
package/dist/index.js
CHANGED
|
@@ -724,6 +724,85 @@ registerTool('mcp_registry_series', 'Multi-day series of MCP server registry gro
|
|
|
724
724
|
],
|
|
725
725
|
};
|
|
726
726
|
});
|
|
727
|
+
// ── Tool: get_ai_papers_trending (free) ─────────────────────────────
|
|
728
|
+
registerTool('get_ai_papers_trending', 'Daily curated AI/ML research papers ranked by citation count. Sourced from Semantic Scholar across five fan-out queries (large language model, transformer, RLHF, AI agents, diffusion model), deduped by paperId, top 30 returned. Each paper carries title, abstract, authors, year, venue, citation count, arxivId, doi, and fields of study. Refreshed daily at 11:00 UTC. Use this when an agent wants the citation-ranked top of the AI research literature. Free, no auth.', {}, async () => {
|
|
729
|
+
const data = (await fetchJSON('/papers/ai-trending'));
|
|
730
|
+
const s = data.snapshot;
|
|
731
|
+
const lines = s.papers.map((p, i) => {
|
|
732
|
+
const authors = p.authors.slice(0, 3).join(', ') + (p.authors.length > 3 ? ' et al.' : '');
|
|
733
|
+
const year = p.year ? ` (${p.year})` : '';
|
|
734
|
+
const venue = p.venue ? ` ${p.venue}.` : '';
|
|
735
|
+
const arxiv = p.arxivId ? ` arXiv:${p.arxivId}` : '';
|
|
736
|
+
const link = p.url ? `\n ${p.url}` : '';
|
|
737
|
+
return `${i + 1}. ${p.title}${year}\n ${authors}.${venue} Citations: ${p.citationCount}.${arxiv}${link}`;
|
|
738
|
+
}).join('\n\n');
|
|
739
|
+
const venues = s.summary.top_venues.slice(0, 5).map(v => `${v.venue} (${v.count})`).join(', ');
|
|
740
|
+
return {
|
|
741
|
+
content: [
|
|
742
|
+
{
|
|
743
|
+
type: 'text',
|
|
744
|
+
text: `AI Papers, citation-ranked. ${s.date}, ${s.total_papers} papers.\n` +
|
|
745
|
+
(venues ? `Top venues: ${venues}\n\n` : '\n') +
|
|
746
|
+
lines +
|
|
747
|
+
`\n\nSource: Semantic Scholar Graph API. Captured ${s.capturedAt}.`,
|
|
748
|
+
},
|
|
749
|
+
],
|
|
750
|
+
};
|
|
751
|
+
});
|
|
752
|
+
// ── Tool: get_arxiv_recent (free) ───────────────────────────────────
|
|
753
|
+
registerTool('get_arxiv_recent', 'Most recent arXiv submissions in cs.AI / cs.LG / cs.CL / cs.CV. Single Atom API call, deduped by arxivId, top 50 by submission date. The firehose pair to get_ai_papers_trending: this shows what just dropped, ai_papers_trending ranks by citation count. Each paper carries arxivId, title, abstract, authors, primary category, publication date, html and pdf URLs. Refreshed daily at 11:30 UTC. Free, no auth.', {
|
|
754
|
+
limit: z.number().min(1).max(50).optional().describe('Max papers to include in the rendered list (default 25, max 50)'),
|
|
755
|
+
}, async ({ limit }) => {
|
|
756
|
+
const data = (await fetchJSON('/papers/arxiv-recent'));
|
|
757
|
+
const s = data.snapshot;
|
|
758
|
+
const cap = Math.min(limit ?? 25, s.papers.length);
|
|
759
|
+
const lines = s.papers.slice(0, cap).map((p, i) => {
|
|
760
|
+
const authors = p.authors.slice(0, 3).join(', ') + (p.authors.length > 3 ? ' et al.' : '');
|
|
761
|
+
const cat = p.primaryCategory ? ` [${p.primaryCategory}]` : '';
|
|
762
|
+
const date = p.publishedAt ? ` ${p.publishedAt.slice(0, 10)}` : '';
|
|
763
|
+
return `${i + 1}. ${p.title}${cat}${date}\n ${authors}\n ${p.htmlUrl}`;
|
|
764
|
+
}).join('\n\n');
|
|
765
|
+
return {
|
|
766
|
+
content: [
|
|
767
|
+
{
|
|
768
|
+
type: 'text',
|
|
769
|
+
text: `arXiv recent submissions. ${s.date}, showing ${cap} of ${s.total_papers}.\n` +
|
|
770
|
+
`Categories: ${s.categories_queried.join(', ')}\n\n` +
|
|
771
|
+
lines +
|
|
772
|
+
`\n\nSource: arxiv.org. Captured ${s.capturedAt}.`,
|
|
773
|
+
},
|
|
774
|
+
],
|
|
775
|
+
};
|
|
776
|
+
});
|
|
777
|
+
// ── Tool: get_hf_trending (free) ────────────────────────────────────
|
|
778
|
+
registerTool('get_hf_trending', 'Top 30 most-downloaded models and top 30 most-downloaded datasets on Hugging Face. Captured daily at 12:00 UTC against the public HF API (no auth). Each entry carries id, downloads, likes, pipeline_tag (models), tags, lastModified, private, gated. Use this when an agent wants the current shape of the open model/dataset ecosystem. Once enough daily snapshots accumulate, day-over-day download deltas become a real trending signal. Free, no auth.', {
|
|
779
|
+
section: z.enum(['models', 'datasets', 'both']).optional().describe('Which to include in the rendered output (default both)'),
|
|
780
|
+
limit: z.number().min(1).max(30).optional().describe('Max items per section (default 15, max 30)'),
|
|
781
|
+
}, async ({ section, limit }) => {
|
|
782
|
+
const data = (await fetchJSON('/hf/trending'));
|
|
783
|
+
const s = data.snapshot;
|
|
784
|
+
const sec = section ?? 'both';
|
|
785
|
+
const n = Math.min(limit ?? 15, 30);
|
|
786
|
+
const fmtCount = (x) => x >= 1_000_000 ? `${(x / 1_000_000).toFixed(1)}M` : x >= 1_000 ? `${(x / 1_000).toFixed(1)}K` : String(x);
|
|
787
|
+
const modelLines = s.models.items.slice(0, n).map((m, i) => {
|
|
788
|
+
const tag = m.pipeline_tag ? ` [${m.pipeline_tag}]` : '';
|
|
789
|
+
return `${i + 1}. ${m.id}${tag} ${fmtCount(m.downloads)} downloads, ${fmtCount(m.likes)} likes`;
|
|
790
|
+
}).join('\n');
|
|
791
|
+
const datasetLines = s.datasets.items.slice(0, n).map((d, i) => `${i + 1}. ${d.id} ${fmtCount(d.downloads)} downloads, ${fmtCount(d.likes)} likes`).join('\n');
|
|
792
|
+
const pipelines = s.summary.top_pipeline_tags.slice(0, 5).map(t => `${t.tag} (${t.count})`).join(', ');
|
|
793
|
+
const namespaces = s.summary.top_namespaces.slice(0, 5).map(n => `${n.namespace} (${n.count})`).join(', ');
|
|
794
|
+
let text = `Hugging Face top-downloaded. ${s.date}.\n`;
|
|
795
|
+
if (pipelines)
|
|
796
|
+
text += `Top pipeline tags (models): ${pipelines}\n`;
|
|
797
|
+
if (namespaces)
|
|
798
|
+
text += `Top namespaces: ${namespaces}\n`;
|
|
799
|
+
if (sec === 'models' || sec === 'both')
|
|
800
|
+
text += `\nModels:\n${modelLines}\n`;
|
|
801
|
+
if (sec === 'datasets' || sec === 'both')
|
|
802
|
+
text += `\nDatasets:\n${datasetLines}\n`;
|
|
803
|
+
text += `\nSource: huggingface.co. Captured ${s.capturedAt}.`;
|
|
804
|
+
return { content: [{ type: 'text', text }] };
|
|
805
|
+
});
|
|
727
806
|
// ── Start ───────────────────────────────────────────────────────────
|
|
728
807
|
async function main() {
|
|
729
808
|
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.13.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.13.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.13.0",
|
|
18
18
|
"runtimeHint": "npx",
|
|
19
19
|
"transport": {
|
|
20
20
|
"type": "stdio"
|
|
@@ -44,7 +44,10 @@
|
|
|
44
44
|
"get_ai_today",
|
|
45
45
|
"get_agent_activity",
|
|
46
46
|
"mcp_registry_snapshot",
|
|
47
|
-
"probe_latest"
|
|
47
|
+
"probe_latest",
|
|
48
|
+
"get_ai_papers_trending",
|
|
49
|
+
"get_arxiv_recent",
|
|
50
|
+
"get_hf_trending"
|
|
48
51
|
],
|
|
49
52
|
"premiumTools": [
|
|
50
53
|
"premium_routing",
|