Wraps the bioRxiv and medRxiv REST APIs plus EuropePMC search to let Claude pull preprint metadata, search by keyword with relevance ranking, list recent posts in a date range, and resolve preprints to their published journal records. Handles both servers in parallel when you don't want to pick one. Five tools cover fetch by DOI with full revision history, category filtered listings, keyword search, and journal crosswalk lookups. Useful when you're analyzing early stage research, tracking preprint to publication pipelines, or need machine readable access to life sciences and medical preprints before they hit PubMed. Built on the author's mcp-ts-core framework with retry logic and polite user agent strings.
Search and retrieve bioRxiv and medRxiv preprints — by DOI, date interval, or keyword — via MCP. STDIO or Streamable HTTP.
Six tools for working with bioRxiv and medRxiv preprint data:
| Tool | Description |
|---|---|
biorxiv_get_preprint | Fetch full metadata, abstract, revision history, and journal crosswalk for one or more preprints by DOI |
biorxiv_list_recent | List preprints posted or updated within a date interval, with optional server and category filters |
biorxiv_search_preprints | Search preprints by keyword and/or author via EuropePMC for relevance ranking, enriched with bioRxiv/medRxiv metadata |
biorxiv_get_published_version | Resolve a preprint DOI to its journal publication record (journal DOI, name, published date) |
biorxiv_get_fulltext | Retrieve a preprint's full text as best-effort Markdown extracted from its rendered HTML article page |
biorxiv_list_categories | List valid subject category strings for bioRxiv and medRxiv |
biorxiv_get_preprintFetch preprint metadata by DOI — all revisions in one call.
collection[] — one API call per DOI, no enumeration loopjatsxml), and published journal DOI when the preprint has been acceptedbiorxiv, medrxiv, or both; when both, each DOI fans out in parallel and partial failures report per-DOI in failed[]biorxiv_list_recentPage through preprints in a date interval.
?category=… — pass a value from biorxiv_list_categoriescursor (0, 30, 60, …)total count per server for calculating remaining pagesserver="both", each server paginates independently; response surfaces per-server pagination state ({ biorxiv: { cursor, total }, medrxiv: { cursor, total } })biorxiv_search_preprintsKeyword and/or author search with relevance ranking.
author maps to an EuropePMC AUTH:"…" field query, ANDed with the keyword query — supply query, author, or bothserverdate_from, date_to)partial_resultsbiorxiv_get_published_versionResolve a preprint DOI to its journal publication crosswalk.
/pubs/{server}/{doi} endpoint for richer metadata than the published field in biorxiv_get_preprintpublished field is non-null and you need the full crosswalk recordbiorxiv_get_fulltextRetrieve a preprint's full text as best-effort Markdown.
www.{server}.org/content/{doi}v{N}.full) and extracts Markdown — there is no keyless JATS sourceoffset/limit character chunking (totalChars, remainingChars, hasMore)fulltext_unavailable error routing to biorxiv_get_preprintbiorxiv_list_categoriesReturn the static subject category taxonomy for both servers.
biorxiv_list_recentBuilt on @cyanheads/mcp-ts-core:
none, jwt, oauth)in-memory, filesystem, Supabase, Cloudflare KV/R2/D1bioRxiv-specific:
BiorxivApiService wraps api.biorxiv.org — details, publications, and crosswalk endpoints with retry and exponential backoffEuropePmcService wraps the EuropePMC search endpoint for relevance-ranked keyword and/or author resultsBiorxivFullTextService fetches and extracts Markdown from the rendered HTML article pages on www.biorxiv.org / www.medrxiv.org — a distinct origin from the JSON APIPromise.allSettled — both biorxiv and medrxiv queried in parallel when server="both", results merged and deduplicated by DOIUser-Agent header including a mailto address (BIORXIV_MAILTO env var) per Cold Spring Harbor Lab API guidelinesAdd the following to your MCP client configuration file.
{
"mcpServers": {
"biorxiv-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/biorxiv-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"BIORXIV_MAILTO": "your@email.com"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"biorxiv-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/biorxiv-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"BIORXIV_MAILTO": "your@email.com"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"biorxiv-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "-e", "BIORXIV_MAILTO=your@email.com", "ghcr.io/cyanheads/biorxiv-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 BIORXIV_MAILTO=your@email.com bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/biorxiv-mcp-server.git
cd biorxiv-mcp-server
bun install
cp .env.example .env
# optionally set BIORXIV_MAILTO for polite API access
All configuration is validated at startup via Zod schemas in src/config/server-config.ts.
| Variable | Description | Default |
|---|---|---|
BIORXIV_MAILTO | Email address included in the User-Agent header for polite API access per Cold Spring Harbor Lab guidelines. Optional, but recommended. | — |
BIORXIV_API_BASE_URL | Override the bioRxiv API base URL. | https://api.biorxiv.org |
EUROPEPMC_API_BASE_URL | Override the EuropePMC base URL. | https://www.ebi.ac.uk/europepmc/webservices/rest |
BIORXIV_WEB_BASE_URL | Override the bioRxiv website base URL (full-text HTML source for biorxiv_get_fulltext). | https://www.biorxiv.org |
MEDRXIV_WEB_BASE_URL | Override the medRxiv website base URL (full-text HTML source for biorxiv_get_fulltext). | https://www.medrxiv.org |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path. | /mcp |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t biorxiv-mcp-server .
docker run --rm -e BIORXIV_MAILTO=your@email.com -p 3010:3010 biorxiv-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/biorxiv-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools and initializes services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Six tools across bioRxiv and medRxiv. |
src/services/biorxiv | BiorxivApiService — details, publications, and crosswalk endpoint wrappers with retry. |
src/services/biorxiv-fulltext | BiorxivFullTextService — rendered HTML article page fetch and Markdown extraction. |
src/services/europe-pmc | EuropePmcService — preprint keyword/author search endpoint wrapper. |
tests/ | Unit and integration tests mirroring the src/ structure. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/tools/definitions/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
BIORXIV_MAILTOContact email for User-Agent header — optional, for polite API access.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
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