@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 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 the new version to the standalone repo
24
- # (manual until we wire it as a release-time GitHub Action)
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.12.0",
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.12.0",
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.12.0",
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",