A Node.js MCP server for searching and downloading academic papers from multiple sources, including arXiv, PubMed, bioRxiv, Web of Science, and more.
Paper Search MCP has 15 tools with complete schemas and descriptions, but exhibits inconsistent naming conventions and several missing parameter descriptions. All tools have JSON Schema definitions with proper type constraints and enums where applicable. However, naming lacks verb-noun consistency (e.g., 'search_papers' vs 'search_arxiv' vs 'download_paper'), and several parameters lack descriptions. Output schemas are not documented. Error handling exists but lacks recovery guidance. Tool descriptions are adequate (50-150 chars typical) but could be more specific about prerequisites and data transformations.
Discover public access options for a paper
Download PDF file of an academic paper
Download a publicly available paper PDF
Get paper information by DOI
Get paper content as markdown
Get references, citing records, or related records through Web of Science Expanded API
Search academic papers specifically from arXiv preprint server
Inconsistent tool naming conventions. Multiple search tools exist (search_papers, search_arxiv, search_pubmed, etc.) but lack clear distinguish-ability in names. Similar-sounding tools with overlapping functionality (search_arxiv, search_biorxiv, search_medrxiv, search_semantic_scholar) increase LLM confusion. Recommend namespacing: arxiv_search, pubmed_search, biorxiv_search instead of search_arxiv, search_pubmed, search_biorxiv.
Missing output schema documentation. While input schemas are complete, no tool documents what fields are returned. LLMs cannot infer whether a search returns [paper_id, title, authors, year] or [paper_id, title, authors, year, abstract, doi, keywords, citations_count]. This forces agents to guess at downstream field availability and risks broken tool chains.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 56 | 2024-11-05+ | v1 |
Search bioRxiv preprint server for biology papers
Search IACR ePrint Archive for cryptography papers
Search medRxiv preprint server for medical papers
Search academic papers from multiple sources including arXiv, Web of Science, etc.
Search biomedical literature from PubMed/MEDLINE database using NCBI E-utilities API
Search Sci-Hub for papers
Search Semantic Scholar for academic papers with citation data
Search Web of Science Starter (default) or explicitly selected Expanded API
Sparse parameter descriptions in several tools. 'search_scihub' has only one parameter (query) with a generic description 'Search query string' (21 chars). 'discover_paper_access' parameters (paperId, doi) lack context on which is required, when to use each, or what the function returns. Parameters should follow the pattern: 'The [resource] to [action] (format: [constraint], e.g. [example])'.
Missing parameter descriptions for resource identifiers. 'download_paper' has parameters 'paperId' and 'platform' with minimal descriptions ('Paper ID (e.g., arXiv ID, DOI for Sci-Hub)' and 'Platform to use for download'). It's unclear which platforms accept which ID formats, or what happens if a mismatch occurs. Should document: 'paperId: Identifier format depends on platform (arXiv: YYMM.NNNNN, DOI: 10.XXXX/YYYY, PMID: numeric).'
Error responses lack recovery guidance. Code in callToolHandler.ts returns 'Error executing tool X: [message]' with isError=true, but does not categorize the error (retryable vs user-fixable vs fatal) or suggest next steps. An LLM receiving 'Platform not found' has no way to know whether to retry, try a different platform, or ask the user.
Destructive operations (download_paper, download_public_paper) lack confirmation or dry-run support. File downloads overwrite paths without warning. If an LLM misspecifies 'savePath', data could be silently lost. Consider a 'dryRun' parameter or explicit confirmation-required pattern.
Required parameters marked inconsistently. 'discover_paper_access' declares no required fields (required: []), but the description implies at least one of paperId or doi must be present. Undocumented dependencies force LLMs to guess, leading to invalid calls or wasted retries.