About Scholar Feed
Scholar Feed is an MCP server for researchers and LLM engineers searching CS, AI, and ML literature. It combines ranked paper discovery with citation-graph exploration, full-text access, author lookup, and BibTeX export.
Key features
- 01Semantic and keyword paper search
- 02Ranking by relevance, citations, and trends
- 03Citation graph traversal
- 04Section-based paper full-text retrieval
- 05Author search and co-author graphs
- 06Paper details and BibTeX export
Use cases
- 01Find recent work in a research area
- 02Trace references and later citations
- 03Review a paper's text by section
- 04Export similar papers as BibTeX
MCP support
It exposes paper search, citation, full-text, author, and research-library tools to MCP clients over stdio. Core search and retrieval work anonymously; library features require an API key.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://mcp.scholarfeed.org/mcp?src=mcp-registryclaude mcp add --transport http scholar-feed https://mcp.scholarfeed.org/mcp?src=mcp-registry{"mcpServers":{"scholar-feed":{"type":"http","url":"https://mcp.scholarfeed.org/mcp?src=mcp-registry"}}}Open in Cursor{"servers":{"scholar-feed":{"type":"http","url":"https://mcp.scholarfeed.org/mcp?src=mcp-registry"}}}Open in VS Code{"mcpServers":{"scholar-feed":{"type":"http","url":"https://mcp.scholarfeed.org/mcp?src=mcp-registry"}}}{"mcpServers":{"scholar-feed":{"serverUrl":"https://mcp.scholarfeed.org/mcp?src=mcp-registry"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
26| Parameter | Type | Required | Description |
|---|---|---|---|
| q | string | No | Search query keywords. REQUIRED unless (a) anchor_paper_id or scope_to_citations_of is set (anchor mode ignores q and returns papers similar to the anchor), or (b) sort is one of 'trending' / 'recent' / 'impactful' — the query-less 'browse the frontier' feed, which is capped to the FIRST 200 RESULTS (paging past offset 200 is a 422; narrow with q= or filters instead). Any other q-less call is a 422, INCLUDING a q-less call with only filters (category/days/...) and a q-less sort='community'. Filters alone do NOT substitute for q — pair them with a browse sort (e.g. category='cs.AI' + sort='recent') or pass q. For 'what's hot in AI right now', either sort='trending' alone or a broad q plus sort='trending' works. |
| sort | enum | No | Result ranking — a relevance↔impact dial plus time-based and adoption orders. 'relevance' (default) = best topical match. 'balanced' = relevant AND well-cited. 'impactful' = the most-cited (proven-influential) papers among those relevant to the query — use this for 'the important/seminal papers on topic X'. 'trending' = rising/FORECAST impact (impact_pct, last ~90 days) — use for 'what's hot/new in X', NOT for established work. 'recent' = newest first. 'community' = GitHub adoption (stars + star-velocity) — surfaces the papers practitioners are actually running/building on, independent of citations. COVERAGE CAVEAT (the analogue of impact_min's ~90-day hole): an unfetched repo stores 0 rather than NULL, and coverage skews heavily toward recently-published papers, so most older papers with a repo currently rank as 0-star and sink — 'community' reflects measured adoption, not corpus-wide adoption. Proven impact ('impactful'/'balanced') ranks by real citations; 'trending' is a model prediction; 'community' is real-world engineering traction within its window. Pair with get_foundational_lineage for a topic's canonical roots.relevance | balanced | impactful | trending | recent | community |
| anchor_paper_id | string | No | Return papers similar to this arXiv paper ID (replaces the removed find_similar tool). When set, q is ignored and results carry similarity_score. Example: '2407.15831'. |
| scope_to_citations_of | string | No | Restrict search to this paper's citation graph, ranked by relevance to q (replaces the removed find_citations_about tool). Pass the arXiv ID of the paper whose citations you want to search within. |
| category | string | No | Filter by arXiv category e.g. 'cs.AI', 'cs.LG' |
| novelty_min | number | No | Minimum novelty score (0-1). Use 0.5+ for novel papers. |
| impact_min | integer | No | Minimum impact_pct (0-100), e.g. 80 = top 20% FORECAST impact. This is a RISING-WORK filter: impact_pct is only computed for the last ~90 days, so impact_min restricts results to recent papers predicted to land well AND DROPS everything older. Use it for 'what's rising in X'. Do NOT use it to find the influential/seminal papers in a topic — that excludes the established work; use sort='impactful' instead. |
| days | integer | No | Limit to papers published within N days |
| has_code | boolean | No | Filter to papers with a linked code release (has_code=true). Surfaces runnable/reproducible work — pair with min_stars/sort='community' to find the papers practitioners actually adopt. |
| min_citations | integer | No | Minimum real citation count. Unlike impact_min (a ~90-day FORECAST percentile), this filters on PROVEN citations and keeps established/canonical papers. |
| min_stars | integer | No | Minimum GitHub stars on the paper's linked repo. A proxy for engineering adoption — surfaces work that practitioners are actually running/building on. Pair with sort='community' to rank by it. COVERAGE CAVEAT: a never-fetched repo is stored as 0, not NULL, so this filter cannot distinguish 'no adoption' from 'never measured'. It is applied as 'KNOWN to have >= N stars' — papers whose stars were never fetched are excluded rather than treated as 0-star, so the result is honest but INCOMPLETE: a genuinely popular older paper can be missing simply because nobody measured it. Coverage skews toward recently-published papers and is being backfilled. Use it to filter recent work; for established papers use min_citations instead. |
| github_url_exists | boolean | No | Filter on whether the paper has a linked GitHub URL (true = only papers with a repo). Stricter than has_code (which counts any code link). |
| published_after | string | No | Only papers published on or after this date, 'YYYY-MM-DD'. Use with published_before to bound an arbitrary date window (days only gives a rolling N-day lookback). |
| published_before | string | No | Only papers published on or before this date, 'YYYY-MM-DD'. Pair with published_after for an explicit window. |
| method_category | string | No | Filter by method category e.g. 'reinforcement learning', 'transformer' |
| method_name | string | No | Filter to papers introducing/using a specific named method e.g. 'LoRA', 'YOLO', 'DPO'. Case-insensitive substring match on the extracted method_name field. |
| task | string | No | Filter by task e.g. 'image classification', 'question answering' (partial match) |
| dataset | string | No | Filter to papers that evaluate on a specific dataset e.g. 'MMLU', 'ImageNet' |
| contribution_type | enum | No | Filter by paper's contribution typemodel | method | benchmark | dataset | survey | theoretical | empirical_study | system |
| task_category | enum | No | Filter by broad research areaNLP | Computer Vision | RL | Audio/Speech | Graphs | Multimodal | Systems | Theory | Security | Other |
| mode | enum | No | Search mode. 'semantic' (default) uses embedding similarity — finds conceptually related papers even without exact keyword matches. 'keyword' uses Postgres full-text search — faster but only matches exact terms.keyword | semantic |
| cursor | string | No | Cursor from previous response's next_cursor for keyset pagination |
| page | integer | No | Page number |
| limit | integer | No | Results per page (max 50) |
| fields | string | No | Comma-separated list of fields to return (e.g. 'arxiv_id,title,llm_summary,llm_novelty_score'). If omitted, returns the lean 12-field default unless verbose=true. |
| verbose | boolean | No | If true, returns the full 28-field paper shape (method/task/dataset extraction, application_domain, baselines, etc.). Default false returns the lean 12-field set. Ignored when `fields` is provided. |
| exclude_ids | array | No | arXiv IDs to exclude from results (for deduplication across chained calls) |
Details
From the project README
Scholar Feed MCP Server
Research paper search with ranking and citation tracking, for LLM engineering and academic research, without leaving Claude Code, Cursor, or any MCP client.
Most paper tools hand back a flat list. Scholar Feed ranks it: sort by relevance, by proven citation count, or by rising impact, then trace any paper's citation lineage forward and backward across 22M+ edges. 600k+ CS/AI/ML papers, updated daily, each with an LLM-generated summary and novelty score.
Scholar Feed indexes arXiv papers daily and ranks them on recency, citation velocity, institutional reputation, and code availability.
Quick Start
npx scholar-feed-mcp@latest init
This interactive wizard will:
- Optionally ask for an API key (or skip for anonymous access)
- Detect your MCP client (Claude Code, Cursor, or Claude Desktop)
- Write the config and verify the connection
No API key required. Anonymous access gives you 200 calls/month, enough for a typical research session. For a higher quota (500/month per account) plus your library — collections, saved papers and watches — get a free key at scholarfeed.org/settings.
Try asking: "Search for recent papers on test-time compute scaling"
What You Can Do
Technology scouting: "What novel research on retrieval-augmented generation was published this month?"
Literature review: "Find papers similar to 2401.04088 and export their BibTeX"
Trend monitoring: "What's trending in cs.CV this week? Summarize the top 3."
Author discovery: "Who are the top researchers working on efficient LLM inference?"
Field orientation: "Give me an orientation report on sparse mixture-of-experts architectures."
Installation
The fastest path is npx scholar-feed-mcp@latest init, which auto-detects your client and writes the config. To set it up by hand, every client launches the same stdio server (npx -y scholar-feed-mcp@latest); only the config-file location and the wrapper key differ.
Claude Desktop (one-click) installs without editing any config: download the .mcpb bundle from the latest release and open it (or drag it into Settings > Extensions). The installer shows one optional field for a Scholar Feed API key (sf_...): leave it blank for anonymous mode (200 calls/month), or paste a free key from scholarfeed.org/settings for 500/month.
Claude Code takes a one-line command:
# Anonymous (200 calls/month)
claude mcp add scholar-feed -- npx -y scholar-feed-mcp@latest
# With an API key (500 calls/month per account)
claude mcp add scholar-feed -e SF_API_KEY=sf_your_key_here -- npx -y scholar-feed-mcp@latest
Every other client takes this standard JSON block:
{
"mcpServers": {
"scholar-feed": {
"command": "npx",
"args": ["-y", "scholar-feed-mcp@latest"]
}
}
}
To raise the quota to 500 calls/month, add "env": { "SF_API_KEY": "sf_your_key_here" } to the server entry. Get a free key at scholarfeed.org/settings.
Drop that block into the right config file:
| Client | Config file | Notes |
|---|---|---|
| Cursor | .cursor/mcp.json (project) or ~/.cursor/mcp.json (global) | Restart Cursor. |
| Claude Desktop | macOS: ~/Library/Application Support/Claude/claude_desktop_config.json; Windows: %APPDATA%\Claude\claude_desktop_config.json | Settings → Developer → Edit Config, then restart. |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | Cascade → MCP icon → Configure, then refresh. |
| Cline / Roo Code | cline_mcp_settings.json | MCP Servers sidebar icon → Configure. Cline and Roo Code share this format. |
| Gemini CLI | ~/.gemini/settings.json (or project .gemini/settings.json) | |
| LM Studio | ~/.lmstudio/mcp.json | Program tab → Install → Edit mcp.json. Follows Cursor's notation. |
| JetBrains (PyCharm / IntelliJ) | AI Assistant → MCP → Add → As JSON | Requires AI Assistant 2025.1+. |
A few clients need a different wrapper key or file format:
OpenAI Codex, VS Code (GitHub Copilot), Zed, Continue, and project-scoped configs
OpenAI Codex (~/.codex/config.toml, or $CODEX_HOME/config.toml if you set that) uses TOML, not JSON — the block above will not work. One file serves both the Codex CLI and the IDE extension.
[mcp_servers.scholar-feed]
command = "npx"
args = ["-y", "scholar-feed-mcp@latest"]
env = { SF_API_KEY = "sf_your_key_here" }
Drop the env line to run keyless at 200 calls/month. On Windows, if Codex cannot launch the server, use command = "cmd" with args = ["/c", "npx", "-y", "scholar-feed-mcp@latest"].
VS Code: GitHub Copilot (.vscode/mcp.json) uses a servers key and an explicit type, and needs Copilot agent mode. You can also run MCP: Add Server from the Command Palette.
{
"servers": {
"scholar-feed": {
"type": "stdio",
"command": "npx",
"args": ["-y", "scholar-feed-mcp@latest"]
}
}
}
Zed (settings.json) uses a context_servers key, and the "source": "custom" line is required (without it, Zed silently skips the entry).
{
"context_servers": {
"scholar-feed": {
"source": "custom",
"command": "npx",
"args": ["-y", "scholar-feed-mcp@latest"]
}
}
}
Continue uses YAML, with mcpServers as a list, in ~/.continue/config.yaml (global) or .continue/config.yaml (workspace).
mcpServers:
- name: scholar-feed
type: stdio
command: npx
args:
- "-y"
- scholar-feed-mcp@latest
Project-scoped (.mcp.json), to share the server across a repo:
{
"mcpServers": {
"scholar-feed": {
"command": "npx",
"args": ["-y", "scholar-feed-mcp@latest"],
"env": { "SF_API_KEY": "${SF_API_KEY}" }
}
}
}
Windows: for any JSON config above, use "command": "cmd" and "args": ["/c", "npx", "-y", "scholar-feed-mcp@latest"].
Scholar Feed is a standard stdio MCP server, so any other MCP-compatible client works with the standard block too.
Available Tools (27)
Core Search & Discovery
| Tool | Description | Key Parameters |
|---|---|---|
search_papers | Semantic + keyword search with filters. Also does similar-paper discovery, citation-scoped search, and trending. | q, category, novelty_min, days, sort, anchor_paper_id, scope_to_citations_of, mode, method_category, task, dataset, contribution_type, task_category, cursor, limit |
get_paper | Get full paper details by arXiv ID. Also handles batch lookup and BibTeX export. | arxiv_ids, format, fields, verbose |
get_citations | Citation graph (outgoing refs or incoming citations) | arxiv_id, direction, limit, fields |
fetch_fulltext | Read a paper's text by section (abstract, introduction, related_work, method, results, conclusion, or all). Pass arxiv_ids to read up to 8 papers in one call; a paper that cannot be extracted comes back as a failed entry, not a failed call. | arxiv_id, arxiv_ids, sections |
Authors
| Tool | Description | Key Parameters |
|---|---|---|
find_author | Find researchers by topic/name query, or retrieve a profile by ID. | q, id, field, limit |
co_author_graph | Co-authorship neighborhood for an author | author_ids, window_years |
Embeddings
| Tool | Description | Key Parameters |
|---|---|---|
embed_text | Get a 768-dim Gemini embedding for text (for HyDE and custom similarity). Pro-only, so anonymous/free callers get a 403 pro_required. | text, task_type |
Research
| Tool | Description | Key Parameters |
|---|---|---|
get_field_orientation | Cheap retrieval orientation for a research area: top papers, subfields, open problems. No Pro quota. | topic, limit |
get_foundational_lineage | Foundational work for a paper's niche via the citation graph (consensus-then-lift): niche_roots → field_level → discipline, with cited_by_in_niche evidence. Surfaces canonical anchors semantic search misses. No Pro quota. | anchor_paper_id, scope, generality_ceiling, limit |
check_drift | "Is the method I use superseded — and by what?" Critique receipts + benchmark-dominance edges over ~10 LLM builder-problem families. No Pro quota. | family, method, limit |
Library, Collections, Watches & Gap Analysis (require SF_API_KEY)
These MUTATE or read the authenticated user's account. The core read/search tools above work anonymously; these need a key.
| Tool | Description | Key Parameters |
|---|---|---|
save_paper | Bookmark a paper to your library (idempotent; feeds personalization). | arxiv_id |
unsave_paper | Remove a paper from your library (idempotent). | arxiv_id |
like_paper | "More like this" calibration signal for the For You feed (insert-only). | arxiv_id |
list_library | List your saved papers, newest first (includes your notes). | limit, page |
annotate_paper | Record your verdict on a paper — why it matters, when to use it, why you ruled it out. Upserted; returned by list_library, so it is what a later session reads instead of re-deriving. | arxiv_id, note_text, action |
list_collections | List collections with paper counts. | (none) |
create_collection | Create a named collection (get-or-create; no error on duplicate). | name |
add_to_collection | Add a paper to a collection by name or id (also auto-saves). | arxiv_id, collection_name, collection_id |
remove_from_collection | Remove a paper from a collection (stays saved). | arxiv_id, collection_name, collection_id |
create_watch | Standing daily-evaluated saved search; get-or-create by name. Define it with a structured criteria filter (recommended) or a single seed selector. | name, novelty_min, criteria, recency_days, q, collection_name, collection_id, anchor_paper_id, scope_to_citations_of, author_id, category |
list_watches | List watches with summary, last_evaluated_at, and pending_hits. | (none) |
check_watches | Pull new matches since the last digest (read-only, idempotent). | watch_name, watch_id, limit |
update_watch | Edit a watch in place: rename, change novelty_min, or retarget its structured criteria (clears pending hits). Address by name or id. | name, watch_id, new_name, novelty_min, criteria, recency_days |
preview_watch | Dry-run a structured criteria filter over recent papers without creating a watch; returns match_count and a sample to tune before saving. Read-only. | criteria, recency_days |
delete_watch | Delete a watch by name or id (idempotent). | name, watch_id |
find_gaps | "What am I missing?" for a collection or topic: foundational + frontier work you haven't saved (read-only, Pro). | collection_name, collection_id, topic, scope, limit |
ask_library | "Answer from my saved set": a cited synthesis over your library or one collection, grounded only in papers you've saved (read-only). The inverse of find_gaps. Free 20/month, then Pro 200/day. | question, collection_name, collection_id, limit |
Novelty Score
Every paper has an llm_novelty_score from 0.0 to 1.0:
| Range | Meaning | Example |
|---|---|---|
| 0.7+ | Paradigm shift or broad SOTA | New architecture that changes the field |
| 0.5-0.7 | Novel method with strong results | New training technique with clear gains |
| 0.3-0.5 | Incremental improvement | Applying known method to new domain |
| <0.3 | Survey, dataset, or minor extension | Literature review, benchmark release |
Use novelty_min: 0.5 in search_papers to filter for genuinely novel work.
Rate Limits
| Endpoint | Limit |
|---|---|
search_papers | 30/min |
get_paper | 30/min |
get_citations | 30/min |
fetch_fulltext (single paper) | 10/min |
fetch_fulltext (batch, 2-8 papers) | 6/min |
find_author | 20/min |
co_author_graph | 20/min |
embed_text | 30/min |
get_field_orientation | 20/min |
get_foundational_lineage | 20/min |
find_gaps | 20/min |
ask_library | 10/min |
Responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers.
Monthly volume quota (separate from the per-minute limits above, counted per account across all your keys): 200 calls/month anonymous (per IP), 500/month with a free key, 10,000/month on Pro. A smaller daily cap (100 / 200 / 2,000) sits underneath it as a burst guardrail so a runaway loop cannot spend a month in an hour; hitting it returns a 429 with scope: "burst" and leaves your monthly quota untouched. Read your remaining month from GET /v1/health (monthly_limit / usage_this_month) before a batch.
The AI synthesis tools have their own limits: ask_library is 20/month free, then 200/day on Pro; find_gaps is Pro-only (a 403 pro_required otherwise). embed_text needs an account of any tier — anonymous callers get a 403 account_required.
Example Response
search_papers with q: "attention mechanism" returns:
{
"papers": [
{
"arxiv_id": "2401.04088",
"title": "Attention Is All You Need (But Not All You Get)",
"authors": ["A. Researcher", "B. Scientist"],
"year": 2024,
"categories": ["cs.LG", "cs.AI"],
"primary_category": "cs.LG",
"arxiv_url": "https://arxiv.org/abs/2401.04088",
"has_code": true,
"github_url": "https://github.com/example/repo",
"citation_count": 42,
"rank_score": 0.73,
"llm_summary": "Proposes a sparse attention variant that reduces compute by 60% while matching dense attention accuracy on 5 benchmarks.",
"llm_novelty_score": 0.55
}
],
"total": 1847,
"page": 1,
"limit": 20,
"next_cursor": "eyJzIjogMC43MywgImlkIjogIjI0MDEuMDQwODgifQ=="
}
Pass next_cursor back to get the next page (keyset pagination, which is more stable than page numbers for large result sets).
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
SF_API_KEY | No | (none) | Your Scholar Feed API key (starts with sf_). Without it, runs in anonymous mode (200 calls/month). |
SF_API_BASE_URL | No | Production URL | Override API base URL |
Development
npm install
npm run build # Build to build/
npm run dev # Watch mode
npm run typecheck # Type check without emitting
npm test # Run tests
Contributing
See CONTRIBUTING.md for guidelines.
Troubleshooting
"Authentication failed: your SF_API_KEY is invalid" The key may have been revoked. Generate a new one at scholarfeed.org/settings. Or remove the key to use anonymous mode.
"Rate limit exceeded" or "Anonymous daily limit exceeded" Anonymous mode allows 200 calls/month. Get a free API key at scholarfeed.org/settings for 500 calls/month per account, plus your library.
Server shows as "failed" with no error — especially right after an update
The first launch (and the first launch after each new release) makes npx download the package. The published bin is a single self-contained file with no dependency tree to resolve, so this is fast — but on a slow link it can still outrun your client's start-up timeout, and the server then shows as "failed" with no detail. Fixes: (1) warm the cache by running it once in a terminal — npx -y scholar-feed-mcp@latest --version — then restart your client; (2) raise the MCP start-up timeout if your client supports it (Claude Code: MCP_TIMEOUT=60000). For the fastest, offline-capable launches, install once globally and point the config at it instead of npx:
npm install -g scholar-feed-mcp
# then in your MCP config: "command": "scholar-feed-mcp", "args": []
Tool calls time out or fail silently
Ensure Node.js 18+ is installed (node --version). Older versions lack the native fetch API.
Stale npx cache
The config blocks above pin scholar-feed-mcp@latest, which re-resolves the newest version each launch. If you previously used an unpinned scholar-feed-mcp and are stuck on an old build: npx --yes scholar-feed-mcp@latest.
Windows: "command not found"
Use "command": "cmd" with "args": ["/c", "npx", "-y", "scholar-feed-mcp@latest"] in your MCP config.
About Scholar Feed
Scholar Feed is a research-discovery engine for computer science and AI/ML papers, founded in 2025. It indexes 600,000+ papers from arXiv — ranked by novelty, citation velocity, and relevance — with LLM-generated summaries, a citation graph, author profiles, and full-text extraction. It is available as a website, a public REST API, and a Model Context Protocol (MCP) server that AI agents can call directly. This package (scholar-feed-mcp) is the open-source MCP server.
- Website: https://www.scholarfeed.org
- npm: https://www.npmjs.com/package/scholar-feed-mcp
- REST API: https://api.scholarfeed.org/v1
Privacy
See our privacy policy.
License
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.