Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Search Europe PMC for scientific literature and download open-access full texts and PDFs. Retrieve full-text XML/plain text by PMCID, get citation lists and bibliography.
.claude/skills/mkurman-literature-search-europepmc/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 131% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 136% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 147% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 290% | 0% |
A skill for searching, downloading, and exploring open-access papers from Europe PMC — a comprehensive, free life-science literature database with over 43 million abstracts and 9 million full-text articles.
uv: Read the uv skill and follow its Setup instructions to ensureuv is installed and on PATH.
this skill directory then (1) prominently notify the user to check the terms at https://europepmc.org/ and to always check the license of the papers retrieved by the skill for any restrictions, then (2) create the file recording the notification text and timestamp.
The script automatically appends OPEN_ACCESS:y to every search query. Do NOT remove or override this filter.
necessarily have all key dependencies. Do not attempt to pip install or create new venvs.
API directly. The script handles rate limiting (1 req/s) and errors.
--output to write results to afile. Read the output file separately to avoid context overflow.
output AND list the URLs of all papers that were used in producing the output.
All commands are subcommands of scripts/europepmc_api.py. Rate limiting and retries are handled automatically.
search)Search Europe PMC by query. Supports DOI lookup, keyword search, author search, PMID lookup, and the full Europe PMC search syntax.
bash# Look up a paper by DOI uv run scripts/europepmc_api.py search "DOI:10.1038/s41586-021-03819-2" --output result.json # Keyword search uv run scripts/europepmc_api.py search "CRISPR cancer" --max_results 5 --output results.json # Author search uv run scripts/europepmc_api.py search "AUTH:Jumper J" --max_results 10 --output results.json # PMID lookup uv run scripts/europepmc_api.py search "EXT_ID:34265844 AND SRC:MED" --output result.json # Sorted by citations uv run scripts/europepmc_api.py search "machine learning" \ --sort "CITED desc" --max_results 20 --output results.json
Arguments:
query (str, required) — search query using Europe PMC syntax--output (str, required) — output JSON file path--max_results (int, default 10) — maximum results per page (max 1000)--result_type (str, default core) — core (full metadata) or lite--cursor (str, default *) — cursor mark for pagination; pass thenextCursorMark value from a previous response to get the next page
--sort (str) — sort order, e.g. CITED desc, P_PDATE_D desc(publication date descending), P_PDATE_D asc
Output: JSON file with three fields:
hitCount (int) — total number of matching articlesnextCursorMark (str) — cursor for next page; empty string if no more pagesresults (list) — array of article metadata objectsSearch Syntax Quick Reference:
DOI:10.xxxx/yyyy — look up by DOIEXT_ID:12345678 AND SRC:MED — look up by PMIDAUTH:surname initials — author searchTITLE:keyword — search in title onlyJOURNAL:name — search by journalPUB_YEAR:2024 or (FIRST_PDATE:[2023-01-01 TO 2023-12-31]) — date filterHAS_FT:y — restrict to articles with full text in Europe PMCAND, OR, NOT> Note: OPEN_ACCESS:y is automatically appended to all queries. You do not > need to add it manually.
download_pdf)Download an open-access PDF from Europe PMC by PMCID.
bashuv run scripts/europepmc_api.py download_pdf PMC8371605 --output alphafold.pdf
Arguments:
pmcid (str, required) — PubMed Central ID (e.g., PMC8371605)--output (str, required) — filepath to save the PDFOutput: Saves the PDF to the specified file. Exits with an error if the PMCID is not found or the response is not a valid PDF. Whenever you download a PDF, check the pdf downloaded is not empty or corrupted.
get_fulltext)Retrieve the full text of an open-access article and save to a file. Returns plain text (XML tags stripped) by default, or raw XML with --format xml.
bash# Get plain text (default) uv run scripts/europepmc_api.py get_fulltext PMC8371605 --output fulltext.txt # Get raw XML uv run scripts/europepmc_api.py get_fulltext PMC8371605 --format xml --output fulltext.xml
Arguments:
pmcid (str, required) — PubMed Central ID--output (str, required) — output file path--format (str, default text) — text (plain text) or xml (raw JATSXML)
Output: Full text written to the specified file. Exits with an error if the article is not in the Europe PMC open-access subset.
> Important: Only articles in the PMC Open Access Subset have full text > available. If retrieval fails, use search to check the isOpenAccess field > and fall back to the abstract.
get_citations)Retrieve articles that cite a given paper.
bash# Get citations for the AlphaFold paper (PMID 34265844) uv run scripts/europepmc_api.py get_citations MED 34265844 \ --page_size 25 --output citations.json
Arguments:
source (str, required) — source database: MED (PubMed), PMC, PPR(preprints), PAT (patents)
article_id (str, required) — article ID in the source database--output (str, required) — output JSON file path--page (int, default 1) — page number--page_size (int, default 25) — results per pageOutput: JSON file with hitCount and citations array.
get_references)Retrieve the reference list (bibliography) of a given paper.
bash# Get references from the AlphaFold paper uv run scripts/europepmc_api.py get_references MED 34265844 \ --page_size 100 --output references.json
Arguments:
source (str, required) — source database: MED, PMC, PPR, PATarticle_id (str, required) — article ID in the source database--output (str, required) — output JSON file path--page (int, default 1) — page number--page_size (int, default 25) — results per pageOutput: JSON file with hitCount and references array.
bash# Step 1: Search for the PMCID uv run scripts/europepmc_api.py search "DOI:10.1038/s41586-021-03819-2" --output result.json PMCID=$(jq -r '.results[0].pmcid // empty' result.json) # Step 2: Download the PDF uv run scripts/europepmc_api.py download_pdf "$PMCID" --output paper.pdf
bash# Step 1: Find the PMCID from a PMID uv run scripts/europepmc_api.py search "EXT_ID:34265844 AND SRC:MED" --output result.json PMCID=$(jq -r '.results[0].pmcid // empty' result.json) # Step 2: Get the full text uv run scripts/europepmc_api.py get_fulltext "$PMCID" --output fulltext.txt
bash# Find what papers cite a landmark study, then check their references uv run scripts/europepmc_api.py get_citations MED 34265844 --page_size 50 --output citing.json # Parse a cited paper's PMID and explore its references uv run scripts/europepmc_api.py get_references MED <CITING_PMID> --output refs.json
bash# First page uv run scripts/europepmc_api.py search "CRISPR" --max_results 100 --output page1.json # Extract cursor for next page CURSOR=$(jq -r '.nextCursorMark // empty' page1.json) # Next page uv run scripts/europepmc_api.py search "CRISPR" --max_results 100 --cursor "$CURSOR" --output page2.json
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | pass→pass | 8,042 | 9,006 | +12% | 1 | 1 | 0% | 1,497 | 4,140 | +177% | 0 | 0 | — |
case-01 | fail→fail | 26,250 | 6,463 | -75% | 1 | 1 | 0% | 2,115 | 2,775 | +31% | 0 | 0 | — |
case-02 | fail→fail | 21,284 | 8,488 | -60% | 1 | 1 | 0% | 2,741 | 2,816 | +3% | 0 | 0 | — |
case-03 | fail→fail | 17,883 | 6,603 | -63% | 1 | 1 | 0% | 1,168 | 2,783 | +138% | 0 | 0 | — |
case-04 | fail→fail | 8,588 | 7,600 | -12% | 1 | 1 | 0% | 1,637 | 2,905 | +77% | 0 | 0 | — |
case-05 | fail→pass | 7,508 | 3,573 | -52% | 1 | 1 | 0% | 1,323 | 3,060 | +131% | 0 | 0 | — |
case-15 | fail→pass | 10,887 | 4,037 | -63% | 1 | 1 | 0% | 1,670 | 2,991 | +79% | 0 | 0 | — |
case-06 | fail→pass | 8,690 | 10,137 | +17% | 1 | 1 | 0% | 1,585 | 3,745 | +136% | 0 | 0 | — |
case-07 | fail→pass | 7,175 | 7,070 | -1% | 1 | 1 | 0% | 1,509 | 3,727 | +147% | 0 | 0 | — |
case-08 | fail→pass | 5,234 | 5,397 | +3% | 1 | 1 | 0% | 861 | 3,358 | +290% | 0 | 0 | — |
case-09 | fail→pass | 10,596 | 5,797 | -45% | 1 | 1 | 0% | 1,915 | 3,429 | +79% | 0 | 0 | — |
case-10 | fail→pass | 10,126 | 4,452 | -56% | 1 | 1 | 0% | 1,832 | 3,150 | +72% | 0 | 0 | — |
case-11 | fail→pass | 7,198 | 2,534 | -65% | 1 | 1 | 0% | 917 | 2,753 | +200% | 0 | 0 | — |
case-12 | fail→pass | 8,212 | 7,314 | -11% | 1 | 1 | 0% | 1,216 | 3,516 | +189% | 0 | 0 | — |
case-13 | fail→pass | 13,232 | 4,512 | -66% | 1 | 1 | 0% | 2,283 | 3,179 | +39% | 0 | 0 | — |
case-14 | fail→pass | 5,871 | 3,198 | -46% | 1 | 1 | 0% | 909 | 2,976 | +227% | 0 | 0 | — |
case-16 | fail→fail | 6,871 | 8,571 | +25% | 1 | 1 | 0% | 1,398 | 2,795 | +100% | 0 | 0 | — |
case-17 | fail→fail | 11,842 | 9,650 | -19% | 1 | 1 | 0% | 2,503 | 2,840 | +13% | 0 | 0 | — |
case-18 | pass→pass | 8,862 | 3,064 | -65% | 1 | 1 | 0% | 884 | 2,857 | +223% | 0 | 0 | — |
case-19 | pass→pass | 8,198 | 2,190 | -73% | 1 | 1 | 0% | 1,359 | 2,749 | +102% | 0 | 0 | — |
case-20 | pass→fail | 10,515 | 15,837 | +51% | 1 | 1 | 0% | 2,035 | 4,765 | +134% | 0 | 0 | — |
case-22 | pass→pass | 6,882 | 21,047 | +206% | 1 | 1 | 0% | 848 | 3,601 | +325% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 16 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 16 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.