This Node.js MCP server connects Claude to 14 academic databases including arXiv, PubMed, Web of Science, and Google Scholar through a unified search interface. It exposes two main operations: search_papers for cross-platform queries and download_paper for PDF retrieval from open access sources. You'll reach for this when building research workflows that need to pull academic papers directly into Claude conversations. The server handles API authentication for paid services like Web of Science and Elsevier, includes rate limiting and error handling, and returns standardized metadata across all platforms. Setup requires API keys for premium databases but works immediately with free sources like arXiv and Crossref.
A Node.js Model Context Protocol (MCP) server for searching and downloading academic papers from multiple sources, including arXiv, Web of Science, PubMed, Google Scholar, Sci-Hub, ScienceDirect, Springer, Wiley, Scopus, Crossref, and 14 academic platforms in total.
| Platform | Search | Download | Full Text | Citations | API Key | Special Features |
|---|---|---|---|---|---|---|
| Crossref | ✅ | ❌ | ❌ | ✅ | ❌ | Default search, extensive metadata coverage |
| arXiv | ✅ | ✅ | ✅ | ❌ | ❌ | Physics/CS preprints |
| Web of Science | ✅ | ❌ | ❌ | ✅ | ✅ Required | Multi-topic search, date sorting, year ranges |
| PubMed | ✅ | ❌ | ❌ | ❌ | 🟡 Optional | Biomedical literature |
| Google Scholar | ✅ | ❌ | ❌ | ✅ | ❌ | Comprehensive academic search |
| bioRxiv | ✅ | ✅ | ✅ | ❌ | ❌ | Biology preprints |
| medRxiv | ✅ | ✅ | ✅ | ❌ | ❌ | Medical preprints |
| Semantic Scholar | ✅ | ✅ | ❌ | ✅ | 🟡 Optional | AI semantic search |
| IACR ePrint | ✅ | ✅ | ✅ | ❌ | ❌ | Cryptography papers |
| Sci-Hub | ✅ | ✅ | ❌ | ❌ | ❌ | Universal paper access via DOI |
| ScienceDirect | ✅ | ❌ | ❌ | ✅ | ✅ Required | Elsevier's full-text database |
| Springer Nature | ✅ | ✅* | ❌ | ❌ | ✅ Required | Dual API: Meta v2 & OpenAccess |
| Wiley | ❌ | ✅ | ✅ | ❌ | ✅ Required | TDM API: DOI-based PDF download only |
| Scopus | ✅ | ❌ | ❌ | ✅ | ✅ Required | Largest citation database |
✅ Supported | ❌ Not supported | 🟡 Optional | ✅* Open Access only
Note: Wiley TDM API does not support keyword search. Use
search_crossrefto find Wiley articles, then usedownload_paperwithplatform="wiley"to download PDFs by DOI.
This project includes integrations that may have legal, contractual (ToS), and ethical constraints. You are responsible for ensuring your usage complies with applicable laws, institutional policies, and third‑party terms.
# Clone repository
git clone https://github.com/your-username/paper-search-mcp-nodejs.git
cd paper-search-mcp-nodejs
# Install dependencies
npm install
# Copy environment template
cp .env.example .env
Get Web of Science API Key
.env fileGet PubMed API Key (Optional)
Configure Environment Variables
# Edit .env file
WOS_API_KEY=your_actual_api_key_here
WOS_API_VERSION=v1
# PubMed API key (optional, recommended for better performance)
PUBMED_API_KEY=your_ncbi_api_key_here
# Semantic Scholar API key (optional, increases rate limits)
SEMANTIC_SCHOLAR_API_KEY=your_semantic_scholar_api_key
# Elsevier API key (required for ScienceDirect and Scopus)
ELSEVIER_API_KEY=your_elsevier_api_key
# Springer Nature API keys (required for Springer)
SPRINGER_API_KEY=your_springer_api_key # For Metadata API v2
# Optional: Separate key for OpenAccess API (if different from main key)
SPRINGER_OPENACCESS_API_KEY=your_openaccess_api_key
# Wiley TDM token (required for Wiley)
WILEY_TDM_TOKEN=your_wiley_tdm_token
# Direct run with npx (most common MCP deployment)
npx -y paper-search-mcp-nodejs
# Or install globally
npm install -g paper-search-mcp-nodejs
paper-search-mcp
# Build TypeScript code
npm run build
# Start server
npm start
# Or run in development mode
npm run dev
Add the following configuration to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"paper-search-nodejs": {
"command": "npx",
"args": ["-y", "paper-search-mcp-nodejs"],
"env": {
"WOS_API_KEY": "your_web_of_science_api_key"
}
}
}
}
{
"mcpServers": {
"paper_search_nodejs": {
"command": "node",
"args": ["/path/to/paper-search-mcp-nodejs/dist/server.js"],
"env": {
"WOS_API_KEY": "your_web_of_science_api_key"
}
}
}
}
search_papersSearch academic papers across multiple platforms
// Random platform selection (default behavior)
search_papers({
query: "machine learning",
platform: "all", // Randomly selects one platform for efficiency
maxResults: 10,
year: "2023",
sortBy: "date"
})
// Search specific platform
search_papers({
query: "quantum computing",
platform: "webofscience", // Target specific platform
maxResults: 5
})
Platform Selection Behavior:
platform: "crossref" (default) - Free API with extensive scholarly metadata coverageplatform: "all" - Randomly selects one platform for efficient, focused resultscrossref, arxiv, webofscience/wos, pubmed, biorxiv, medrxiv, semantic, iacr, googlescholar/scholar, scihub, sciencedirect, springer, scopuswiley only supports PDF download by DOI, not keyword searchsearch_crossrefSearch academic papers from Crossref database (default search platform)
search_crossref({
query: "machine learning",
maxResults: 10,
year: "2023",
author: "Smith",
sortBy: "relevance", // or "date", "citations"
sortOrder: "desc"
})
search_arxivSearch arXiv preprints specifically
search_arxiv({
query: "transformer neural networks",
maxResults: 10,
category: "cs.AI",
author: "Vaswani",
year: "2023",
sortBy: "date", // relevance, date, citations
sortOrder: "desc" // asc, desc
})
search_webofscienceSearch Web of Science database specifically
search_webofscience({
query: "CRISPR gene editing",
maxResults: 15,
year: "2022",
journal: "Nature"
})
search_pubmedSearch PubMed/MEDLINE biomedical literature database
search_pubmed({
query: "COVID-19 vaccine efficacy",
maxResults: 20,
year: "2023",
author: "Smith",
journal: "New England Journal of Medicine",
publicationType: ["Journal Article", "Clinical Trial"],
sortBy: "date" // relevance, date
})
search_google_scholarSearch Google Scholar academic database
search_google_scholar({
query: "machine learning",
maxResults: 10,
yearLow: 2020,
yearHigh: 2023,
author: "Bengio"
})
search_biorxiv / search_medrxivSearch biology and medical preprints
search_biorxiv({
query: "CRISPR",
maxResults: 15,
days: 30,
category: "genomics" // neuroscience, genomics, etc.
})
search_medrxiv({
query: "COVID-19",
maxResults: 10,
days: 30,
category: "infectious_diseases"
})
search_semantic_scholarSearch Semantic Scholar AI semantic database
search_semantic_scholar({
query: "deep learning",
maxResults: 10,
fieldsOfStudy: ["Computer Science"],
year: "2023"
})
search_iacrSearch IACR ePrint cryptography archive
search_iacr({
query: "zero knowledge proof",
maxResults: 5,
fetchDetails: true
})
search_scihubSearch and download papers from Sci-Hub using DOI or paper URL
search_scihub({
doiOrUrl: "10.1038/nature12373",
downloadPdf: true,
savePath: "./downloads"
})
search_sciencedirectSearch Elsevier ScienceDirect database
search_sciencedirect({
query: "artificial intelligence",
maxResults: 10,
year: "2023",
author: "Smith",
openAccess: true // Filter for open access articles
})
search_springerSearch Springer Nature database (Metadata API v2 or OpenAccess API)
search_springer({
query: "machine learning",
maxResults: 10,
year: "2023",
openAccess: true, // Use OpenAccess API for downloadable PDFs
type: "Journal" // Filter: Journal, Book, or Chapter
})
search_scopusSearch Scopus citation database
search_scopus({
query: "renewable energy",
maxResults: 10,
year: "2023",
affiliation: "MIT",
documentType: "ar" // ar=article, cp=conference, re=review
})
check_scihub_mirrorsCheck health status of Sci-Hub mirror sites
check_scihub_mirrors({
forceCheck: true // Force fresh health check
})
download_paperDownload paper PDF files
download_paper({
paperId: "2106.12345", // or DOI for Sci-Hub
platform: "arxiv", // or "scihub" for Sci-Hub downloads
savePath: "./downloads"
})
get_paper_by_doiGet paper information by DOI
get_paper_by_doi({
doi: "10.1038/s41586-023-12345-6",
platform: "all"
})
get_platform_statusCheck platform status and API keys
get_platform_status({})
All platform paper data is converted to a unified format:
interface Paper {
paperId: string; // Unique identifier
title: string; // Paper title
authors: string[]; // Author list
abstract: string; // Abstract
doi: string; // DOI
publishedDate: Date; // Publication date
pdfUrl: string; // PDF link
url: string; // Paper page URL
source: string; // Source platform
citationCount?: number; // Citation count
journal?: string; // Journal name
year?: number; // Publication year
categories?: string[]; // Subject categories
keywords?: string[]; // Keywords
// ... more fields
}
src/
├── models/
│ └── Paper.ts # Paper data model
├── platforms/
│ ├── PaperSource.ts # Abstract base class
│ ├── ArxivSearcher.ts # arXiv searcher
│ ├── WebOfScienceSearcher.ts # Web of Science searcher
│ ├── PubMedSearcher.ts # PubMed searcher
│ ├── GoogleScholarSearcher.ts # Google Scholar searcher
│ ├── BioRxivSearcher.ts # bioRxiv/medRxiv searcher
│ ├── SemanticScholarSearcher.ts # Semantic Scholar searcher
│ ├── IACRSearcher.ts # IACR ePrint searcher
│ ├── SciHubSearcher.ts # Sci-Hub searcher with mirror management
│ ├── ScienceDirectSearcher.ts # ScienceDirect (Elsevier) searcher
│ ├── SpringerSearcher.ts # Springer Nature searcher (Meta v2 & OpenAccess APIs)
│ ├── WileySearcher.ts # Wiley TDM API (DOI-based PDF download only)
│ ├── ScopusSearcher.ts # Scopus citation database searcher
│ └── CrossrefSearcher.ts # Crossref API searcher (default platform)
├── utils/
│ └── RateLimiter.ts # Token bucket rate limiter
└── server.ts # MCP server main file
PaperSourceserver.tsThe codebase includes comprehensive security and optimization utilities:
src/utils/
├── SecurityUtils.ts # Security utilities
│ ├── sanitizeDoi() # DOI format validation
│ ├── escapeQueryValue() # Query injection prevention
│ ├── validateQueryComplexity() # DoS prevention
│ ├── withTimeout() # Request timeout protection
│ ├── sanitizeRequest() # Sensitive data removal
│ └── maskSensitiveData() # API key masking
├── ErrorHandler.ts # Unified error handling
│ ├── ApiError class # Custom error with metadata
│ ├── HTTP error codes # 400-504 handling
│ └── Retry logic # Exponential backoff
├── RateLimiter.ts # Token bucket rate limiting
├── QuotaManager.ts # Daily quota tracking (New in v0.2.6)
├── RequestCache.ts # LRU caching for requests (New in v0.2.6)
└── PDFExtractor.ts # PDF text extraction (New in v0.2.6)
src/services/
└── CitationService.ts # Citation fetching service (New in v0.2.6)
Security Best Practices:
The test suite has been reorganized for better maintainability (v0.2.6):
# Run tests
npm test
# Run linting
npm run lint
# Code formatting
npm run format
Test Coverage:
| Test Suite | Coverage |
|---|---|
| Platform Searchers | 13/13 ✅ |
| SecurityUtils | ✅ |
| ErrorHandler | ✅ |
| RateLimiter & Integration | ✅ |
| QuotaManager | ✅ |
| RequestCache | ✅ |
Springer Nature provides two APIs:
Metadata API v2 (Main API)
https://api.springernature.com/meta/v2/jsonOpenAccess API (Optional)
https://api.springernature.com/openaccess/json// Search all Springer content
search_springer({
query: "machine learning",
maxResults: 10
})
// Search only open access papers
search_springer({
query: "COVID-19",
openAccess: true, // Uses OpenAccess API if available
maxResults: 5
})
🎯 WoS Starter API v1/v2 Support: Uses Clarivate's WoS Starter API with full field tag support.
API Version Configuration:
# In .env file (default: v1)
WOS_API_VERSION=v1 # Stable, recommended
# WOS_API_VERSION=v2 # Newer version, same endpoints
// Multi-topic search
search_webofscience({
query: 'oriented structure',
year: '2023-2025',
sortBy: 'date',
sortOrder: 'desc',
maxResults: 10
})
// Year range filtering
search_webofscience({
query: 'machine learning',
year: '2020-2024', // Supports range format
sortBy: 'citations',
sortOrder: 'desc'
})
// Advanced query with filters
search_webofscience({
query: 'blockchain',
author: 'zhang',
journal: 'Nature',
year: '2023',
sortBy: 'date',
sortOrder: 'desc'
})
// Traditional WOS query syntax with field tags
search_webofscience({
query: 'TS="machine learning" AND PY=2023 AND DT="Article"',
maxResults: 20
})
🔧 v0.2.6 Improvements:
RequestCache for caching search results and API responsesRateLimiter and QuotaManager to prevent API abuse and 429 errorsCitationService and PDFExtractor for future enhancementstests/platforms, tests/utils, and tests/integrationSupported Search Options:
query: Search terms (supports multi-topic)year: Single year "2023" or range "2020-2023"author: Author name filteringjournal: Journal/source filteringsortBy: Sort field (date, citations, relevance, title, author, journal)sortOrder: Sort direction (asc, desc)maxResults: Maximum results (1-50 per page)Supported WOS Field Tags (18 total):
| Tag | Description | Tag | Description |
|---|---|---|---|
TS | Topic (title, abstract, keywords) | TI | Title |
AU | Author | AI | Author Identifier |
SO | Source/Journal | IS | ISSN/ISBN |
PY | Publication Year | FPY | Final Publication Year |
DO | DOI | DOP | Date of Publication |
VL | Volume | PG | Page |
CS | Issue | DT | Document Type |
PMID | PubMed ID | UT | Accession Number |
OG | Organization | SUR | Source URL |
Example with Field Tags:
// Search by PMID
search_webofscience({ query: 'PMID=12345678' })
// Search by DOI
search_webofscience({ query: 'DO="10.1038/nature12373"' })
// Filter by document type
search_webofscience({ query: 'TS="CRISPR" AND DT="Review"' })
// Search specific volume/issue
search_webofscience({ query: 'SO="Nature" AND VL=580 AND CS=7805' })
🔧 Debugging WOS Issues:
# Enable debug logging
export NODE_ENV=development
# In CI, logDebug is enabled automatically when CI=true
MIT License - see LICENSE file for details.
Contributions welcome! See CONTRIBUTING.md for guidelines.
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)If you encounter issues, please report them at GitHub Issues.
⭐ If this project helps you, please give it a star!
com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp