![ScholarMCP banner](public/scholarmcp_banner.png) # ScholarMCP [![npm](https://img.shields.io/npm/v/scholar-mcp)](https://www.npmjs.com/package/scholar-mcp) [![test](https://github.com/lstudlo/ScholarMCP/actions/workflows/test.yml/badge.svg)](https://github.com/lstudlo/ScholarMCP/actions/workflows/test.yml) [![latest commit](https://img.shields.io/github/last-commit/lstudlo/ScholarMCP)](https://github.com/lstudlo/ScholarMCP/commits/main) [![license](https://img.shields.io/github/license/lstudlo/ScholarMCP)](https://github.com/lstudlo/ScholarMCP/blob/main/LICENSE) ScholarMCP is an open-source MCP server for academic research. Search Google Scholar, OpenAlex, Crossref, and Semantic Scholar, parse accessible PDFs, and prepare references in your coding agent. [ScholarMCP website and documentation](https://scholar-mcp.lstudlo.com/) · [Installation](https://scholar-mcp.lstudlo.com/getting-started/quick-start/) · [Academic paper search guide](https://scholar-mcp.lstudlo.com/guides/academic-paper-search/) ### Early Development Notice This project is still in early development, and rough edges or bugs may occur. If you run into a problem, please open an issue and include: 1. the agent used 2. screenshots, if applicable 3. steps to reproduce the issue ### ScholarMCP gives your agent tools to: - search papers across multiple sources - ingest and parse full-text PDFs - extract structured paper details - suggest citations and build references - validate manuscript citations ### ScholarMCP is for... Use this if you want Claude Code, Codex, or any MCP-compatible coding agent to run research tasks directly from chat. ## Quick Start ### 1. Prerequisites - Node.js `>=20` - `npm` (for install/publish) - `pnpm` (for contributors working from source) ### 2. Install as an npm package (recommended) ```bash npm install -g scholar-mcp ``` One-off run without global install: ```bash npx -y scholar-mcp --transport=stdio ``` Install from GitHub Packages (scoped mirror package): ```bash npm install -g @lstudlo/scholar-mcp --registry=https://npm.pkg.github.com ``` ### 3. Run Stdio mode: ```bash scholar-mcp --transport=stdio ``` HTTP mode: ```bash scholar-mcp --transport=http ``` Health check (HTTP mode): ```bash curl http://127.0.0.1:3000/health ``` ### 4. Run from source (contributors) ```bash pnpm install pnpm dev:stdio ``` ## Use with Coding Agents ScholarMCP works best over `stdio` for local coding agents. The docs site has full step-by-step guides for [Claude Code](https://scholar-mcp.lstudlo.com/getting-started/claude-code/), [OpenAI Codex](https://scholar-mcp.lstudlo.com/getting-started/openai-codex/), and [OpenCode](https://scholar-mcp.lstudlo.com/getting-started/opencode/). Anthropic officially documents `claude mcp add ... -- `, and OpenAI officially documents `codex mcp add ...`; the short forms below keep those CLI flows as the primary setup path. Shared environment values used below: ```bash SCHOLAR_MCP_TRANSPORT=stdio SCHOLAR_REQUEST_DELAY_MS=350 RESEARCH_ALLOW_REMOTE_PDFS=true RESEARCH_ALLOW_LOCAL_PDFS=true ``` ### Claude Code Add with the Claude CLI: ```bash claude mcp add -s user \ --transport stdio \ -e SCHOLAR_MCP_TRANSPORT=stdio \ -e SCHOLAR_REQUEST_DELAY_MS=350 \ -e RESEARCH_ALLOW_REMOTE_PDFS=true \ -e RESEARCH_ALLOW_LOCAL_PDFS=true \ scholar_mcp -- npx -y scholar-mcp --transport=stdio ``` Verify: ```bash claude mcp get scholar_mcp ``` Manual fallback: - add `scholar_mcp` under `mcpServers` in `~/.claude.json` - use project-local `.mcp.json` if you want the config scoped to the repo - keep the `--` separator in the CLI form; Claude needs it to stop parsing flags ### OpenAI Codex Add with the Codex CLI: ```bash codex mcp add scholar_mcp \ --env SCHOLAR_MCP_TRANSPORT=stdio \ --env SCHOLAR_REQUEST_DELAY_MS=350 \ --env RESEARCH_ALLOW_REMOTE_PDFS=true \ --env RESEARCH_ALLOW_LOCAL_PDFS=true \ -- npx -y scholar-mcp --transport=stdio ``` Verify: ```bash codex mcp list codex mcp get scholar_mcp --json ``` Manual fallback: - add the server to `~/.codex/config.toml` under `[mcp_servers.scholar_mcp]` - Codex CLI and the Codex app share that MCP config model ### OpenCode Add with the OpenCode CLI: ```bash opencode mcp add ``` Recommended interactive values: - name: `scholar_mcp` - type: `local` - command: `npx -y scholar-mcp --transport=stdio` - enabled: `true` - env: use the four shared variables above Verify: ```bash opencode mcp list ``` Manual fallback: - add the server to `~/.config/opencode/opencode.json` - use `"type": "local"` and a command array like `["npx", "-y", "scholar-mcp", "--transport=stdio"]` ### Run from source If you are developing ScholarMCP locally, use this launcher instead of `npx -y scholar-mcp --transport=stdio`: ```bash pnpm --filter scholar-mcp dev:stdio ``` Use the same environment values shown above in whichever client you register. ### Generic MCP clients - `stdio` command: - `scholar-mcp --transport=stdio` - Or: `npx -y scholar-mcp --transport=stdio` - HTTP endpoint: 1. Start server with `SCHOLAR_MCP_TRANSPORT=http scholar-mcp` 2. Connect client to `http://127.0.0.1:3000/mcp` 3. Optional auth: set `SCHOLAR_MCP_API_KEY` and send bearer auth header from your client ## MCP Tools | Tool | Purpose | |---|---| | `search_literature_graph` | Federated search over OpenAlex/Crossref/Semantic Scholar (+ optional scholar scrape). | | `search_google_scholar_key_words` | Keyword search on Google Scholar. | | `search_google_scholar_advanced` | Scholar search with author/year/phrase filters. | | `get_author_info` | Resolve author profile and top publications. | | `ingest_paper_fulltext` | Start async full-text ingestion from DOI/URL/PDF/local path. | | `get_ingestion_status` | Poll ingestion job status and parsed summary. | | `extract_granular_paper_details` | Extract methods, claims, datasets, metrics, and references. | | `suggest_contextual_citations` | Suggest citations from manuscript context. | | `build_reference_list` | Generate formatted bibliography and BibTeX. | | `validate_manuscript_citations` | Detect missing/uncited/duplicate citation issues. | ## Example Agent Prompts - "Find 10 recent papers on retrieval-augmented generation and summarize methods and datasets." - "Ingest full text for DOI `10.1038/s41467-024-55563-6`, then extract claims and limitations." - "Given this draft section, suggest citations in IEEE style and generate BibTeX." - "Validate my manuscript citations against this reference list and show missing citations." ## Configuration Most users only need these: - `SCHOLAR_MCP_TRANSPORT`: `stdio` | `http` | `both` (default: `stdio`) - `SCHOLAR_REQUEST_DELAY_MS`: request pacing to reduce rate-limit risk (default: `250`) - `RESEARCH_ALLOW_REMOTE_PDFS`: allow remote PDF downloads for ingestion (default: `true`) - `RESEARCH_ALLOW_LOCAL_PDFS`: allow local PDF ingestion (default: `true`) - `SCHOLAR_MCP_API_KEY`: optional bearer token for HTTP mode - `RESEARCH_GROBID_URL`: optional GROBID endpoint The CLI loads `.env` from the current working directory automatically at startup. Advanced options exist in `src/config.ts` for timeouts, retries, HTTP session capacity/TTL, provider tuning, and cache behavior. ## Troubleshooting - `Invalid environment variable format` in `claude mcp add`: - Add `--` before the MCP server name (see Claude setup command above). - `Unable to resolve a downloadable PDF URL from input` on DOI ingestion: - The DOI and landing page may not expose an accessible PDF URL. - Retry with `pdf_url` (direct PDF) or `local_pdf_path`. - Too many Scholar failures or throttling: - Increase `SCHOLAR_REQUEST_DELAY_MS` (for example `500` to `1000`). ## Usage Notes Google Scholar may throttle automated traffic. Use conservative request pacing, respect provider terms, and avoid abusive query patterns. ## Publishing Releases publish to two registries: - npm: `scholar-mcp` via `.github/workflows/publish.yml` - GitHub Packages: `@lstudlo/scholar-mcp` via `.github/workflows/publish-github-packages.yml` Release with a minimal command set: 1. Validate release readiness: `pnpm release:check` 2. Cut and publish a release: `pnpm release` (patch), `pnpm release minor`, or `pnpm release major` 3. Start from a clean git working tree (no unstaged/staged/untracked files). 4. The release command runs checks, bumps `packages/scholar-mcp/package.json`, creates a release commit/tag, pushes branch/tag, then creates a GitHub Release. 5. GitHub Actions publishes to npm and GitHub Packages from that release tag.