Servidor MCP

pubmed-mcp-server

io.github.cyanheads/pubmed-mcp-server
Salud Búsqueda e investigación Público y accesible MCP 2025-11-25

Qué hace este MCP

Searches and retrieves PubMed and Europe PMC biomedical articles, full text, citations, related studies, identifiers, and MeSH terms.

pubmed_convert_ids
Pubmed Convert Ids
Convert between article identifiers (DOI, PMID, PMCID). Accepts up to 50 IDs of a single type per request. Only resolves articles indexed in PubMed Central — for articles not in PMC, use pubmed_search_articles instead.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ids', 'idType'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 50, 'minItems': 1, 'description': 'Article identifiers to convert â\x80\x94 one identifier per element, all of the same type. Each element is checked against `idType` before the request: `doi` starts with "10." and carries a "/" ("10.1093/nar/gks1195"); `pmid` is digits ("23193287"); `pmcid` is digits with an optional "PMC" prefix ("PMC3531190" or "3531190"). No element may contain a comma or whitespace â\x80\x94 a packed value like "23193287,37952131" is rejected, so split it across elements.'}, 'idType': {'enum': ['pmcid', 'pmid', 'doi'], 'type': 'string', 'description': 'The type of IDs being submitted. Required so the API can unambiguously resolve them.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['records', 'totalConverted', 'totalSubmitted']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found', 'malformed_id'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). `malformed_id`: An `ids` element does not match the declared `idType` â\x80\x94 most often several identifiers packed into one element, which the comma-delimited upstream batch would split into extra records. 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': {}}, 'records': {'type': 'array', 'items': {'type': 'object', 'required': ['requestedId'], 'properties': {'doi': {'type': 'string', 'description': 'Digital Object Identifier, cased as the PMC ID Converter reports it; absent if no DOI is on record. DOIs are case-insensitive by spec and no case normalization is applied here, so casing can differ from a Europe PMC-sourced `doi` â\x80\x94 compare the two case-insensitively.'}, 'pmid': {'type': 'string', 'description': 'PubMed ID; absent if no mapping was found'}, 'pmcid': {'type': 'string', 'description': 'PubMed Central ID; absent if the article has no PMC copy'}, 'errmsg': {'type': 'string', 'description': 'Error message if conversion failed. Presence of `errmsg` is the failure signal; absence means the conversion succeeded.'}, 'requestedId': {'type': 'string', 'description': 'The ID that was submitted'}}, 'description': 'Per-ID conversion record', 'additionalProperties': False}, 'description': 'Conversion results, one per input ID'}, 'totalConverted': {'type': 'number', 'description': 'Number of IDs successfully converted'}, 'totalSubmitted': {'type': 'number', 'description': 'Number of IDs submitted'}}, 'additionalProperties': False}
pubmed_europepmc_fetch
Pubmed Europepmc Fetch
Fetch complete Europe PMC records — including the full, untruncated abstract — for records addressed by `source` plus `epmcId`. Pairs with `pubmed_europepmc_search`, which returns bounded `abstractSnippet` values and flags cut ones with `abstractTruncated: true`; pass those hits' `source` and `epmcId` here to read the whole abstract. This is the retrieval path for preprint (`PPR`), patent (`PAT`), and Agricola (`AGR`) records, which frequently carry no PMID and no DOI, so `pubmed_fetch_articles` and `pubmed_fetch_fulltext` cannot address them. Up to 25 records per call.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['records'], 'properties': {'records': {'type': 'array', 'items': {'type': 'object', 'required': ['source', 'epmcId'], 'properties': {'epmcId': {'type': 'string', 'pattern': '^[A-Za-z0-9][A-Za-z0-9._-]*$', 'maxLength': 64, 'description': "Europe PMC's own record id within that source. Copy it from the search hit's `epmcId` â\x80\x94 for `MED` records this is the PMID; for the other sources it is an EPMC-native accession."}, 'source': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string', 'description': "Europe PMC source corpus â\x80\x94 `MED` (PubMed), `PMC` (PubMed Central), `PPR` (preprint), `PAT` (patent), `AGR` (Agricola). Copy it from the search hit's `source`. `PMC` paired with a PMCID resolves whether or not the article is also indexed in PubMed, and a PubMed-indexed one comes back as its canonical `MED` record carrying that PMCID in `pmcId`."}}, 'description': 'One record address: the Europe PMC source corpus plus its id within that corpus'}, 'maxItems': 25, 'minItems': 1, 'description': 'Records to retrieve, each addressed by the `source` and `epmcId` of a `pubmed_europepmc_search` hit. The whole batch resolves in one Europe PMC request.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['records']}, {'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': ['europepmc_unreachable', 'europepmc_invalid_response', 'europepmc_invalid_input', 'europepmc_disabled'], 'description': 'Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt â\x80\x94 unreachable, an HTTP 404 or 5xx other than a 504 timeout from its search endpoint, or an empty response with no results. `europepmc_invalid_response`: Europe PMC returned a body that could not be parsed (invalid JSON or XML). `europepmc_invalid_input`: Europe PMC rejected the request input â\x80\x94 an error message in place of results, an empty response to a sort with an undocumented field or no asc/desc direction, or a pagination cursor it cannot read (an empty response on the last attempt the retry budget allows, or a second HTTP 503 when the first page of the same query is served). `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. 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': 'Guidance when one or more requested records could not be resolved. Absent when every record came back.'}, 'records': {'type': 'array', 'items': {'type': 'object', 'required': ['source', 'epmcId', 'epmcUrl'], 'properties': {'doi': {'type': 'string', 'description': 'DOI when present, cased as Europe PMC reports it. DOIs are case-insensitive by spec and no case normalization is applied here, so the same DOI can arrive in a different case from `pubmed_fetch_articles` (Europe PMC `10.1056/nejmoa2212948`, NCBI `10.1056/NEJMoa2212948`) â\x80\x94 a byte-for-byte comparison across the two reports a false mismatch.'}, 'pmid': {'type': 'string', 'description': 'PMID when present in PubMed'}, 'pmcId': {'type': 'string', 'description': 'PMC ID when present in PMC'}, 'title': {'type': 'string', 'description': 'Record title as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'epmcId': {'type': 'string', 'description': "Europe PMC's internal record id"}, 'source': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string', 'description': 'Europe PMC source the record was resolved from'}, 'authors': {'type': 'string', 'description': 'Formatted author string as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'epmcUrl': {'type': 'string', 'description': 'Europe PMC article URL'}, 'journal': {'type': 'string', 'description': 'Journal title as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'pubYear': {'type': 'string', 'description': 'Publication year'}, 'abstract': {'type': 'string', 'description': 'Complete abstract as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded, never truncated. Omitted when Europe PMC carries no abstract for the record.'}, 'citedByCount': {'type': 'number', 'description': 'Citation count reported by Europe PMC'}, 'isOpenAccess': {'type': 'boolean', 'description': 'Whether Europe PMC reports the record as open access'}, 'hasFullTextXml': {'type': 'boolean', 'description': 'Whether Europe PMC publishes a fullTextXML for this record. Derived from `inPMC` â\x80\x94 only records with a PMC counterpart have JATS via Europe PMC.'}, 'firstPublicationDate': {'type': 'string', 'description': 'First publication date (ISO YYYY-MM-DD)'}}, 'description': 'Complete Europe PMC record', 'additionalProperties': False}, 'description': 'Resolved records, in the order Europe PMC returned them'}, 'notFound': {'type': 'array', 'items': {'type': 'object', 'required': ['source', 'epmcId'], 'properties': {'epmcId': {'type': 'string', 'pattern': '^[A-Za-z0-9][A-Za-z0-9._-]*$', 'maxLength': 64, 'description': "Europe PMC's own record id within that source. Copy it from the search hit's `epmcId` â\x80\x94 for `MED` records this is the PMID; for the other sources it is an EPMC-native accession."}, 'source': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string', 'description': "Europe PMC source corpus â\x80\x94 `MED` (PubMed), `PMC` (PubMed Central), `PPR` (preprint), `PAT` (patent), `AGR` (Agricola). Copy it from the search hit's `source`. `PMC` paired with a PMCID resolves whether or not the article is also indexed in PubMed, and a PubMed-indexed one comes back as its canonical `MED` record carrying that PMCID in `pmcId`."}}, 'description': 'One record address: the Europe PMC source corpus plus its id within that corpus', 'additionalProperties': False}, 'description': 'Requested `source` + `epmcId` pairs Europe PMC returned no record for'}}, 'additionalProperties': False}
pubmed_europepmc_search
Pubmed Europepmc Search
Search Europe PMC, a broad open-access biomedical corpus. Surfaces preprints (`source: PPR`), patents (`source: PAT`), Agricola (`source: AGR`), plus everything in PubMed (`MED`) and PMC. Use when additional coverage is needed — preprints and EPMC-only OA records are the typical recovery. Paginate via `cursorMark`. Defaults to `MED`, `PMC`, and `PPR`; pass `sources` to include `PAT` / `AGR`. Abstracts arrive as a bounded `abstractSnippet` with `abstractTruncated` marking the cut ones — pass a hit’s `source` and `epmcId` to `pubmed_europepmc_fetch` for the complete abstract.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'sort': {'type': 'string', 'description': 'Optional EPMC sort: `<field> asc|desc`, or several comma-separated keys applied in order (`PUB_YEAR desc, CITED desc`). Documented sortable fields: `P_PDATE_D` (publication date), `CITED` (citation count), `AUTH_FIRST` (first author surname), `PUB_YEAR` (publication year). Examples: `P_PDATE_D desc` (newest first), `CITED desc` (most cited). Omit for relevance ranking. Field and direction match case-insensitively. A field outside the documented set may be honored, silently ignored, or rejected, and a sort using one â\x80\x94 or a key without `asc`/`desc` â\x80\x94 can fail with `europepmc_invalid_input` naming it, even when Europe PMC honors the field. Note: `P_PDATE_D` is ignored for preprint-only (`sources: ["PPR"]`) result sets â\x80\x94 preprints have no populated publication date, so use `PUB_YEAR` to order preprints by date.'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'Europe PMC search query. Supports field tokens like `AUTH:"<name>"`, `JOURNAL:"<title>"`, `TITLE:"<words>"`, `PUB_YEAR:[2020 TO 2024]`, `DOI:"..."`, `EXT_ID:<pmid> AND SRC:MED`, `PMCID:PMC<digits>`. Identifier tokens may be quoted or unquoted â\x80\x94 this tool wraps every query with its `sources` filter, and Europe PMC honors a quoted identifier inside that wrapper. A PubMed-indexed article resolves under `SRC:MED`, not `SRC:PMC`, whichever identifier is used. Free text is matched broadly across abstract/title/keywords. A query with no search term â\x80\x94 blank once HTML entities are decoded and markup, parentheses, and invisible characters are disregarded, such as `()` or `<b></b>` â\x80\x94 is rejected; any other query is sent as written.'}, 'sources': {'type': 'array', 'items': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string'}, 'minItems': 1, 'description': 'Filter to specific EPMC sources. Defaults to MED, PMC, PPR when omitted. Pass an explicit array including PAT or AGR to broaden coverage. Allowed values: MED, PMC, PPR, PAT, AGR.'}, 'pageSize': {'type': 'integer', 'default': 25, 'maximum': 100, 'minimum': 1, 'description': 'Results per page. Max 100 per EPMC API.'}, 'cursorMark': {'type': 'string', 'default': '*', 'description': "Pagination cursor. Use `*` (default) for the first page; pass the previous response's `nextCursorMark` verbatim for subsequent pages. A whitespace-only cursor, invisible characters included, is rejected before the request, and a cursor Europe PMC cannot read fails with `europepmc_invalid_input` once a retry of it fails again while the first page of the same query is served."}, 'resultType': {'enum': ['core', 'lite'], 'type': 'string', 'default': 'core', 'description': '`core` returns abstract, IDs, dates, license; `lite` is a smaller payload with IDs and titles only.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['hits', 'cursorMark', 'searchUrl', 'totalCount', 'query', 'appliedSources']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'hits': {'type': 'array', 'items': {'type': 'object', 'required': ['source', 'epmcId', 'epmcUrl'], 'properties': {'doi': {'type': 'string', 'description': 'DOI when present, cased as Europe PMC reports it. DOIs are case-insensitive by spec and no case normalization is applied here, so the same DOI can arrive in a different case from `pubmed_fetch_articles` (Europe PMC `10.1056/nejmoa2212948`, NCBI `10.1056/NEJMoa2212948`) â\x80\x94 a byte-for-byte comparison across the two reports a false mismatch.'}, 'pmid': {'type': 'string', 'description': 'PMID when present in PubMed'}, 'pmcId': {'type': 'string', 'description': 'PMC ID when present in PMC'}, 'title': {'type': 'string', 'description': 'Article title as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'epmcId': {'type': 'string', 'description': "Europe PMC's internal record id. Pass it with this hit's `source` to `pubmed_europepmc_fetch` for the complete record. Europe PMC's `fullTextXML` is keyed on `pmcId`, not on this id, so records without a PMC counterpart have no full text to fetch."}, 'source': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string', 'description': 'Europe PMC source â\x80\x94 `MED` (PubMed), `PMC` (PubMed Central), `PPR` (preprint), `PAT` (patent), `AGR` (Agricola)'}, 'authors': {'type': 'string', 'description': 'Formatted author string as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'epmcUrl': {'type': 'string', 'description': 'Europe PMC article URL'}, 'journal': {'type': 'string', 'description': 'Journal title as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded.'}, 'pubYear': {'type': 'string', 'description': 'Publication year'}, 'citedByCount': {'type': 'number', 'description': 'Citation count reported by Europe PMC'}, 'isOpenAccess': {'type': 'boolean', 'description': 'Whether EPMC reports the record as open access'}, 'hasFullTextXml': {'type': 'boolean', 'description': 'Whether Europe PMC publishes a fullTextXML for this record. Derived from `inPMC` â\x80\x94 only records with a PMC counterpart have JATS via EPMC; preprints (`PPR`) and MED-only records return false.'}, 'abstractSnippet': {'type': 'string', 'description': 'First 400 characters of the abstract as display-ready plain text â\x80\x94 JATS/HTML markup stripped and HTML entities decoded â\x80\x94 when `resultType: "core"` is requested, with a trailing â\x80¦ appended when the abstract was cut. Check `abstractTruncated` before treating it as the whole abstract.'}, 'abstractTruncated': {'type': 'boolean', 'description': 'Whether `abstractSnippet` was cut short of the full abstract. Retrieve the complete text with `pubmed_europepmc_fetch` using this recordâ\x80\x99s `source` and `epmcId`. Present whenever `abstractSnippet` is; omitted when Europe PMC carries no abstract.'}, 'firstPublicationDate': {'type': 'string', 'description': 'First publication date (ISO YYYY-MM-DD)'}}, 'description': 'Single Europe PMC record returned by the search', 'additionalProperties': False}, 'description': 'Matching Europe PMC records, in the order EPMC returned them'}, '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': ['europepmc_unreachable', 'europepmc_invalid_response', 'europepmc_invalid_input', 'blank_query', 'blank_cursor', 'europepmc_disabled'], 'description': 'Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt â\x80\x94 unreachable, an HTTP 404 or 5xx other than a 504 timeout from its search endpoint, or an empty response with no results. `europepmc_invalid_response`: Europe PMC returned a body that could not be parsed (invalid JSON or XML). `europepmc_invalid_input`: Europe PMC rejected the request input â\x80\x94 an error message in place of results, an empty response to a sort with an undocumented field or no asc/desc direction, or a pagination cursor it cannot read (an empty response on the last attempt the retry budget allows, or a second HTTP 503 when the first page of the same query is served). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. `blank_cursor`: The `cursorMark` holds only whitespace or invisible characters such as a zero-width space. Europe PMC cannot read it and answers with the HTTP 503 it also uses for an outage. `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. 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': {}}, 'query': {'type': 'string', 'description': 'Effective query string echoed by Europe PMC'}, 'notice': {'type': 'string', 'description': 'Optional guidance when results are empty or paging overshot'}, 'searchUrl': {'type': 'string', 'description': "Europe PMC's website search URL for this query"}, 'cursorMark': {'type': 'string', 'description': 'Cursor used for this response (echoed from the request)'}, 'totalCount': {'type': 'number', 'description': 'Total matching records across all pages'}, 'appliedSources': {'type': 'array', 'items': {'enum': ['MED', 'PMC', 'PPR', 'PAT', 'AGR'], 'type': 'string'}, 'description': 'Sources the query was filtered against (defaults applied)'}, 'nextCursorMark': {'type': 'string', 'description': 'Cursor to pass back as `cursorMark` for the next page. Absent on the final page.'}}, 'additionalProperties': False}
pubmed_fetch_articles
Pubmed Fetch Articles
Fetch full article metadata by PubMed IDs. Returns detailed article information including abstract, authors, journal, MeSH terms, and linked retraction, erratum, and comment notices. Set `maxResponseCharacters` to bound the whole response: articles past the ceiling are deferred whole and listed in `deferred.ids` for a follow-up call.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pmids'], 'properties': {'pmids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^\\d+$'}, 'maxItems': 200, 'minItems': 1, 'description': 'PubMed IDs to fetch'}, 'includeMesh': {'type': 'boolean', 'default': True, 'description': 'Include MeSH terms'}, 'includeGrants': {'type': 'boolean', 'default': False, 'description': 'Include grant information'}, 'maxResponseCharacters': {'type': 'integer', 'maximum': 1000000, 'minimum': 1, 'description': 'Opt-in ceiling for the whole response, in characters. Each article is measured as the JSON record it is returned as â\x80\x94 title, abstract, authors, journal, MeSH terms, grants, identifiers, every field it carries. Articles are kept in response order until the next one would cross the ceiling; that article and the rest are deferred whole (never partially populated) and listed in `deferred.ids`. Response envelope fields â\x80\x94 counts, `unavailablePmids`, `deferred` itself â\x80\x94 are not counted. Omit to return every resolved article.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['articles', 'totalReturned']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found', 'invalid_efetch_response'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). `invalid_efetch_response`: NCBI EFetch returned a payload missing the PubmedArticleSet wrapper. 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': 'Optional guidance when no articles were returned â\x80\x94 points to discovery tools â\x80\x94 or when `maxResponseCharacters` deferred articles, naming how to retrieve them. Absent on successful unbudgeted fetches.'}, 'articles': {'type': 'array', 'items': {'type': 'object', 'required': ['recordType'], 'properties': {'doi': {'type': 'string', 'description': "DOI, cased as NCBI reports it (usually the publisher's mixed case). DOIs are case-insensitive by spec and no case normalization is applied here, so the same DOI can arrive in a different case from `pubmed_europepmc_search` and `pubmed_europepmc_fetch` (NCBI `10.1056/NEJMoa2212948`, Europe PMC `10.1056/nejmoa2212948`) â\x80\x94 a byte-for-byte comparison across the two reports a false mismatch."}, 'book': {'type': 'object', 'properties': {'doi': {'type': 'string', 'description': 'The book\'s own DOI, from `Book/ELocationID` with `EIdType="doi"`. Distinct from the record-level `doi`, which is the chapter\'s: a chapter does not inherit this one.'}, 'isbns': {'type': 'array', 'items': {'type': 'string', 'description': 'One ISBN, verbatim as NCBI reports it â\x80\x94 leading zeros intact'}, 'description': 'Every `Book/Isbn` on the record. A book commonly carries a print and an electronic ISBN, so this is a list. Absent for a Bookshelf title with no ISBN, which is most of them.'}, 'title': {'type': 'string', 'description': 'Title of the containing book, from `Book/BookTitle` (e.g. "GeneReviews®"). On a `book` record this is the same value as the record\'s own `title`.'}, 'medium': {'type': 'string', 'description': 'Medium the book is published in, from `Book/Medium` â\x80\x94 "Internet" wherever NCBI supplies it. Absent when NCBI supplies none; it is never defaulted.'}, 'edition': {'type': 'string', 'description': 'Edition statement from `Book/Edition`. Rare on Bookshelf titles â\x80\x94 absent unless NCBI supplies one.'}, 'editors': {'type': 'array', 'items': {'type': 'object', 'properties': {'initials': {'type': 'string', 'description': 'Editor initials with no separators (e.g. "MP"). Absent when NCBI supplies none, or on a group editor.'}, 'lastName': {'type': 'string', 'description': 'Editor surname, from the book\'s `Book/AuthorList Type="editors"` entry. Absent on a group editor, which carries `collectiveName` instead.'}, 'firstName': {'type': 'string', 'description': 'Editor given name as NCBI supplies it (`ForeName`, often "Margaret P"). Absent when NCBI carries initials only, or on a group editor.'}, 'collectiveName': {'type': 'string', 'description': 'Group or committee credited as editor, when the entry names an organization rather than a person. Mutually exclusive with the name-part fields.'}}, 'description': 'One editor of the containing book. Name parts only â\x80\x94 editors are a citation credit, not a contributor record, so no affiliations or ORCID are reported for them.', 'additionalProperties': False}, 'description': 'Editors of the containing book, from `Book/AuthorList` marked `Type="editors"`. Kept out of `authors`, which carries the chapter\'s own writers. Absent when the book credits no editors.'}, 'pubDate': {'type': 'string', 'description': "Publication year from `Book/PubDate`. Year only â\x80\x94 NCBI's month and day are not reported, since no citation style uses them for a book."}, 'accession': {'type': 'string', 'description': 'NCBI Bookshelf accession from `ArticleIdList` (`bookaccession`), e.g. "NBK1247". The record is readable at `https://www.ncbi.nlm.nih.gov/books/<accession>/`.'}, 'publisher': {'type': 'string', 'description': 'Publisher of the book, from `Book/Publisher/PublisherName`.'}, 'endingDate': {'type': 'string', 'description': 'Last year of a closed date range, from `Book/EndingDate`. Absent while a book is still being updated, which leaves the range open-ended.'}, 'beginningDate': {'type': 'string', 'description': 'First year of a continuously-updated book, from `Book/BeginningDate` (GeneReviews runs from 1993). Absent on a book published once.'}, 'collectionTitle': {'type': 'string', 'description': 'Series the book belongs to, from `Book/CollectionTitle` (e.g. "ADA Clinical Compendia Series"). Absent for a book outside a series.'}, 'publisherLocation': {'type': 'string', 'description': 'Place of publication, from `Book/Publisher/PublisherLocation` (e.g. "Seattle (WA)"). Absent when NCBI supplies no place.'}}, 'description': 'The containing book of a `book-chapter`, or the book itself on a `book` record. Present only on those two record types, and never a stand-in for `journalInfo`.', 'additionalProperties': False}, 'pmid': {'type': 'string', 'description': 'PubMed ID'}, 'pmcId': {'type': 'string', 'description': 'PMC ID'}, 'title': {'type': 'string', 'description': 'Article title â\x80\x94 the chapter title on a `book-chapter`, and the book title on a `book` record, where it repeats `book.title`.'}, 'pmcUrl': {'type': 'string', 'description': 'PMC full text URL'}, 'authors': {'type': 'array', 'items': {'type': 'object', 'properties': {'orcid': {'type': 'string', 'description': 'ORCID identifier'}, 'initials': {'type': 'string', 'description': 'Author initials'}, 'lastName': {'type': 'string', 'description': 'Last name'}, 'firstName': {'type': 'string', 'description': 'First/given name'}, 'collectiveName': {'type': 'string', 'description': 'Group/collective author name'}, 'affiliationIndices': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Indices into the top-level affiliations array'}}, 'description': 'Author record', 'additionalProperties': False}, 'description': "Author list. On a `book-chapter` these are the chapter's own authors, never the book's editors, which are in `book.editors`. Empty on a Bookshelf record that credits neither."}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords'}, 'grantList': {'type': 'array', 'items': {'type': 'object', 'properties': {'agency': {'type': 'string', 'description': 'Funding agency'}, 'acronym': {'type': 'string', 'description': 'Grant acronym'}, 'country': {'type': 'string', 'description': 'Agency country'}, 'grantId': {'type': 'string', 'description': 'Grant identifier'}}, 'description': 'Grant record', 'additionalProperties': False}, 'description': 'Grant information'}, 'meshTerms': {'type': 'array', 'items': {'type': 'object', 'required': ['isMajorTopic'], 'properties': {'qualifiers': {'type': 'array', 'items': {'type': 'object', 'required': ['qualifierName', 'isMajorTopic'], 'properties': {'qualifierUi': {'type': 'string', 'description': 'Qualifier unique ID'}, 'isMajorTopic': {'type': 'boolean', 'description': 'Whether this qualifier is a major topic'}, 'qualifierName': {'type': 'string', 'description': 'Qualifier/subheading name'}}, 'description': 'MeSH qualifier/subheading', 'additionalProperties': False}, 'description': 'MeSH qualifiers/subheadings'}, 'descriptorUi': {'type': 'string', 'description': 'MeSH descriptor unique ID'}, 'isMajorTopic': {'type': 'boolean', 'description': 'Whether this is a major topic of the article'}, 'descriptorName': {'type': 'string', 'description': 'MeSH descriptor name'}}, 'description': 'MeSH descriptor term', 'additionalProperties': False}, 'description': 'MeSH terms'}, 'pubmedUrl': {'type': 'string', 'description': 'PubMed article URL'}, 'recordType': {'enum': ['journal-article', 'book-chapter', 'book'], 'type': 'string', 'description': 'Which kind of PubMed record this is, set from the XML element it arrived in: `journal-article` for an ordinary article, `book-chapter` for an NCBI Bookshelf chapter, `book` for a whole Bookshelf book. Read this to tell the three apart â\x80\x94 `publicationTypes` cannot, because PubMed labels a Bookshelf record "Review" or "Study Guide". `journalInfo` is present only on `journal-article`; `book` only on the other two.'}, 'journalInfo': {'type': 'object', 'properties': {'issn': {'type': 'string', 'description': 'Print ISSN'}, 'eIssn': {'type': 'string', 'description': 'Electronic ISSN'}, 'issue': {'type': 'string', 'description': 'Issue number'}, 'pages': {'type': 'string', 'description': 'Page range (e.g. "48-55")'}, 'title': {'type': 'string', 'description': 'Full journal title'}, 'volume': {'type': 'string', 'description': 'Volume number'}, 'elocationId': {'type': 'string', 'description': 'Electronic article locator from NCBI `ELocationID` â\x80\x94 the publisher-assigned article number (e.g. "2400512"). Journals that assign article numbers instead of pages often omit pagination entirely, leaving this the only locator. Never a substitute for `pages`, and never the DOI: a DOI-typed `ELocationID` is reported in `doi` instead. Absent when the only locator NCBI supplies is marked invalid.'}, 'elocationIdType': {'type': 'string', 'description': 'Type of `elocationId`, from NCBI\'s `EIdType` attribute â\x80\x94 "pii" in practice. Free-form: NCBI does not close the set, so treat an unfamiliar value as opaque.'}, 'isoAbbreviation': {'type': 'string', 'description': 'ISO journal abbreviation'}, 'publicationDate': {'type': 'object', 'properties': {'day': {'type': 'string', 'description': 'Publication day'}, 'year': {'type': 'string', 'description': 'Publication year'}, 'month': {'type': 'string', 'description': 'Publication month'}, 'medlineDate': {'type': 'string', 'description': 'Non-standard date string (e.g. "2000 Spring")'}}, 'description': 'Journal publication date', 'additionalProperties': False}}, 'description': 'Journal information. Present on `journal-article` records only â\x80\x94 absent on `book-chapter` and `book` records, because a Bookshelf record has no journal and its book title is never reported as one; read `book` for those. (#114)', 'additionalProperties': False}, 'abstractText': {'type': 'string', 'description': 'Abstract text'}, 'affiliations': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Deduplicated author affiliations'}, 'articleDates': {'type': 'array', 'items': {'type': 'object', 'properties': {'day': {'type': 'string', 'description': 'Day'}, 'year': {'type': 'string', 'description': 'Year'}, 'month': {'type': 'string', 'description': 'Month'}, 'dateType': {'type': 'string', 'description': 'Date type'}}, 'description': 'Dated article event', 'additionalProperties': False}, 'description': 'Article dates'}, 'publicationTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Publication types'}, 'commentsCorrections': {'type': 'array', 'items': {'type': 'object', 'required': ['refType', 'refSource'], 'properties': {'note': {'type': 'string', 'description': 'NCBI\'s note on the link, e.g. what an erratum corrected ("Fuβer, Fabian [corrected to FuÃ\x9fer, Fabian]"). Absent unless NCBI supplies one.'}, 'pmid': {'type': 'string', 'description': 'PMID of the linked record â\x80\x94 pass it to `pubmed_fetch_articles` to read that record. Absent when the linked record has no PMID, as with many errata.'}, 'refType': {'type': 'string', 'description': 'Link type, verbatim from NCBI\'s `RefType` â\x80\x94 e.g. "RetractionIn", "RetractionOf", "ErratumIn", "ErratumFor", "ExpressionOfConcernIn", "CommentIn", "CommentOn", "UpdateIn". The set is open: treat an unfamiliar value as opaque.'}, 'refSource': {'type': 'string', 'description': 'Citation of the linked record as NCBI writes it (e.g. "Lancet. 2010 Feb 6;375(9713):445. doi: 10.1016/S0140-6736(10)60175-4.").'}}, 'description': 'One record NCBI links to this article and published separately from it â\x80\x94 for example a retraction notice, erratum, expression of concern, comment, update, or republication.', 'additionalProperties': False}, 'description': "Records NCBI links to this article â\x80\x94 for example retraction notices, errata, expressions of concern, comments, and updates â\x80\x94 from `CommentsCorrectionsList`, in NCBI's order and uncapped. `Cites` entries are excluded: they list a bibliography, which `pubmed_find_related` covers with its `references` relationship. Read this alongside `publicationTypes`, not in place of it: that field describes the record itself, and a corrected or questioned article often carries no matching type. Absent when NCBI links nothing other than `Cites` entries, and never set on `book-chapter` or `book` records."}}, 'description': 'Parsed PubMed article', 'additionalProperties': False}, 'description': 'Parsed articles'}, 'deferred': {'type': 'object', 'required': ['maxResponseCharacters', 'returnedCharacters', 'deferredCount', 'ids', 'nextDeferredCharacters'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'PMIDs of the deferred articles, in response order. Re-call `pubmed_fetch_articles` with these as `pmids` and the same other inputs to retrieve them. Never contains a PMID from `unavailablePmids`.'}, 'deferredCount': {'type': 'number', 'description': 'Articles that resolved but were withheld to stay under the ceiling'}, 'returnedCharacters': {'type': 'number', 'description': 'Serialized characters the returned article records account for'}, 'maxResponseCharacters': {'type': 'number', 'description': 'The `maxResponseCharacters` ceiling this response was budgeted against'}, 'nextDeferredCharacters': {'type': 'number', 'description': 'Serialized size of the next deferred article â\x80\x94 the first entry in `ids`, where the response stopped. Raise `maxResponseCharacters` to at least this to make progress; a smaller article further down `ids` cannot be reached until this one fits.'}}, 'description': 'Continuation state for articles the whole-response budget withheld. Present only when `maxResponseCharacters` deferred at least one article.', 'additionalProperties': False}, 'truncated': {'type': 'boolean', 'description': 'True when `maxResponseCharacters` withheld at least one resolved article. Absent when the response carries every article that resolved. The continuation state is in `deferred`.'}, 'totalReturned': {'type': 'number', 'description': 'Number of articles in this response. Under a `maxResponseCharacters` budget this counts the kept articles only; `deferred.deferredCount` covers the rest.'}, 'unavailablePmids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'PMIDs PubMed returned no record for. That is all this reports: PubMed omits an unknown PMID silently, with no error and no reason, so the absence says nothing about whether the PMID exists. Reported in full regardless of where a `maxResponseCharacters` cutoff lands â\x80\x94 these are misses, not deferrals. Use `pubmed_search_articles` to find PMIDs that do resolve.'}}, 'additionalProperties': False}
pubmed_fetch_fulltext
Pubmed Fetch Fulltext
Fetch full-text articles from PubMed Central with structured sections, tables, and references. When PMC misses, transparently falls back to Europe PMC `fullTextXML` (structured JATS for records with a PMC counterpart), then to Unpaywall — publisher-hosted or institutional open-access copies as HTML-as-Markdown or PDF-as-text. Provide exactly one of `pmcids` (PMC IDs directly), `pmids` (PubMed IDs, auto-resolved), or `dois` (DOIs, auto-resolved to PMC via the ID Converter; preprints and EPMC-only OA fall through to the Europe PMC and Unpaywall layers). Two independent character controls: `maxCharacters` caps body text per article, `maxResponseCharacters` caps the whole response and defers articles past the ceiling whole, listing them in `deferred.ids` for a follow-up call.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'dois': {'type': 'array', 'items': {'type': 'string', 'pattern': '^10\\.[^\\s,]+\\/[^\\s,]+$'}, 'maxItems': 10, 'minItems': 1, 'description': 'DOIs to resolve (e.g. ["10.21203/rs.3.rs-9010375/v1"]), one per element. Provide exactly one of `pmcids`, `pmids`, or `dois`. Resolved to a PMCID via the PMC ID Converter and returned as structured JATS when the article is in PMC; DOIs with no PMC counterpart (preprints, EPMC-only OA) fall through to Europe PMC, then Unpaywall, when those layers are enabled.'}, 'pmids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^\\d+$'}, 'maxItems': 10, 'minItems': 1, 'description': 'PubMed IDs. Provide exactly one of `pmcids`, `pmids`, or `dois`. Articles in PMC are returned as structured JATS; articles not in PMC fall through to Europe PMC (when EPMC has a `fullTextXML`), then to Unpaywall when `UNPAYWALL_EMAIL` is set and a DOI is available.'}, 'pmcids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^(?:PMC)?\\d+$'}, 'maxItems': 10, 'minItems': 1, 'description': 'PMC IDs to fetch (e.g. ["PMC9575052"]). Provide exactly one of `pmcids`, `pmids`, or `dois`. PMC IDs with no retrievable full text fall through to Europe PMC, then to Unpaywall on the DOI the chain resolves for them.'}, 'sections': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter to specific sections by title (e.g. ["Introduction", "Methods", "Results", "Discussion"]). A term matches a section or subsection title at any nesting depth, case-insensitively, as a substring â\x80\x94 "resul" matches "Results". A section whose own title matches is returned whole; one kept only because a nested subsection matched keeps its heading as a breadcrumb, with its own text cleared and only the matching branch beneath it. Tables and assets narrow with the filter: one whose section did not survive, or that names no section, is dropped. Applies to `source=pmc` results only.'}, 'maxSections': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Maximum top-level body sections. Applies to `source=pmc` results only.'}, 'overflowMode': {'enum': ['truncate', 'outline'], 'type': 'string', 'default': 'truncate', 'description': 'How to spend `maxCharacters` across an article that exceeds it. truncate: fill sections in document order, so early sections stay whole, the section the budget runs out in is cut, and every section or subsection past that point is dropped (counted in `truncation.omittedSections`). outline: split the budget evenly so every section and subsection keeps its heading, and an excerpt as far as the budget reaches â\x80\x94 a heading the budget left empty is marked as such in the rendered text. Use it to survey what an article contains before requesting specific `sections`. Ignored when no budget is set, and identical for `source=unpaywall` bodies, which have no headings to preserve.'}, 'includeAssets': {'type': 'boolean', 'default': True, 'description': "Include the article's figures and supplementary material â\x80\x94 `assets[]`, each with its label, caption, enclosing section and deposit pointer. On by default because it is cheaper than tables: a median asset-bearing article grows about 10%, and the body prose already refers to these by label. Set false to omit them, which also removes the `[Figure: â\x80¦]` / `[Supplementary: â\x80¦]` markers from the section text, since without the array they point at nothing. Prose-shaped blocks â\x80\x94 lists, definition lists, block quotes, boxed text, preformatted blocks, displayed formulae â\x80\x94 are section text rather than assets and this switch never affects them. Applies to `source=pmc` results only."}, 'includeTables': {'type': 'boolean', 'default': True, 'description': "Include the article's tables â\x80\x94 cells, captions, labels and footnotes. On by default because a dropped table takes its numbers with it. Table-dense articles pay for it: rendered tables typically add 12â\x80\x9317% to an article record and can more than double it. Set false to omit them, or cap the cost with `maxCharacters`, which drops tables it cannot fit whole. Applies to `source=pmc` results only."}, 'maxCharacters': {'type': 'integer', 'maximum': 1000000, 'minimum': 1, 'description': 'Per-article budget for body text, in characters. Counts `source=pmc` section and subsection text â\x80\x94 which carries the inline blocks the parser renders in place, such as lists, definition lists, block quotes, boxed text, preformatted blocks and displayed formulae â\x80\x94 plus table label, caption, cell and footnote text and asset label, caption and `href` text; or the `source=unpaywall` `content` body. Titles, abstracts, identifiers, and references are never counted or shortened. Shortened text ends at the last word boundary inside its allowance, so it can come back a few characters under it. The counted unit is that text alone â\x80\x94 the Markdown grid `content[]` renders around the cells (pipes, padding, the divider row, headings) is scaffolding this budget does not measure, so a table renders longer than it costs here. Sections are served first, then tables, then assets, each spending what is left, in document order â\x80\x94 admission stops at the first entry that does not fit, and every entry from there on is dropped whole rather than cut mid-row or returned with a shortened caption, counted in `truncation.omittedTables` / `truncation.omittedAssets` and named in `truncation.articles[].omittedTableNames` / `omittedAssetNames`. Applied after `sections`, `maxSections`, `includeReferences`, `includeTables`, and `includeAssets`, so semantic filtering is unaffected. This knob alone bounds only bodies: the response-wide ceiling it implies is this value times the number of articles returned, plus every uncounted field. Use `maxResponseCharacters` for a true whole-response ceiling. Omit for the full body.'}, 'includeReferences': {'type': 'boolean', 'default': False, 'description': 'Include reference list. Applies to `source=pmc` results only.'}, 'maxResponseCharacters': {'type': 'integer', 'maximum': 1000000, 'minimum': 1, 'description': 'Opt-in ceiling for the whole response, in characters â\x80\x94 the true response-wide counterpart to the per-article `maxCharacters`. Each article is measured as the JSON record it is returned as, after every filter and the per-article body budget: title, abstract, body sections, references, identifiers, license and source metadata â\x80\x94 every field it carries. One ledger covers all tiers, so PMC-, Europe PMC-, and Unpaywall-served articles spend the same budget. Articles are kept in response order until the next one would cross the ceiling; that article and the rest are deferred whole (never partially populated) and listed in `deferred.ids`. Response envelope fields â\x80\x94 counts, `unavailable`, `truncation`, `deferred` itself â\x80\x94 are not counted. Omit to return every resolved article.'}, 'maxCharactersPerSection': {'type': 'integer', 'maximum': 1000000, 'minimum': 1, 'description': 'Budget for a single top-level body section, in characters, counting the section text plus its subsections. Combine with `maxCharacters` to cap both one section and the article; the tighter of the two wins. Applies to `source=pmc` results only.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['articles', 'totalReturned']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). 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': 'Optional guidance for a partial or empty body. A `sections`-filter miss names the requested terms and affected article id(s) and suggests retrying without `sections` or using broader headings. A metadata-only record names the id(s) the chain could retrieve as front matter only and points at `pubmed_fetch_articles` for the abstract. A table returned with no cell values names the affected table(s), the article each came from, and why the cells cannot be recovered. A budgeted response names the characters returned versus carried and points at `truncation`. A response-wide budget that deferred articles names the ids to re-request. Absent when none of those applies.'}, 'articles': {'type': 'array', 'items': {'oneOf': [{'type': 'object', 'required': ['source', 'viaSource', 'sections'], 'properties': {'doi': {'type': 'string', 'description': 'DOI, cased as the tier that served this record reports it (NCBI PMC, Europe PMC, or Unpaywall). DOIs are case-insensitive by spec and no case normalization is applied here, so casing can differ between tiers and from other tools â\x80\x94 compare case-insensitively.'}, 'pmid': {'type': 'string', 'description': 'PubMed ID'}, 'pmcId': {'type': 'string', 'description': 'PMC ID â\x80\x94 present for NCBI PMC records and Europe PMC entries that have a PMC counterpart. Absent for EPMC-only records like preprints; use `epmcId` in that case.'}, 'title': {'type': 'string', 'description': 'Article title'}, 'assets': {'type': 'array', 'items': {'type': 'object', 'required': ['assetType'], 'properties': {'id': {'type': 'string', 'description': 'JATS `id` attribute â\x80\x94 the target body-text cross-references point at'}, 'href': {'type': 'string', 'description': 'The `<graphic>`/`<media>` `@xlink:href` exactly as deposited â\x80\x94 a pointer into the PMC deposit (`MOL2-20-1253-g001.jpg`), not a fetchable URL. No absolute form of it resolves; read the rendered article at `pmcUrl` instead. Absent when the deposit names no file.'}, 'label': {'type': 'string', 'description': 'Display label as printed, e.g. `Fig. 1`'}, 'caption': {'type': 'string', 'description': 'Caption text, with the label excluded'}, 'assetType': {'enum': ['figure', 'supplementary-material'], 'type': 'string', 'description': 'Which captioned element this came from â\x80\x94 `figure` for a `<fig>`, `supplementary-material` for a `<supplementary-material>` deposit'}, 'sectionTitle': {'type': 'string', 'description': 'Title of the innermost section enclosing the asset, wherever that section sits â\x80\x94 body, `<back>` matter, or an appendix all count. Absent for an asset inside no section at all, such as a `<floats-group>` deposit.'}}, 'description': 'One figure or supplementary-material item, with its caption, pointer, and section', 'additionalProperties': False}, 'description': 'Every `<fig>` and `<supplementary-material>` the article carries, in document order â\x80\x94 from the body and from `<floats-group>`, `<back>` and appendices alike. Each one lifted from the body leaves a `[Figure: <label>]` or `[Supplementary: <label>]` marker at its position in the section text, so reading order survives the lift. Absent when the article deposits none, when `includeAssets` is false, or when a `sections` filter left none standing.'}, 'epmcId': {'type': 'string', 'description': 'Europe PMC record id â\x80\x94 present when `viaSource` is `europepmc`'}, 'pmcUrl': {'type': 'string', 'description': 'PMC URL â\x80\x94 derived from `pmcId` when present'}, 'source': {'type': 'string', 'const': 'pmc', 'description': 'Structured JATS â\x80\x94 same DTD whether sourced from NCBI PMC or Europe PMC'}, 'tables': {'type': 'array', 'items': {'type': 'object', 'required': ['headerRowCount', 'rows'], 'properties': {'id': {'type': 'string', 'description': 'JATS `id` attribute â\x80\x94 the target body-text cross-references point at'}, 'rows': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}, 'description': 'One row, as cell text by grid column'}, 'description': 'Cell text by row, in document order, one entry per grid column. `colspan` and `rowspan` are expanded, so a cell covering several columns or rows repeats its text across each cell it covers and a well-formed table is rectangular â\x80\x94 align on position from the left, and read a repeated value as one spanning cell rather than several measurements. Empty when `unextractableReason` is set.'}, 'label': {'type': 'string', 'description': 'Table label as printed, e.g. `TABLE 1`'}, 'caption': {'type': 'string', 'description': 'Caption text, with the label excluded'}, 'footnotes': {'type': 'string', 'description': '`<table-wrap-foot>` text, flattened to one string'}, 'sectionTitle': {'type': 'string', 'description': 'Title of the innermost section enclosing the table, wherever that section sits â\x80\x94 body, `<back>` matter, or an appendix all count, and in back matter the section name is the only positional cue there is. Absent only for a table inside no section at all, such as a `<floats-group>` deposit.'}, 'headerRowCount': {'type': 'number', 'description': 'How many leading `rows` entries are header rows â\x80\x94 a `<thead>` block, or leading rows made entirely of `<th>`. 0 when the table declares none. Several header rows stack: read one column top to bottom for its full header path.'}, 'unextractableReason': {'enum': ['cals-tgroup', 'graphic-only', 'no-rows'], 'type': 'string', 'description': 'Why `rows` is empty â\x80\x94 set only then. graphic-only: the table was deposited as an image with no underlying markup. cals-tgroup: the table uses the CALS `<tgroup>` model, which this server does not extract (0 of 283 tables in an open-access survey used it). no-rows: the markup carried no rows. The label and caption are still returned, so a table that could not be read is visible rather than silently missing.'}}, 'description': 'One table from the article, with its cells, caption, and owning section', 'additionalProperties': False}, 'description': 'Every `<table-wrap>` the article carries, in document order â\x80\x94 from the body and from `<floats-group>`, `<back>` and appendices alike. Absent when the article deposits none, when `includeTables` is false, or when a `sections` filter left none standing.'}, 'authors': {'type': 'array', 'items': {'type': 'object', 'properties': {'lastName': {'type': 'string', 'description': 'Last name'}, 'givenNames': {'type': 'string', 'description': 'Given names'}, 'collectiveName': {'type': 'string', 'description': 'Group name'}}, 'description': 'Author entry', 'additionalProperties': False}, 'description': 'Authors'}, 'journal': {'type': 'object', 'properties': {'issn': {'type': 'string', 'description': 'ISSN'}, 'issue': {'type': 'string', 'description': 'Issue number'}, 'pages': {'type': 'string', 'description': 'Page range'}, 'title': {'type': 'string', 'description': 'Journal title'}, 'volume': {'type': 'string', 'description': 'Volume number'}, 'elocationId': {'type': 'string', 'description': 'Electronic article locator from JATS `<elocation-id>` â\x80\x94 the publisher-assigned article number (e.g. "e20542"). Journals that assign article numbers deposit no `<fpage>`, so this is the only locator on roughly half of PMC records. Never a substitute for `pages`; JATS carries no type attribute, so there is no counterpart to the `elocationIdType` that `pubmed_fetch_articles` reports.'}}, 'description': 'Journal information', 'additionalProperties': False}, 'abstract': {'type': 'string', 'description': 'Abstract'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Keywords'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'Section body text'}, 'label': {'type': 'string', 'description': 'Section label'}, 'title': {'type': 'string', 'description': 'Section heading'}, 'subsections': {'type': 'array', 'items': {'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'description': 'Subsection body text. Sections nested deeper than this level are folded in here in document order, each heading rendered on its own line above its text.'}, 'label': {'type': 'string', 'description': 'Subsection label'}, 'title': {'type': 'string', 'description': 'Subsection heading'}}, 'description': 'Article subsection', 'additionalProperties': False}, 'description': 'Nested subsections'}}, 'description': 'Article body section', 'additionalProperties': False}, 'description': 'Article body sections'}, 'pubmedUrl': {'type': 'string', 'description': 'PubMed URL'}, 'viaSource': {'enum': ['pmc', 'europepmc'], 'type': 'string', 'description': 'Which layer produced the JATS: `pmc` for NCBI PMC EFetch (db=pmc), `europepmc` for Europe PMC `fullTextXML`. Both paths return the same JATS shape; the discriminator records origin for observability and license attribution.'}, 'epmcSource': {'type': 'string', 'description': 'Europe PMC source code when `viaSource` is `europepmc`. Common values: `MED` (PubMed-derived), `PMC` (PMC counterpart), `PPR` (preprint), `PAT` (patent), `AGR` (Agricola), plus less common codes (`CTX`, `CBA`, `ETH`, `HIR`). Treat as opaque â\x80\x94 EPMC may introduce new codes.'}, 'references': {'type': 'array', 'items': {'type': 'object', 'required': ['citation'], 'properties': {'id': {'type': 'string', 'description': 'Reference ID'}, 'label': {'type': 'string', 'description': 'Reference label'}, 'citation': {'type': 'string', 'description': 'Citation text'}}, 'description': 'Reference entry', 'additionalProperties': False}, 'description': 'Reference list'}, 'articleType': {'type': 'string', 'description': 'Article type'}, 'affiliations': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Author affiliations'}, 'publicationDate': {'type': 'object', 'properties': {'day': {'type': 'string', 'description': 'Publication day'}, 'year': {'type': 'string', 'description': 'Publication year'}, 'month': {'type': 'string', 'description': 'Publication month'}}, 'description': 'Publication date', 'additionalProperties': False}}, 'description': 'Structured JATS full-text article. `viaSource` records whether the JATS came from NCBI PMC or Europe PMC.', 'additionalProperties': False}, {'type': 'object', 'required': ['source', 'viaSource', 'contentFormat', 'doi', 'sourceUrl', 'content'], 'properties': {'doi': {'type': 'string', 'description': 'DOI used to locate the open-access copy'}, 'pmid': {'type': 'string', 'description': 'PubMed ID when input was `pmids`; absent for `pmcids` and `dois` input'}, 'year': {'type': 'number', 'description': "Publication year from Unpaywall's record for the DOI. Absent when Unpaywall has none."}, 'pmcId': {'type': 'string', 'description': 'PMC ID this article was requested under, in `PMC<digits>` form â\x80\x94 present for `pmcids` input, absent for `pmids` and `dois` input. Ties the article back to the requested identifier, which `unavailable[]` keys on for the ids that found nothing.'}, 'title': {'type': 'string', 'description': "Article title, from the first source that carries one: Unpaywall's record for the DOI, then the Europe PMC record when the chain searched Europe PMC for this id, then â\x80\x94 for `html-markdown` content only â\x80\x94 the title detected on the page. Absent when none of them has a title."}, 'source': {'type': 'string', 'const': 'unpaywall', 'description': 'Content fetched from an open-access copy indexed by Unpaywall. Best-effort â\x80\x94 structural fidelity depends on `contentFormat`.'}, 'content': {'type': 'string', 'description': 'Full article text â\x80\x94 Markdown or plain text per `contentFormat`'}, 'license': {'type': 'string', 'description': 'License identifier from Unpaywall (e.g. cc-by, cc0)'}, 'version': {'type': 'string', 'description': 'OA version: submittedVersion | acceptedVersion | publishedVersion'}, 'hostType': {'type': 'string', 'description': '`publisher` or `repository` â\x80\x94 where the OA copy is hosted'}, 'pubmedUrl': {'type': 'string', 'description': 'PubMed URL â\x80\x94 present when `pmid` is set'}, 'sourceUrl': {'type': 'string', 'description': 'URL the content was fetched from'}, 'viaSource': {'type': 'string', 'const': 'unpaywall', 'description': 'Layer that produced this article. Constant `unpaywall` for this branch.'}, 'wordCount': {'type': 'number', 'description': 'Approximate word count reported by the HTML extractor; absent for PDFs'}, 'totalPages': {'type': 'number', 'description': 'Page count reported by the PDF extractor; absent for HTML'}, 'journalName': {'type': 'string', 'description': "Journal or repository name from Unpaywall's record for the DOI (e.g. `medRxiv` for a medRxiv preprint). Absent when Unpaywall has none."}, 'contentFormat': {'enum': ['html-markdown', 'pdf-text'], 'type': 'string', 'description': 'How `content` was extracted. html-markdown: Defuddle extracted Markdown from an HTML landing page; light section structure may survive but is not guaranteed. pdf-text: unpdf extracted plain text from a PDF; no section, reference, or heading structure.'}}, 'description': 'Best-effort full text from an open-access copy', 'additionalProperties': False}], 'description': 'Full-text article; shape depends on `source` (pmc = structured JATS, unpaywall = best-effort)'}, 'description': 'Full-text articles'}, 'deferred': {'type': 'object', 'required': ['maxResponseCharacters', 'returnedCharacters', 'deferredCount', 'idType', 'ids', 'nextDeferredCharacters'], 'properties': {'ids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Identifiers of the deferred articles, in response order, keyed as they were requested (PMC IDs in `PMC<digits>` form). Re-call `pubmed_fetch_fulltext` with these under the `idType` branch and the same other inputs. Never contains an id from `unavailable`.'}, 'idType': {'enum': ['pmid', 'pmcid', 'doi'], 'type': 'string', 'description': 'Which input branch the deferred ids belong to â\x80\x94 re-submit them as `pmids`, `pmcids`, or `dois` respectively. Matches the `idType` on `unavailable` entries.'}, 'deferredCount': {'type': 'number', 'description': 'Articles the chain resolved but withheld to stay under the ceiling'}, 'returnedCharacters': {'type': 'number', 'description': 'Serialized characters the returned article records account for'}, 'maxResponseCharacters': {'type': 'number', 'description': 'The `maxResponseCharacters` ceiling this response was budgeted against'}, 'nextDeferredCharacters': {'type': 'number', 'description': 'Serialized size of the next deferred article â\x80\x94 the first entry in `ids`, where the response stopped. Raise `maxResponseCharacters` to at least this to make progress; a smaller article further down `ids` cannot be reached until this one fits.'}}, 'description': 'Continuation state for articles the whole-response budget withheld. Present only when `maxResponseCharacters` deferred at least one article.', 'additionalProperties': False}, 'truncated': {'type': 'boolean', 'description': 'True when a character budget shortened at least one returned body, or withheld a whole article. Absent when every resolved article is present with its full post-filter body. The per-article body accounting is in `truncation`; the withheld ids are in `deferred`.'}, 'truncation': {'type': 'object', 'required': ['mode', 'originalCharacters', 'returnedCharacters', 'omittedSections', 'articles'], 'properties': {'mode': {'enum': ['truncate', 'outline'], 'type': 'string', 'description': 'The `overflowMode` that produced these results'}, 'articles': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'source', 'originalCharacters', 'returnedCharacters'], 'properties': {'id': {'type': 'string', 'description': 'Identifier for the article â\x80\x94 PMCID, PMID, DOI, or Europe PMC id, whichever the article carries first'}, 'source': {'enum': ['pmc', 'unpaywall'], 'type': 'string', 'description': 'Which output shape was budgeted: `pmc` budgets body sections and subsections, `unpaywall` budgets the single `content` body'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['originalCharacters', 'returnedCharacters', 'truncated'], 'properties': {'label': {'type': 'string', 'description': 'Section label as printed (e.g. `2`), when the section carries one'}, 'title': {'type': 'string', 'description': 'Section heading, when the section carries one'}, 'truncated': {'type': 'boolean', 'description': 'True when the section returned fewer characters than it originally carried'}, 'subsections': {'type': 'array', 'items': {'type': 'object', 'required': ['originalCharacters', 'returnedCharacters', 'truncated'], 'properties': {'label': {'type': 'string', 'description': 'Subsection label as printed (e.g. `2.1`), when the subsection carries one'}, 'title': {'type': 'string', 'description': 'Subsection heading, when the subsection carries one'}, 'truncated': {'type': 'boolean', 'description': 'True when the subsection returned fewer characters than it originally carried'}, 'originalCharacters': {'type': 'number', 'description': 'Body characters this subsection carried before the budget pass'}, 'returnedCharacters': {'type': 'number', 'description': 'Body characters this subsection carries in the response. Zero means it was dropped in `truncate` mode and counted in `omittedSections`, or kept as a heading-only entry in `outline` mode, marked as such in the rendered text.'}}, 'description': 'Character accounting for one subsection of a shortened section', 'additionalProperties': False}, 'description': 'Per-subsection accounting for a shortened section, in document order, including subsections dropped for budget â\x80\x94 where inside the section the cut landed. Absent when the section was returned whole or carries no subsections.'}, 'originalCharacters': {'type': 'number', 'description': 'Body characters this section carried before the budget pass'}, 'returnedCharacters': {'type': 'number', 'description': 'Body characters this section carries in the response. Zero means the section was dropped in `truncate` mode, or kept as a heading-only entry in `outline` mode, marked as such in the rendered text.'}}, 'description': 'Character accounting for one body section of a budgeted article', 'additionalProperties': False}, 'description': 'Per-section accounting for `source: pmc` articles, in document order, including sections dropped for budget; a shortened section lists its subsections. Absent for `source: unpaywall`, whose body has no section structure.'}, 'omittedAssets': {'type': 'number', 'description': 'Figures and supplementary items this article dropped whole because the budget left no room once sections and tables were served. An asset is never returned with a truncated caption, so it is either returned complete or counted here. Absent when none were dropped.'}, 'omittedTables': {'type': 'number', 'description': 'Tables this article dropped whole because the budget left no room for them. A table is never cut mid-row, so it is either returned complete or counted here. Absent when none were dropped.'}, 'omittedAssetNames': {'type': 'array', 'items': {'type': 'string'}, 'description': "The dropped assets by name, in document order â\x80\x94 each asset's label, else its `id`, else `asset <n>` for its position in the article. Contiguous for the same reason `omittedTableNames` is: admission stops at the first asset that did not fit rather than skipping ahead to a smaller one. Absent when none were dropped."}, 'omittedTableNames': {'type': 'array', 'items': {'type': 'string'}, 'description': "The dropped tables by name, in document order â\x80\x94 each table's label, else its `id`, else `table <n>` for its position in the article. Names the tables a bare count only hints at, the way `deferred.ids` names deferred articles. Every table from the first that did not fit onward is here: admission stops at that table rather than skipping ahead to a smaller one, so these are contiguous. Absent when none were dropped."}, 'originalCharacters': {'type': 'number', 'description': 'Body characters this article carried before the budget pass'}, 'returnedCharacters': {'type': 'number', 'description': 'Body characters this article carries in the response'}}, 'description': 'Character accounting for one article the budget shortened', 'additionalProperties': False}, 'description': 'Per-article accounting, covering only the articles the budget shortened'}, 'maxCharacters': {'type': 'number', 'description': 'The `maxCharacters` budget applied, when set'}, 'omittedAssets': {'type': 'number', 'description': 'Figures and supplementary items dropped whole across every budgeted article, because the budget left no room once body sections and tables were served. Absent when none were dropped. Re-request the affected articles with a higher `maxCharacters`, or with `sections` narrowed, to receive them.'}, 'omittedTables': {'type': 'number', 'description': 'Tables dropped whole across every budgeted article, because the budget left no room once body sections were served. Absent when none were dropped. Re-request the affected articles with a higher `maxCharacters`, or with `sections` narrowed, to receive them.'}, 'omittedSections': {'type': 'number', 'description': 'Body sections and subsections dropped entirely because an article budget was exhausted before reaching them. A dropped section counts once, together with its subsections. Always 0 in `outline` mode, which keeps every heading.'}, 'originalCharacters': {'type': 'number', 'description': 'Body characters the shortened articles carried before the budget pass'}, 'returnedCharacters': {'type': 'number', 'description': 'Body characters the shortened articles carry in this response'}, 'maxCharactersPerSection': {'type': 'number', 'description': 'The `maxCharactersPerSection` budget applied, when set'}}, 'description': 'Character accounting for full text the budget shortened. Present only when a budget actually removed characters â\x80\x94 its absence means every returned article carries its full post-filter body.', 'additionalProperties': False}, 'unavailable': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'idType', 'reason', 'triedTiers'], 'properties': {'id': {'type': 'string', 'description': 'Identifier the chain could not resolve â\x80\x94 PMID, PMCID, or DOI per `idType`'}, 'idType': {'enum': ['pmid', 'pmcid', 'doi'], 'type': 'string', 'description': 'Which input branch the id came from'}, 'reason': {'enum': ['not-found', 'no-pmc-fallback-disabled', 'no-epmc-fulltext', 'no-body', 'no-doi', 'doi-lookup-failed', 'no-oa', 'fetch-failed', 'parse-failed', 'service-error'], 'type': 'string', 'description': 'Why no full text was returned â\x80\x94 the most specific signal any tier that answered reported. not-found: upstream returned no record for this ID. no-pmc-fallback-disabled: every tier was skipped (`triedTiers` is all `not-attempted`) â\x80\x94 typically because EPMC (`EUROPEPMC_ENABLED`) and Unpaywall (`UNPAYWALL_EMAIL`) are not configured. no-epmc-fulltext: EPMC indexed the record but publishes no fullTextXML. no-body: the record was retrieved but carries front matter and abstract only, with no body sections â\x80\x94 use `pubmed_fetch_articles` for the metadata. no-doi: the DOI lookup ran and this record has none, so Unpaywall could not be queried. doi-lookup-failed: the DOI lookup itself errored, so whether a DOI exists is unknown and Unpaywall was never reached â\x80\x94 retry the request; unlike no-doi this is a transient failure, not a settled answer. no-oa: Unpaywall has no OA copy. fetch-failed: download failed. parse-failed: extraction empty. service-error: upstream server failure (threw, timed out, or returned malformed data). A reason never means the chain ran to completion â\x80\x94 read `unqueriedTiers` for that.'}, 'triedTiers': {'type': 'array', 'items': {'type': 'object', 'required': ['tier', 'outcome'], 'properties': {'tier': {'enum': ['pmc', 'europepmc', 'unpaywall'], 'type': 'string', 'description': 'Which tier in the resolution chain'}, 'detail': {'type': 'string', 'description': 'Tier-specific context when available'}, 'outcome': {'enum': ['not-attempted', 'miss', 'no-fulltext', 'no-body', 'no-doi', 'doi-lookup-failed', 'no-oa', 'fetch-failed', 'parse-failed', 'service-error'], 'type': 'string', 'description': 'Per-tier outcome. not-attempted: tier was skipped. miss: tier returned no record. no-fulltext: EPMC indexed the record but publishes no fullTextXML. no-body: the tier returned a record with front matter and abstract but no body sections, so the chain continued. no-doi: the DOI lookup ran and this record has none, so Unpaywall could not be queried. doi-lookup-failed: the DOI lookup itself errored, so whether a DOI exists is unknown and Unpaywall was never reached â\x80\x94 retry the request. no-oa: Unpaywall reports no open-access copy. fetch-failed: OA copy download failed. parse-failed: extraction produced empty content. service-error: tier service threw.'}}, 'description': 'One tier the resolution chain attempted, with its outcome', 'additionalProperties': False}, 'description': 'Per-tier outcomes the chain produced for this id, in execution order. Covers `pmc`, `europepmc`, and `unpaywall` â\x80\x94 the same tiers the tool description references. Tiers that the chain skipped appear as `outcome: not-attempted` with a `detail` explaining why.'}, 'unqueriedTiers': {'type': 'array', 'items': {'enum': ['europepmc', 'unpaywall'], 'type': 'string', 'description': 'A fallback tier this deployment has not configured'}, 'description': 'Tiers the chain skipped because this deployment has not configured them, and that could have served this id â\x80\x94 the search was incomplete, and a deployment with these tiers configured may still resolve the id. `triedTiers` carries which environment variable each one is waiting on. Absent when every tier that could have served the id was actually queried; a tier skipped because it was inapplicable to this id (no DOI for Unpaywall) is never listed.'}}, 'description': 'One identifier that could not be returned, with the full chain it traversed', 'additionalProperties': False}, 'description': 'Per-identifier explanations for any requested PMIDs, PMCIDs, or DOIs with no returnable full text. `idType` discriminates which branch the id came from. Distinct from `deferred`: nothing here is retrievable by re-calling, and an id never appears in both.'}, 'totalReturned': {'type': 'number', 'description': 'Number of articles in this response. Under a `maxResponseCharacters` budget this counts the kept articles only; `deferred.deferredCount` covers the rest.'}}, 'additionalProperties': False}
pubmed_find_related
Pubmed Find Related
Find articles related to a source article — similar content (similar), articles citing this one (cited_by), or articles this one cites (references). Uses NCBI ELink as the primary source; falls back to Europe PMC then OpenAlex when NCBI is unavailable.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pmid'], 'properties': {'pmid': {'type': 'string', 'pattern': '^\\d+$', 'description': 'Source PubMed ID'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Result offset for pagination (0-based); page through results by incrementing by maxResults'}, 'maxResults': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'Maximum related articles'}, 'relationship': {'enum': ['similar', 'cited_by', 'references'], 'type': 'string', 'default': 'similar', 'description': 'Relationship type: similar (content-based), cited_by (articles citing this one), references (articles this one cites)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['sourcePmid', 'relationship', 'offset', 'articles', 'totalCount', 'source']}, {'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': ['all_providers_failed'], 'description': 'Machine-readable failure mode. Declared by this tool: `all_providers_failed`: Every provider eligible for the requested relationship failed; none answered. 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': 'Guidance when results are empty, a fallback provider answered, offset overshot, a fallback provider could not be reached, or upstream rows were excluded for carrying no PubMed PMID. Absent on a clean NCBI result page.'}, 'offset': {'type': 'number', 'description': 'Result offset used'}, 'source': {'enum': ['ncbi', 'europepmc', 'openalex'], 'type': 'string', 'description': 'Provider that answered this request'}, 'articles': {'type': 'array', 'items': {'type': 'object', 'required': ['pmid'], 'properties': {'pmid': {'type': 'string', 'description': 'PubMed ID'}, 'title': {'type': 'string', 'description': 'Article title'}, 'source': {'type': 'string', 'description': 'Journal the article appeared in. Absent on an NCBI Bookshelf record, which has no journal â\x80\x94 its venue is in `bookTitle` and `publisherName` instead, and `docType` says which kind of record it is.'}, 'authors': {'type': 'string', 'description': 'Author string â\x80\x94 the first three of the record\'s own authors, then "et al.". On an NCBI Bookshelf chapter these are the chapter\'s authors; the book\'s editors are in `editors`.'}, 'docType': {'type': 'string', 'description': 'What PubMed classifies this record as: "chapter" or "book" for an NCBI Bookshelf record, "citation" for an ordinary journal article. Absent when PubMed supplies none.'}, 'editors': {'type': 'array', 'items': {'type': 'string', 'description': 'One editor, "Surname Initials" as ESummary renders it'}, 'description': "Editors of the containing book, kept out of `authors` so they cannot displace the record's own authors. Absent on a journal article and on a book that credits no editors."}, 'pubDate': {'type': 'string', 'description': 'Publication date'}, 'bookTitle': {'type': 'string', 'description': 'Title of the book an NCBI Bookshelf record belongs to. Present instead of `source` on a book record; absent on a journal article.'}, 'publisherName': {'type': 'string', 'description': 'Publisher of the book an NCBI Bookshelf record belongs to. Present only on a book record; absent on a journal article.'}}, 'description': 'Related article with enriched summary', 'additionalProperties': False}, 'description': 'Related articles'}, 'sourcePmid': {'type': 'string', 'description': 'Source PubMed ID'}, 'totalCount': {'type': 'number', 'description': 'Total related articles found before windowing. A Europe PMC or OpenAlex total may shrink to the PubMed-addressable count once a request window covers the whole upstream set, since rows without a PubMed PMID cannot be returned.'}, 'relationship': {'enum': ['similar', 'cited_by', 'references'], 'type': 'string', 'description': 'Relationship type used'}, 'coverageFailures': {'type': 'array', 'items': {'type': 'object', 'required': ['provider', 'reason', 'retryable'], 'properties': {'reason': {'type': 'string', 'description': 'Declared failure reason, e.g. europepmc_unreachable or provider_disabled'}, 'provider': {'enum': ['europepmc', 'openalex'], 'type': 'string', 'description': 'Reference-coverage provider that failed'}, 'retryable': {'type': 'boolean', 'description': 'Whether a retry can reach this provider'}}, 'description': 'One coverage provider that could not be checked', 'additionalProperties': False}, 'description': 'Reference-coverage fallbacks that failed instead of answering, so the reference set is unverified rather than confirmed absent. Absent when every provider consulted answered.'}}, 'additionalProperties': False}
pubmed_format_citations
Pubmed Format Citations
Get formatted citations for PubMed articles in one or more formats (apa, mla, bibtex, ris, vancouver). Pass a single format as a string or multiple as an array.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['pmids'], 'properties': {'pmids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^\\d+$'}, 'maxItems': 50, 'minItems': 1, 'description': 'PubMed IDs to cite'}, 'format': {'anyOf': [{'enum': ['apa', 'mla', 'bibtex', 'ris', 'vancouver'], 'type': 'string', 'description': 'Single citation style. One of: apa, mla, bibtex, ris, vancouver.'}, {'type': 'array', 'items': {'enum': ['apa', 'mla', 'bibtex', 'ris', 'vancouver'], 'type': 'string'}, 'minItems': 1, 'description': 'Multiple citation styles to generate. Each entry: apa, mla, bibtex, ris, or vancouver.'}], 'default': 'apa', 'description': 'Citation format(s) to generate â\x80\x94 single style as a string or multiple as an array. Allowed values: apa, mla, bibtex, ris, vancouver.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['citations', 'totalSubmitted', 'totalFormatted']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). 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': 'Optional guidance when no citations were produced â\x80\x94 points to discovery tools. Absent when at least one citation was produced.'}, 'citations': {'type': 'array', 'items': {'type': 'object', 'required': ['pmid', 'citations'], 'properties': {'pmid': {'type': 'string', 'description': 'PubMed ID'}, 'title': {'type': 'string', 'description': 'Article title'}, 'citations': {'type': 'object', 'description': 'Citations keyed by style', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}}, 'description': 'Citations for a single article', 'additionalProperties': False}, 'description': 'Citations per article'}, 'totalFormatted': {'type': 'number', 'description': 'Number of PMIDs successfully formatted'}, 'totalSubmitted': {'type': 'number', 'description': 'Number of PMIDs submitted for citation formatting'}, 'unavailablePmids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'PMIDs PubMed returned no record for, so nothing could be cited for them. That is all this reports: PubMed omits a PMID it does not recognize silently, with no error and no reason, so the absence says nothing about whether the PMID exists. Use `pubmed_search_articles` to find PMIDs that do resolve.'}}, 'additionalProperties': False}
pubmed_lookup_citation
Pubmed Lookup Citation
Look up PubMed IDs from partial bibliographic citations. Useful when you have a reference (journal, year, volume, page, author) and need the PMID — deterministic citation matching, more reliable than free-text search for structured references. Each citation must include at least journal or year (ECitMatch primary-keys on journal+volume+page; author-only or volume-only inputs guarantee no match); more fields = better match accuracy.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['citations'], 'properties': {'citations': {'type': 'array', 'items': {'type': 'object', 'properties': {'key': {'type': 'string', 'description': 'Arbitrary label to track this citation in results. Auto-assigned if omitted. Echoed back unchanged and never sent to NCBI, so any character is accepted here.'}, 'year': {'type': 'string', 'pattern': '^[^|\\r\\n]*$', 'description': 'Publication year (e.g., "1991"). Cannot contain a pipe ("|") or a line break.'}, 'volume': {'type': 'string', 'pattern': '^[^|\\r\\n]*$', 'description': 'Volume number. Cannot contain a pipe ("|") or a line break.'}, 'journal': {'type': 'string', 'pattern': '^[^|\\r\\n]*$', 'description': 'Journal title or ISO abbreviation (e.g., "proc natl acad sci u s a"). Cannot contain a pipe ("|") or a line break.'}, 'firstPage': {'type': 'string', 'pattern': '^[^|\\r\\n]*$', 'description': 'First page number. Cannot contain a pipe ("|") or a line break.'}, 'authorName': {'type': 'string', 'pattern': '^[^|\\r\\n]*$', 'description': 'Author name, typically "lastname initials" (e.g., "mann bj"). Cannot contain a pipe ("|") or a line break.'}}, 'description': 'Citation to match against PubMed. Must include at least journal or year â\x80\x94 ECitMatch primary-keys on journal+volume+page, so author-only or volume-only inputs guarantee no match.'}, 'maxItems': 25, 'minItems': 1, 'description': 'Citations to look up, 1â\x80\x9325, each matched independently. More fields = better match accuracy.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'totalMatched', 'totalSubmitted', 'totalWarnings']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). 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': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'matched', 'status'], 'properties': {'key': {'type': 'string', 'description': 'Citation tracking key'}, 'pmid': {'type': 'string', 'description': 'Matched PubMed ID'}, 'detail': {'type': 'string', 'description': 'Additional detail returned by ECitMatch for non-exact matches'}, 'status': {'enum': ['matched', 'not_found', 'ambiguous'], 'type': 'string', 'description': 'Lookup outcome classification for this citation'}, 'matched': {'type': 'boolean', 'description': 'Whether a PMID was found'}, 'warnings': {'type': 'array', 'items': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'enum': ['author_mismatch', 'year_mismatch'], 'type': 'string', 'description': 'Machine-readable warning code'}, 'message': {'type': 'string', 'description': 'Human-readable description of the warning'}}, 'description': 'Non-fatal warning about the match', 'additionalProperties': False}, 'description': 'Non-fatal warnings about this match. A PMID may be returned even when the queried author or year disagrees with the matched article â\x80\x94 verify before treating the PMID as authoritative.'}, 'candidatePmids': {'type': 'array', 'items': {'type': 'string', 'description': 'PMID'}, 'description': 'Candidate PMIDs returned when the citation matched ambiguously. Add more bibliographic fields and retry to disambiguate, or fetch each candidate via pubmed_fetch_articles to pick the intended one.'}, 'matchedFirstAuthor': {'type': 'string', 'description': 'First author of the matched article (e.g., "Husain M"). Useful eyeball signal for verifying a match.'}}, 'description': 'Per-citation match result', 'additionalProperties': False}, 'description': 'Match results, one per input citation'}, 'totalMatched': {'type': 'number', 'description': 'Number of citations with PMID matches'}, 'totalWarnings': {'type': 'number', 'description': 'Number of matched citations that carry at least one warning'}, 'totalSubmitted': {'type': 'number', 'description': 'Number of citations submitted'}}, 'additionalProperties': False}
pubmed_lookup_mesh
Pubmed Lookup Mesh
Search and explore the MeSH (Medical Subject Headings) controlled vocabulary. Returns descriptor records with tree numbers, scope notes, and entry terms, plus pagination via offset for paging past the maxResults cap.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'query': {'type': 'string', 'minLength': 1, 'description': 'MeSH descriptor name or free-text term to look up. Must carry a term: a value of only whitespace or invisible characters, such as a zero-width space, is rejected rather than searched.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Result offset for pagination (0-based). Pass the `nextOffset` from the previous response to get the following page; the exact-descriptor match is pinned to the first page only.'}, 'maxResults': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': 'Maximum results'}, 'includeDetails': {'type': 'boolean', 'default': True, 'description': 'Fetch full MeSH records (scope notes, tree numbers, entry terms)'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['query', 'offset', 'results', 'totalCount']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found', 'blank_query'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. 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': {}}, 'query': {'type': 'string', 'description': 'Original search query'}, 'notice': {'type': 'string', 'description': 'Optional guidance when no descriptors matched or the offset overshot the result set â\x80\x94 suggests spell-check, free-text search, or resetting the offset. Absent on successful result pages.'}, 'offset': {'type': 'number', 'description': 'Result offset this page was read from'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['meshId', 'entrezUid', 'name'], 'properties': {'name': {'type': 'string', 'description': 'Descriptor name'}, 'meshId': {'type': 'string', 'description': 'Canonical MeSH DescriptorUI (e.g. "D003924") â\x80\x94 resolves at the MeSH Browser and NLM linked data. Falls back to the raw Entrez UID when a record is not decodable.'}, 'entrezUid': {'type': 'string', 'description': 'NCBI Entrez UID for this record â\x80\x94 the join key for E-utilities (eSummary/eFetch db=mesh).'}, 'scopeNote': {'type': 'string', 'description': 'Scope note'}, 'entryTerms': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Synonyms / entry terms'}, 'treeNumbers': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Navigable MeSH tree numbers (e.g. "D02.078.370.141.450"). Omitted for supplementary concept records (SCRs), which map to a heading rather than occupying a tree position.'}}, 'description': 'Matching MeSH descriptor record', 'additionalProperties': False}, 'description': 'Matching MeSH records'}, 'nextOffset': {'type': 'number', 'description': 'Offset to request for the next page. Omitted when this is the last page, so its absence is the end-of-results signal.'}, 'totalCount': {'type': 'number', 'description': 'Total MeSH descriptors matching the query upstream, before the maxResults cap'}}, 'additionalProperties': False}
pubmed_search_articles
Pubmed Search Articles
Search PubMed with full query syntax, filters, and date ranges. Returns PMIDs and optional brief summaries. Supports field-specific filters (author, journal, MeSH terms), common filters (language, species, free full text), and pagination via offset for paging through large result sets.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'sort': {'enum': ['relevance', 'pub_date', 'author', 'journal'], 'type': 'string', 'default': 'relevance', 'description': 'Sort order: relevance (default), pub_date (newest first), author, or journal'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'PubMed search query (supports full NCBI syntax). Must carry a search term: a value that is blank once markup, bracketed field tags (`[pdat]`), parentheses, and invisible characters such as a zero-width space are disregarded is rejected rather than sent to PubMed.'}, 'author': {'type': 'string', 'description': 'Filter by author name (e.g. "Smith J"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9998, 'minimum': 0, 'description': 'Result offset for pagination (0-based). PubMed serves at most the first 9999 records of a result set, so this caps at 9998; narrow the query or add filters to reach anything beyond it.'}, 'journal': {'type': 'string', 'description': 'Filter by journal name. An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.'}, 'species': {'enum': ['humans', 'animals'], 'type': 'string', 'description': 'Filter by species'}, 'language': {'type': 'string', 'description': 'Filter by language (e.g. "english"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.'}, 'dateRange': {'type': 'object', 'required': ['minDate', 'maxDate'], 'properties': {'maxDate': {'type': 'string', 'pattern': '^$|^\\d{4}([/\\-.]\\d{1,2}([/\\-.]\\d{1,2})?)?$', 'description': 'End date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date â\x80\x94 `2023/02/29` is rejected.'}, 'minDate': {'type': 'string', 'pattern': '^$|^\\d{4}([/\\-.]\\d{1,2}([/\\-.]\\d{1,2})?)?$', 'description': 'Start date (YYYY/MM/DD, YYYY/MM, or YYYY); empty string disables this bound. Must be a real calendar date â\x80\x94 `2023/02/29` is rejected.'}, 'dateType': {'enum': ['pdat', 'mdat', 'edat'], 'type': 'string', 'default': 'pdat', 'description': 'Date type: pdat (publication), mdat (modification), edat (entrez)'}}, 'description': 'Filter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range. A partial date covers its whole year or month, and a range whose `minDate` falls after its `maxDate` is rejected: `2024/06` to `2024` is valid, `2024/07` to `2024/06/30` is not.'}, 'meshTerms': {'type': 'array', 'items': {'type': 'string'}, 'description': "Filter by MeSH terms. Multiple terms are AND'd â\x80\x94 all must match. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected."}, 'maxResults': {'type': 'integer', 'default': 20, 'maximum': 1000, 'minimum': 1, 'description': 'Maximum results to return'}, 'hasAbstract': {'type': 'boolean', 'description': 'Only include articles with abstracts'}, 'freeFullText': {'type': 'boolean', 'description': 'Only include free full text articles'}, 'summaryCount': {'type': 'integer', 'default': 0, 'maximum': 50, 'minimum': 0, 'description': 'Fetch brief summaries for top N results (0 = PMIDs only). Above the 50 cap, pass the remaining PMIDs to pubmed_fetch_articles.'}, 'publicationTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter by publication type (e.g. "Review", "Clinical Trial", "Meta-Analysis"). Multiple values are OR\'d â\x80\x94 any match qualifies. Empty strings are skipped; an element of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['query', 'offset', 'pmids', 'summaries', 'searchUrl', 'totalCount', 'effectiveQuery', 'appliedFilters']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found', 'blank_query', 'invalid_date_range', 'blank_filter'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. `invalid_date_range`: A `dateRange` bound is not a real calendar date â\x80\x94 a month outside 01â\x80\x9312, day 00, or a day past the end of its month such as `2023/02/29` â\x80\x94 or `minDate` falls after `maxDate` once PubMed expands each partial date: `minDate` from the start of its year or month, `maxDate` to the end. `blank_filter`: An `author`, `journal`, or `language` value, or a `publicationTypes` or `meshTerms` element, holds no term once markup is removed and HTML entities are decoded â\x80\x94 only whitespace, invisible characters such as a zero-width space, parentheses, brackets, or double quotes are left, as in `()` or `""` â\x80\x94 so its field clause would carry no term. An exactly-empty string is not blank here; it sets no filter. 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': {}}, 'pmids': {'type': 'array', 'items': {'type': 'string'}, 'description': 'PubMed IDs'}, 'query': {'type': 'string', 'description': 'Original query'}, 'notice': {'type': 'string', 'description': 'Optional guidance when the result set does not reflect what was asked for â\x80\x94 a field tag PubMed ignored, a phrase it matched nothing for, a dateRange dropped for having one bound, no matches at all, or paging past the end. Absent when nothing applies.'}, 'offset': {'type': 'number', 'description': 'Result offset used'}, 'searchUrl': {'type': 'string', 'description': 'PubMed search URL'}, 'summaries': {'type': 'array', 'items': {'type': 'object', 'required': ['pmid'], 'properties': {'doi': {'type': 'string', 'description': 'DOI, cased as NCBI reports it. DOIs are case-insensitive by spec and no case normalization is applied here, so casing can differ from a Europe PMC-sourced `doi` â\x80\x94 compare the two case-insensitively.'}, 'pmid': {'type': 'string', 'description': 'PubMed ID'}, 'pmcId': {'type': 'string', 'description': 'PMC ID'}, 'title': {'type': 'string', 'description': 'Article title'}, 'pmcUrl': {'type': 'string', 'description': 'PMC URL'}, 'source': {'type': 'string', 'description': 'Journal the article appeared in. Absent on an NCBI Bookshelf record, which has no journal â\x80\x94 its venue is in `bookTitle` and `publisherName` instead, and `docType` says which kind of record it is.'}, 'authors': {'type': 'string', 'description': 'Formatted author string â\x80\x94 the first three of the record\'s own authors, then "et al.". On an NCBI Bookshelf chapter these are the chapter\'s authors; the book\'s editors are reported separately in `editors`.'}, 'docType': {'type': 'string', 'description': 'What PubMed classifies this record as: "chapter" or "book" for an NCBI Bookshelf record, "citation" for an ordinary journal article. Absent when PubMed supplies none.'}, 'editors': {'type': 'array', 'items': {'type': 'string', 'description': 'One editor, "Surname Initials" as ESummary renders it'}, 'description': "Editors of the containing book, kept out of `authors` so they cannot displace the record's own authors. Absent on a journal article and on a book that credits no editors."}, 'pubDate': {'type': 'string', 'description': 'Publication date'}, 'bookTitle': {'type': 'string', 'description': 'Title of the book an NCBI Bookshelf record belongs to, e.g. "GeneReviews(®)". Present instead of `source` on a book record; absent on a journal article.'}, 'pubmedUrl': {'type': 'string', 'description': 'PubMed URL'}, 'publisherName': {'type': 'string', 'description': 'Publisher of the book an NCBI Bookshelf record belongs to. Present only on a book record; absent on a journal article.'}}, 'description': 'Brief article summary', 'additionalProperties': False}, 'description': 'Brief summaries (empty array when summaryCount is 0)'}, 'totalCount': {'type': 'number', 'description': 'Total matching articles'}, 'appliedFilters': {'type': 'object', 'properties': {'author': {'type': 'string', 'description': 'Author filter applied to the search'}, 'journal': {'type': 'string', 'description': 'Journal filter applied to the search'}, 'species': {'enum': ['humans', 'animals'], 'type': 'string', 'description': 'Species filter applied to the search'}, 'language': {'type': 'string', 'description': 'Language filter applied to the search'}, 'dateRange': {'type': 'object', 'required': ['minDate', 'maxDate', 'dateType'], 'properties': {'maxDate': {'type': 'string', 'description': 'Applied maximum date'}, 'minDate': {'type': 'string', 'description': 'Applied minimum date'}, 'dateType': {'enum': ['pdat', 'mdat', 'edat'], 'type': 'string', 'description': 'Applied date field used for the range filter'}}, 'description': 'Date range filter applied to the search', 'additionalProperties': False}, 'meshTerms': {'type': 'array', 'items': {'type': 'string'}, 'description': 'MeSH term filters applied to the search'}, 'hasAbstract': {'type': 'boolean', 'description': 'Whether results were restricted to articles with abstracts'}, 'freeFullText': {'type': 'boolean', 'description': 'Whether results were restricted to free full-text articles'}, 'publicationTypes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Publication type filters applied to the search'}}, 'description': 'Normalized filter values that were applied to the PubMed query', 'additionalProperties': False}, 'effectiveQuery': {'type': 'string', 'description': 'Sanitized query sent to PubMed after applying all active filters'}}, 'additionalProperties': False}
pubmed_spell_check
Pubmed Spell Check
Spell-check a PubMed search query against NCBI ESpell and get the corrected query back. Use after a zero-hit or thin `pubmed_search_articles` result, or when a drug, gene, disease, or author name may be misspelled — every misspelled token is corrected in one call (`alzhiemer diseese treatmnt outcomse` → `alzheimer disease treatment outcomes`), and `hasSuggestion` is false when NCBI has no change to offer. Re-run the search with `corrected`.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'query': {'type': 'string', 'minLength': 2, 'description': 'PubMed search query to spell-check. Must carry a term: a value of only whitespace or invisible characters, such as a zero-width space, is rejected rather than sent to ESpell.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['original', 'corrected', 'hasSuggestion']}, {'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': ['queue_full', 'ncbi_unreachable', 'ncbi_rate_limited', 'ncbi_deadline_exceeded', 'ncbi_invalid_response', 'ncbi_resource_not_found', 'blank_query'], 'description': 'Machine-readable failure mode. Declared by this tool: `queue_full`: The local NCBI request queue shed the call â\x80\x94 the queue is full, or the call cannot start before its total deadline (for example behind the cooldown that follows an NCBI 429). `ncbi_unreachable`: NCBI E-utilities failed on every attempt the retry budget allowed â\x80\x94 retries ran out, or the next backoff would overrun the total deadline. `ncbi_rate_limited`: NCBI answered HTTP 429 (too many requests) and the call stopped on it â\x80\x94 retries ran out, the next backoff would overrun the total deadline, or the Retry-After NCBI named outlasts the time left or the 30-second backoff cap. `ncbi_deadline_exceeded`: The total NCBI request deadline expired before NCBI answered successfully â\x80\x94 mid-request, while queued, or during a retry backoff. `ncbi_invalid_response`: NCBI returned a body that could not be parsed (invalid XML/JSON). `ncbi_resource_not_found`: NCBI returned a structured "not found" error for the requested ID(s). `blank_query`: The query contains no search term: nothing is left once whitespace and invisible characters such as a zero-width space are disregarded. pubmed_search_articles and pubmed_europepmc_search first decode HTML entities and also disregard markup and parentheses, so `()`, `<b></b>`, and `&nbsp;` hold no term there; pubmed_search_articles also disregards bracketed field tags such as `[pdat]`. 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': {}}, 'original': {'type': 'string', 'description': 'Original query'}, 'corrected': {'type': 'string', 'description': 'Corrected query (same as original if no suggestion)'}, 'hasSuggestion': {'type': 'boolean', 'description': 'Whether NCBI suggested a correction'}}, 'additionalProperties': False}
Modificado
pubmed_europepmc_fetch
29 de September de 2026 a las 02:51
Modificado
pubmed_europepmc_search
29 de September de 2026 a las 02:51
Modificado
pubmed_convert_ids
29 de September de 2026 a las 02:51
Modificado
pubmed_lookup_citation
29 de September de 2026 a las 02:51
Modificado
pubmed_lookup_mesh
29 de September de 2026 a las 02:51
Modificado
pubmed_spell_check
29 de September de 2026 a las 02:51
Modificado
pubmed_format_citations
29 de September de 2026 a las 02:51
Modificado
pubmed_fetch_fulltext
29 de September de 2026 a las 02:51
Modificado
pubmed_fetch_articles
29 de September de 2026 a las 02:51
Modificado
pubmed_search_articles
29 de September de 2026 a las 02:51
Modificado
pubmed_europepmc_fetch
25 de September de 2026 a las 02:51
Modificado
pubmed_europepmc_search
25 de September de 2026 a las 02:51
Modificado
pubmed_convert_ids
25 de September de 2026 a las 02:51
Modificado
pubmed_lookup_citation
25 de September de 2026 a las 02:51
Modificado
pubmed_lookup_mesh
25 de September de 2026 a las 02:51
Modificado
pubmed_spell_check
25 de September de 2026 a las 02:51
Modificado
pubmed_find_related
25 de September de 2026 a las 02:51
Modificado
pubmed_format_citations
25 de September de 2026 a las 02:51
Modificado
pubmed_fetch_fulltext
25 de September de 2026 a las 02:51
Modificado
pubmed_fetch_articles
25 de September de 2026 a las 02:51
Modificado
pubmed_search_articles
25 de September de 2026 a las 02:51
Añadido
pubmed_europepmc_fetch
17 de September de 2026 a las 12:41
Añadido
pubmed_europepmc_search
17 de September de 2026 a las 12:41
Añadido
pubmed_convert_ids
17 de September de 2026 a las 12:41
Añadido
pubmed_lookup_citation
17 de September de 2026 a las 12:41
Añadido
pubmed_lookup_mesh
17 de September de 2026 a las 12:41
Añadido
pubmed_spell_check
17 de September de 2026 a las 12:41
Añadido
pubmed_find_related
17 de September de 2026 a las 12:41
Añadido
pubmed_format_citations
17 de September de 2026 a las 12:41
Añadido
pubmed_fetch_fulltext
17 de September de 2026 a las 12:41