Koskamo

biorxiv-mcp-server

An MCP server that allows agents to search, list, and retrieve detailed metadata and full text for bioRxiv and medRxiv preprints. It supports filtering by DOI, date intervals, keywords, subject categories, and funders, and can resolve preprint DOIs to their corresponding journal publication records.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

biorxiv-mcp-server logo, by cyanheadsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by cyanheads
MCP endpoint (Streamable HTTP)
https://biorxiv.caseyjhand.com/mcp
Vendor documentation

What its tools do

7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

7 of 7 have a description · 7 of 7 declare behavior hints · 6 of 6 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • List recent preprints within a specific date range and subject category
  • Fetch full metadata and abstracts for preprints by DOI
  • Search preprints by keyword or author via EuropePMC
  • Resolve a preprint DOI to its final journal publication record

Source and maintenance

Community listingRegistry 0.5.1
Maintenance checked

Protocol and capabilities

Server
biorxiv-mcp-server 0.5.1
MCP protocol negotiated in check
2025-11-25
Tools
7 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "logging": {},
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "subscribe": true,
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/skills": {
      "directoryRead": true
    }
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

bioRxiv/medRxiv preprints, addressed by 10.1101/ or 10.64898/ DOI and searched across both servers by default. Find preprints with biorxiv_search_preprints (keyword or author, ranked by EuropePMC) or biorxiv_list_recent (a date interval, filtered by a category string from biorxiv_list_categories and, on bioRxiv, by a funder ROR ID). Resolve a DOI with biorxiv_get_preprint for metadata and revisions, biorxiv_get_fulltext for the article body as Markdown, and biorxiv_get_published_version for the journal crosswalk once a preprint has been published — it also takes the DOI of a journal article and returns the preprint it was posted as. biorxiv_list_published_versions lists those crosswalk records by journal publication date — the preprints that became journal articles in an interval, whenever they were posted, filtered on bioRxiv by the DOI prefix of a journal publisher.

Tools

7 advertised

biorxiv_list_categories — List bioRxiv/medRxiv Categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

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_categories input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {},
  "additionalProperties": false
}
biorxiv_list_categories output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "biorxiv",
        "medrxiv"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "biorxiv": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Subject category name"
      },
      "description": "bioRxiv subject categories"
    },
    "medrxiv": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Subject category name"
      },
      "description": "medRxiv subject categories"
    }
  },
  "additionalProperties": false
}
biorxiv_list_categories annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
biorxiv_list_recent — List Recent Preprints
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

biorxiv_list_recent input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "start_date",
    "end_date"
  ],
  "properties": {
    "cursor": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Integer page offset (0, 30, 60, …). Defaults to 0 (first page)."
    },
    "funder": {
      "type": "string",
      "description": "Funder filter: the funder's ROR ID, bare (\"021nxhr62\" for the US National Science Foundation) or as a URL (\"https://ror.org/021nxhr62\"). bioRxiv only — medRxiv records carry no funder data, so server=\"both\" queries bioRxiv alone and server=\"medrxiv\" is rejected. Combines with category. Look the ID up by name at ror.org."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Server to query. \"both\" fans out to bioRxiv and medRxiv in parallel."
    },
    "category": {
      "type": "string",
      "description": "Subject category filter, matched case-insensitively with \"_\" and \"-\" read as a space — \"Cell Biology\", \"cell biology\", \"cell_biology\", and \"cell-biology\" are the same filter. Use biorxiv_list_categories for valid values."
    },
    "end_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "End of the date interval (YYYY-MM-DD)."
    },
    "start_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Start of the date interval (YYYY-MM-DD)."
    },
    "include_abstract": {
      "type": "boolean",
      "default": false,
      "description": "Include each preprint's abstract. Defaults to false: abstracts make up about three quarters of a page, and every other field is returned either way."
    }
  },
  "additionalProperties": false
}
biorxiv_list_recent output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "pagination",
        "failed"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "invalid_date_range",
                "invalid_category",
                "invalid_funder",
                "upstream_unavailable",
                "rate_limited"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_date_range`: end_date is before start_date, or either date names no calendar day (2024-02-30, 2024-13-01). `invalid_category`: The category is not in the requested server's taxonomy, or api.biorxiv.org ignored it and returned the unfiltered listing on every server that answered. `invalid_funder`: funder is not a well-formed ROR ID (pattern or checksum), is combined with server=\"medrxiv\", or is a ROR ID api.biorxiv.org has no funder record for. `upstream_unavailable`: Every attempted server failed against api.biorxiv.org, so no page was retrieved and an empty interval could not be established. `rate_limited`: Every attempted server failed and at least one was rejected with HTTP 429 by api.biorxiv.org. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "server",
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "What went wrong on that server."
          },
          "server": {
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "type": "string",
            "description": "Server whose listing request failed."
          }
        },
        "description": "A server that did not answer.",
        "additionalProperties": false
      },
      "description": "Servers that did not answer, so their records are missing from \"preprints\" and they have no \"pagination\" entry. Non-empty means this result set is partial — retry to include them. Only populated when server=\"both\", and never holding every attempted server: when none answered, the call fails with upstream_unavailable or rate_limited instead of returning a page. A single-server failure likewise surfaces as a tool error. Distinct from an exhausted pagination entry, where the server answered."
    },
    "notice": {
      "type": "string",
      "description": "Guidance on how to read this result set: which servers did not answer, which ignored the category filter (their unfiltered records are left out), that a funder filter limited server=\"both\" to bioRxiv, which cursors are past the end, and — when nothing came back — the applied filters and how to broaden them. All applicable qualifications are composed into one string."
    },
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "doi",
          "server"
        ],
        "properties": {
          "doi": {
            "type": "string",
            "description": "Preprint DOI."
          },
          "date": {
            "type": "string",
            "description": "Posting or revision date (YYYY-MM-DD)."
          },
          "type": {
            "type": "string",
            "description": "Preprint type."
          },
          "title": {
            "type": "string",
            "description": "Title of the preprint."
          },
          "awards": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "One award value as upstream records it."
            },
            "description": "Grant award numbers from the funding statement, verbatim and deduplicated — one value can hold several grants run together without a separator. Absent when none. Funder names are not included: api.biorxiv.org attributes them to unrelated organizations."
          },
          "server": {
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "type": "string",
            "description": "Server the preprint was listed on — accepted as the server input of every tool."
          },
          "authors": {
            "type": "string",
            "description": "Author list."
          },
          "license": {
            "type": "string",
            "description": "License identifier."
          },
          "version": {
            "type": "string",
            "description": "Revision version number."
          },
          "abstract": {
            "type": "string",
            "description": "The preprint's latest-revision abstract, which differs from this row's own revision when a later one exists — api.biorxiv.org keeps one abstract per preprint. Present only when include_abstract is true."
          },
          "category": {
            "type": "string",
            "description": "Subject category."
          },
          "jatsxmlUrl": {
            "type": "string",
            "description": "URL to the JATS XML full-text."
          },
          "authorCorresponding": {
            "type": "string",
            "description": "Corresponding author name."
          },
          "publishedJournalDoi": {
            "type": "string",
            "description": "Published journal DOI when this preprint has been accepted."
          },
          "authorCorrespondingInstitution": {
            "type": "string",
            "description": "Corresponding author institution."
          }
        },
        "description": "A single preprint entry.",
        "additionalProperties": false
      },
      "description": "Preprints in the requested date interval."
    },
    "pagination": {
      "type": "object",
      "properties": {
        "biorxiv": {
          "type": "object",
          "required": [
            "cursor",
            "total"
          ],
          "properties": {
            "total": {
              "type": "number",
              "description": "Rows bioRxiv lists in the interval for these filters — one per revision posted in it, so a preprint revised in the interval counts once per version. For the number of new preprints, read newPreprints."
            },
            "cursor": {
              "type": "number",
              "description": "Current cursor (offset used for this page)."
            },
            "exhausted": {
              "type": "boolean",
              "description": "True when this cursor is past bioRxiv's last page: no records came back at a non-zero cursor. The API reports total 0 for an out-of-range cursor, so \"total\" is not the interval total here — step back to a lower cursor to read it."
            },
            "nextCursor": {
              "type": "number",
              "description": "Cursor value for the next page, if any."
            },
            "newPreprints": {
              "type": "integer",
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "description": "Preprints whose first version posted on bioRxiv in the interval, for these filters — the rows with version \"1\" across every page of the listing, as bioRxiv counts them. Absent when bioRxiv reports no count, as on an exhausted entry; never a 0 standing in for an unknown count."
            }
          },
          "description": "bioRxiv pagination state. Present when server is \"biorxiv\" or \"both\".",
          "additionalProperties": false
        },
        "medrxiv": {
          "type": "object",
          "required": [
            "cursor",
            "total"
          ],
          "properties": {
            "total": {
              "type": "number",
              "description": "Rows medRxiv lists in the interval for these filters — one per revision posted in it, so a preprint revised in the interval counts once per version. For the number of new preprints, read newPreprints."
            },
            "cursor": {
              "type": "number",
              "description": "Current cursor (offset used for this page)."
            },
            "exhausted": {
              "type": "boolean",
              "description": "True when this cursor is past medRxiv's last page: no records came back at a non-zero cursor. The API reports total 0 for an out-of-range cursor, so \"total\" is not the interval total here — step back to a lower cursor to read it."
            },
            "nextCursor": {
              "type": "number",
              "description": "Cursor value for the next page, if any."
            },
            "newPreprints": {
              "type": "integer",
              "maximum": 9007199254740991,
              "minimum": -9007199254740991,
              "description": "Preprints whose first version posted on medRxiv in the interval, for these filters — the rows with version \"1\" across every page of the listing, as medRxiv counts them. Absent when medRxiv reports no count, as on an exhausted entry; never a 0 standing in for an unknown count."
            }
          },
          "description": "medRxiv pagination state. Present when server is \"medrxiv\" or \"both\", except under a funder filter, which queries bioRxiv only.",
          "additionalProperties": false
        }
      },
      "description": "Per-server pagination state. Advance each server independently.",
      "additionalProperties": false
    },
    "categoryNote": {
      "type": "string",
      "description": "Present when server=\"both\" and the category exists in only one server's taxonomy. Explains which server was queried and why the other was excluded."
    }
  },
  "additionalProperties": false
}
biorxiv_list_recent annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
biorxiv_get_preprint — Get Preprint by DOI
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

biorxiv_get_preprint input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "dois"
  ],
  "properties": {
    "dois": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Preprint DOI (e.g. 10.1101/2024.01.15.575123 or 10.64898/2026.05.07.723463). A doi.org or biorxiv.org/medrxiv.org article URL, a doi: prefix, or a vN / .full suffix is accepted and stripped to the bare DOI; every revision is returned either way."
      },
      "maxItems": 200,
      "minItems": 1,
      "description": "Preprint DOIs to look up, up to 200 entries. The first 10 distinct DOIs are looked up; the rest are returned in unprocessed."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Server to query. \"both\" checks bioRxiv and medRxiv in parallel for each DOI."
    }
  },
  "additionalProperties": false
}
biorxiv_get_preprint output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "failed",
        "unprocessed"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The most distinct DOIs one call looks up."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "doi_not_found",
                "invalid_doi_format",
                "upstream_unavailable",
                "rate_limited"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `doi_not_found`: Every DOI looked up resolves to empty collections on all requested servers, with every server answering, and no DOI was left in unprocessed. `invalid_doi_format`: Every input entry fails to match the 10.NNNN/ pattern, even after URL, doi:, and suffix stripping. `upstream_unavailable`: No DOI resolved, none was left in unprocessed, and at least one lookup failed against api.biorxiv.org, so absence could not be established for any requested DOI. `rate_limited`: No DOI resolved, none was left in unprocessed, and at least one lookup was rejected with HTTP 429 by api.biorxiv.org. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Distinct DOIs looked up in this call."
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "doi",
          "error",
          "reason",
          "retryable"
        ],
        "properties": {
          "doi": {
            "type": "string",
            "description": "DOI that failed to resolve — in bare form, or exactly as sent for invalid_doi_format."
          },
          "error": {
            "type": "string",
            "description": "Error description."
          },
          "reason": {
            "enum": [
              "not_found",
              "invalid_doi_format",
              "upstream_unavailable",
              "rate_limited"
            ],
            "type": "string",
            "description": "Why this DOI failed: not_found (every attempted server answered with an empty collection), invalid_doi_format (the DOI does not match 10.NNNN/…), upstream_unavailable (a server never answered, so absence could not be established), or rate_limited (api.biorxiv.org returned HTTP 429 — the same as upstream_unavailable except that the origin named a wait)."
          },
          "retryable": {
            "type": "boolean",
            "description": "True when retrying this DOI may succeed — set for upstream_unavailable and rate_limited. A not_found or invalid_doi_format entry will not change on retry."
          },
          "retryAfter": {
            "type": "number",
            "description": "Seconds api.biorxiv.org asked the caller to wait before the next request. Present only on a rate_limited entry whose response carried a usable Retry-After header."
          }
        },
        "description": "A DOI that failed to resolve.",
        "additionalProperties": false
      },
      "description": "DOIs that could not be resolved, with per-DOI error details."
    },
    "notice": {
      "type": "string",
      "description": "How to look up the DOIs left in unprocessed, and how many failed[] entries are retryable alongside them."
    },
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "doi",
          "revisions"
        ],
        "properties": {
          "doi": {
            "type": "string",
            "description": "The requested DOI in bare form (any URL, doi: prefix, or suffix removed)."
          },
          "revisions": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "doi",
                "server"
              ],
              "properties": {
                "doi": {
                  "type": "string",
                  "description": "Preprint DOI."
                },
                "date": {
                  "type": "string",
                  "description": "Revision date (YYYY-MM-DD)."
                },
                "type": {
                  "type": "string",
                  "description": "Preprint type."
                },
                "title": {
                  "type": "string",
                  "description": "Title."
                },
                "awards": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "description": "One award value as upstream records it."
                  },
                  "description": "Grant award numbers from the funding statement, verbatim and deduplicated — one value can hold several grants run together without a separator. Absent when none. Funder names are not included: api.biorxiv.org attributes them to unrelated organizations."
                },
                "server": {
                  "enum": [
                    "biorxiv",
                    "medrxiv"
                  ],
                  "type": "string",
                  "description": "Server the revision was found on — accepted as the server input of every tool."
                },
                "authors": {
                  "type": "string",
                  "description": "Author list."
                },
                "license": {
                  "type": "string",
                  "description": "License identifier."
                },
                "version": {
                  "type": "string",
                  "description": "Revision version number."
                },
                "abstract": {
                  "type": "string",
                  "description": "The preprint's current abstract, present on the latest revision only: api.biorxiv.org keeps one abstract per preprint and repeats it on every revision. For an earlier revision's own abstract, read that revision with biorxiv_get_fulltext and its version input; medRxiv blocks its article pages to some hosts, and there that request fails as fulltext_unavailable."
                },
                "category": {
                  "type": "string",
                  "description": "Subject category."
                },
                "jatsxmlUrl": {
                  "type": "string",
                  "description": "URL to the JATS XML full-text."
                },
                "authorCorresponding": {
                  "type": "string",
                  "description": "Corresponding author name."
                },
                "publishedJournalDoi": {
                  "type": "string",
                  "description": "Published journal DOI when accepted."
                },
                "authorCorrespondingInstitution": {
                  "type": "string",
                  "description": "Corresponding author institution."
                }
              },
              "description": "A single preprint revision.",
              "additionalProperties": false
            },
            "description": "All revisions for this preprint, earliest first."
          }
        },
        "description": "A preprint and all its revisions.",
        "additionalProperties": false
      },
      "description": "Successfully resolved preprints with their full revision history."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when DOIs past the first 10 were left in unprocessed."
    },
    "unprocessed": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "A bare DOI that was not looked up."
      },
      "description": "Valid, distinct DOIs past the first 10, in input order — not looked up, so neither found nor failed. Pass this list as dois in another call to continue. Empty when every DOI was looked up."
    }
  },
  "additionalProperties": false
}
biorxiv_get_preprint annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
biorxiv_get_published_version — Get Published Journal Version
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

biorxiv_get_published_version input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "doi"
  ],
  "properties": {
    "doi": {
      "type": "string",
      "description": "DOI to resolve: a preprint DOI (e.g. 10.1101/2024.01.15.575123 or 10.64898/2026.05.07.723463) or a journal article DOI (e.g. 10.1016/j.cell.2020.01.001). A doi.org or biorxiv.org/medrxiv.org article URL or a doi: prefix is accepted and stripped to the bare DOI, as is a vN, .full, or .pdf suffix; a journal DOI keeps its own components (10.7554/eLife.55185.sa1 is not 10.7554/eLife.55185). Cold Spring Harbor Laboratory Press journal DOIs (10.1101/gr.…, 10.1101/gad.…, 10.1101/lm.…) share the preprint prefix and cannot be resolved by DOI."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Server the preprint was posted on. \"both\" (default) checks bioRxiv and medRxiv in parallel — use it when the DOI alone does not tell you which server holds the preprint."
    }
  },
  "additionalProperties": false
}
biorxiv_get_published_version output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprintDoi",
        "server"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "doi_not_found",
                "invalid_doi_format",
                "upstream_unavailable",
                "rate_limited"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `doi_not_found`: No attempted server holds the preprint, neither the crosswalk nor its preprint record lists a journal version, or the crosswalk links no preprint to the journal DOI given. `invalid_doi_format`: The input does not match the 10.NNNN/ DOI pattern, even after URL, doi:, and suffix stripping. `upstream_unavailable`: No published record was established and at least one crosswalk or preprint lookup failed against api.biorxiv.org. `rate_limited`: No published record was established and at least one crosswalk or preprint lookup was rejected with HTTP 429 by api.biorxiv.org. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Present when publishedDoi came from the preprint's own record because the crosswalk had none: says why publishedJournal and publishedDate are absent."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv"
      ],
      "type": "string",
      "description": "The server that returned this published record — never \"both\"."
    },
    "preprintDoi": {
      "type": "string",
      "description": "The preprint DOI, in bare form: the input itself when it was a preprint DOI, or the preprint the crosswalk links to the input when it was a journal DOI."
    },
    "preprintDate": {
      "type": "string",
      "description": "Preprint posting date (YYYY-MM-DD) from the crosswalk record, or from the preprint's first revision when the crosswalk has none — the first posting for most preprints. medRxiv records some 10.64898/ preprints twice with different posting dates; this is the first record listed."
    },
    "publishedDoi": {
      "type": "string",
      "description": "The journal publication DOI."
    },
    "preprintTitle": {
      "type": "string",
      "description": "Title of the preprint."
    },
    "publishedDate": {
      "type": "string",
      "description": "Journal publication date (YYYY-MM-DD). Absent when the crosswalk holds no record for this preprint — see notice."
    },
    "preprintAuthors": {
      "type": "string",
      "description": "Preprint author list."
    },
    "preprintAbstract": {
      "type": "string",
      "description": "Preprint abstract."
    },
    "preprintCategory": {
      "type": "string",
      "description": "Subject category."
    },
    "publishedJournal": {
      "type": "string",
      "description": "Name of the publishing journal. Absent when the crosswalk holds no record for this preprint — see notice."
    },
    "preprintAuthorCorresponding": {
      "type": "string",
      "description": "Corresponding author name."
    },
    "preprintAuthorCorrespondingInstitution": {
      "type": "string",
      "description": "Corresponding author institution."
    }
  },
  "additionalProperties": false
}
biorxiv_get_published_version annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
biorxiv_list_published_versions — List Published Journal Versions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

biorxiv_list_published_versions input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "start_date",
    "end_date"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 25,
      "maximum": 1000,
      "minimum": 1,
      "description": "Rows to return per queried server, starting at cursor. Defaults to 25. Up to 100, the page api.biorxiv.org serves: a larger value returns 100 rows per server and says so in the notice. limit: 100 walks an interval in the fewest calls."
    },
    "cursor": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Integer row offset, applied to each queried server. Defaults to 0 (first page). To continue, pass the nextCursor the previous page returned for that server — it advances by the rows actually served."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Preprint server to list. \"both\" lists bioRxiv and medRxiv in parallel; their rows do not overlap."
    },
    "end_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "End of the journal publication-date interval (YYYY-MM-DD), inclusive."
    },
    "publisher": {
      "type": "string",
      "pattern": "^10\\.\\d{4,}$",
      "description": "Journal publisher filter: the DOI prefix its journal articles share, the part before the slash — \"10.7554\" for eLife, \"10.1016\" for Elsevier. Lists only the bioRxiv preprints published under that prefix: medRxiv has no publisher listing, so server=\"both\" queries bioRxiv alone and server=\"medrxiv\" is rejected. Rows listed this way carry no journal name, authors, corresponding author, or abstract."
    },
    "start_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Start of the journal publication-date interval (YYYY-MM-DD), inclusive."
    },
    "include_abstract": {
      "type": "boolean",
      "default": false,
      "description": "Include each preprint's abstract. Defaults to false: abstracts make up about three quarters of a page, and every other field is returned either way."
    }
  },
  "additionalProperties": false
}
biorxiv_list_published_versions output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "publications",
        "pagination",
        "failed"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "Most publications this page can hold: rows per server (limit, or 100 when limit asked for more) times the servers queried. Set with truncated."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "invalid_date_range",
                "invalid_publisher",
                "upstream_unavailable",
                "rate_limited"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_date_range`: start_date or end_date is not a real calendar date (2024-02-30, 2024-13-01), or end_date is before start_date. `invalid_publisher`: publisher is combined with server=\"medrxiv\", or is a prefix api.biorxiv.org does not recognize. `upstream_unavailable`: Every attempted server failed against api.biorxiv.org, so no page was retrieved and an empty interval could not be established. `rate_limited`: Every attempted server failed and at least one was rejected with HTTP 429 by api.biorxiv.org. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Publications on this page, across every server queried. Set with truncated."
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "server",
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "What went wrong on that server."
          },
          "server": {
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "type": "string",
            "description": "Server whose request failed."
          }
        },
        "description": "A server that did not answer.",
        "additionalProperties": false
      },
      "description": "Servers that did not answer, so their rows are missing from \"publications\" and they have no \"pagination\" entry. Non-empty means this result set is partial — retry to include them. Only populated under server=\"both\", and never holding every attempted server: when none answered, the call fails with upstream_unavailable or rate_limited instead. Distinct from an exhausted pagination entry, where the server answered."
    },
    "notice": {
      "type": "string",
      "description": "Guidance on how to read this result set: which servers did not answer, that a publisher filter limited server=\"both\" to bioRxiv and which fields its rows lack, a limit above the 100-row page, which cursors are past the end, which servers have rows past this page, and — when nothing came back — the interval and how to broaden it. All applicable qualifications are composed into one string."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when at least one server has rows past this page — continue at that server's nextCursor. Absent when every server queried is on its last page."
    },
    "pagination": {
      "type": "object",
      "properties": {
        "biorxiv": {
          "type": "object",
          "required": [
            "cursor"
          ],
          "properties": {
            "total": {
              "type": "number",
              "description": "Journal publications on bioRxiv in the interval. Absent only when the entry is exhausted: bioRxiv reports no total for a cursor past its last row."
            },
            "cursor": {
              "type": "number",
              "description": "Cursor (row offset) this page was requested at."
            },
            "exhausted": {
              "type": "boolean",
              "description": "True when the cursor is at or past bioRxiv's last row: no rows came back at a non-zero cursor. Lower the cursor to page bioRxiv."
            },
            "nextCursor": {
              "type": "number",
              "description": "Cursor for the next page, when rows remain on bioRxiv past this one: this page's cursor plus the rows it served. Pass it as cursor to continue, at any limit."
            }
          },
          "description": "bioRxiv pagination state. Present when bioRxiv was queried and answered.",
          "additionalProperties": false
        },
        "medrxiv": {
          "type": "object",
          "required": [
            "cursor"
          ],
          "properties": {
            "total": {
              "type": "number",
              "description": "Journal publications on medRxiv in the interval. Absent only when the entry is exhausted: medRxiv reports no total for a cursor past its last row."
            },
            "cursor": {
              "type": "number",
              "description": "Cursor (row offset) this page was requested at."
            },
            "exhausted": {
              "type": "boolean",
              "description": "True when the cursor is at or past medRxiv's last row: no rows came back at a non-zero cursor. Lower the cursor to page medRxiv."
            },
            "nextCursor": {
              "type": "number",
              "description": "Cursor for the next page, when rows remain on medRxiv past this one: this page's cursor plus the rows it served. Pass it as cursor to continue, at any limit."
            }
          },
          "description": "medRxiv pagination state. Present when medRxiv was queried and answered.",
          "additionalProperties": false
        }
      },
      "description": "Per-server pagination state. Advance each server independently.",
      "additionalProperties": false
    },
    "publications": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "server",
          "preprintDoi"
        ],
        "properties": {
          "server": {
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "type": "string",
            "description": "Preprint server that listed this publication."
          },
          "preprintDoi": {
            "type": "string",
            "description": "Preprint DOI — input to biorxiv_get_preprint and the other DOI tools."
          },
          "preprintDate": {
            "type": "string",
            "description": "Preprint posting date (YYYY-MM-DD) as this row records it — the first posting for most preprints. medRxiv lists some 10.64898/ preprints on two rows that differ in this date, and sometimes in title or authors; both rows are returned. Not derivable from the DOI."
          },
          "publishedDoi": {
            "type": "string",
            "description": "Journal article DOI."
          },
          "preprintTitle": {
            "type": "string",
            "description": "Title of the preprint."
          },
          "publishedDate": {
            "type": "string",
            "description": "Journal publication date (YYYY-MM-DD), within the requested interval."
          },
          "preprintAuthors": {
            "type": "string",
            "description": "Preprint author list. Absent under a publisher filter."
          },
          "preprintAbstract": {
            "type": "string",
            "description": "Preprint abstract. Present only when include_abstract is true, and never under a publisher filter."
          },
          "preprintCategory": {
            "type": "string",
            "description": "Subject category."
          },
          "publishedJournal": {
            "type": "string",
            "description": "Name of the publishing journal. Absent under a publisher filter, whose rows carry none."
          },
          "preprintAuthorCorresponding": {
            "type": "string",
            "description": "Corresponding author name. Absent under a publisher filter."
          },
          "preprintAuthorCorrespondingInstitution": {
            "type": "string",
            "description": "Corresponding author institution. Absent under a publisher filter."
          }
        },
        "description": "One preprint and the journal article it became.",
        "additionalProperties": false
      },
      "description": "Publications in the interval, in upstream order: bioRxiv rows first, then medRxiv rows."
    }
  },
  "additionalProperties": false
}
biorxiv_list_published_versions annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
biorxiv_search_preprints — Search Preprints by Keyword
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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".

biorxiv_search_preprints input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 25,
      "maximum": 1000,
      "minimum": 1,
      "description": "Maximum results to return. Defaults to 25. Up to 100 per call: a larger value returns the first 100 and says so, and nextCursorMark continues the ranked list."
    },
    "query": {
      "type": "string",
      "description": "Keyword search query. Optional when author is provided — supply at least one of query or author."
    },
    "author": {
      "type": "string",
      "description": "Author name to filter by, mapped to an EuropePMC AUTH:\"…\" field query and ANDed with the keyword query. Optional when query is provided (e.g. \"Jennifer Doudna\")."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Server scope for the search and its enrichment: \"biorxiv\" or \"medrxiv\" returns only that server's preprints; \"both\" searches both and checks each matching DOI on both servers."
    },
    "date_to": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Latest first-publication date filter (YYYY-MM-DD)."
    },
    "date_from": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Earliest first-publication date filter (YYYY-MM-DD)."
    },
    "cursor_mark": {
      "type": "string",
      "description": "Opaque page token for ranked EuropePMC results. Omit for the first page; pass the nextCursorMark returned by a prior call to fetch the next page. Pages through the same ranked list rather than raising limit. A token EuropePMC does not recognize fails with invalid_cursor_mark."
    },
    "include_abstract": {
      "type": "boolean",
      "default": true,
      "description": "Include each result's abstract. Defaults to true. false omits the abstract from every result, enriched and EuropePMC-fallback alike, and keeps every other field."
    }
  },
  "additionalProperties": false
}
biorxiv_search_preprints output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "partial_results",
        "totalCount",
        "queryEcho"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "Results one call returns at most (100). Set with truncated."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "invalid_date_range",
                "search_unavailable",
                "invalid_cursor_mark",
                "rate_limited"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date (2024-02-30, 2024-13-01), or date_from is after date_to. `search_unavailable`: EuropePMC search endpoint is unreachable, returns a server error, or answers without a result list on every retry. On a cursor_mark page, HTTP 503 or a missing result list on every retry is this reason only when the first page of the same query fails too, or no time is left to check it. `invalid_cursor_mark`: EuropePMC answers a cursor_mark page with HTTP 503 or without a result list on every retry while the first page of the same query answers — the token is malformed or not one EuropePMC issued. `rate_limited`: The EuropePMC search endpoint rejected the keyword search with HTTP 429. Distinct from a rate-limited enrichment call, which degrades to EuropePMC-only metadata instead of failing. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Results on this page. Set with truncated."
    },
    "notice": {
      "type": "string",
      "description": "Present when zero results are returned: on a cursor_mark page past the last match, says the list is exhausted; otherwise echoes the query and suggests how to broaden it. Also present when limit was above the 100-result cap per call, and when abstracts for results shown with EuropePMC metadata only could not be retrieved, which leaves those results without one."
    },
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "doi",
          "enriched"
        ],
        "properties": {
          "doi": {
            "type": "string",
            "description": "Preprint DOI."
          },
          "date": {
            "type": "string",
            "description": "Posting or revision date."
          },
          "type": {
            "type": "string",
            "description": "Preprint type."
          },
          "title": {
            "type": "string",
            "description": "Preprint title."
          },
          "awards": {
            "type": "array",
            "items": {
              "type": "string",
              "description": "One award value as upstream records it."
            },
            "description": "Grant award numbers from the funding statement, verbatim and deduplicated — one value can hold several grants run together without a separator. Absent when none, and on EuropePMC-only fallback records. Funder names are not included: api.biorxiv.org attributes them to unrelated organizations."
          },
          "server": {
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "type": "string",
            "description": "Server the preprint was found on — accepted as the server input of every tool. Present on enriched records only."
          },
          "authors": {
            "type": "string",
            "description": "Author list."
          },
          "license": {
            "type": "string",
            "description": "License identifier."
          },
          "version": {
            "type": "string",
            "description": "Latest revision version."
          },
          "abstract": {
            "type": "string",
            "description": "Abstract text. Omitted when include_abstract is false. On a EuropePMC-fallback record, absent when EuropePMC holds none or the abstract lookup failed — the notice says when it failed."
          },
          "category": {
            "type": "string",
            "description": "Subject category."
          },
          "enriched": {
            "type": "boolean",
            "description": "True when full bioRxiv metadata was available; false for EuropePMC-only fallback."
          },
          "jatsxmlUrl": {
            "type": "string",
            "description": "URL to the JATS XML full-text."
          },
          "revisionCount": {
            "type": "number",
            "description": "Total revision count when enriched from bioRxiv."
          },
          "enrichment_error": {
            "enum": [
              "service_error",
              "not_found",
              "rate_limited"
            ],
            "type": "string",
            "description": "Reason enrichment was unavailable: \"service_error\" (transient — retry may help), \"rate_limited\" (api.biorxiv.org returned HTTP 429 — wait before retrying, and expect the other preprint metadata tools to be limited too), or \"not_found\" (DOI not indexed on target server — EuropePMC fallback is authoritative). Only present when enriched is false."
          },
          "authorCorresponding": {
            "type": "string",
            "description": "Corresponding author."
          },
          "publishedJournalDoi": {
            "type": "string",
            "description": "Published journal DOI when accepted."
          },
          "authorCorrespondingInstitution": {
            "type": "string",
            "description": "Corresponding author institution."
          }
        },
        "description": "A single search result.",
        "additionalProperties": false
      },
      "description": "Search results, ranked by EuropePMC relevance."
    },
    "queryEcho": {
      "type": "object",
      "required": [
        "server",
        "limit"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "description": "Maximum results requested from EuropePMC: the limit input, capped at 100 per call."
        },
        "query": {
          "type": "string",
          "description": "The keyword query sent to EuropePMC, if any."
        },
        "author": {
          "type": "string",
          "description": "The author filter applied as an AUTH: clause, if any."
        },
        "server": {
          "type": "string",
          "description": "Server scope used for enrichment."
        },
        "date_to": {
          "type": "string",
          "description": "date_to filter applied, if any."
        },
        "date_from": {
          "type": "string",
          "description": "date_from filter applied, if any."
        },
        "cursor_mark": {
          "type": "string",
          "description": "cursor_mark page token applied, if any."
        }
      },
      "description": "Echo of the parameters used to produce this result set — lets callers verify what was sent.",
      "additionalProperties": false
    },
    "truncated": {
      "type": "boolean",
      "description": "True when limit asked for more than the 100 results one call returns and this page holds all 100 — continue with nextCursorMark."
    },
    "totalCount": {
      "type": "number",
      "description": "Total preprints matching the query in EuropePMC (hitCount) — the true upstream grand total, not the number of results returned."
    },
    "nextCursorMark": {
      "type": "string",
      "description": "Opaque token for the next page of ranked results. Present only when more results exist beyond this page; pass it back as cursor_mark. Absent on the last page."
    },
    "partial_results": {
      "type": "boolean",
      "description": "True when one or more DOIs failed bioRxiv enrichment and fell back to EuropePMC metadata."
    }
  },
  "additionalProperties": false
}
biorxiv_search_preprints annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
biorxiv_get_fulltext — Get Preprint Full Text
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

biorxiv_get_fulltext input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "doi"
  ],
  "properties": {
    "doi": {
      "type": "string",
      "description": "Preprint DOI (e.g. 10.1101/2024.05.28.596311 or 10.64898/2026.05.07.723463). A doi.org or biorxiv.org/medrxiv.org article URL, a doi: prefix, or a .full suffix is accepted and stripped; a trailing vN (…596311v2) requests that version. Without one, the latest version is resolved automatically."
    },
    "limit": {
      "type": "integer",
      "default": 20000,
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Maximum number of characters to return in this chunk. Default 20,000; a value past the remaining text returns the rest of the article. Check the length field for the actual count returned."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Character offset into the full extracted text at which to start reading. 0 returns the beginning. To read the next chunk, use offset = prior_offset + prior_length (the length field from the previous response)."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ],
      "type": "string",
      "default": "both",
      "description": "Server the preprint was posted on. \"both\" (default) checks bioRxiv and medRxiv in parallel to resolve the DOI — the full-text fetch itself only ever targets whichever server resolved, and the output server field names it."
    },
    "version": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Preprint version to read (1, 2, …) — the revision numbers biorxiv_get_preprint lists. Omit for the latest version. Must match a vN suffix on the DOI when both are given."
    }
  },
  "additionalProperties": false
}
biorxiv_get_fulltext output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "doi",
        "server",
        "version",
        "content",
        "contentFormat",
        "wordCount",
        "sourceUrl",
        "offset",
        "length",
        "totalChars",
        "remainingChars",
        "hasMore"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "cap": {
      "type": "number",
      "description": "The limit (max characters) applied to this chunk."
    },
    "doi": {
      "type": "string",
      "description": "The resolved preprint DOI, in bare form."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "invalid_doi_format",
                "version_conflict",
                "version_not_found",
                "doi_not_found",
                "upstream_unavailable",
                "rate_limited",
                "fulltext_unavailable",
                "offset_out_of_range"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_doi_format`: The input DOI does not match the 10.NNNN/ pattern, even after URL, doi:, and suffix stripping. `version_conflict`: The DOI carries a vN suffix and the version input names a different version. `version_not_found`: The preprint exists but has no revision with the requested version number. `doi_not_found`: The DOI resolves to an empty collection on every attempted server. `upstream_unavailable`: No attempted server resolved the DOI and at least one lookup failed against api.biorxiv.org; the version lookup used most of the call's time budget, so the article page was never requested or had not answered when the budget ran out; or the article page (www.biorxiv.org / www.medrxiv.org) did not answer within the call. `rate_limited`: Either origin returned HTTP 429 for this host — the article page (www.biorxiv.org / www.medrxiv.org) during the full-text fetch, or api.biorxiv.org during version resolution. `fulltext_unavailable`: The preprint exists but its full-text HTML page is blocked, missing, or yields no extractable text (PDF-only). `offset_out_of_range`: offset is greater than or equal to the total character length of the extracted text. Other values are possible when a failure originates below the handler."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "shown": {
      "type": "number",
      "description": "Characters returned in this chunk."
    },
    "title": {
      "type": "string",
      "description": "Article title detected during extraction. Absent when the page exposed none."
    },
    "length": {
      "type": "number",
      "description": "Number of characters returned in this chunk."
    },
    "notice": {
      "type": "string",
      "description": "Paging guidance when the content was truncated — how to fetch the next chunk."
    },
    "offset": {
      "type": "number",
      "description": "Character offset into the full extracted text where this chunk begins."
    },
    "server": {
      "enum": [
        "biorxiv",
        "medrxiv"
      ],
      "type": "string",
      "description": "Server the preprint was resolved on."
    },
    "content": {
      "type": "string",
      "description": "The requested chunk of full text as best-effort Markdown extracted from the rendered HTML page. Section structure is approximate — this is not JATS."
    },
    "hasMore": {
      "type": "boolean",
      "description": "True when more text follows this chunk. When true, call again with offset = offset + length."
    },
    "version": {
      "type": "string",
      "description": "Preprint version whose full text was retrieved — the requested one, or the latest revision when none was requested. Pass it back as version when paging."
    },
    "sourceUrl": {
      "type": "string",
      "description": "The full-text HTML page the content was extracted from."
    },
    "truncated": {
      "type": "boolean",
      "description": "True when this chunk was capped by limit and more text remains."
    },
    "wordCount": {
      "type": "number",
      "description": "Approximate word count of the FULL extracted article, not just the returned chunk — whitespace-delimited tokens of the same Markdown text that totalChars measures, so Markdown markers such as # and - count too."
    },
    "totalChars": {
      "type": "number",
      "description": "Total characters in the full extracted text. Use with offset and length to page through long articles."
    },
    "contentFormat": {
      "type": "string",
      "const": "html-markdown",
      "description": "How content was produced: Markdown extracted from the rendered HTML article page (constant)."
    },
    "omittedTables": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "label",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "The article origin's page that serves this table's cells. Not fetched by this tool."
          },
          "label": {
            "type": "string",
            "description": "The table label as the article prints it, e.g. \"Table 1\"."
          }
        },
        "description": "One table whose cells content does not include.",
        "additionalProperties": false
      },
      "description": "Tables the article page names without their cells — content keeps each one's caption, and the cells live on a separate page at url. The same list on every chunk. Absent when the article has none."
    },
    "remainingChars": {
      "type": "number",
      "description": "Characters remaining after this chunk (totalChars - offset - length). 0 means this chunk reaches the end."
    }
  },
  "additionalProperties": false
}
biorxiv_get_fulltext annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

biorxiv-guide

Advertised by the server during the last successful anonymous check.

Search syntax, identifier origins, and counting gates for the biorxiv_* tools over bioRxiv and medRxiv preprints. Use when finding preprints by topic, author, or date window; counting what a category, funder, or journal took up; tracing a preprint to its journal article or back; or reading a preprint's full text or an earlier revision.

biorxiv-guide URI
skill://biorxiv-guide/SKILL.md

MIME type: text/markdown

io.modelcontextprotocol/skills

Advertised by the server during the last successful anonymous check.

io.modelcontextprotocol/skills URI template
skill://{+path}

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
677 ms
95th percentile latency
677 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 677 ms · metadata changed · 7 tool(s), 1 resource(s), 1 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http biorxiv-mcp-server-caseyjhand https://biorxiv.caseyjhand.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add biorxiv-mcp-server-caseyjhand --url https://biorxiv.caseyjhand.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable biorxiv-mcp-server-caseyjhand in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "biorxiv-mcp-server-caseyjhand": {
      "url": "https://biorxiv.caseyjhand.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "biorxiv-mcp-server-caseyjhand": {
      "type": "streamableHttp",
      "url": "https://biorxiv.caseyjhand.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start biorxiv-mcp-server-caseyjhand and inspect its tools.
VS Code configuration
{
  "servers": {
    "biorxiv-mcp-server-caseyjhand": {
      "type": "http",
      "url": "https://biorxiv.caseyjhand.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http biorxiv-mcp-server-caseyjhand https://biorxiv.caseyjhand.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://biorxiv.caseyjhand.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "biorxiv-mcp-server-caseyjhand": {
      "serverUrl": "https://biorxiv.caseyjhand.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like biorxiv-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.