PyEuropePMC
PYPI · PYEUROPEPMC
Europe PMC search, search analytics, full text, enrichment, PICO, MeSH, data links, export, auth
Available components
Last scanned (18 hours ago)
Scores higher than 70% of PyPI servers
Category Education and Research
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security32
- Malware scan not yet available for this package.Unverified
- CVE check failed: a known advisory affects this package; its severity couldn't be graded. See how to fix → View diagnostics → Fail
- Runs poetry.core.masonry.api at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 8 of 57 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to JonasHeinickeBio/pyEuropePMC). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 7151 tokens (~152/item across 47 items; 47 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "bib_merge" implies "merge" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
- An AI judge read all 48 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Nov 26 0
- Security disclosure: unverified → fail ▼ functional
- Package version: 4.6.0 → 4.6.1 functional
- 1 Nov 26 0
- Security disclosure: fail → unverified ▼ functional
- 31 Oct 26 +1
- Stability: 0.97 → pass security
- 30 Oct 26 −16
- Malware scan: pass → unverified ▼ security
- Stability: pass → 0.97 functional
- 29 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 28 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 4.5.0 → 4.6.0 functional
- 27 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 26 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 4.2.0 → 4.5.0 functional
- Package version: 4.2.0 → 4.4.0 functional
- Package version: 4.2.0 → 4.3.0 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed pypi/pyeuropepmc@4.6.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | JonasHeinickeBio/pyEuropePMC |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/JonasHeinickeBio/pyEuropePMC/.github/workflows/release.yml@refs/tags/v4.6.1 |
| Rekor log index | 3641302145 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:6880f27222123fe2e53bf6d032ef7a5ccda6c876cbcf86ddc5c1e61f618c04e5 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | poetry.core.masonry.api |
Background: Why install scripts are a supply-chain risk →
Vulnerabilities 2 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-w8v5-vhqr-4h9v | CVE-2025-69872 | medium | no | |
| PYSEC-2026-2447 | CVE-2025-69872 | none | no |
Background: What a vulnerability scan can and cannot prove →
Dependencies 57 packages
| Packages resolved | 57 |
|---|---|
| Stale | 7 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
analyze_citations ~57
Analyze citation context for a paper using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| context | string | – | Citation context description |
| pmid | string | yes | PubMed ID |
| task | string | – | Analysis task description |
Structured output declared, but exposes no named fields.
No examples provided.
analyze_search ~416
Aggregate statistics about a search without returning its records. Every metric says where it comes from in `basis`: `exact` is counted by Europe PMC over all `hit_count` records (`by_year`: one count per year; `open_access`; the `thresholds` of `citations`), `sample` is computed from the first `limit` records of the search and describes only those (`journals`, `authors`, `types`, `countries`, `funders` and the `citations` statistics). When `limit` covers the whole result, those are `exact` too. The sample metrics need `pip install pyeuropepmc[analytics]`.
| Name | Type | Req | Description |
|---|---|---|---|
| date_from | string | – | First publication date, from (YYYY, YYYY-MM or YYYY-MM-DD) |
| date_to | string | – | First publication date, to (YYYY, YYYY-MM or YYYY-MM-DD) |
| has_fulltext | boolean | – | Only articles with full text |
| limit | integer | – | Records read for the metrics that cannot be counted (citations statistics, journals, authors, types, countries, funders) |
| metrics | – | – | What to compute, any of: by_year, citations, journals, authors, types, countries, open_access, funders. Default: all of them. |
| open_access | boolean | – | Only open-access articles |
| query | string | yes | Search query |
| sort | string | – | Order of the records read, e.g. 'CITED desc' (default: relevance) |
| source | string | – | Restrict to one source, e.g. MED, PMC or PPR (preprints) |
| top_n | integer | – | Entries in each ranking (journals, authors, ...) |
| year_window | integer | – | Years `by_year` counts, ending with the current one, one request each (30 take a few seconds on a large search, 60 about twice that). Older records are one `before` bucket, so the total stays exact |
Structured output declared, but exposes no named fields.
No examples provided.
bib_merge ~36
Merge multiple BibTeX libraries, deduplicating by DOI.
| Name | Type | Req | Description |
|---|---|---|---|
| libraries | array | yes | BibTeX-formatted strings to merge |
Structured output declared, but exposes no named fields.
No examples provided.
bib_parse_string ~32
Parse a BibTeX string into structured entries.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | BibTeX-formatted string |
Structured output declared, but exposes no named fields.
No examples provided.
bib_to_csl ~34
Convert BibTeX entries to CSL-JSON format.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | BibTeX-formatted string |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
bib_to_ris ~32
Convert BibTeX entries to RIS format.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | BibTeX-formatted string |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
bib_validate ~31
Validate BibTeX entries for completeness and correctness.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | BibTeX string to validate |
Structured output declared, but exposes no named fields.
No examples provided.
build_query ~268
Build a Europe PMC query from structured input instead of writing syntax by hand, and check the result. Returns the query, a plain-language explanation of what it asks for, and any warnings. At least one of all_of, any_of or a filter is needed (none_of alone would match almost everything). The same filters are available on `search_papers`.
| Name | Type | Req | Description |
|---|---|---|---|
| all_of | – | – | Terms that must all match. A plain word or phrase is searched as written ('heart attack' becomes a phrase); write FIELD:value, a quoted string or a parenthesised expression to say more, e.g. 'TITLE:c… |
| any_of | – | – | Terms of which at least one must match |
| cites | string | – | Only records that cite this PMID |
| date_from | string | – | First publication date, from (YYYY, YYYY-MM or YYYY-MM-DD) |
| date_to | string | – | First publication date, to (YYYY, YYYY-MM or YYYY-MM-DD) |
| has_fulltext | boolean | – | Only records with full text |
| none_of | – | – | Terms that must not match |
| open_access | boolean | – | Only open-access records |
| source | string | – | Only this source, e.g. MED, PMC or PPR (preprints) |
Structured output declared, but exposes no named fields.
No examples provided.
cache_status ~75
How full are the server's caches and how often do they help? For the search, article and annotation clients and for the full-text XML cache: entries, capacity, size, hits, misses and hit rate. Counts only: no cache keys (they can contain query text), no cached content and no file paths.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
citation_snowball ~111
Walk the citation graph forward (cited-by), backward (references), or both, with configurable depth and a minimum-citation-count filter.
| Name | Type | Req | Description |
|---|---|---|---|
| identifier | string | yes | Paper ID (PMID, DOI, or Semantic Scholar ID) |
| max_depth | integer | – | Recursion depth (0 = no limit) |
| max_papers | integer | – | Max papers per level |
| min_citations | integer | – | Minimum citation count filter |
| strategy | string | – | Snowball direction |
Structured output declared, but exposes no named fields.
No examples provided.
clear_cache ~127
Empty one of the server's in-memory caches, so that the next call asks Europe PMC again. Only worth doing when you suspect a cached answer is stale (the caches hold results for a day); every cleared entry has to be fetched again, which is load on Europe PMC. It changes server state, so a client may ask for approval. It never touches files on disk.
| Name | Type | Req | Description |
|---|---|---|---|
| scope | string | yes | Which cache: search (search results, batch lookups, counts), article (citations, references), annotations, xml (downloaded full text) or all of them |
Structured output declared, but exposes no named fields.
No examples provided.
clinical_trial_search ~83
Search ClinicalTrials.gov for studies by condition, intervention, or free-text query.
| Name | Type | Req | Description |
|---|---|---|---|
| condition | – | – | Medical condition filter |
| intervention | – | – | Intervention/treatment filter |
| limit | integer | – | Max results |
| query | string | – | Free-text search query |
| status | – | – | Recruitment status filter, e.g. ACTIVE, COMPLETED, RECRUITING |
Structured output declared, but exposes no named fields.
No examples provided.
compare_citations ~65
Compare citations between two papers using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| pmid1 | string | yes | PubMed ID of first paper |
| pmid2 | string | yes | PubMed ID of second paper |
| task | string | – | Comparison task description |
Structured output declared, but exposes no named fields.
No examples provided.
count_papers ~158
Number of Europe PMC records matching a query, without fetching them. Use it to size a search before choosing ``limit`` for `search_papers`.
| Name | Type | Req | Description |
|---|---|---|---|
| date_from | string | – | First publication date, from (YYYY, YYYY-MM or YYYY-MM-DD) |
| date_to | string | – | First publication date, to (YYYY, YYYY-MM or YYYY-MM-DD) |
| has_fulltext | boolean | – | Only articles with full text |
| open_access | boolean | – | Only open-access articles |
| query | string | yes | Search query |
| source | string | – | Restrict to one source, e.g. MED, PMC or PPR (preprints) |
| synonym | boolean | – | Expand the query with MeSH synonyms |
Structured output declared, but exposes no named fields.
No examples provided.
enrich_paper ~357
One compact record for a paper from Europe PMC, Crossref, OpenAlex, Semantic Scholar, iCite and Unpaywall, merged: citation impact, funders and grants, authors with their institutions, open-access status and licence, and corrections and retractions. The sources are asked at the same time; `sources` in the answer says for each whether it answered (ok), had nothing (empty), failed (error, with the reason), or was still running when `time_budget` ended (timeout). A failed source gives a partial record, not an error. Institutions come with name, country and ROR ID; `ror_details` adds their place and website. Nothing is written to disk.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI or doi.org URL (alternative to pmcid) |
| include | – | – | Only these field groups: impact, funding, affiliations, oa, updates. Default: all. |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| ror_details | boolean | – | Add city, country code, website and coordinates of each institution from ROR (needs the affiliations group). One more request per institution, so slower; the time budget covers it. |
| sources | – | – | Only these sources besides Europe PMC: crossref, openalex, semantic_scholar, icite, unpaywall. Default: all that need no credentials (Unpaywall once UNPAYWALL_EMAIL is set). |
| time_budget | number | – | Seconds to wait for the sources together; one that is still running is reported as a timeout and left out |
Structured output declared, but exposes no named fields.
No examples provided.
epmc_status ~135
Is Europe PMC up right now? Probes the endpoints this server depends on (search, full text, citations, annotations) and returns ok, degraded (some fail), down (none answers) or unknown (only 4xx answers: a blocked probe or a moved endpoint), with the HTTP status and the time in milliseconds of each. Use it before retrying a tool that failed with a network error, a timeout or a 5xx. The answer is kept for 30 seconds, so asking again does not probe again (`cached` says so), and it contains no URLs or response bodies.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
evaluate_query ~156
Score a Europe PMC query against papers you already know, for systematic-review work: recall (how many of the included PMIDs it finds) and how many excluded ones it still finds, with the PMIDs it misses. This runs the query on Europe PMC itself, so it measures what the search really returns, not a local reading of the syntax. PMIDs that Europe PMC does not know are reported apart and left out of the scores. A query with errors is refused; see `validate_query`.
| Name | Type | Req | Description |
|---|---|---|---|
| excluded_pmids | – | – | PMIDs the query should not find |
| included_pmids | array | yes | PMIDs the query should find |
| query | string | yes | A Europe PMC search query |
Structured output declared, but exposes no named fields.
No examples provided.
export_papers ~395
Export papers as a file's worth of text to hand to a reference manager or a spreadsheet: BibTeX, RIS or CSL-JSON (Zotero, Mendeley, EndNote, Pandoc) or CSV, JSON or Markdown. Give a search `query` or a list of `ids`. BibTeX keys look like `vasiliou2005analysis`, are unique within the export and do not change when it is cut to size; text that LaTeX reads as syntax (& % # _ $) is escaped. A paper with more than 100 authors lists the first 100 (BibTeX adds `and others`). The export is never cut in the middle of a record: `truncated` says that records were left out; `next_skip` (query) or `remaining` (ids) say where to continue. Nothing is written to disk.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | – | – | csv, json and markdown only: columns, from id, source, pmid, pmcid, doi, title, authors, journal, year, cited_by, is_open_access, pub_types, abstract. Default: id, source, pmid, pmcid, doi, title, au… |
| format | string | – | Output format |
| ids | – | – | PMIDs, PMCIDs and DOIs (mixed) to export, in this order; give this or query, not both |
| include_abstract | boolean | – | bibtex, ris and csl-json only: include the abstract |
| limit | integer | – | Most records to export |
| max_chars | integer | – | Cut the export at a record boundary after this many characters |
| query | string | – | A Europe PMC search query; give this or ids, not both |
| skip | integer | – | Query only: results to skip, for the next part |
Structured output declared, but exposes no named fields.
No examples provided.
find_open_access ~151
Where can this paper be read for free? Looks the DOI up in Unpaywall and returns the open-access status (gold, green, hybrid, bronze, closed), the best copy with its PDF link and licence, and a few alternatives. ``europepmc_fulltext`` says whether `get_paper_fulltext` will work for it. Needs UNPAYWALL_EMAIL in the server's environment.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI, e.g. 10.1038/s41586-020-2649-2 |
| pmcid | string | – | PMC ID (alternative to doi) |
| pmid | string | – | PubMed ID (alternative to doi) |
Structured output declared, but exposes no named fields.
No examples provided.
find_papers_by_entity ~215
Articles in which Europe PMC found a given entity, with how often and where it is mentioned. One page per call: pass ``next_cursor`` back as ``cursor`` for the next. Europe PMC's entity search ignores type, section and provider, so the three filters here apply to the mentions it returns: an article without a matching mention is left out and counted in ``articles_filtered_out``.
| Name | Type | Req | Description |
|---|---|---|---|
| annotation_type | string | – | Only count mentions of this type, e.g. Chemicals, Diseases |
| cursor | string | – | next_cursor of the previous page; empty for the first page |
| entity | string | yes | Entity identifier or name, e.g. 'CHEBI:16236', 'ethanol', 'BRCA1' |
| limit | integer | – | Articles per page (Europe PMC allows 1 to 8) |
| provider | string | – | Only count mentions from this provider |
| section | string | – | Only count mentions in this section, e.g. Abstract, Results |
Structured output declared, but exposes no named fields.
No examples provided.
fulltext_index_query ~103
Search the local SQLite FTS5 full-text index for papers whose full text matches a query. A fresh index handle is opened per call rather than cached: SQLite connections are only safe to use from the thread that created them, and each call may run on a different worker thread.
| Name | Type | Req | Description |
|---|---|---|---|
| index_path | – | – | Path to the SQLite index file (optional) |
| limit | integer | – | Max results |
| query | string | yes | Full-text search query |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_annotations ~209
Genes, proteins, chemicals, diseases, organisms and other entities that Europe PMC text-mined from a paper, grouped by entity with mention counts, sections and example mentions. A review with hundreds of mentions comes back as a short entity list.
| Name | Type | Req | Description |
|---|---|---|---|
| annotation_type | string | – | Only this entity type, e.g. Gene_Proteins, Chemicals, Diseases, Organisms, 'Gene Ontology'. Case-insensitive; the result lists available_types when nothing matches. |
| doi | string | – | DOI (alternative to pmcid) |
| limit | integer | – | Max entities to return, most mentioned first |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| provider | string | – | Only this annotation provider, e.g. 'Europe PMC' |
| section | string | – | Only mentions in this section, e.g. Abstract, Results, Methods |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_citations ~74
Get papers that cite a given paper (Europe PMC).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max citing papers to return |
| pmid | string | yes | Article ID, usually a PubMed ID |
| source | string | – | Europe PMC source code of the ID: MED (PMID), PMC or PPR |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
get_paper_data_links ~264
Where is the data of this paper? Accession numbers Europe PMC text-mined from the full text (dbSNP, RefSeq, OMIM, ClinicalTrials.gov, cited DOIs) and records that providers link to the paper (BioStudies supplementary data, model-organism databases, Altmetric), as one flat list. `kind` separates supporting_data and related_data from altmetrics and recommended_reviews; `origin` says whether a link was text_mined or supplied by a provider. A paper without links gives an empty list, which is a valid answer.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Only this category, e.g. 'Data Citations', SNPs, RefSeq, 'Clinical Trials', Diseases, Altmetric. Case-insensitive; `categories` in the result lists what exists. |
| doi | string | – | DOI (alternative to pmcid) |
| limit | integer | – | Max links to return |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| scheme | string | – | Only this identifier scheme, e.g. dbSNP, RefSeq, DOI, OMIM |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_details ~55
Get detailed paper information by PMID, PMCID, or DOI (Europe PMC).
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI |
| pmcid | string | – | PMCID |
| pmid | string | – | PubMed ID |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_fulltext ~281
Fetch the structured full text of an open-access paper from Europe PMC. Returns metadata, the list of available section titles, and the content in the requested format. When the content is longer than ``max_chars`` it is cut at a block boundary and ``truncated`` is true: ask again with ``sections`` for the part you need. Only open-access articles have full text; anything else fails with the reason.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI (alternative to pmcid) |
| format | string | – | markdown: readable text with tables (default). sections: typed blocks (paragraph, heading, list, figure, table) for programmatic use. outline: only section titles, block counts and sizes - use it fir… |
| include_references | boolean | – | Also return the parsed reference list (DOI/PMID per entry) |
| max_chars | integer | – | Cut the content at a block boundary after this many characters |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| sections | – | – | Only these sections: case-insensitive substrings of a section title, e.g. ['methods', 'results']. Default: all sections. |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_lab_links ~157
Links that third parties publish for a paper, grouped by provider with the provider's description: BioStudies supplementary material, model-organism databases, GO annotations, Faculty Opinions recommendations, Altmetric. Use get_paper_data_links for the data accessions mentioned in the text.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI (alternative to pmcid) |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| provider | string | – | Only this provider: part of its name (e.g. biostudies) or its numeric id. Europe PMC ignores a provider filter, so this is applied here. |
Structured output declared, but exposes no named fields.
No examples provided.
get_paper_references ~81
Get the reference list of a paper (backward citations, Europe PMC).
| Name | Type | Req | Description |
|---|---|---|---|
| article_id | string | yes | Article ID, e.g. a PMID or PMCID |
| limit | integer | – | Max references to return |
| source | string | – | Europe PMC source code: MED (PMID), PMC (PMCID) or PPR |
Structured output declared, but exposes no named fields.
No examples provided.
get_papers_batch ~204
Look up many papers at once: one combined Europe PMC query per 50 identifiers instead of one call per paper. Every input gets a result in the order given, with a status: ok, not_found, invalid (malformed identifier) or error (that request failed). One bad identifier never fails the batch; a repeated identifier repeats its result.
| Name | Type | Req | Description |
|---|---|---|---|
| fields | – | – | Fields to return per paper, from: id, source, pmid, pmcid, doi, title, authors, journal, year, cited_by, is_open_access, pub_types, abstract. Default: id, source, pmid, pmcid, doi, title, authors, jo… |
| ids | array | yes | PMIDs, PMCIDs and DOIs, mixed allowed (bare digits are a PMID; 'doi:' and https://doi.org/ prefixes are accepted) |
Structured output declared, but exposes no named fields.
No examples provided.
get_papers_fulltext_batch ~237
Markdown full text of several open-access papers in one call, within a size budget. The identifiers are resolved with one query, papers that are not open access are reported without being downloaded, and the rest are fetched four at a time. The total budget is handed out in the order given: once it is used up, the remaining papers are reported as skipped_budget and not downloaded. Each result has a status: ok, not_found, invalid, not_in_pmc, not_open_access, no_matching_section, duplicate, error or skipped_budget. Use `get_paper_fulltext` for one paper at a larger size.
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | PMIDs, PMCIDs and DOIs, mixed allowed. Only open-access papers have full text |
| max_chars_per_paper | integer | – | Cap on the content of one paper |
| max_total_chars | integer | – | Cap on the content of the whole response |
| sections | – | – | Only these sections of every paper: case-insensitive substrings of a title, e.g. ['methods', 'results']. Default: all sections. |
Structured output declared, but exposes no named fields.
No examples provided.
knowledge_graph ~51
Build a knowledge graph from research literature using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| entities | – | – | Key entities |
| relationships | – | – | Known relationships |
| research_domain | string | yes | Research domain |
Structured output declared, but exposes no named fields.
No examples provided.
literature_review ~70
Generate a comprehensive literature review using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| excluded_topics | – | – | Topics to exclude from the review |
| key_concepts | array | yes | Key concepts to cover |
| research_topic | string | yes | Research topic |
| time_frame | string | – | Time frame |
Structured output declared, but exposes no named fields.
No examples provided.
mesh_expand ~336
MeSH headings for search terms: the descriptor (ID, heading, tree numbers), its entry terms and a ready Europe PMC fragment `(MESH:"Heading" OR "entry term" OR ...)` for each term, and the fragments joined into one query that is checked like `validate_query`. By default it works offline from a bundled snapshot of 244 common clinical headings taken from NLM's published MeSH (heading, entry terms and tree numbers as published): a term that is not in it comes back with `matched: false` and is searched as written, never guessed. `use_api` asks NLM instead, which covers all of MeSH and needs the network (the terms are sent to id.nlm.nih.gov); a failed or skipped request is reported for that term and does not fail the call, and `time_budget` bounds the whole call.
| Name | Type | Req | Description |
|---|---|---|---|
| combine | string | – | How the terms' fragments are joined into `query`: 'and' (one concept per term, the usual structure) or 'or' |
| max_entry_terms | integer | – | Entry terms added to each fragment |
| terms | array | yes | Search terms to expand, e.g. ['type 2 diabetes', 'metformin'] |
| time_budget | number | – | With use_api: seconds for all lookups together; terms not reached are reported as skipped. Ignored offline. |
| use_api | boolean | – | Ask the NLM MeSH service (id.nlm.nih.gov, a network request, up to four per term) instead of the bundled snapshot. Default: offline. |
Structured output declared, but exposes no named fields.
No examples provided.
paper_figures ~132
Extract figures, tables and supplementary files from a PMC Open Access article. Each item carries its label, caption and the Europe PMC URL its file can be downloaded from. A figure supplement also names the figure it belongs to.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI (alternative to pmcid) |
| include_supplements | boolean | – | Include supplementary material |
| include_tables | boolean | – | Include <table-wrap> elements |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
Structured output declared, but exposes no named fields.
No examples provided.
paper_screening ~74
Automated paper screening with PRISMA-compliant criteria, using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| exclusion_criteria | array | yes | Exclusion criteria |
| inclusion_criteria | array | yes | Inclusion criteria |
| limit | integer | – | Papers to screen |
| query | string | yes | Search query |
Structured output declared, but exposes no named fields.
No examples provided.
pico_decompose ~325
Split a research question into PICO, PICOS, PICOT or SPIDER elements and build a Europe PMC query from them. Rule-based and offline: no model, no key, no request. Every element is a verbatim piece of the question, given with its position; an element the question does not state is listed in `missing`, never filled in. The rules cover the usual clinical phrasings ("In P, does I reduce O compared with C?", "What is the effect of I on O in P?", "Is I more effective than C for O?", "Is I associated with O?", "Effectiveness of I for O in P", "P treated with I"). A question phrased differently is only partly understood: check `elements` and `missing` before using the query, and ask for clarification when the question is incomplete. The query is checked with the same linter as `validate_query`.
| Name | Type | Req | Description |
|---|---|---|---|
| framework | string | – | PICO, PICOS (adds study design), PICOT (adds time frame) or SPIDER (qualitative questions: sample, phenomenon of interest, design, evaluation, research type) |
| mesh | boolean | – | Expand each term with MeSH headings and entry terms from the bundled snapshot (offline). Terms it does not know stay as written. |
| query_elements | – | – | Elements to build the query from. Default: population and intervention (sample and phenomenon_of_interest for SPIDER); outcome terms are rarely indexed and cut recall. |
| question | string | yes | The research or clinical question |
Structured output declared, but exposes no named fields.
No examples provided.
preprint_analysis ~59
Preprint-specific quality assessment using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| pmid | string | yes | PubMed ID |
| preprint_server | string | – | Preprint server, e.g. bioRxiv, medRxiv |
Structured output declared, but exposes no named fields.
No examples provided.
ref_resolve_doi ~29
Resolve a DOI to bibliographic metadata.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | yes | DOI to resolve |
Structured output declared, but exposes no named fields.
No examples provided.
ref_resolve_pmid ~32
Resolve a PubMed ID to bibliographic metadata.
| Name | Type | Req | Description |
|---|---|---|---|
| pmid | string | yes | PubMed ID |
Structured output declared, but exposes no named fields.
No examples provided.
research_question_analysis ~49
Expand and analyze a research question using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| research_question | string | yes | Research question |
| time_frame | string | – | Time frame for literature search |
Structured output declared, but exposes no named fields.
No examples provided.
search_authors ~37
Search for authors in Europe PMC.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Number of results |
| query | string | yes | Author name or affiliation |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
search_papers ~218
Search Europe PMC for papers (single source — prefer `unified_search` for multi-source coverage). At most ``limit`` records are fetched; optional filters narrow the query by date, open access, full text availability and source.
| Name | Type | Req | Description |
|---|---|---|---|
| date_from | string | – | First publication date, from (YYYY, YYYY-MM or YYYY-MM-DD) |
| date_to | string | – | First publication date, to (YYYY, YYYY-MM or YYYY-MM-DD) |
| has_fulltext | boolean | – | Only articles with full text |
| limit | integer | – | Number of results |
| open_access | boolean | – | Only open-access articles |
| query | string | yes | Search query |
| result_type | string | – | Europe PMC result type |
| sort | string | – | Sort order, e.g. 'cited' or 'date' |
| source | string | – | Restrict to one source, e.g. MED, PMC or PPR (preprints) |
| synonym | boolean | – | Expand the query with MeSH synonyms |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
summarize_citations ~50
Summarize citation activity for a paper using an LLM (requires an LLM provider).
| Name | Type | Req | Description |
|---|---|---|---|
| citation_count | integer | – | Number of citations |
| pmid | string | yes | PubMed ID |
Structured output declared, but exposes no named fields.
No examples provided.
tag_paper_sentences ~397
The sentences of an open-access paper's body, grouped by what they do: background, motivation, method, result, claim (the authors' interpretation), limitation, conclusion. Front matter, the reference list and administrative sections (acknowledgments, funding, conflicts) are left out. Rule-based and offline apart from the download: the section a sentence is in sets its default role and cues in the sentence correct it. Where no rule is sure the sentence is `unknown` instead of a guess; in a paper without recognisable headings only background, method and conclusion sentences are recognised. Measured precision per role is in the guide; discussion sections are the hardest part. Sentences come in reading order and are never cut: `truncated` says whether some were left out. Use it to pull the methods or the results of a paper without knowing what its sections are called.
| Name | Type | Req | Description |
|---|---|---|---|
| doi | string | – | DOI (alternative to pmcid) |
| max_chars | integer | – | Stop after this many characters of sentence text, between sentences |
| min_confidence | number | – | A sentence the rules are less sure about is 'unknown' |
| pmcid | string | – | PMC ID of the article, e.g. PMC1234567 |
| pmid | string | – | PubMed ID (alternative to pmcid) |
| roles | – | – | Only these roles: background, motivation, method, result, claim, limitation, conclusion, unknown. Default: all. |
| sections | – | – | Only sentences of these sections: case-insensitive substrings of a section title, e.g. ['results', 'discussion']. Default: the whole body. |
| use_llm | boolean | – | Also ask the configured LLM about up to 40 sentences the rules left 'unknown'. Needs the agentic extra and a provider, like the other LLM tools; the sentences are sent to it. |
Structured output declared, but exposes no named fields.
No examples provided.
translate_query ~162
Rewrite a Europe PMC query for another database. For PubMed the field codes map where they have an equivalent (TITLE[ti], AUTH[au], JOURNAL[ta], dates[dp], ...); a construct that does not map (CITES, HAS_*, CITED, ...) is left out and named in `warnings` and `dropped`, and `exact` is false whenever the translation is narrower, broader or only approximate. The other targets search free text, so field codes and operators are stripped and `exact` is always false. A query with errors is refused; see `validate_query`.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | A Europe PMC search query |
| target | string | – | Database to translate the query for |
Structured output declared, but exposes no named fields.
No examples provided.
unified_search ~224
Search across multiple literature sources (PubMed, arXiv, Semantic Scholar, OpenAlex, ClinicalTrials.gov) in parallel, with automatic cross-source deduplication. A source that fails does not fail the call; set `diagnostics` to see which one did and why, and to tell an empty source from an unavailable one.
| Name | Type | Req | Description |
|---|---|---|---|
| diagnostics | boolean | – | Also return `sources`: for each queried source whether it answered (`ok`), found nothing (`empty`), failed (`error`), was rate limited (`rate_limited`) or could not be created (`unavailable`), with i… |
| limit | integer | – | Max results per source |
| query | string | yes | Search query |
| sources | – | – | Sources to query, e.g. ['europepmc', 'arxiv', 'semantic_scholar', 'openalex', 'clinicaltrials']. Defaults to the server's configured source set. |
Structured output declared, but exposes no named fields.
No examples provided.
validate_query ~152
Check a Europe PMC query before running it. Europe PMC does not reject a malformed query, it answers a different one: an unclosed parenthesis or a dangling operator is dropped silently, an unknown field, a flag that is not y/n and a date range with a missing or reversed bound match nothing, and AND mixed with OR without parentheses is not read as either grouping. Each problem comes with its position. `valid` is false when there are errors; warnings are things worth a second look. `normalized` is the cleaned-up query (capital operators, explicit AND) and is only given for a query without errors.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | A Europe PMC search query |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the PyEuropePMC MCP server?
PyEuropePMC runs locally as a PyPI package, launched with uvx pyeuropepmc. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · pyeuropepmc
claude mcp add jonasheinickebio-pyeuropepmc -- uvx pyeuropepmc
What is the PyEuropePMC MCP server?
PyEuropePMC is an MCP server listed in the public MCP registry as io.github.JonasHeinickeBio/pyeuropepmc. Europe PMC search, search analytics, full text, enrichment, PICO, MeSH, data links, export, auth. This page covers its PyPI package (pyeuropepmc).
Is the PyEuropePMC MCP server safe to use?
PyEuropePMC scores 74 out of 100 on VerifyMCP. We recorded 2 known advisories against it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the PyEuropePMC MCP server expose?
PyEuropePMC exposes 47 tools: unified_search, search_papers, count_papers, get_paper_details, search_authors, and 42 more. Their descriptions and schemas cost roughly 6,996 tokens of context every time the server is loaded.
Is the PyEuropePMC MCP server still maintained?
PyEuropePMC is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the PyEuropePMC MCP server under?
PyEuropePMC declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.