LLM-assisted biomedical literature screening and extraction for PubMed, GEO, and preprints.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
mcp-name: io.github.rachadele/biolit
LLM-assisted biomedical literature screening and structured extraction. Accepts PubMed alert emails and mixed lists of PMIDs, DOIs, and GEO accessions in any combination. Retrieves full text from PMC, Europe PMC, bioRxiv/medRxiv, Unpaywall, and Semantic Scholar. Supports multiple LLM providers and exposes all functionality as an MCP server.
Requirements: Python 3.8+
Install from PyPI:
Or install from source for development:
Copy .env.example to .env and add your API key:
On macOS, you can store the key in the system keychain instead of .env. biolit consults the keychain by service name only (no account required):
Omit -w <value> to be prompted for the key without echoing it. The keychain is checked first; the env var is used only as a fallback (so a stale value in .env cannot mask a working keychain entry).
The tool accepts a PubMed alert email (.eml) or a plain-text file of identifiers, as well as inline identifiers via --ids. Identifiers can be PMIDs, DOIs, or GEO accessions β mixed lists are supported in a single run.
| Input | How to pass | Example |
|---|---|---|
| PubMed alert email | positional .eml file | alert.eml |
| BibTeX file | positional .bib file | refs.bib |
| Identifier file (mixed) | positional plain-text file, one per line | identifiers.txt |
| Inline identifiers | --ids flag, comma-separated | --ids 41795042,GSE53987,10.1101/2025.03.17.25324098 |
Use --default to run with schizophrenia genomics defaults (no prompts):
Or specify criterion and fields as flags:
Add --markdown (or --md) to also write a prose .md summary alongside the CSV. Each record gets a markdown section with ### field subsections; records that failed or were skipped appear as stub entries:
Add --batch to issue screening, extraction, and markdown rendering through the provider's Message Batches / Batch API instead of one call per record. Per-request cost drops by ~50%, but each batch blocks on completion (typically several minutes per stage; up to 6 hours), so it's intended for the bulk weekly-alert case rather than one-off lookups. Anthropic and OpenAI only β falls back to sequential calls on Ollama or on OpenAI-compatible endpoints with a custom base_url. Also accepted as "batch": true in a config file.
Or use a JSON config file to store reusable parameters (CLI flags take precedence). The config can include ids or input_file (path to an .eml, .bib, or identifier list), and "markdown": true to enable markdown output:
The fields key in a config file can be a comma-separated string or a JSON object mapping field names to extraction descriptions. When a string is used, an extra LLM call converts the field names into descriptions before extraction. When a dict is used, that call is skipped β the descriptions are passed directly to the model:
Omit --criterion to skip screening (all records are extracted). Omit --fields to use the default fields (methodology, sample_type, causal_claims, summary):
Use biolit screen to quickly check one paper or GEO record for relevance without running the full extraction pipeline:
Output is a single line to stdout:
PMIDs, DOIs, and GEO accessions can be freely mixed in a file or via --ids. Each identifier is auto-detected by format:
41795042 β PMID (all digits)10.1101/2025.03.17.25324098 β DOI (starts with 10.)GSE53987 β GEO accession (starts with GSE, GDS, GSM, or GPL)GEO records additionally include a linked_pmids column. All record types share pmid, doi, and geo_accession columns (null when not applicable).
Full-text retrieval runs automatically for every PMID and DOI (including preprints). For GEO records, the pipeline attempts full-text retrieval via each linked PMID in order, falling back to the GEO record metadata if no linked paper has accessible full text. The pipeline tries each source in order:
--unpaywall-email)CORE_API_KEY)citation_pdf_url meta tag; key-less)BIOLIT_CUSTOM_RESOLVERS)citation_fulltext_html_url meta tag; key-less)Steps 6-9 are all open-access-only (green-OA author manuscripts,
institutional-repository copies, and the publisher's own advertised OA
PDF link) β never a paywall bypass. OpenAlex, Europe PMC, and the
landing-page scrape need no key; CORE is a no-op unless CORE_API_KEY is
set. The landing-page scrape (step 9) follows the DOI to the article page
and reads the citation_pdf_url link the publisher itself embeds (the
Highwire / Google-Scholar standard) β this catches OA PDFs the aggregator
APIs mislabel or never index. bioRxiv / medRxiv are skipped there (their
servers block agents; the preprint step above covers them). Step 10 is
the seam for your own authorized access β see
Custom full-text fetchers. Step 11 is the
HTML counterpart of step 9: when no downloadable PDF exists at all, it
extracts the article body text from the publisher's full HTML page
(the citation_fulltext_html_url Highwire signal that PLOS / eLife / BMC
/ Frontiers and many society journals set) β recovering Methods text for
OA papers the PDF chain can never reach. When even that misses, the
abstract fallback records a paper_status classification (bot_blocked
/ js_shell / abstract) in the per-record artifacts so a caller can
read why full text was not reached.
To enable Unpaywall (step 4), pass your email:
Limit which sections are sent to the LLM:
The tool supports Anthropic (default), OpenAI, and local Ollama models:
You can also set LLM_PROVIDER and LLM_MODEL as environment variables.
Each run creates a timestamped directory (e.g. run_20260313_142000/) containing:
results.csv β one row per relevant recordresults.md β prose markdown summary (written when --markdown or "markdown": true in config)artifacts/<id>/ β per-record folder with the text sent to the LLM, metadata, and any retrieved full-text filesRecords that fail at any pipeline stage (fetch error, not found, no content, screening or extraction error) are excluded from the CSV but appear in the markdown as stub entries with a failure note.
With default fields, the CSV columns are:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/biolit)<a href="https://allmcps.com/mcp/biolit"><img src="https://allmcps.com/api/badge/biolit?style=directory" alt="Biolit on AllMCPs" /></a>