Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Scholar Feed

NPM · SCHOLAR-FEED-MCP · 2 COMPONENTS · SCANNED SEP 20

Rank CS/AI/ML papers by citations, forecast impact, or code adoption; trace 23.2M citation edges.

0 this week 94 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security100
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to YGao2005/scholar-feed-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 11 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability65
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 8393 tokens (~310/item across 27 items; 27 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 28 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Scholar Feed MCP server?

Scholar Feed runs locally as an npm package, launched with npx -y scholar-feed-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · scholar-feed-mcp

# add to Claude Code
claude mcp add ygao2005-scholar-feed-mcp -- npx -y scholar-feed-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "ygao2005-scholar-feed-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scholar-feed-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "ygao2005-scholar-feed-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scholar-feed-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add ygao2005-scholar-feed-mcp -- npx -y scholar-feed-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ygao2005-scholar-feed-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "scholar-feed-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ygao2005-scholar-feed-mcp --command npx --arg -y --arg scholar-feed-mcp
# ~/.hermes/config.yaml
mcp_servers:
  ygao2005-scholar-feed-mcp:
    command: "npx"
    args: ["-y", "scholar-feed-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "ygao2005-scholar-feed-mcp": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "scholar-feed-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add ygao2005-scholar-feed-mcp -t stdio -c npx -a -y scholar-feed-mcp
// mcp.json
{
  "mcpServers": {
    "ygao2005-scholar-feed-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "scholar-feed-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 20 Sept 26 +1
    • Stability: 0.97 → pass security
  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 13 Sept 26 +1
    • Stability: 0.97 → pass security
  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 9 Sept 26 +16
    • Malware scan: unverified → pass security
  • 8 Sept 26 −15
    • Malware scan: pass → unverified security
    • Package version: 3.19.1 → 3.20.0 functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/scholar-feed-mcp@3.20.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo YGao2005/scholar-feed-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/YGao2005/scholar-feed-mcp/.github/workflows/publish.yml@refs/tags/v3.20.0
Rekor log index 2755304277
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:22e8cb2600e70c418e7559e3555610a087309c3dd98dbb13efcf6b7087dc1ffa06e4a6bfbb54307ab5577562fa804c773ff09b20cc33d641b91be349a

Background: How many MCP packages publish verified provenance →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 27 exposed · ~7,896 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_to_collection ~181

Add a paper to a collection, addressed by collection_id OR collection_name (get-or-create by name — no need to look up an id first). Nest with "/": collection_name "AgentOPA/Formal" files the paper under an "AgentOPA" folder. MUTATES: also auto-saves the paper to the library. Idempotent (adding a paper already in the collection is a no-op). Requires SF_API_KEY.

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper to add, e.g. '2407.15831'.
collection_idstringUUID of an existing collection. Provide this OR collection_name.
collection_namestringName of the collection. Created if it doesn't exist. Use '/' to nest, e.g. 'AgentOPA/Formal'. Provide this OR collection_id.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

annotate_paper ~413

Record YOUR verdict on a paper — why it matters for your work, when to use it, or why you ruled it out. One note per paper, upserted (writing again replaces it), so it is safe to call repeatedly. Requires SF_API_KEY. WHY IT MATTERS: this note is the only thing that survives between sessions. list_library returns note_text on every saved paper, so a verdict written now is what a future session reads INSTEAD of re-reading the paper and re-deriving the same conclusion. WRITE A JUDGMENT, NOT A SUMMARY — the paper already carries llm_summary and an abstract, so restating what the paper says adds nothing. Write what those cannot: how it bears on YOUR problem. Prefer a claim someone could later prove wrong ("needs a labeled trace log we don't have", "our baseline — beat this on the 7B setting") over an unfalsifiable verdict ("interesting", "not very relevant"), because a mechanism can be re-checked when circumstances change and a sentiment cannot. State the basis when it is thin: a verdict formed from the abstract alone deserves "(abstract only)", since fetch_fulltext defaults to ~800 characters of the results section rather than the whole paper. Pass action='get' to read the existing note before overwriting it — worth doing when a prior session may already have judged this paper. To correct a note, just write the corrected text (it replaces).

NameTypeReqDescription
actionstring'upsert' (default) writes/replaces the note. 'get' returns the current note without changing it. There is deliberately no delete: a wrong note is corrected by overwriting it, which keeps this tool no…
arxiv_idstringyesarXiv ID of the paper to annotate, e.g. '2407.15831'.
note_textstringYour verdict (max 5000 chars). Required for the default upsert; ignored for action='get'.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

ask_library ~211

Answer a question using ONLY the papers you've saved — a synthesis over your library (or one collection) with inline [arXiv-ID] citations. The inverse of find_gaps (which finds important work you're MISSING): ask_library reasons over what you HAVE. Optionally scope to one collection (collection_name OR collection_id); omit both to use your whole library. Read-only. Requires SF_API_KEY (it reads your saved set). Free accounts get 1 question/month; Pro raises this to 200/day.

NameTypeReqDescription
collection_idstringScope the answer to one collection by UUID. Omit to use your whole library.
collection_namestringScope the answer to one collection by name (resolved by the backend). Omit to use your whole library.
limitintegerHow many of your most-relevant saved papers to ground the answer on (max 20). Default 8.
questionstringyesThe natural-language question to answer from your saved papers.
NameTypeReqDescription
answerstringThe synthesized answer with inline [arXiv-ID] citations.
citationsarray
messagestring
okboolean
papersarray

No examples provided.

check_drift ~660

Answers 'for my problem, is the method I use superseded — and by what?' over a grounded, entity-resolved knowledge base of textual critique receipts + benchmark-dominance edges (no LLM call at query time). Call with a `family` (e.g. 'rag', 'peft', 'kvcache') and a `method` (e.g. 'SnapKV', 'LoRA') to get a verdict: how superseded it is, WHO critiques it (verbatim quotes + the citing paper), WHO beats it on benchmarks (winner, numbers, condition, source paper), and the not-yet-superseded alternatives in the same sub-problem. Omit `method` to get the whole-family map: most-superseded baselines, competition sub-problems, and the live frontier. Method names are matched case- and spacing-insensitively, with did-you-mean suggestions on a miss. Use this when choosing or reviewing a technique for a known problem area, or to check whether a baseline a paper relies on has been beaten. Does not require a Pro API key. Covers ~10 builder-problem families and growing; the `family` parameter lists them, or pass family='list' for the live set. Coverage caveat: evidence is drawn only from arXiv benchmark tables, so 'superseded' means a method was beaten in a published comparison (not that it is dead or unusable), production frameworks (LangChain, LlamaIndex, etc.) appear only as baselines and never as winners, and results are a literature signal rather than a deployment recommendation. GROUNDING — how far to trust an individual receipt: every claim passes a deterministic gate against the source paper's raw LaTeX (a critique must carry a verbatim quote shingle found in the source; a benchmark edge must have every one of its numbers present there), so a fabricated quote or table cell cannot enter the KB. What the gate does NOT verify is ATTRIBUTION: the quote is real but its subject may be class-level or a pronoun ('these methods', 'they') rather than the named method, so tying a receipt to one specific method is sometimes an inference. No end-to-end precision number has been measured…

NameTypeReqDescription
familystringBuilder-problem family to query, e.g. 'rag' (retrieval-augmented generation), 'peft' (parameter-efficient fine-tuning), 'kvcache' (KV-cache compression). Omit it (or pass an unknown family like 'list…
limitintegerMax items per list — receipts, dominance edges, frontier (3–50, default 12).
methodstringMethod to check, e.g. 'SnapKV', 'H2O', 'StreamingLLM' (case/spacing-insensitive). Omit to get the whole-family map instead of a single-method verdict.
NameTypeReqDescription
anchor_arxiv
anchor_title
available_familiesarray
beaten_byarray
beaten_by_papersnumber
criticized_byarray
critiqued_by_papersnumber
descriptionstring
familystring
first_seen
foundboolean
frontierarray
labelstring
messagestring
methodstring
methods_rankednumber
most_supersededarray
newer_alternativesarray
notestring
statsobject
sub_problem
sub_problemsarray
suggestionsarray
summarystring
superseded_rank
verdictstring

No examples provided.

check_watches ~163

Pull new matching papers since the last digest delivery, in the same shape as search_papers results. Optionally scope to one watch by watch_name OR watch_id; omit both for all watches. Read-only and idempotent — does NOT advance any watermark (only digest delivery does), so it is safe to call repeatedly (no mark-on-read). This is the in-session 'anything new on my watches?' pull. Requires SF_API_KEY.

NameTypeReqDescription
limitintegerMax hits to return (max 100).
watch_idstringScope to one watch by UUID. Provide this OR watch_name, or neither for all.
watch_namestringScope to one watch by name. Provide this OR watch_id, or neither for all.
NameTypeReqDescription
directionstringCitation direction (get_citations: citing | cited_by).
hitsarrayNew watch matches (check_watches).
limitnumber
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
pagenumber
sinceWatermark the hits were computed from, or null on first run.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

co_author_graph ~177

Find the co-authorship neighborhood of one or more authors. Given a list of author_ids, returns edges {from, to, papers_count, last_collab_year} where 'from' is one of the input authors and 'to' is any co-author appearing on a shared paper within the window. Use for AC reviewer triage (find conflicts), disambiguating researchers (who do they actually work with?), or expanding an author seed into a research community. window_years defaults to 10. Result is capped at 500 edges, sorted by papers_count DESC.

NameTypeReqDescription
author_idsarrayyesAuthor IDs to query (1-25). Get author IDs via the find_author tool.
window_yearsintegerOnly count co-authorships from the last N years (default 10, max 30).
NameTypeReqDescription
edge_countnumber
edgesarrayCo-authorship edges {from, to, papers_count, last_collab_year}.
queried_author_idsarray
window_yearsnumber

No examples provided.

create_collection ~120

Create a new named collection. MUTATES. If a collection with that name already exists, returns the existing one (get-or-create — never errors on duplicate). Use "/" to nest under a folder, e.g. "AgentOPA/Formal" — the folder is derived from the name, so there is no parent to create first. Requires SF_API_KEY.

NameTypeReqDescription
namestringyesName for the collection, e.g. 'KV-cache compression'. Use '/' to nest: 'AgentOPA/Formal' files it under an 'AgentOPA' folder.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

create_watch ~540

Create a standing watch — evaluated daily against newly-indexed papers, surfacing new matches via the email digest and via check_watches. MUTATES. Get-or-create by name (re-creating with an existing name returns it unchanged — never errors on duplicate). TWO forms: (1) the v2 STRUCTURED filter via `criteria` (collections/authors/categories/text/has_code/min_novelty/similar, AND-composed) — the composable, agent-tunable form, recommended; tune it with preview_watch first, and edit later with update_watch. Structured watches rank by 'rising' (forecasted breakout impact) by default, and tighten with min_impact_pct for an anti-noise watch that surfaces only the breakout papers in your niche. (2) a single legacy seed selector (q OR collection_name OR collection_id OR anchor_paper_id); if `criteria` is given it takes precedence. Requires SF_API_KEY.

NameTypeReqDescription
anchor_paper_idstringWatch papers similar to this arXiv ID. One seed selector only.
author_idstringWatch an author's new work, by author ID. One seed selector only.
categorystringWatch an arXiv category (e.g. 'cs.LG'), filtered by novelty_min. One seed selector only.
collection_idstringWatch the neighborhood of a collection by UUID. One seed selector only.
collection_namestringWatch the neighborhood of a collection by name (resolved by the backend). One seed selector only.
criteriaobjectv2 STRUCTURED filter (collections/authors/categories/text/has_code/min_novelty/similar). When provided, this defines the watch (kind='filter') and the single-selector seeds above are IGNORED. This is…
namestringyesLabel for the watch, e.g. 'novel KV-cache work'.
novelty_minnumberOnly surface papers at/above this novelty score (0..1). The signal/noise knob — raise it for 'only tell me when it matters'. Default 0.5.
qstringSemantic/keyword topic seed. One seed selector only.
recency_daysintegerFor a structured (criteria) watch: only consider papers from the last N days (default 7; the 'cites' relation uses 30).
scope_to_citations_ofstringWatch new papers citing this arXiv ID. One seed selector only.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

delete_watch ~108

Delete a watch, addressed by watch_id OR name. MUTATES. Idempotent: deleting a non-existent watch is a no-op (no error). To change a watch in place (rename / novelty_min / retarget criteria) use update_watch instead of delete-and-recreate. Requires SF_API_KEY.

NameTypeReqDescription
namestringName of the watch to delete. Provide this OR watch_id.
watch_idstringUUID of the watch to delete. Provide this OR name.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

embed_text ~225

Embed a text string into a 768-dim Gemini Flash vector. Use for HyDE-style retrieval: (1) write a hypothetical short paper that would perfectly answer the user's query, (2) embed it with task_type='RETRIEVAL_DOCUMENT' (default — matches the corpus embedding side), (3) pass the resulting embedding back through search-style tools to find real papers nearest to the hypothetical. task_type='RETRIEVAL_QUERY' matches the query side and is useful for direct user-query embedding without HyDE. Pro-only — requires an SF_API_KEY on a Pro account; anonymous and free callers get a 403 pro_required. Cost: ~$0.0001/call; rate-limited at 30/minute per API key.

NameTypeReqDescription
task_typestringRETRIEVAL_DOCUMENT (default) matches paper-side embeddings — use for HyDE. RETRIEVAL_QUERY matches query-side semantic search.
textstringyesText to embed (1-8000 chars). For HyDE flows this is your hypothetical answer/abstract.
NameTypeReqDescription
dimensionsnumber
dimsnumber
embeddingarrayThe embedding vector (768-dim Gemini Flash).
modelstring
task_typestring

No examples provided.

fetch_fulltext ~181

Read arXiv papers' actual text, by section. Section selection controls context cost: ask for the one or two you need, not whole papers — 'all' is ~13.5KB a paper, 8 of them ~108KB. Section labels are inferred: check `low_confidence_sections` before calling one the paper's own. Sourced from arXiv's section-tagged HTML, then LaTeX, then PDF; a 404 means all three failed.

NameTypeReqDescription
arxiv_idstringarXiv ID of one paper.
arxiv_idsarrayUp to 8 arXiv IDs, one entry per paper. `sections` is required past one ID.
sectionsOne section name or an array. Defaults to 'all' for one paper; no default for a batch.
NameTypeReqDescription
arxiv_idstring
available_sectionsarrayWhich sections this paper has; 'no such section' is not 'extraction failed'.
full_textstringBackup text, PDF fallback only.
low_confidence_sectionsarraySections labelled positionally: a guess (~50% accurate, hand-audited) at what sits between the introduction and the results, and on surveys or theory papers often not a method at all. Verify against…
missing_sectionsarrayRequested sections the paper lacks.
notestring
requested_sectionstring
requested_section_availableboolean
requested_sectionsarray
resultsarrayBatch mode: one entry per paper, in request order. A failed paper is an entry with ok:false and an `error` code, never a failed call.
section_provenanceobjectHow each section was labelled: abstract_block, heading, heading_loose, subsection, latex_heading, pdf_heading, or positional. Absent, with low_confidence_sections, when labelling is unknown; that is…
sectionsobjectPer-section text; null means the paper has no such section.
sourcestring
table_captionsarray

No examples provided.

find_author ~283

Two-mode author tool. Provide exactly one of q or id. Q-MODE (q=...): search for researchers by topic or name — uses embedding similarity for topics ('efficient LLM inference'), fuzzy matching for names ('Yann LeCun'). Returns a list of matching authors with author_id, name, h_index, total_papers, primary_field, research_topics. ID-MODE (id=...): look up a single author profile by author_id (obtained from a previous q-mode call or from co_author_graph results). Returns h-index, total citations, global rank, primary field, novelty score distribution, research topics, code/venue scores, years active, and their top 10 papers by rank score.

NameTypeReqDescription
fieldstring(q-mode only) Filter by primary research field e.g. 'cs.LG', 'cs.CV', 'cs.CL'.
idintegerAuthor ID for direct profile lookup (id-mode). Returns the single author profile with top 10 papers. Get IDs from q-mode results or co_author_graph.
limitinteger(q-mode only) Max results to return (default 20).
qstringTopic or researcher name to search (q-mode). Returns a list of matching authors. Examples: 'efficient transformer training', 'Geoffrey Hinton'.
NameTypeReqDescription
authorsarrayMatching authors (q-mode).
h_index
idnumber
namestring
primary_field
querystring
rank
research_topicsarray
search_typestring
top_papersarrayTop papers by rank (id-mode profile).
totalnumber
total_citations
total_papers

No examples provided.

find_gaps ~262

Find important work you HAVEN'T saved, for a collection or topic — a 'what am I missing?' analysis. Returns two buckets: foundational_gaps (canonical citation-graph anchors in the niche, not in your library) and frontier_gaps (recent high-novelty work in the niche, not yet saved). Provide exactly one seed: collection_name OR collection_id OR topic. The backend derives the niche, runs lineage + recent-novelty search, and subtracts your saved set. Read-only. Requires SF_API_KEY (it needs your library to subtract) and is a Pro feature — free accounts receive an upgrade prompt.

NameTypeReqDescription
collection_idstringAnalyze gaps for a collection by UUID. Provide exactly one seed.
collection_namestringAnalyze gaps for a collection by name (resolved by the backend). Provide exactly one seed.
limitintegerMax gaps per bucket (max 50). Default 10.
scopestringWhich gaps to surface: 'foundational' (canonical anchors you're missing), 'frontier' (recent novel work you haven't saved), or 'both' (default).
topicstringAnalyze gaps for a free-text topic/area. Provide exactly one seed.
NameTypeReqDescription
foundational_gapsarrayCanonical anchors in the niche not in your library.
frontier_gapsarrayRecent high-novelty work you haven't saved.
messagestring
okboolean

No examples provided.

get_citations ~243

Get the citation graph for a paper, sorted by citing-paper rank_score (highest-impact first). 'citing' = outgoing references this paper cites; 'cited_by' = incoming citations from other papers. Default response is a lean 12-field shape per paper — pass verbose=true for the full 28-field shape.

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper
directionstring'citing' = outgoing references this paper cites; 'cited_by' = incoming citations from other papers
exclude_idsarrayarXiv IDs to exclude from results (for deduplication across chained calls)
fieldsstringComma-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.
limitintegerNumber of papers to return (max 50)
verbosebooleanIf true, returns the full 28-field paper shape. Default false returns the lean 12-field set. Ignored when `fields` is provided.
NameTypeReqDescription
directionstringCitation direction (get_citations: citing | cited_by).
limitnumber
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
pagenumber
papersarrayMatched / returned papers.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

get_field_orientation ~188

Returns CANDIDATE FOUNDATIONAL PAPERS for a research topic — cheap retrieval only, no synthesis. Ranks papers by a blend of citation count (0.6 weight, captures importance) and semantic similarity to your topic (0.4 weight). Use this to bootstrap a literature survey or get a fast sense of the landscape. For a synthesized orientation report (key concepts, open problems, reading order), use the /field-guide skill which calls this tool internally. Does not require a Pro API key — no LLM calls are made.

NameTypeReqDescription
limitintegerNumber of candidate papers to return (5–30, default 15).
topicstringyesResearch area to orient on. Be specific for better results. Examples: 'diffusion models for protein structure prediction', 'efficient attention mechanisms for long-context LLMs', 'graph neural networ…
NameTypeReqDescription
directionstringCitation direction (get_citations: citing | cited_by).
limitnumber
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
pagenumber
papersarrayMatched / returned papers.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

get_foundational_lineage ~389

Returns the FOUNDATIONAL WORK FOR A PAPER'S NICHE via the citation graph — the relative question ('what is foundational for THIS paper's specific sub-field', often itself only modestly cited) rather than the obvious global landmarks. Anchors on the paper, takes its embedding neighbourhood as the niche, and ranks what the niche cites into three tiers: `niche_roots` (the niche-specific foundations, ranked by how specifically the neighbourhood builds on them — surfaces canonical anchors that semantic search misses), `field_level` (broader secondary foundations), and `discipline` (universal landmarks like Attention Is All You Need, collapsed out of the way). Each paper carries `cited_by_in_niche` evidence so the claim is grounded, not asserted. Use this to trace prior art / lineage for a paper, or to find the canonical methods a niche is built on. Complements get_field_orientation (which is topic-anchored and retrieval-only). No Pro key and no LLM calls required.

NameTypeReqDescription
anchor_paper_idstringyesarXiv ID of the paper to anchor on, e.g. '2504.04704' or '2504.04704v2'. The niche is built from this paper's embedding neighbourhood.
generality_ceilingbooleanWhen true (default), demote universally-cited landmark papers into the collapsed `discipline` tier so the niche-specific foundations lead. Set false to keep landmarks in the foundational tiers.
limitintegerMax papers in each of the niche_roots and field_level tiers (5–40, default 15).
scopestringNiche breadth: 'narrow' (~100 nearest papers, tightest sub-topic — surfaces the few-citation niche root), 'field' (~200, default), 'broad' (~400, wider area foundations).
NameTypeReqDescription
anchorstring
disciplinearray
field_levelarray
niche_rootsarray
niche_sizenumber
note
scopestring
tiersobjectFoundational tiers: niche_roots → field_level → discipline.

No examples provided.

get_paper ~438

Get full details for one or more papers by arXiv ID. Pass a single-element array for one paper; pass multiple IDs to batch-fetch up to 50 papers in one call. Pass format='bibtex' to get a .bib citation entry (bibtex is single-paper only; for multi-paper bibtex, call repeatedly). Default returns a lean 13-field shape (arxiv_id, title, authors, year, categories, has_code, github_url, citation_count, venue_name, llm_summary, llm_significance, llm_novelty_score, impact_pct — where impact_pct is the ML-forecast impact percentile 0-100 computed WITHIN the paper's own arXiv-category cohort, so it is a cohort-relative rank rather than an absolute score, and is NULL on older papers outside the recent ~90-day scoring window). Pass verbose=true for the full shape with structured extraction (method_name, contribution_type, task_category, datasets, baselines) and institution_tags. Use fields='arxiv_id,title,abstract' to select an exact subset, or fetch_fulltext with sections='all' for the full paper.

NameTypeReqDescription
arxiv_idsarrayyesOne or more arXiv IDs. Single-paper lookup uses [id]; batch lookup passes multiple IDs (max 50). Example: ['2407.15831'] or ['2407.15831', '2402.09906'].
fieldsstringComma-separated list of fields to return (e.g. 'arxiv_id,title,llm_summary,abstract'). If omitted, returns the lean 12-field default unless verbose=true.
formatstringResponse format. 'json' (default) returns structured paper data. 'bibtex' returns a .bib citation entry. Bibtex mode uses the first ID in arxiv_ids.
verbosebooleanIf 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.
NameTypeReqDescription
bibtexstringBibTeX entry (format='bibtex').
countnumber
directionstringCitation direction (get_citations: citing | cited_by).
formatstring
limitnumber
messagestring
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
okboolean
pagenumber
papersarrayMatched / returned papers.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

like_paper ~94

Like a paper — a 'more like this' calibration signal that tunes the user's For You feed toward similar work. INSERT-only and idempotent (liking twice is a no-op, never un-likes). Distinct from save_paper: like expresses taste for ranking; save bookmarks for later reading. Requires SF_API_KEY.

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper to like.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

list_collections ~43

List the authenticated user's collections (named groups of saved papers) with paper counts. Read-only. Use before add_to_collection to see existing collections. Requires SF_API_KEY.

Input schema present but exposes no named parameters.

NameTypeReqDescription
collectionsarray
messagestring
okboolean

No examples provided.

list_library ~354

List the authenticated user's saved papers (their library), newest first. Read-only. Use this to review a reading list or to see what's already saved before saving more. Requires SF_API_KEY. SHAPE: agent callers get a lean record — `llm_summary` (~300 chars) INSTEAD of the abstract, with empty fields omitted rather than sent as null. Each paper also carries the state that makes this a knowledge base rather than a bookmark list: `note_text` (the user's own recorded verdict, when one exists), `is_read`, and `collections` (the axes it is filed under, e.g. 'AgentOPA/G4'). READ note_text FIRST. A paper carrying one was already judged in an earlier session — use that verdict instead of re-reading the paper and re-deriving it. If it is missing, consider recording one with annotate_paper so the next session inherits your conclusion. Pass verbose=true (or fields=...) only when you genuinely need the abstract or the full 28-field shape; the default is ~4x smaller and is the right choice for surveying what you already have.

NameTypeReqDescription
fieldsstringComma-separated fields to return, e.g. 'arxiv_id,title,abstract'. Overrides verbose. Library state (note_text/is_read/is_saved/collections) is always included regardless.
limitintegerHow many saved papers to return (max 100).
pageintegerPage number for paging through a large library.
verbosebooleanReturn the full paper shape (including the abstract) instead of the lean default. Costs roughly 4x the tokens — prefer llm_summary unless you specifically need the abstract's wording.
NameTypeReqDescription
directionstringCitation direction (get_citations: citing | cited_by).
limitnumber
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
pagenumber
papersarrayMatched / returned papers.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

list_watches ~61

List the authenticated user's watches with name, a one-line definition summary, last_evaluated_at, and pending_hits (count of new matches since the last digest delivery). Read-only. Use before create_watch to see what's already tracked. Requires SF_API_KEY.

Input schema present but exposes no named parameters.

NameTypeReqDescription
messagestring
okboolean
watchesarray

No examples provided.

preview_watch ~213

Dry-run a structured filter over recent papers WITHOUT creating a watch — the tuning loop. Returns {window_days, needs_similarity, match_count, sample} so you can iterate (add a category, raise min_novelty, switch the collection relation) before saving with create_watch. Structured watches rank by 'rising' (forecasted breakout impact) by default, and tighten with min_impact_pct for an anti-noise watch that surfaces only the breakout papers in your niche. NOTE: for a similarity filter, match_count is capped at 200 (the cosine fetch window) and so saturates at 200 on broad/hot topics — tune by the `sample` scores and narrow with categories/min_novelty (or a higher similar floor) rather than relying on match_count alone. Read-only. Requires SF_API_KEY.

NameTypeReqDescription
criteriaobjectyesThe structured filter to test.
recency_daysintegerWindow in days (default 7; the 'cites' relation uses 30).
NameTypeReqDescription
match_countnumber
messagestring
needs_similarityboolean
okboolean
samplearrayA sample of matching papers.
window_daysnumber

No examples provided.

remove_from_collection ~107

Remove a paper from a collection, addressed by collection_id OR collection_name. MUTATES (the paper stays in your library; it's only removed from this collection). Idempotent. Requires SF_API_KEY.

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper to remove from the collection.
collection_idstringUUID of the collection. Provide this OR collection_name.
collection_namestringName of the collection. Provide this OR collection_id.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

save_paper ~118

Save a paper to the authenticated user's Scholar Feed library (bookmark). MUTATES the library and feeds the user's personalization — saved papers are the strongest signal in the For You feed and the email digest. Idempotent: calling it again on an already-saved paper leaves it saved. Requires SF_API_KEY. To file it into a named collection in one step, use add_to_collection (that also saves).

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper to save, e.g. '2407.15831'.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

search_papers ~1,788

Search Scholar Feed's 600k+ CS/AI/ML paper corpus. Semantic (embedding) search by default, so it finds conceptually related work even when the wording differs. EVERY PARAMETER DOCUMENTS ITS OWN BEHAVIOUR AND COVERAGE LIMITS — read the ones you intend to use; this description covers only what no single parameter can tell you. RETRIEVAL LIMIT: semantic ranking favours recent, stylistically-matched papers and routinely MISSES the old high-citation anchor of a field (H2O for KV eviction, GRIT for unified embedding+generation). To reach a field's canonical work, read the top-5 abstracts for repeated baseline mentions ('we compare against X') and look that name up directly, or call get_foundational_lineage. THREE UNRELATED NOTIONS OF IMPACT, easily confused: proven citations (sort='impactful', min_citations) | a ~90-day forecast percentile that is NULL on older papers and therefore excludes them (sort='trending', impact_min) | GitHub adoption (sort='community', min_stars). YOUR LIBRARY IS MARKED INLINE on authenticated calls: each hit carries is_saved and is_read, and a hit you previously annotated carries note_text — your own earlier verdict. Read note_text INSTEAD of re-deriving a conclusion from the abstract; re-judging a paper you already ruled on is the most common way an agent wastes a research session. is_saved=false is a real measurement; on anonymous calls these keys are absent entirely, so never read a missing is_saved as false. Papers new to you are ranked exactly as before — nothing is demoted for being unseen.

NameTypeReqDescription
anchor_paper_idstringReturn papers similar to this arXiv paper ID. When set, q is ignored and results carry similarity_score. Example: '2407.15831'.
categorystringFilter by arXiv category e.g. 'cs.AI', 'cs.LG'
contribution_typestringFilter by paper's contribution type
cursorstringCursor from previous response's next_cursor for keyset pagination
datasetstringFilter to papers that evaluate on a specific dataset e.g. 'MMLU', 'ImageNet'
daysintegerLimit to papers published within N days
exclude_idsarrayarXiv IDs to exclude from results (for deduplication across chained calls)
fieldsstringComma-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.
github_url_existsbooleanFilter on whether the paper has a linked GitHub URL (true = only papers with a repo). Stricter than has_code (which counts any code link).
has_codebooleanFilter 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.
impact_minintegerMinimum 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 predic…
limitintegerResults per page (max 50)
method_categorystringFilter by method category e.g. 'reinforcement learning', 'transformer'
method_namestringFilter to papers introducing/using a specific named method e.g. 'LoRA', 'YOLO', 'DPO'. Case-insensitive substring match on the extracted method_name field.
min_citationsintegerMinimum real citation count. Unlike impact_min (a ~90-day FORECAST percentile), this filters on PROVEN citations and keeps established/canonical papers.
min_starsintegerMinimum 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. COVERA…
modestringSearch 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…
novelty_minnumberMinimum novelty score (0-1). Use 0.5+ for novel papers.
pageintegerPage number
published_afterstringOnly 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_beforestringOnly papers published on or before this date, 'YYYY-MM-DD'. Pair with published_after for an explicit window.
qstringSearch 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…
scope_to_citations_ofstringRestrict search to this paper's citation graph, ranked by relevance to q. Pass the arXiv ID of the paper whose citations you want to search within.
sortstringResult 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-in…
taskstringFilter by task e.g. 'image classification', 'question answering' (partial match)
task_categorystringFilter by broad research area
verbosebooleanIf 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.
NameTypeReqDescription
directionstringCitation direction (get_citations: citing | cited_by).
limitnumber
modestringSearch mode actually applied.
next_cursorKeyset cursor for the next page, or null when exhausted.
not_foundarrayRequested IDs that had no match.
note
pagenumber
papersarrayMatched / returned papers.
sortstringSearch sort order actually applied.
topicstring
totalTotal results available for the query. null when the count was skipped (query-less browse, or the count query timed out).

No examples provided.

unsave_paper ~115

Remove a paper from the authenticated user's Scholar Feed library. MUTATES the library. Idempotent: removing a paper that isn't saved leaves it unsaved. Note: the saved library is a superset of all collections, so un-saving a paper ALSO removes it from every collection it was in. To keep it filed in a collection, use remove_from_collection instead (that leaves the paper saved). Requires SF_API_KEY.

NameTypeReqDescription
arxiv_idstringyesarXiv ID of the paper to remove from the library.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

update_watch ~221

Update an existing watch in place — rename, change novelty_min, or RETARGET its structured filter `criteria`. MUTATES. Address by watch_id OR name. Changing criteria replaces the definition and clears the watch's pending hits (so stale matches don't deliver); the next daily eval repopulates. Structured watches rank by 'rising' (forecasted breakout impact) by default, and tighten with min_impact_pct for an anti-noise watch that surfaces only the breakout papers in your niche. Tune the new criteria with preview_watch first. Requires SF_API_KEY.

NameTypeReqDescription
criteriaobjectReplace the watch's filter (becomes kind='filter'). Clears pending hits.
namestringFind the watch by its current name. Provide this OR watch_id.
new_namestringRename the watch.
novelty_minnumberNew novelty floor (0..1).
recency_daysintegerWindow for the new criteria.
watch_idstringFind the watch by UUID. Provide this OR name.
NameTypeReqDescription
actionstringMachine label: saved | no_change | removed | liked | created | updated | deleted.
arxiv_idstring
collectionThe created/affected collection, when applicable.
messagestringHuman-readable summary of the outcome.
okbooleanTrue when the operation succeeded.
watchThe created/affected watch, when applicable.

No examples provided.

Common questions

What is the Scholar Feed MCP server?

Scholar Feed is an MCP server listed in the public MCP registry as io.github.YGao2005/scholar-feed-mcp. Rank CS/AI/ML papers by citations, forecast impact, or code adoption; trace 23.2M citation edges. This page covers its npm package (scholar-feed-mcp).

Is the Scholar Feed MCP server safe to use?

Scholar Feed scores 94 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Scholar Feed MCP server expose?

Scholar Feed exposes 27 tools: search_papers, get_paper, get_citations, fetch_fulltext, find_author, and 22 more. Their descriptions and schemas cost roughly 7,896 tokens of context every time the server is loaded.

Is the Scholar Feed MCP server still maintained?

Scholar Feed is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Scholar Feed MCP server under?

Scholar Feed declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.