Paper Search MCP
MCP, CLI, Skills for searching and downloading academic papers from multiple sources like arXiv, PubMed, bioRxiv, etc.
Paper Search MCP is an open-source mcp server by openags, written mainly in Python, with 2,962 GitHub stars and the MIT license. Its code was last updated Oct 2, 2026.
Scan summary: scanned Nov 5, 2026 at commit cab1b5c. Seen able to read environment and secrets, connect to the internet. Scan policy
cab1b5c · Nov 5, 2026Findings (26)
- highHigh. Something risky that needs a close look before you install.credential-access issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.credential-access issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.credential-access issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.credential-access issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.dependencies issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.dependencies issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.dependencies issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.dependencies issueDetails are available to the maintainer after claiming this listing.
- highHigh. Something risky that needs a close look before you install.dependencies issueDetails are available to the maintainer after claiming this listing.
- mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.Turns off TLS certificate checking, allowing traffic interception.
paper_search_mcp/academic_platforms/sci_hub.py:55 - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.Turns off TLS certificate checking, allowing traffic interception.
paper_search_mcp/academic_platforms/sci_hub.py:87 - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.dnspython@2.8.0: 1 known vulnerabilityGHSA-45c3-73f7-pv4m
uv.lock - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.lxml@6.0.2: 1 known vulnerabilityPYSEC-2026-87
uv.lock - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.mcp@1.27.2: 5 known vulnerabilitiesPYSEC-2026-3483, GHSA-5h93-6whr-6q8j, GHSA-84m7-p3x7-pcfv, GHSA-rwrf-2pqf-9j8j, GHSA-w4fh-qvv9-3v23
uv.lock - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.pypdf@6.9.2: 50 known vulnerabilitiesPYSEC-2026-3004, PYSEC-2026-3006, PYSEC-2026-3007, PYSEC-2026-3009, PYSEC-2026-3010 +45 more
uv.lock - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.soupsieve@2.8.3: 4 known vulnerabilitiesPYSEC-2026-3071, PYSEC-2026-3072, PYSEC-2026-4170, PYSEC-2026-4171
uv.lock - mediumMedium. Worth checking, often a vulnerable dependency or a setup problem.urllib3@2.6.3: 5 known vulnerabilitiesPYSEC-2026-141, PYSEC-2026-142, PYSEC-2026-4175, PYSEC-2026-4176, PYSEC-2026-4177
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.fastmcp@3.4.2: 1 known vulnerabilityGHSA-7xgj-8392-5q4r
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.fastmcp-slim@3.4.2: 1 known vulnerabilityGHSA-7xgj-8392-5q4r
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.idna@3.11: 1 known vulnerabilityPYSEC-2026-215
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.joserfc@1.7.5: 1 known vulnerabilityGHSA-9pg5-8c7x-5hfx
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.opentelemetry-api@1.40.0: 1 known vulnerabilityGHSA-xcq7-p3pf-p88h
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.pydantic-settings@2.13.1: 1 known vulnerabilityGHSA-4xgf-cpjx-pc3j
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.pygments@2.19.2: 1 known vulnerabilityPYSEC-2026-2987
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.requests@2.32.5: 1 known vulnerabilityPYSEC-2026-2275
uv.lock - lowLow. Minor, or common in normal tools. Shown for information.No manifest declaring network access and environment variables (agent.json)
Network activity
Tools exposed (71)
get_search_cache_statusShow opt-in local search cache settings and entry count, never query contents. Enable/disable with PAPER_SEARCH_MCP_SEARCH_CACHE_ENABLED and restart the server. Defaults to disabled; inspect docs/SEARCH_CACHE.md for TTL/size knobs.
clear_search_cacheDelete all cached search results at the configured local cache path. Works while caching is disabled and never creates a missing database. Does not delete downloaded PDFs or other files. New searches can fill the cache again if enabled; disable caching and restart to stop future writes.
search_papersUnified top-level search across all configured academic platforms. Args: query: Search query string. max_results_per_source: Max results to fetch from each selected source. sources: Comma-separated source names or 'all'. Available: arxiv,pubmed,biorxiv,medrxi
search_wosExplicit Web of Science Starter metadata search; never part of 'all'. Requires a runtime WOS_API_KEY (PAPER_SEARCH_MCP_ prefix supported). Native WoS query syntax, max_results 0..100 (at most two requests). No PDF, abstract, or full-text capability. API errors are not empty results.
search_scopusExplicit Scopus metadata search, never part of 'all'. Requires runtime SCOPUS_API_KEY (PAPER_SEARCH_MCP_ prefix supported). max_results 0..100; at most four pages. COMPLETE requires extra entitlement. sort: relevance, coverDate, citedby-count, creator; date: YYYY or YYYY-YYYY. Field
read_scopus_paperRetrieve Scopus abstract metadata, with explicit ScienceDirect opt-in. full_text=True attempts one article retrieval by a verified DOI/PII. Returns status full_text, abstract_only, or unavailable, plus reason. Never guesses by title or writes PDFs; typed API failures are not empty text.
search_arxivSearch academic papers from arXiv. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). sort_by: Sort criterion — 'relevance', 'submittedDate', or 'lastUpdatedDate' (default: 'relevance'). sor
search_pubmedSearch academic papers from PubMed. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). sort: Sort order — 'relevance' or 'pub_date' (default: 'relevance'). Returns: List of paper metadat
search_biorxivSearch academic papers from bioRxiv. Note: bioRxiv does not provide full-text keyword search. The query may be a DOI, a date range such as '2024-01-01/2024-01-31', a category such as 'bioinformatics', or an empty string for recent papers. Args: query: DOI, date range, categ
search_medrxivSearch academic papers from medRxiv. Note: medRxiv API filters by category name within the last 30 days, not full-text keyword search. Use a category keyword such as 'infectious_diseases', 'cardiovascular_medicine', 'oncology', etc. Args: query: Category name to filter by (
search_google_scholarSearch academic papers from Google Scholar. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_iacrSearch academic papers from IACR ePrint Archive. Args: query: Search query string (e.g., 'cryptography', 'secret sharing'). max_results: Maximum number of papers to return (default: 10). fetch_details: Whether to fetch detailed information for each paper (default: True).
download_arxivDownload PDF of an arXiv paper. Args: paper_id: arXiv paper ID (e.g., '2106.12345'). save_path: Directory to save the PDF (default: './downloads'). Returns: Path to the downloaded PDF file.
download_pubmedAttempt to download PDF of a PubMed paper. Args: paper_id: PubMed ID (PMID). save_path: Directory to save the PDF (default: './downloads'). Returns: str: Message indicating that direct PDF download is not supported.
download_biorxivDownload PDF of a bioRxiv paper. Args: paper_id: bioRxiv DOI. save_path: Directory to save the PDF (default: './downloads'). Returns: Path to the downloaded PDF file.
download_medrxivDownload PDF of a medRxiv paper. Args: paper_id: medRxiv DOI. save_path: Directory to save the PDF (default: './downloads'). Returns: Path to the downloaded PDF file.
download_iacrDownload PDF of an IACR ePrint paper. Args: paper_id: IACR paper ID (e.g., '2009/101'). save_path: Directory to save the PDF (default: './downloads'). Returns: Path to the downloaded PDF file.
read_arxiv_paperRead and extract text content from an arXiv paper PDF. Args: paper_id: arXiv paper ID (e.g., '2106.12345'). save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: The extracted text content of the paper.
read_pubmed_paperRead and extract text content from a PubMed paper. Args: paper_id: PubMed ID (PMID). save_path: Directory where the PDF would be saved (unused). Returns: str: Message indicating that direct paper reading is not supported.
read_biorxiv_paperRead and extract text content from a bioRxiv paper PDF. Args: paper_id: bioRxiv DOI. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: The extracted text content of the paper.
read_medrxiv_paperRead and extract text content from a medRxiv paper PDF. Args: paper_id: medRxiv DOI. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: The extracted text content of the paper.
read_iacr_paperRead and extract text content from an IACR ePrint paper PDF. Args: paper_id: IACR paper ID (e.g., '2009/101'). save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: The extracted text content of the paper.
search_semanticSearch academic papers from Semantic Scholar. Args: query: Search query string (e.g., 'machine learning'). year: Optional year filter (e.g., '2019', '2016-2020', '2010-', '-2015'). max_results: Maximum number of papers to return (default: 10). Returns: List o
download_semanticDownload PDF of a Semantic Scholar paper. Args: paper_id: Semantic Scholar paper ID, Paper identifier in one of the following formats: - Semantic Scholar ID (e.g., "649def34f8be52c8b66281af98ae884c09aef38b") - DOI:<doi> (e.g., "DOI:10.18653/v1/N18-3011")
read_semantic_paperRead and extract text content from a Semantic Scholar paper. Args: paper_id: Semantic Scholar paper ID, Paper identifier in one of the following formats: - Semantic Scholar ID (e.g., "649def34f8be52c8b66281af98ae884c09aef38b") - DOI:<doi> (e.g., "DOI:10.18653/v1
search_crossrefSearch academic papers from CrossRef database. CrossRef is a scholarly infrastructure organization that provides persistent identifiers (DOIs) for scholarly content and metadata. It's one of the largest citation databases covering millions of academic papers, journals, books,
get_crossref_paper_by_doiGet a specific paper from CrossRef by its DOI. Args: doi: Digital Object Identifier (e.g., '10.1038/nature12373'). Returns: Paper metadata in dictionary format, or empty dict if not found. Example: get_crossref_paper_by_doi("10.1038/nature12373")
download_crossrefAttempt to download PDF of a CrossRef paper. Args: paper_id: CrossRef DOI (e.g., '10.1038/nature12373'). save_path: Directory to save the PDF (default: './downloads'). Returns: str: Message indicating that direct PDF download is not supported. Note:
download_scihubDownload paper PDF via Sci-Hub (optional fallback connector). Args: identifier: DOI, title, PMID, or paper URL. save_path: Directory to save the PDF. base_url: Sci-Hub mirror URL. Returns: Downloaded PDF path on success; error message on failure.
download_with_fallbackTry source-native download, OA repositories, Unpaywall, then optional Sci-Hub. Args: source: Source name (arxiv, biorxiv, medrxiv, iacr, semantic, crossref, pubmed, pmc, core, europepmc, citeseerx, doaj, base, zenodo, hal, ssrn). paper_id: Source-native paper identifier.
read_crossref_paperAttempt to read and extract text content from a CrossRef paper. Args: paper_id: CrossRef DOI (e.g., '10.1038/nature12373'). save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Message indicating that direct paper reading is not
search_openalexSearch academic papers from OpenAlex. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). filter: OpenAlex filter string. Examples: - 'open_access.is_oa:true,from_publication_
extract_sectionsSplit an already-downloaded PDF into heuristic heading-based sections. pdf_path must be relative to PAPER_SEARCH_MCP_SECTION_PDF_ROOT (default ./downloads); absolute paths, traversal and symlinks are rejected. Reads at most 20 MiB, 100 pages, 200000 characters and 100 sections, with a 6
get_citing_papersGet one hop of papers citing a DOI or OpenAlex work ID (never a title). Most-cited first. Limits: 500 results, 5 pages, 8 HTTP requests, 60 seconds. The seed lookup and redirects consume requests; no retries or enrichment. Returns papers with pagination/truncation metadata. API failures
get_referenced_papersGet one hop of papers referenced by a DOI or OpenAlex work ID. Same budgets/error contract as get_citing_papers. Missing OpenAlex reference coverage may yield an empty successful list; it does not prove no references exist in the original paper. No title guessing or multi-hop graph trav
search_pmcSearch academic papers from PubMed Central (PMC). Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_coreSearch academic papers from CORE. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_europepmcSearch academic papers from Europe PMC. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_dblpSearch academic papers from dblp computer science bibliography. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_openaireSearch academic papers from OpenAIRE European Open Access infrastructure. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_citeseerxSearch academic papers from CiteSeerX digital library. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_doajSearch academic papers from DOAJ (Directory of Open Access Journals). Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_baseSearch academic papers from BASE (Bielefeld Academic Search Engine). Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_zenodoSearch academic papers from Zenodo open repository. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_halSearch academic papers from HAL open archive. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum number of papers to return (default: 10). Returns: List of paper metadata in dictionary format.
search_openreviewSearch public OpenReview API v2 papers anonymously (0..1000 results). Reviews, replies, private notes and API v1-only records are excluded. Up to 1000 hits are scanned in 100-record pages; errors are reported.
download_openreviewDownload a public OpenReview PDF by note ID or official forum URL. Verifies public paper identity, PDF structure and first-page title. Does not use authentication or follow redirects; files over 50 MiB are rejected.
read_openreview_paperDownload, validate and read an anonymously accessible OpenReview PDF.
search_ssrnSearch SSRN-indexed metadata through OpenAlex. Uses bounded cursor pagination (0..1000 results), with explicit API errors. Direct public SSRN download/read is separate and best-effort. Args: query: Search query string (e.g., 'machine learning'). max_results: Maximum num
search_unpaywallLookup a DOI via Unpaywall and return OA metadata. Unpaywall is DOI-centric and does not support generic keyword search. This tool extracts the first DOI from `query` and returns at most one record. Args: query: DOI string or text containing a DOI. max_results: Kept for
read_dblp_paperAttempt to read and extract text content from a dblp paper. Note: dblp doesn't provide direct paper content access. This function returns an informative message. Args: paper_id: dblp paper identifier. save_path: Directory where the PDF would be saved (unused). Retur
download_dblpDownload PDF for a paper from dblp. Note: dblp doesn't provide direct PDF access. This function returns an informative message. Args: paper_id: dblp paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Message indica
read_openaire_paperAttempt to read and extract text content from an OpenAIRE paper. Args: paper_id: OpenAIRE paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text or error message.
download_openaireDownload PDF for a paper from OpenAIRE. Args: paper_id: OpenAIRE paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF or error message.
read_citeseerx_paperRead and extract text content from a CiteSeerX paper. Args: paper_id: CiteSeerX paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text or fallback abstract/error message.
download_citeseerxDownload PDF for a paper from CiteSeerX. Args: paper_id: CiteSeerX paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF or error message.
read_doaj_paperRead and extract text content from a DOAJ paper. Args: paper_id: DOAJ paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text content.
download_doajDownload PDF for a paper from DOAJ. Args: paper_id: DOAJ paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF.
read_base_paperRead and extract text content from a BASE paper. Args: paper_id: BASE paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text content.
download_baseDownload PDF for a paper from BASE. Args: paper_id: BASE paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF.
read_zenodo_paperRead and extract text content from a Zenodo paper. Args: paper_id: Zenodo paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text content.
download_zenodoDownload PDF for a paper from Zenodo. Args: paper_id: Zenodo paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF.
read_hal_paperRead and extract text content from a HAL paper. Args: paper_id: HAL paper identifier. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text content.
download_halDownload PDF for a paper from HAL. Args: paper_id: HAL paper identifier. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Path to downloaded PDF.
read_ssrn_paperRead paper content from SSRN. Note: SSRN connector is metadata-only and read is not supported. Args: paper_id: SSRN paper identifier. save_path: Directory where the PDF is/will be saved (unused). Returns: str: Error message from metadata-only SSRN connector.
download_ssrnDownload PDF for a paper from SSRN. Note: SSRN connector is metadata-only and download is not supported. Args: paper_id: SSRN paper identifier. save_path: Directory to save the PDF (unused). Returns: str: Error message from metadata-only SSRN connector.
read_openalex_paperAttempt to read and extract text content from an OpenAlex paper. Args: paper_id: OpenAlex paper ID. save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Message indicating that direct paper reading is not supported natively.
download_openalexDownload PDF for a paper from OpenAlex. Args: paper_id: OpenAlex paper ID. save_path: Directory to save the PDF (default: './downloads'). Returns: str: Error message, typically OpenAlex relies on extracted pdf_url instead of direct downloads.
search_acmSearch ACM Digital Library for papers. Args: query: Search query string. max_results: Maximum number of results (default: 10). Returns: List of paper dicts from ACM DL.
download_acmDownload a PDF from ACM Digital Library. dl.acm.org sits behind a Cloudflare browser challenge that blocks scripted downloads; on a block, raises with the browser URL and a download_with_fallback suggestion. Args: paper_id: ACM DOI (e.g. '10.1145/...'). save_path: Direc
read_acm_paperDownload and read an ACM Digital Library paper. Args: paper_id: ACM DOI (e.g. '10.1145/...'). save_path: Directory where the PDF is/will be saved (default: './downloads'). Returns: str: Extracted text content.
Automated result for the commit shown. See our scan policy. View the scan log
Maintainers can claim the listing to rescan, or dispute a result.
Paper Search MCP alternatives
View more →Similar mcp servers in Research & Analysis, ranked by GitHub stars. Compare licence, recent activity and scan status before you choose.
| Name | Stars | Licence | Last updated | Scan |
|---|---|---|---|---|
| Paper Search MCP (this page) openags | 3k | MIT | Oct 2, 2026 | Scanned, no flagged issues |
| Worldmonitor koala73 | 90k | AGPL-3.0 | Nov 1, 2026 | Scanned, no flagged issues |
| GPT Researcher assafelovic | 30k | Apache-2.0 | Oct 10, 2026 | Scanned, no flagged issues |
| Auto Claude Code Research In Sleep wanshuiyin | 18k | MIT | Nov 1, 2026 | Scanned, no flagged issues |
| Deep Research u14app | 4.7k | MIT | Jun 18, 2026 | Scanned, no flagged issues |
| MCP Server Chart antvis | 4.4k | MIT | Aug 27, 2026 | Scanned, no flagged issues |