biorxiv-mcp-server

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

我该使用它吗

质量与安全性

A
描述质量
100%
模式完整度
87%
命名质量
80%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~8,642token 数(工具定义)
~16.0 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 6.75%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。

安装

一键安装

将以下内容添加到你的 `claude_desktop_config.json` 文件中:

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

可运行的软件包

npm@cyanheads/biorxiv-mcp-server0.3.0streamable-http

远程端点

https://biorxiv.caseyjhand.com/mcpstreamable-http

它能做什么

工具清单

工具(6)

🟢 只读🟡 写入🔴 删除⚪ 未知
🟢biorxiv_list_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.

输入模式

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "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"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "biorxiv",
        "medrxiv"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢biorxiv_list_recent(start_date, end_date, server, category, funder, ...)

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

输入模式

{
  "type": "object",
  "properties": {
    "start_date": {
      "type": "string",
      "description": "Start of the date interval (YYYY-MM-DD)."
    },
    "end_date": {
      "type": "string",
      "description": "End of the date interval (YYYY-MM-DD)."
    },
    "server": {
      "default": "both",
      "description": "Server to query. \"both\" fans out to bioRxiv and medRxiv in parallel.",
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ]
    },
    "category": {
      "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.",
      "type": "string"
    },
    "funder": {
      "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.",
      "type": "string"
    },
    "cursor": {
      "default": 0,
      "description": "Integer page offset (0, 30, 60, …). Defaults to 0 (first page).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "include_abstract": {
      "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.",
      "type": "boolean"
    }
  },
  "required": [
    "start_date",
    "end_date"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "doi": {
            "type": "string",
            "description": "Preprint DOI."
          },
          "title": {
            "description": "Title of the preprint.",
            "type": "string"
          },
          "authors": {
            "description": "Author list.",
            "type": "string"
          },
          "authorCorresponding": {
            "description": "Corresponding author name.",
            "type": "string"
          },
          "authorCorrespondingInstitution": {
            "description": "Corresponding author institution.",
            "type": "string"
          },
          "date": {
            "description": "Posting or revision date (YYYY-MM-DD).",
            "type": "string"
          },
          "version": {
            "description": "Revision version number.",
            "type": "string"
          },
          "type": {
            "description": "Preprint type.",
            "type": "string"
          },
          "license": {
            "description": "License identifier.",
            "type": "string"
          },
          "category": {
            "description": "Subject category.",
            "type": "string"
          },
          "jatsxmlUrl": {
            "description": "URL to the JATS XML full-text.",
            "type": "string"
          },
          "abstract": {
            "description": "Abstract text. Present only when include_abstract is true.",
            "type": "string"
          },
          "awards": {
            "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.",
            "type": "array",
            "items": {
              "type": "string",
              "description": "One award value as upstream records it."
            }
          },
          "publishedJournalDoi": {
            "description": "Published journal DOI when this preprint has been accepted.",
            "type": "string"
          },
          "server": {
            "description": "Source server (biorxiv or medrxiv).",
            "type": "string"
          }
        },
        "required": [
          "doi"
        ],
        "additionalProperties": false,
        "description": "A single preprint entry."
      },
      "description": "Preprints in the requested date interval."
    },
    "pagination": {
      "type": "object",
      "properties": {
        "biorxiv": {
          "description": "bioRxiv pagination state. Present when server is \"biorxiv\" or \"both\".",
          "type": "object",
          "properties": {
            "cursor": {
              "type": "number",
              "description": "Current cursor (offset used for this page)."
            },
            "total": {
              "type": "number",
              "description": "Total preprints available on bioRxiv for these filters."
            },
            "nextCursor": {
              "description": "Cursor value for the next page, if any.",
              "type": "number"
            },
            "exhausted": {
              "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.",
              "type": "boolean"
            }
          },
          "required": [
            "cursor",
            "total"
          ],
          "additionalProperties": false
        },
        "medrxiv": {
          "description": "medRxiv pagination state. Present when server is \"medrxiv\" or \"both\", except under a funder filter, which queries bioRxiv only.",
          "type": "object",
          "properties": {
            "cursor": {
              "type": "number",
              "description": "Current cursor (offset used for this page)."
            },
            "total": {
              "type": "number",
              "description": "Total preprints available on medRxiv for these filters."
            },
            "nextCursor": {
              "description": "Cursor value for the next page, if any.",
              "type": "number"
            },
            "exhausted": {
              "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.",
              "type": "boolean"
            }
          },
          "required": [
            "cursor",
            "total"
          ],
          "additionalProperties": false
        }
      },
      "additionalProperties": false,
      "description": "Per-server pagination state. Advance each server independently."
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "server": {
            "type": "string",
            "enum": [
              "biorxiv",
              "medrxiv"
            ],
            "description": "Server whose listing request failed."
          },
          "error": {
            "type": "string",
            "description": "What went wrong on that server."
          }
        },
        "required": [
          "server",
          "error"
        ],
        "additionalProperties": false,
        "description": "A server that did not answer."
      },
      "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": {
      "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.",
      "type": "string"
    },
    "categoryNote": {
      "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.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_date_range`: end_date is before start_date, or either date is malformed. `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.",
              "examples": [
                "invalid_date_range",
                "invalid_category",
                "invalid_funder",
                "upstream_unavailable",
                "rate_limited"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "pagination",
        "failed"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢biorxiv_get_preprint(dois, server)

Fetch full metadata, 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. 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. 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.

输入模式

{
  "type": "object",
  "properties": {
    "dois": {
      "minItems": 1,
      "maxItems": 10,
      "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."
      },
      "description": "One or more preprint DOIs to look up (max 10)."
    },
    "server": {
      "default": "both",
      "description": "Server to query. \"both\" checks bioRxiv and medRxiv in parallel for each DOI.",
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ]
    }
  },
  "required": [
    "dois"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "doi": {
            "type": "string",
            "description": "The requested DOI in bare form (any URL, doi: prefix, or suffix removed)."
          },
          "revisions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "doi": {
                  "type": "string",
                  "description": "Preprint DOI."
                },
                "title": {
                  "description": "Title.",
                  "type": "string"
                },
                "authors": {
                  "description": "Author list.",
                  "type": "string"
                },
                "authorCorresponding": {
                  "description": "Corresponding author name.",
                  "type": "string"
                },
                "authorCorrespondingInstitution": {
                  "description": "Corresponding author institution.",
                  "type": "string"
                },
                "date": {
                  "description": "Revision date (YYYY-MM-DD).",
                  "type": "string"
                },
                "version": {
                  "description": "Revision version number.",
                  "type": "string"
                },
                "type": {
                  "description": "Preprint type.",
                  "type": "string"
                },
                "license": {
                  "description": "License identifier.",
                  "type": "string"
                },
                "category": {
                  "description": "Subject category.",
                  "type": "string"
                },
                "jatsxmlUrl": {
                  "description": "URL to the JATS XML full-text.",
                  "type": "string"
                },
                "abstract": {
                  "description": "Abstract text.",
                  "type": "string"
                },
                "awards": {
                  "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.",
                  "type": "array",
                  "items": {
                    "type": "string",
                    "description": "One award value as upstream records it."
                  }
                },
                "publishedJournalDoi": {
                  "description": "Published journal DOI when accepted.",
                  "type": "string"
                },
                "server": {
                  "description": "Source server (biorxiv or medrxiv).",
                  "type": "string"
                }
              },
              "required": [
                "doi"
              ],
              "additionalProperties": false,
              "description": "A single preprint revision."
            },
            "description": "All revisions for this preprint, earliest first."
          }
        },
        "required": [
          "doi",
          "revisions"
        ],
        "additionalProperties": false,
        "description": "A preprint and all its revisions."
      },
      "description": "Successfully resolved preprints with their full revision history."
    },
    "failed": {
      "type": "array",
      "items": {
        "type": "object",
        "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": {
            "type": "string",
            "enum": [
              "not_found",
              "invalid_doi_format",
              "upstream_unavailable",
              "rate_limited"
            ],
            "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": {
            "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.",
            "type": "number"
          }
        },
        "required": [
          "doi",
          "error",
          "reason",
          "retryable"
        ],
        "additionalProperties": false,
        "description": "A DOI that failed to resolve."
      },
      "description": "DOIs that could not be resolved, with per-DOI error details."
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `doi_not_found`: ALL requested DOIs resolve to empty collections on all requested servers, with every server answering. `invalid_doi_format`: Every input DOI fails to match the 10.NNNN/ pattern, even after URL, doi:, and suffix stripping. `upstream_unavailable`: No DOI resolved 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 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.",
              "examples": [
                "doi_not_found",
                "invalid_doi_format",
                "upstream_unavailable",
                "rate_limited"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "failed"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢biorxiv_get_published_version(doi, server)

Resolve a preprint DOI to its full journal publication record — journal DOI, journal name, published date, and corresponding author details. Use when the preprint's `publishedJournalDoi` field from biorxiv_get_preprint is present and you need the full crosswalk metadata. bioRxiv and medRxiv share their DOI prefixes, so server="both" (the default) checks both in parallel and the response reports which server answered. Works for 10.1101/ and 10.64898/ DOIs alike; 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 only when no server holds the preprint or it lists no journal version at all.

输入模式

{
  "type": "object",
  "properties": {
    "doi": {
      "type": "string",
      "description": "Preprint DOI to resolve (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."
    },
    "server": {
      "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.",
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ]
    }
  },
  "required": [
    "doi"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "preprintDoi": {
      "type": "string",
      "description": "The preprint DOI that was resolved, in bare form."
    },
    "server": {
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv"
      ],
      "description": "The server that returned this published record — never \"both\"."
    },
    "publishedDoi": {
      "description": "The journal publication DOI.",
      "type": "string"
    },
    "publishedJournal": {
      "description": "Name of the publishing journal. Absent when the crosswalk holds no record for this preprint — see notice.",
      "type": "string"
    },
    "publishedDate": {
      "description": "Journal publication date (YYYY-MM-DD). Absent when the crosswalk holds no record for this preprint — see notice.",
      "type": "string"
    },
    "preprintTitle": {
      "description": "Title of the preprint.",
      "type": "string"
    },
    "preprintAuthors": {
      "description": "Preprint author list.",
      "type": "string"
    },
    "preprintCategory": {
      "description": "Subject category.",
      "type": "string"
    },
    "preprintDate": {
      "description": "Date the preprint was first posted.",
      "type": "string"
    },
    "preprintAbstract": {
      "description": "Preprint abstract.",
      "type": "string"
    },
    "preprintAuthorCorresponding": {
      "description": "Corresponding author name.",
      "type": "string"
    },
    "preprintAuthorCorrespondingInstitution": {
      "description": "Corresponding author institution.",
      "type": "string"
    },
    "notice": {
      "description": "Present when publishedDoi came from the preprint's own record because the crosswalk had none: says why publishedJournal and publishedDate are absent.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `doi_not_found`: No attempted server holds the preprint, or neither the crosswalk nor its preprint record lists a journal version. `invalid_doi_format`: The input DOI does not match the 10.NNNN/ 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.",
              "examples": [
                "doi_not_found",
                "invalid_doi_format",
                "upstream_unavailable",
                "rate_limited"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprintDoi",
        "server"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢biorxiv_search_preprints(query, author, server, date_from, date_to, ...)

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

输入模式

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Keyword search query. Optional when author is provided — supply at least one of query or author.",
      "type": "string"
    },
    "author": {
      "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\").",
      "type": "string"
    },
    "server": {
      "default": "both",
      "description": "Server scope for enrichment. \"both\" checks all matching DOIs on both servers.",
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ]
    },
    "date_from": {
      "description": "Earliest first-publication date filter (YYYY-MM-DD).",
      "type": "string"
    },
    "date_to": {
      "description": "Latest first-publication date filter (YYYY-MM-DD).",
      "type": "string"
    },
    "limit": {
      "default": 25,
      "description": "Maximum results to return (1–100). Defaults to 25.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "include_abstract": {
      "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.",
      "type": "boolean"
    },
    "cursor_mark": {
      "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.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "preprints": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "doi": {
            "type": "string",
            "description": "Preprint DOI."
          },
          "title": {
            "description": "Preprint title.",
            "type": "string"
          },
          "authors": {
            "description": "Author list.",
            "type": "string"
          },
          "authorCorresponding": {
            "description": "Corresponding author.",
            "type": "string"
          },
          "authorCorrespondingInstitution": {
            "description": "Corresponding author institution.",
            "type": "string"
          },
          "date": {
            "description": "Posting or revision date.",
            "type": "string"
          },
          "version": {
            "description": "Latest revision version.",
            "type": "string"
          },
          "type": {
            "description": "Preprint type.",
            "type": "string"
          },
          "license": {
            "description": "License identifier.",
            "type": "string"
          },
          "category": {
            "description": "Subject category.",
            "type": "string"
          },
          "server": {
            "description": "Source server (biorxiv or medrxiv).",
            "type": "string"
          },
          "jatsxmlUrl": {
            "description": "URL to the JATS XML full-text.",
            "type": "string"
          },
          "awards": {
            "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.",
            "type": "array",
            "items": {
              "type": "string",
              "description": "One award value as upstream records it."
            }
          },
          "publishedJournalDoi": {
            "description": "Published journal DOI when accepted.",
            "type": "string"
          },
          "abstract": {
            "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.",
            "type": "string"
          },
          "enriched": {
            "type": "boolean",
            "description": "True when full bioRxiv metadata was available; false for EuropePMC-only fallback."
          },
          "enrichment_error": {
            "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.",
            "type": "string",
            "enum": [
              "service_error",
              "not_found",
              "rate_limited"
            ]
          },
          "revisionCount": {
            "description": "Total revision count when enriched from bioRxiv.",
            "type": "number"
          }
        },
        "required": [
          "doi",
          "enriched"
        ],
        "additionalProperties": false,
        "description": "A single search result."
      },
      "description": "Search results, ranked by EuropePMC relevance."
    },
    "partial_results": {
      "type": "boolean",
      "description": "True when one or more DOIs failed bioRxiv enrichment and fell back to EuropePMC metadata."
    },
    "totalCount": {
      "type": "number",
      "description": "Total preprints matching the query in EuropePMC (hitCount) — the true upstream grand total, not the number of results returned."
    },
    "nextCursorMark": {
      "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.",
      "type": "string"
    },
    "queryEcho": {
      "type": "object",
      "properties": {
        "query": {
          "description": "The keyword query sent to EuropePMC, if any.",
          "type": "string"
        },
        "author": {
          "description": "The author filter applied as an AUTH: clause, if any.",
          "type": "string"
        },
        "server": {
          "type": "string",
          "description": "Server scope used for enrichment."
        },
        "date_from": {
          "description": "date_from filter applied, if any.",
          "type": "string"
        },
        "date_to": {
          "description": "date_to filter applied, if any.",
          "type": "string"
        },
        "cursor_mark": {
          "description": "cursor_mark page token applied, if any.",
          "type": "string"
        },
        "limit": {
          "type": "number",
          "description": "Maximum results requested."
        }
      },
      "required": [
        "server",
        "limit"
      ],
      "additionalProperties": false,
      "description": "Echo of the parameters used to produce this result set — lets callers verify what was sent."
    },
    "notice": {
      "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 abstracts for results shown with EuropePMC metadata only could not be retrieved, which leaves those results without one.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is malformed, or date_from is after date_to. `search_unavailable`: EuropePMC search endpoint is unreachable, returns a server error, or answers a first-page search without a result list on every retry. `invalid_cursor_mark`: EuropePMC answers a cursor_mark page request without a result list on every retry — 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.",
              "examples": [
                "invalid_date_range",
                "search_unavailable",
                "invalid_cursor_mark",
                "rate_limited"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "preprints",
        "partial_results",
        "totalCount",
        "queryEcho"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢biorxiv_get_fulltext(doi, version, server, offset, limit)

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, and references. 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, abstract, and metadata. For a preprint that has been published in a journal, the journal's version may have richer full text elsewhere.

输入模式

{
  "type": "object",
  "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."
    },
    "version": {
      "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.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "server": {
      "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.",
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv",
        "both"
      ]
    },
    "offset": {
      "default": 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).",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "limit": {
      "default": 20000,
      "description": "Maximum number of characters to return in this chunk. Default 20,000; increase toward 50,000 for large context windows. Check the length field for the actual count returned.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50000
    }
  },
  "required": [
    "doi"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

输出模式

{
  "type": "object",
  "properties": {
    "doi": {
      "type": "string",
      "description": "The resolved preprint DOI, in bare form."
    },
    "server": {
      "type": "string",
      "enum": [
        "biorxiv",
        "medrxiv"
      ],
      "description": "Server the preprint was resolved on."
    },
    "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."
    },
    "title": {
      "description": "Article title detected during extraction. Absent when the page exposed none.",
      "type": "string"
    },
    "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."
    },
    "contentFormat": {
      "type": "string",
      "const": "html-markdown",
      "description": "How content was produced: Markdown extracted from the rendered HTML article page (constant)."
    },
    "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."
    },
    "sourceUrl": {
      "type": "string",
      "description": "The full-text HTML page the content was extracted from."
    },
    "offset": {
      "type": "number",
      "description": "Character offset into the full extracted text where this chunk begins."
    },
    "length": {
      "type": "number",
      "description": "Number of characters returned in this chunk."
    },
    "totalChars": {
      "type": "number",
      "description": "Total characters in the full extracted text. Use with offset and length to page through long articles."
    },
    "remainingChars": {
      "type": "number",
      "description": "Characters remaining after this chunk (totalChars - offset - length). 0 means this chunk reaches the end."
    },
    "hasMore": {
      "type": "boolean",
      "description": "True when more text follows this chunk. When true, call again with offset = offset + length."
    },
    "truncated": {
      "description": "True when this chunk was capped by limit and more text remains.",
      "type": "boolean"
    },
    "shown": {
      "description": "Characters returned in this chunk.",
      "type": "number"
    },
    "cap": {
      "description": "The limit (max characters) applied to this chunk.",
      "type": "number"
    },
    "notice": {
      "description": "Paging guidance when the content was truncated — how to fetch the next chunk.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "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. `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.",
              "examples": [
                "invalid_doi_format",
                "version_conflict",
                "version_not_found",
                "doi_not_found",
                "upstream_unavailable",
                "rate_limited",
                "fulltext_unavailable",
                "offset_out_of_range"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "doi",
        "server",
        "version",
        "content",
        "contentFormat",
        "wordCount",
        "sourceUrl",
        "offset",
        "length",
        "totalChars",
        "remainingChars",
        "hasMore"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}

社区

评价此服务器

证据

最近观测

已验证未记录版本6 个工具
已验证未记录版本6 个工具