Skip to main content
Glama
cyanheads

pubmed-mcp-server

by cyanheads

Pubmed Europepmc Search

pubmed_europepmc_search
Read-only

Search Europe PMC for biomedical literature, including preprints, patents, and Agricola records. Retrieve open-access articles not in PubMed using optional source filters and pagination.

Instructions

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sortNoOptional EPMC sort: `<field> asc|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. Fields outside the documented set are rejected by EPMC. Note: `P_PDATE_D` is ignored for preprint-only (`sources: ["PPR"]`) result sets — preprints have no populated publication date, so use `PUB_YEAR` to order preprints by date.
queryYesEurope 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 combined with `AND SRC:` must be unquoted — the quoted form matches nothing. Free text is matched broadly across abstract/title/keywords.
sourcesNoFilter 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.
pageSizeNoResults per page. Max 100 per EPMC API.
cursorMarkNoPagination cursor. Use `*` (default) for the first page; pass the previous response's `nextCursorMark` for subsequent pages.*
resultTypeNo`core` returns abstract, IDs, dates, license; `lite` is a smaller payload with IDs and titles only.core

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hitsNoMatching Europe PMC records, in the order EPMC returned them
errorNoPresent when the call failed. Absent on success.
queryNoEffective query string echoed by Europe PMC
noticeNoOptional guidance when results are empty or paging overshot
searchUrlNoEurope PMC's website search URL for this query
cursorMarkNoCursor used for this response (echoed from the request)
totalCountNoTotal matching records across all pages
appliedSourcesNoSources the query was filtered against (defaults applied)
nextCursorMarkNoCursor to pass back as `cursorMark` for the next page. Absent on the final page.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv2.10.8
    • changedOutput schema / properties / hits / 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 / hits / 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 / hits / items / properties / title / description
      Previous value: -"Article title"New value: +"Article title as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded."
  2. 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": [
      +      "hits",
      +      "cursorMark",
      +      "searchUrl",
      +      "query",
      +      "totalCount",
      +      "appliedSources"
      +    ]
      +  },
      +  {
      +    "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: -[
      -  "hits",
      -  "cursorMark",
      -  "searchUrl",
      -  "query",
      -  "totalCount",
      -  "appliedSources"
      -]
  3. Changed5 schema fields changedv2.10.2
    • changedInput schema / properties / query / description
      Previous value: -"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`. Free text is matched broadly across abstract/title/keywords."New value: +"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 combined with `AND SRC:` must be unquoted — the quoted form matches nothing. Free text is matched broadly across abstract/title/keywords."
    • changedOutput schema / properties / hits / items / properties / abstractSnippet / description
      Previous value: -"First few hundred characters of the abstract as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded — when `resultType: \"core\"` is requested"New value: +"First 400 characters of the abstract as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded — when `resultType: \"core\"` is requested, with a trailing … appended when the abstract was cut. Check `abstractTruncated` before treating it as the whole abstract."
    • addedOutput schema / properties / hits / items / properties / abstractTruncated
      Added value: +{
      +  "description": "Whether `abstractSnippet` was cut short of the full abstract. Retrieve the complete text with `pubmed_europepmc_fetch` using this record’s `source` and `epmcId`. Present whenever `abstractSnippet` is; omitted when Europe PMC carries no abstract.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / hits / items / properties / doi / description
      Previous value: -"DOI when present"New value: +"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`) — a byte-for-byte comparison across the two reports a false mismatch."
    • changedOutput schema / properties / hits / items / properties / epmcId / description
      Previous value: -"Europe PMC's internal record id; key for `fullTextXML` lookup"New value: +"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."
  4. Changed1 schema field changedv2.9.6
    • changedOutput schema / properties / hits / items / properties / abstractSnippet / description
      Previous value: -"First few hundred characters of the abstract when `resultType: \"core\"` is requested"New value: +"First few hundred characters of the abstract as display-ready plain text — JATS/HTML markup stripped and HTML entities decoded — when `resultType: \"core\"` is requested"
  5. Changed3 schema fields changedv2.9.4
    • removedOutput schema / properties / hitCount
      Removed value: -{
      -  "description": "Total matching records across all pages",
      -  "type": "number"
      -}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total matching records across all pages",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "hits",
      -  "cursorMark",
      -  "searchUrl",
      -  "query",
      -  "hitCount",
      -  "appliedSources"
      -]New value: +[
      +  "hits",
      +  "cursorMark",
      +  "searchUrl",
      +  "query",
      +  "totalCount",
      +  "appliedSources"
      +]
  6. Changed1 schema field changedv2.9.1
    • changedInput schema / properties / sort / description
      Previous value: -"Optional EPMC sort: `<field> asc|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. Fields outside the documented set are rejected by EPMC."New value: +"Optional EPMC sort: `<field> asc|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. Fields outside the documented set are rejected by EPMC. Note: `P_PDATE_D` is ignored for preprint-only (`sources: [\"PPR\"]`) result sets — preprints have no populated publication date, so use `PUB_YEAR` to order preprints by date."
  7. Changed1 schema field changedv2.7.8
    • changedOutput schema / required
      Previous value: -[
      -  "query",
      -  "hits",
      -  "hitCount",
      -  "cursorMark",
      -  "appliedSources",
      -  "searchUrl"
      -]New value: +[
      +  "hits",
      +  "cursorMark",
      +  "searchUrl",
      +  "query",
      +  "hitCount",
      +  "appliedSources"
      +]
  8. Addedv2.7.6

TDQS

A4.4/5.0
Behavior5/5

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

With readOnlyHint and openWorldHint already declared, the baseline burden is lower, and the description adds substantial behavior beyond them: cursorMark-based pagination, the default source set (MED/PMC/PPR), and the output contract of a bounded abstractSnippet with abstractTruncated flagging cut results. It also routes to pubmed_europepmc_fetch for the full abstract — genuinely actionable behavioral context.

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?

Four sentences with purpose and scope front-loaded ahead of usage, pagination, and output behavior; every sentence earns its place. The final sentence is dense but packs critical truncation semantics and the follow-up fetch routing. Minor repetition of schema-documented defaults keeps it from a 5.

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 6-parameter read-only search tool with an output schema, the description covers corpus scope, the when-to-use condition, pagination, default sources, abstract truncation behavior, and the sibling tool for complete abstracts. Nothing material is left for the agent to infer or discover at call time.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema itself is exceptionally detailed (sortable-field caveats, the P_PDATE_D preprint quirk, the unquoted-identifier-token rule, max pageSize). The description's mentions of defaults and cursorMark largely restate what the schema already documents, so it adds little parameter meaning beyond the established baseline.

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 states a specific verb+resource: 'Search Europe PMC, a broad open-access biomedical corpus,' and enumerates the exact coverage (preprints, patents, Agricola, plus all PubMed and PMC content). This cleanly distinguishes it from sibling pubmed_search_articles, which targets the narrower PubMed corpus, without needing to open either schema.

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

Usage Guidelines4/5

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

Gives an explicit trigger condition: 'Use when additional coverage is needed — preprints and EPMC-only OA records are the typical recovery,' and explains how to widen scope ('pass sources to include PAT/AGR'). It does not explicitly name the when-not alternative (e.g., 'use pubmed_search_articles for PubMed-only queries'), but the coverage-based contrast makes the routing decision clear.

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