Biorxiv Mcp Server

io.github.cyanheads由 GitHub 帳號 cyanheads 發布v0.5.1更新於 Oct 29, 2026

Search and retrieve bioRxiv and medRxiv preprints — by DOI, date interval, or keyword — via MCP.

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取知識與記憶

概覽

AI 產生的概覽

依 DOI、日期區間、關鍵字或作者搜尋並取得 bioRxiv 與 medRxiv 預印本,包含全文與期刊發表紀錄。

可以做什麼
  • 依關鍵字和/或作者搜尋預印本,由 EuropePMC 排序並補上 bioRxiv/medRxiv 中介資料
  • 列出某日期區間內發布或修訂的預印本,可依學科分類或資助單位篩選,並列出可用的分類字串
  • 依 DOI 取得中介資料、摘要、修訂歷程與期刊 DOI,並以 Markdown 讀取預印本全文
  • 把預印本 DOI 解析為期刊發表紀錄,或把期刊 DOI 反查為預印本,並列出某期刊發表日期區間內發表的預印本
適用情境
適合需要尋找、閱讀或引用生命科學預印本、追蹤修訂版本,或確認預印本是否已在期刊發表的場合。適用於文獻回顧與研究篩選,而非一般網路搜尋。
執行需求
可作為託管的遠端端點使用,也可透過 npx(Node.js)、Docker 或以 Bun 建置原始碼在本機執行。不需要帳號或 API 金鑰;BIORXIV_MAILTO 為選填但建議填寫,以便禮貌存取 API。需要能連線至 bioRxiv、medRxiv 與 EuropePMC 的網路。
安裝前請注意
對公開預印本服務僅做唯讀查詢,不會代使用者寫入或傳送資料。BIORXIV_MAILTO 會把聯絡信箱放入請求的 User-Agent。選用的 LOG_TOOL_FAILURE_PAYLOADS 會記錄失敗呼叫的參數與結果,且自由文字中的密鑰不會被遮蔽。全文為盡力擷取,僅有 PDF 的預印本無法取得。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Biorxiv Mcp Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.cyanheads%2Fbiorxiv-mcp-server/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "biorxiv": {
      "type": "http",
      "url": "https://biorxiv.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/biorxiv-mcp-server

Search and retrieve bioRxiv and medRxiv preprints — by DOI, date interval, or keyword — via MCP. STDIO or Streamable HTTP.

7 Tools

Public Hosted Server: https://biorxiv.caseyjhand.com/mcp


Overview

bioRxiv and medRxiv preprints, metadata and full text. Search by keyword and author, browse a date interval (optionally by subject), fetch any preprint by DOI, and see which preprints went on to journal publication.

Tools

ToolDescription
biorxiv_get_preprintFetch full metadata, abstract, revision history, and journal crosswalk for one or more preprints by DOI
biorxiv_list_recentList preprints posted or updated within a date interval, with optional server, category, and funder filters
biorxiv_search_preprintsSearch preprints by keyword and/or author via EuropePMC for relevance ranking, enriched with bioRxiv/medRxiv metadata
biorxiv_get_published_versionResolve a preprint DOI to its journal publication record (journal DOI, name, published date), or a journal article's DOI to the preprint it was posted as
biorxiv_list_published_versionsList preprints that appeared as journal articles within a journal publication-date interval, whenever they were posted, optionally from one publisher
biorxiv_get_fulltextRetrieve a preprint's full text as best-effort Markdown extracted from its rendered HTML article page
biorxiv_list_categoriesList valid subject category strings for bioRxiv and medRxiv

Capability reference

biorxiv_get_preprint tool

  • Takes DOIs bare or pasted (https://doi.org/…, doi:…, a biorxiv.org/medrxiv.org article URL, a vN or .full suffix), scoped to biorxiv, medrxiv, or both (default both)
  • Accepts up to 200 entries and looks up the first 10 distinct DOIs; the rest come back in unprocessed[] to pass in another call. A repeated DOI is looked up once, and every list keeps input order
  • Each preprint returns its full revision history in revisions[] — title, authors, category, license, awards, jatsxmlUrl, publishedJournalDoi once accepted, and the server it was found on (biorxiv or medrxiv, ready to pass back as server). Funder names are omitted because the upstream API misattributes them
  • The abstract sits on the latest revision only: the upstream API keeps one abstract per preprint. An earlier revision's own abstract is on its article page, through biorxiv_get_fulltext with version
  • A DOI that fails lands in failed[] with a reason (not_found, invalid_doi_format, upstream_unavailable, rate_limited) and a retryable flag; not_found only when every attempted server answered

biorxiv_list_recent tool

  • Takes a start_date/end_date interval, server (default both), and optional category (a value from biorxiv_list_categories) and bioRxiv-only funder (a ROR ID) filters; a filter that cannot be applied raises invalid_category or invalid_funder
  • Pages of 30 advance with an integer cursor, tracked per server ({ biorxiv: { cursor, total, newPreprints }, medrxiv: { cursor, total, newPreprints } }); a cursor past the last page is marked exhausted: true, and a server that did not answer is named in failed[]
  • Rows are revisions: total counts every version posted in the interval, while newPreprints counts the preprints whose first version posted in it, as the API reports it (absent when the API sends no count)
  • Abstracts are omitted by default; include_abstract: true adds them. Each is the preprint's latest-revision abstract, even on a row for an earlier revision

biorxiv_search_preprints tool

  • Takes query and/or author, optional date_from/date_to and server (default both); up to 100 results per page (default 25; a larger limit returns 100 with a notice), paged with cursor_mark
  • EuropePMC ranks the matches (it indexes new preprints within 1–2 days of posting) and the bioRxiv/medRxiv API enriches them with the same fields as biorxiv_get_preprint; a record left with EuropePMC metadata only carries enriched: false and an enrichment_error (service_error, rate_limited, not_found), with partial_results set
  • Abstracts are included by default; include_abstract: false drops them for a response about a third the size

biorxiv_get_published_version tool

  • Takes one DOI and server (default both): a preprint DOI (10.1101/, 10.64898/), or a journal article's DOI, which resolves to the preprint it was posted as (10.1016/j.cell.2020.01.001 → 10.1101/614172); 10.64898/ DOIs resolve through the preprint's own journal DOI
  • Returns the preprint DOI, journal DOI, journal name, published date, corresponding-author institution, and the server that answered; if no server answers it raises a retryable upstream_unavailable or rate_limited, never doi_not_found
  • Cold Spring Harbor Laboratory Press journal DOIs (10.1101/gr.…, gad.…, lm.…) share the preprint prefix and cannot be resolved by DOI

biorxiv_list_published_versions tool

  • Takes a start_date/end_date interval of journal publication dates and server (default both); each row matches the record biorxiv_get_published_version returns, and may be a preprint posted years earlier
  • Returns limit rows per server (default 25, up to the API's 100-row page) from an integer cursor, continued at each server's nextCursor; a cursor past the last row is marked exhausted: true, and a server that did not answer is named in failed[]
  • Optional publisher, a journal DOI prefix (10.7554 for eLife), lists only the bioRxiv preprints published under it; server: "both" queries bioRxiv alone, and server: "medrxiv" or a prefix the API does not recognize raises invalid_publisher. These rows carry no journal name, authors, or abstract
  • Abstracts are omitted by default; include_abstract: true adds them

biorxiv_get_fulltext tool

  • Takes a DOI, server (default both), and an optional version (or a vN suffix; the two must agree, and a version the preprint lacks raises version_not_found); returns Markdown extracted from the rendered HTML article page, naming the answering server
  • Table cells are not on the page: each table keeps its caption, and omittedTables names it with the URL that serves its cells
  • Pages via offset/limit characters (default 20,000), reporting totalChars, remainingChars, hasMore, and wordCount; PDF-only preprints and blocked pages raise fulltext_unavailable, routing to biorxiv_get_preprint

biorxiv_list_categories tool

  • No API call — a static list of 25 bioRxiv and 51 medRxiv categories, limited to the ones the listing API filters on
  • Use it to pick a category for biorxiv_list_recent

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

bioRxiv-specific:

  • BiorxivApiService wraps api.biorxiv.org (details, publications, and crosswalk endpoints) and EuropePmcService wraps EuropePMC search, both with retry and exponential backoff
  • BiorxivFullTextService extracts Markdown from the article pages on www.biorxiv.org / www.medrxiv.org
  • Every upstream retry ladder runs on what is left of the tool call's one 50 s budget, so a hung origin ends before a client's 60 s request timeout — in a classified, retryable error, or, when the step that hung is optional, in a result that says what is missing
  • Queries biorxiv and medrxiv in parallel when server="both", each result naming the server that answered; a lookup by DOI stops waiting once the server holding that DOI answers
  • Polite User-Agent header including a mailto address (BIORXIV_MAILTO env var) per Cold Spring Harbor Lab API guidelines
  • Pairs with pubmed-mcp-server (post-publication), openalex-mcp-server (citation analytics), and crossref-mcp-server (DOI metadata)

Agent-friendly output:

  • Graceful partial failure — per-DOI and per-server failures land in failed[] with a typed reason and retryable flag instead of aborting the call
  • Rate-limit transparency — a 429 surfaces as reason: "rate_limited" with the parsed retryAfter wait, distinct from upstream_unavailable
  • Typed enrichment status — biorxiv_search_preprints results carry enriched plus a typed enrichment_error (service_error / rate_limited / not_found)
  • Clean titles and abstracts — export markup and symbol placeholders ({beta}, [≥]) are resolved to plain text

Getting started

Connect to the hosted instance, no install:

sh
claude mcp add --transport http biorxiv-mcp-server https://biorxiv.caseyjhand.com/mcp

Or run it locally:

sh
claude mcp add biorxiv-mcp-server -- npx -y @cyanheads/biorxiv-mcp-server

For other clients, add this to the MCP config file:

json
{  "mcpServers": {    "biorxiv-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/biorxiv-mcp-server"]    }  }}

A contact email in BIORXIV_MAILTO (-e [email protected], or an env entry) identifies your requests in the User-Agent header, as the Cold Spring Harbor Lab API guidelines ask. For Docker or a source build, see Running the server.

Configuration

All configuration is validated at startup via Zod schemas in src/config/server-config.ts.

VariableDescriptionDefault
BIORXIV_MAILTOEmail address for the User-Agent header; optional but recommended.—
BIORXIV_API_BASE_URLOverride the bioRxiv API base URL.https://api.biorxiv.org
EUROPEPMC_API_BASE_URLOverride the EuropePMC base URL.https://www.ebi.ac.uk/europepmc/webservices/rest
BIORXIV_WEB_BASE_URLOverride the bioRxiv website base URL (full-text HTML source for biorxiv_get_fulltext).https://www.biorxiv.org
MEDRXIV_WEB_BASE_URLOverride the medRxiv website base URL (full-text HTML source for biorxiv_get_fulltext).https://www.medrxiv.org
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_HTTP_ENDPOINT_PATHHTTP endpoint path./mcp
MCP_AUTH_MODEAuth mode: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<project-root>/logs
LOG_TOOL_FAILURE_PAYLOADSLog each failed tool call's arguments and result, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). A secret inside a free-form value is not redacted.false
OTEL_ENABLEDEnable OpenTelemetry instrumentation.false

See .env.example for the full list of optional overrides.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+).

  • Clone and install:

    sh
    git clone https://github.com/cyanheads/biorxiv-mcp-server.gitcd biorxiv-mcp-server && bun installcp .env.example .env   # optionally set BIORXIV_MAILTO
  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker run --rm -e [email protected] -p 3010:3010 ghcr.io/cyanheads/biorxiv-mcp-server:latest

The image defaults to HTTP transport, stateless session mode, and logs to /var/log/biorxiv-mcp-server; the server listens at http://localhost:3010/mcp. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/biorxiv-mcp-server:latest"]. To build locally, docker build -t biorxiv-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point — registers tools and initializes services.
src/configServer-specific environment variable parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts). Seven tools across bioRxiv and medRxiv.
src/services/biorxivBiorxivApiService — details, publications, and crosswalk endpoint wrappers with retry.
src/services/biorxiv-fulltextBiorxivFullTextService — rendered HTML article page fetch and Markdown extraction.
src/services/europe-pmcEuropePmcService — preprint keyword/author search endpoint wrapper.
tests/Unit and integration tests mirroring the src/ structure.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools via the barrel in src/mcp-server/tools/definitions/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

來源:README.md,提交 39a91f0

工具

7

biorxiv_list_categories

List bioRxiv/medRxiv Categories

List valid subject category strings for bioRxiv and medRxiv — the categories the listing API actually filters on. Use these strings as the `category` filter in biorxiv_list_recent to narrow results to a specific field; case, and "_" or "-" in place of a space, do not matter there. Run this tool before filtering to get the current valid values.

無需輸入參數。

biorxiv_list_recent

List Recent Preprints

List preprints posted or revised within a date interval, optionally scoped to one server or a subject category. Returns 30 preprints per page (fixed by the API); pass `cursor` as an integer offset (0, 30, 60, …) to step through additional pages. Abstracts are omitted by default to keep the page small — pass include_abstract: true for the whole page (each row carries the latest-revision abstract of its preprint, whichever revision the row is), or call biorxiv_get_preprint (up to 10 DOIs per call) for a few. When server="both" (default), per-server pagination state is returned separately — use each server's `cursor` field for independent advancement. One server failing under server="both" does not abort the call: the other server's page is still returned and the failed one is named in `failed[]`, marking the result set as partial rather than complete. Every attempted server failing is a different case and does abort the call, with a retryable upstream_unavailable (or rate_limited) error — an empty page would otherwise be indistinguishable from an interval that genuinely holds nothing. Call biorxiv_list_categories for valid category strings; a server that answers a category filter with its unfiltered listing is left out with a notice, and invalid_category is raised when no server applied it. `funder` limits the listing to bioRxiv preprints funded by that organization, given its ROR ID; an ID api.biorxiv.org has no funder record for raises invalid_funder rather than returning an empty page.

輸入參數cursorfunderservercategoryend_date必填start_date必填include_abstract

biorxiv_get_preprint

Get Preprint by DOI

Fetch full metadata, the abstract, all revision history, JATS XML full-text links, and published-journal DOI for one or more preprints by DOI. Each DOI returns all revisions in one response, with the abstract on the latest revision only — the API keeps one abstract per preprint. Each call looks up the first 10 distinct DOIs and returns the rest, never looked up, in unprocessed[] — pass that list as dois in another call to continue; a repeated DOI is looked up once and an unparseable entry is reported in failed[], so neither counts toward the 10. When server="both" (default), each DOI is checked against both bioRxiv and medRxiv; the response includes which server the preprint was found on. Failed lookups are reported per-DOI in failed[] rather than aborting the batch, each carrying a reason (not_found, invalid_doi_format, upstream_unavailable, rate_limited) and a retryable flag; a rate_limited entry also carries the wait in seconds the origin asked for. preprints[], failed[], and unprocessed[] follow input order. DOIs must match the pattern 10.NNNN/…; a doi.org or article URL, a doi: label, and a trailing vN / .full suffix are stripped first, and results report the bare DOI.

輸入參數dois必填server

biorxiv_get_published_version

Get Published Journal Version

Resolve a DOI to its preprint-to-journal crosswalk record — preprint DOI, journal DOI, journal name, published date, and corresponding author details — from either side: a preprint DOI (10.1101/ or 10.64898/) finds the journal article it was published as, and any other DOI is read as a journal article's and finds the bioRxiv or medRxiv preprint it was posted as. Use when biorxiv_get_preprint shows a `publishedJournalDoi` and you need the journal details, or when you hold a journal article and want its preprint. bioRxiv and medRxiv share their DOI prefixes, so server="both" (the default) checks both in parallel and the response reports which server answered. When the crosswalk holds no record for a published preprint, the journal DOI still comes back from the preprint's own record, without journal name or date, and a notice says so. Returns a not-found error when no server holds the preprint, it lists no journal version, or no preprint is recorded for the journal DOI.

輸入參數doi必填server

biorxiv_list_published_versions

List Published Journal Versions

List preprints that appeared as journal articles within a journal publication-date interval, each with its journal DOI, journal name, publication date, and preprint metadata — the same record biorxiv_get_published_version returns for one DOI. The dates filter on journal publication, not preprint posting, so most rows were posted months or years earlier; use biorxiv_list_recent for preprints posted in an interval. `publisher`, a journal DOI prefix such as 10.7554 for eLife, limits the listing to the bioRxiv preprints published under it; those rows carry no journal name, authors, or abstract, and a prefix api.biorxiv.org does not recognize raises invalid_publisher. Returns `limit` publications per server (default 25, up to 100 — the page api.biorxiv.org serves; a larger limit returns 100 and says so). Continue at the `nextCursor` a page returns rather than stepping `cursor` by a fixed amount; `limit: 100` walks an interval in the fewest calls. When server="both" (default), per-server pagination state is returned separately, since one cursor can be past the end of one server and inside the other — to continue a single server, pass its `nextCursor` with `server` set to that server. One server failing under server="both" does not abort the call: the other server's page is still returned and the failed one is named in `failed[]`. Every attempted server failing raises a retryable upstream_unavailable (or rate_limited) error rather than an empty page. Abstracts are omitted by default to keep the page small — pass include_abstract: true for the whole page. Every preprintDoi, 10.1101/ and 10.64898/ alike, is accepted by biorxiv_get_preprint and the other DOI tools.

輸入參數limitcursorserverend_date必填publisherstart_date必填include_abstract

biorxiv_search_preprints

Search Preprints by Keyword

Search preprints by keyword and/or author using EuropePMC for relevance ranking, then enrich matching DOIs with full bioRxiv/medRxiv metadata. Provide a keyword query, an author name, or both — author maps to an EuropePMC AUTH: field query and is ANDed with the keyword query. Covers both servers by default. EuropePMC indexes new preprints within 1–2 days of posting; for preprints posted within the last day, prefer biorxiv_list_recent. Abstracts are included by default; include_abstract: false omits them from every result for a response about a third the size, and biorxiv_get_preprint returns the abstract for up to 10 DOIs per call. A EuropePMC rate limit (HTTP 429) fails the call with a retryable rate_limited error carrying the wait in seconds — a rate-limited metadata enrichment does not, and instead marks the affected record enrichment_error: "rate_limited".

輸入參數limitqueryauthorserverdate_todate_fromcursor_markinclude_abstract

biorxiv_get_fulltext

Get Preprint Full Text

Retrieve a preprint's full text as best-effort Markdown, extracted from its rendered HTML article page. Reads the latest version unless one is requested (the version input, or a vN suffix on the DOI), confirms it via the details API, then fetches and extracts the body — abstract, sections, inline citation labels, and the reference list. Table cells are not on the article page: each table appears as its caption, and omittedTables names it with the URL that serves its cells. bioRxiv and medRxiv share the 10.1101/ DOI prefix, so server="both" (the default) resolves the DOI against both in parallel and the response reports which server answered. This is HTML-to-Markdown extraction, not structured JATS: section structure is approximate and not guaranteed. Long articles exceed a single response, so use offset and limit to page through them (the response reports totalChars, remainingChars, and hasMore); paging is cheap because the extracted article is cached per version for an hour after the first read, so only the first chunk pays for a fetch. Not every preprint has an extractable HTML page — some are PDF-only and some origins block programmatic access — in which case a fulltext_unavailable error routes you to biorxiv_get_preprint for the title, metadata, and current abstract. For a preprint that has been published in a journal, the journal's version may have richer full text elsewhere.

輸入參數doi必填limitoffsetserverversion

版本歷史

10
  1. v0.5.1最新Oct 29, 2026
  2. v0.4.3Oct 25, 2026
  3. v0.4.2Oct 23, 2026
  4. v0.4.1Oct 18, 2026
  5. v0.4.0Oct 15, 2026
  6. v0.3.1Oct 7, 2026
  7. v0.3.0Sep 23, 2026
  8. v0.2.8Sep 23, 2026
  9. v0.2.7Sep 19, 2026
  10. v0.2.6Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。