Skip to main content
Glama
pubmed-mcp-server

pubmed-mcp-server

by cyanheads

Pubmed Europepmc Fetch

pubmed_europepmc_fetch
Read-only

Fetch complete Europe PMC records by source and ID to read full, untruncated abstracts, including preprint, patent, and Agricola entries that lack PMIDs or DOIs.

Instructions

Fetch complete Europe PMC records — including the full, untruncated abstract — addressed as records: [{ source, epmcId }], an array even for one record. Pairs with pubmed_europepmc_search, which returns bounded abstractSnippet values and flags cut ones with abstractTruncated: true; copy each hit's source and epmcId into records 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. Set maxResponseCharacters to bound the whole response: records past the ceiling are deferred whole and listed in deferred.records for a follow-up call.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "records": "<records>"
    },
    "name": "pubmed_europepmc_fetch"
  }
}

Input Schema

NameRequiredDescriptionDefault
recordsYesRecords to retrieve, each addressed by the `source` and `epmcId` of a `pubmed_europepmc_search` hit. The whole batch resolves in one Europe PMC request.
maxResponseCharactersNoOpt-in ceiling for the whole response, in characters. Each record is measured as the JSON record it is returned as — title, authors, journal, abstract, identifiers, every field it carries. Records are kept in the order Europe PMC returned them until the next one would cross the ceiling; that record and the rest are deferred whole (never partially populated) and listed in `deferred.records`. Response envelope fields — `notFound`, `deferred` itself — are not counted. Omit to return every resolved record.

Output Schema

NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when one or more requested records could not be resolved, or when `maxResponseCharacters` deferred records — naming how to retrieve them. Absent when every requested record came back.
recordsNoResolved records, in the order Europe PMC returned them. Under a `maxResponseCharacters` budget, only the leading records that fit; `deferred.records` lists the rest.
deferredNoContinuation state for records the whole-response budget withheld. Present only when `maxResponseCharacters` deferred at least one record.
notFoundNoRequested `source` + `epmcId` pairs Europe PMC returned no record for. Reported in full regardless of where a `maxResponseCharacters` cut lands — these are misses, not deferrals.
truncatedNoTrue when `maxResponseCharacters` withheld at least one resolved record. Absent when the response carries every record that resolved. The continuation state is in `deferred`.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv2.12.1
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — an error message in place of results; a sort it cannot use (one whose keys are not each a field plus asc/desc, rejected before any request; an empty response to a sort with an undocumented field; or a second HTTP 503 to a sorted search when the same query without the sort is served); 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."New value: +"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — an error message in place of results; a sort it cannot use (one whose keys are not each a field plus asc/desc, rejected before any request; an empty response to a sort with an undocumented field; or a second HTTP 503 to a search whose sort has an undocumented field when the same query without the sort is served); 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."
  2. Changed3 schema fields changedv2.11.1
    • changedOutput schema / properties / records / items / properties / hasFullTextXml / description
      Previous value: -"Whether Europe PMC publishes a fullTextXML for this record. Derived from `inPMC` — only records with a PMC counterpart have JATS via Europe PMC."New value: +"Whether Europe PMC publishes a fullTextXML for this record: true when Europe PMC marks it open access and lists a full-text id for it, open-access preprints (`PPR`) included; false otherwise. Absent when Europe PMC reports no open-access status."
    • changedOutput schema / properties / records / items / properties / journal / description
      Previous value: -"Journal title as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded."New value: +"Journal name as Europe PMC reports it — its MEDLINE abbreviation where it records one (e.g. `Otolaryngol Pol`), else the full journal title — the same name `pubmed_europepmc_search` returns for the record. Display-ready plain text — JATS/HTML markup stripped and HTML entities decoded. Absent when Europe PMC carries no journal, as for preprints."
    • addedOutput schema / properties / records / items / properties / license
      Added value: +{
      +  "description": "License Europe PMC records for this record, verbatim (e.g. `cc by`, `cc by-nc-nd`, `cc0`). Relayed as Europe PMC states it, never interpreted. Absent when Europe PMC supplies none.",
      +  "type": "string"
      +}
  3. Changed3 schema fields changedv2.10.22
    • changedInput schema / properties / maxResponseCharacters / maximum
      Previous value: -1000000New value: +9007199254740991
    • changedOutput schema / properties / deferred / properties / nextDeferredCharacters / description
      Previous value: -"Serialized size of the next deferred record — the first entry in `records`, where the response stopped. Raise `maxResponseCharacters` to at least this to make progress; a smaller record further down `records` cannot be reached until this one fits."New value: +"Serialized size of the next deferred record — the first entry in `records`, where the response stopped — and the continuation ceiling: re-calling with the deferred pairs needs `maxResponseCharacters` ≥ this to return anything, and a smaller record further down `records` cannot be reached until this one fits. Repeating this same call needs `maxResponseCharacters` ≥ `returnedCharacters` + this to return this record as well."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — 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."New value: +"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — an error message in place of results; a sort it cannot use (one whose keys are not each a field plus asc/desc, rejected before any request; an empty response to a sort with an undocumented field; or a second HTTP 503 to a sorted search when the same query without the sort is served); 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."
  4. Changed6 schema fields changedv2.10.20
    • addedInput schema / properties / maxResponseCharacters
      Added value: +{
      +  "description": "Opt-in ceiling for the whole response, in characters. Each record is measured as the JSON record it is returned as — title, authors, journal, abstract, identifiers, every field it carries. Records are kept in the order Europe PMC returned them until the next one would cross the ceiling; that record and the rest are deferred whole (never partially populated) and listed in `deferred.records`. Response envelope fields — `notFound`, `deferred` itself — are not counted. Omit to return every resolved record.",
      +  "maximum": 1000000,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / deferred
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Continuation state for records the whole-response budget withheld. Present only when `maxResponseCharacters` deferred at least one record.",
      +  "properties": {
      +    "deferredCount": {
      +      "description": "Records that resolved but were withheld to stay under the ceiling",
      +      "type": "number"
      +    },
      +    "maxResponseCharacters": {
      +      "description": "The `maxResponseCharacters` ceiling this response was budgeted against",
      +      "type": "number"
      +    },
      +    "nextDeferredCharacters": {
      +      "description": "Serialized size of the next deferred record — the first entry in `records`, where the response stopped. Raise `maxResponseCharacters` to at least this to make progress; a smaller record further down `records` cannot be reached until this one fits.",
      +      "type": "number"
      +    },
      +    "records": {
      +      "description": "The deferred records, in response order, each as the resolved record's own `source` + `epmcId` — a `PMC` request answered by its `MED` record is listed as that `MED` pair. Pass them back as `records` to retrieve them. Never contains a pair from `notFound`.",
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One deferred record, addressed by its own `source` + `epmcId`",
      +        "properties": {
      +          "epmcId": {
      +            "description": "Europe PMC's internal record id",
      +            "type": "string"
      +          },
      +          "source": {
      +            "description": "Europe PMC source the record was resolved from",
      +            "enum": [
      +              "MED",
      +              "PMC",
      +              "PPR",
      +              "PAT",
      +              "AGR"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "source",
      +          "epmcId"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "returnedCharacters": {
      +      "description": "Serialized characters the returned records account for",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "maxResponseCharacters",
      +    "returnedCharacters",
      +    "deferredCount",
      +    "records",
      +    "nextDeferredCharacters"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / notFound / description
      Previous value: -"Requested `source` + `epmcId` pairs Europe PMC returned no record for"New value: +"Requested `source` + `epmcId` pairs Europe PMC returned no record for. Reported in full regardless of where a `maxResponseCharacters` cut lands — these are misses, not deferrals."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when one or more requested records could not be resolved. Absent when every record came back."New value: +"Guidance when one or more requested records could not be resolved, or when `maxResponseCharacters` deferred records — naming how to retrieve them. Absent when every requested record came back."
    • changedOutput schema / properties / records / description
      Previous value: -"Resolved records, in the order Europe PMC returned them"New value: +"Resolved records, in the order Europe PMC returned them. Under a `maxResponseCharacters` budget, only the leading records that fit; `deferred.records` lists the rest."
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when `maxResponseCharacters` withheld at least one resolved record. Absent when the response carries every record that resolved. The continuation state is in `deferred`.",
      +  "type": "boolean"
      +}
  5. Changed1 schema field changedv2.10.19
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — an error message such as an empty query, an empty response to a sort with an undocumented field or no asc/desc direction, or an empty response to a pagination cursor on every attempt. `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — 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."
  6. Changed1 schema field changedv2.10.18
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC was unreachable after all retry attempts. `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 (empty query, unknown sort field, malformed parameter). `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC failed on every retry attempt — 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 — an error message such as an empty query, an empty response to a sort with an undocumented field or no asc/desc direction, or an empty response to a pagination cursor on every attempt. `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. Other values are possible when a failure originates below the handler."
  7. Changed3 schema fields changedv2.10.8
    • changedOutput schema / properties / records / items / properties / authors / description
      Previous value: -"Formatted author string"New value: +"Formatted author string as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded."
    • changedOutput schema / properties / records / items / properties / journal / description
      Previous value: -"Journal title"New value: +"Journal title as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded."
    • changedOutput schema / properties / records / items / properties / title / description
      Previous value: -"Record title"New value: +"Record title as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded."
  8. Changed6 schema fields changedv2.10.4
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "records"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `europepmc_unreachable`: Europe PMC was unreachable after all retry attempts. `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 (empty query, unknown sort field, malformed parameter). `europepmc_disabled`: Europe PMC service is disabled via EUROPEPMC_ENABLED=false. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "europepmc_unreachable",
      +            "europepmc_invalid_response",
      +            "europepmc_invalid_input",
      +            "europepmc_disabled"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "records"
      -]
  9. Addedv2.10.2

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond readOnlyHint/openWorldHint it discloses that the whole batch resolves in one Europe PMC request and that records crossing `maxResponseCharacters` are deferred whole, never partially populated, with envelope fields excluded from the count. That is genuinely useful behavior not carried by the annotations. Deduction only because response shape detail is largely delegated to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with purpose then the search pairing then the source-corpus exception. Some deferral detail is repeated from the `maxResponseCharacters` schema description, so it is not maximally tight, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter batch-fetch tool with a 100%-covered schema and an output schema, the description supplies everything else an agent needs: input provenance, batch limit, source-corpus rationale, and truncation/deferral behavior. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description still adds value by emphasizing that `records` is an array even for a single record and by explaining the deferral semantics of `maxResponseCharacters` in workflow terms (what happens to records past the ceiling and where they are listed).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — 'Fetch complete Europe PMC records — including the full, untruncated abstract' — and immediately distinguishes the tool from pubmed_europepmc_search (bounded snippets) and from pubmed_fetch_articles/pubmed_fetch_fulltext (cannot address PPR/PAT/AGR). An agent can select this tool without consulting any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exact triggering workflow: take the `source` and `epmcId` from a search hit and place them in `records`. It also names explicit when-to-use routing ('the retrieval path for preprint, patent, and Agricola records') and the condition that excludes the fetch_articles/fetch_fulltext siblings, plus the 25-record cap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.