PubCrawl
PubCrawl gives AI assistants verifiable access to biomedical literature, US/UK drug labelling, and clinical trials through deterministic MCP tools.
Search PubMed and Europe PMC, including preprints and open-access filters, with date, article-type, and sort options.
Retrieve structured abstracts, full open-access PMC text, related papers, formatted citations, and trending papers.
Resolve brand/generic drug names and look up US prescribing information (USPI) or UK SmPC labelling.
Compare US vs UK label sections side by side, including differing brand names and paged/truncated sections.
Find drugs approved for a condition and cross-check UK availability.
Search ClinicalTrials.gov by condition, intervention, recruitment status, phase, and sort order.
Fetch full trial details by NCT ID, including eligibility, design, arms, outcomes, locations, and linked PubMed IDs.
Provides tools for searching PubMed, retrieving abstracts and full text, finding related articles, generating formatted citations, and discovering trending papers, with filters for date, article type, and journal impact.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PubCrawl Search PubMed for recent clinical trials on semaglutide"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
An MCP server that gives AI assistants access to PubMed, Europe PMC, FDA & UK drug labelling, and ClinicalTrials.gov.
A peer-reviewed pub crawl through the literature — the label — and the trial.
Quick start · Tools · Examples · Architecture · Self-hosting · Roadmap · Contributing
✨ What is PubCrawl?
PubCrawl connects your AI assistant (Claude Desktop, Cursor, or any MCP-compatible client) directly to the primary sources clinicians and researchers actually use — so you can ask a question in plain English and get an answer grounded in PubMed, Europe PMC, FDA/UK drug labelling, and ClinicalTrials.gov, with real PMIDs, NCT IDs, and DOIs you can verify.
Every tool is a thin, deterministic wrapper over an official API. Nothing is invented; every result cites its source.
The thing no other MCP server does
Ask "compare US and UK labelling for semaglutide" and PubCrawl pulls both live labels and maps equivalent sections — US Indications and Usage ↔ UK 4.1 Therapeutic indications, and so on — so the differences are visible instead of assumed:

US Prescribing Information | UK SmPC | |
Indications | glycaemic control · reduce risk of MACE in T2D with established CVD · reduce risk of sustained eGFR decline, ESKD and CV death in T2D with CKD | glycaemic control only — CV and renal outcomes appear as cross-references to §4.4/4.5/5.1, not as indications |
Contraindications | personal or family history of MTC or MEN 2 · hypersensitivity | hypersensitivity only |
A cardiovascular claim that is on-label in the US promotes an unlicensed indication in the UK. If you write, review, or check medical copy for both markets, that gap is the whole job — and compare_labels is the only MCP tool that surfaces it.
Everything else
🔬 14 tools across literature, drug labelling, and clinical trials
🧾 Verifiable by design — results link back to DailyMed, the eMC, PubMed, and ClinicalTrials.gov
📰 Preprints via Europe PMC — surface work ahead of formal publication
🆓 No API keys required (an optional free NCBI key raises PubMed rate limits)
🧪 Fully typed, tested, and CI-checked — literature retrieval gated by OpenGATE, and labelling & trials by the in-repo fidelity benchmark, on every release
Built by PharmaTools.AI.
Related MCP server: mcp-pubmed-server
🚀 Quick start (60 seconds)
1. Add PubCrawl to your client config — no install step needed, npx fetches it on first run.
For Claude Desktop, edit claude_desktop_config.json:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"pubcrawl": {
"command": "npx",
"args": ["-y", "@pharmatools/pubcrawl"]
}
}
}2. Restart your client. PubCrawl appears under + → Connectors.
3. Ask away:
"Compare the US and UK labelling for atorvastatin, and find recent Phase 3 trials for it."
That's it. → More examples · API key & other options
🧰 Tools
📚 Literature
Tool | What it does |
| Search PubMed with filters for date range, article type, and sort order. Returns PMIDs, titles, authors, journals, and DOIs. |
| Search Europe PMC — a broader corpus than PubMed that also indexes preprints (bioRxiv, medRxiv) and patents. Each result includes an abstract snippet, citation count, open-access status, and a preprint flag. Filter to preprints or open-access only. |
| Get the full structured abstract for an article — broken into labeled sections (background, methods, results, conclusions) with keywords and MeSH terms. |
| Retrieve the full text of open-access articles from PubMed Central, with parsed sections, figure/table captions, and reference counts. |
| Find similar articles using PubMed's neighbor algorithm, ranked by relevance score. |
| Generate a formatted citation in APA, Vancouver, Harvard, or BibTeX style. |
| Find recent papers on a topic, with optional filtering to high-impact journals (Nature, Science, Cell, NEJM, Lancet, JAMA, etc.). |
💊 Drug labelling
Tool | What it does |
| Convert a brand drug name to its generic (or a generic to its US brand names), with drug class and common indications. Deterministic, via RxNorm/openFDA — no AI. |
| Pull US Prescribing Information sections via openFDA (cited to DailyMed) — indications, dosing, warnings, contraindications, and more. |
| Retrieve UK Summary of Product Characteristics from the eMC — the UK equivalent of US prescribing information, with numbered SmPC sections. |
| Side-by-side comparison of US (USPI) and UK (SmPC) labelling for the same drug, pairing equivalent sections (US Indications ↔ UK 4.1). A missing side is always explained, cut sections are flagged |
| Find drugs approved for a medical condition. Searches FDA labelling via openFDA, then cross-references UK availability on the eMC. |
🧫 Clinical trials
Tool | What it does |
| Search ClinicalTrials.gov for clinical trials. Filter by condition, intervention, recruitment status, and phase. Returns NCT IDs, sponsors, enrollment, and links. |
| Get full details for a clinical trial by NCT ID — eligibility criteria, study design, arms, primary/secondary outcomes, locations, and associated PubMed IDs. |
💬 Examples
Once connected, just ask naturally:
Literature
"Search PubMed for recent clinical trials on semaglutide."
"Search Europe PMC for preprints on GLP-1 receptor agonists, most cited first."
"Get the abstract for PMID 38127654, then find related papers and cite them all in Vancouver style."
"What are the trending papers on CRISPR gene therapy this month, high-impact journals only?"
"Pull the full text of that PMC article and summarise the methods section."
Drug labelling
"Get the FDA prescribing information for metformin — just the indications and warnings."
"Pull the UK SmPC for atorvastatin."
"Compare US and UK labelling for lisinopril and highlight the differences."
"What's the generic name and drug class for Ozempic?"
"What drugs are approved for type 2 diabetes in both the US and UK?"
Clinical trials
"Find recruiting Phase 3 trials for pembrolizumab in breast cancer."
"Get the eligibility criteria and primary outcomes for NCT03086486."
Cross-source (where PubCrawl shines)
"For semaglutide: summarise the US label's cardiovascular indication, then find the pivotal trial and its NEJM publication."
🏗 Architecture
Three layers — tools register the MCP interface, lib clients talk to each external API, and shared cache + parsers keep it fast and consistent.
Each tool file exports a register*Tool(server) function with a zod schema and an async handler. All network calls are rate-limited, cached, and time-bounded. See CLAUDE.md for a full architecture walkthrough and CONTRIBUTING.md to add a tool.
🔧 Configuration
Install options
# Zero-install (recommended): npx fetches it on demand — see Quick start above.
# Or install globally:
npm install -g @pharmatools/pubcrawl
# Config for a global install:
# { "mcpServers": { "pubcrawl": { "command": "pubcrawl" } } }NCBI API key (optional)
Without a key, PubMed requests are limited to 3/second. A free key raises this to 10/second.
Create a free NCBI account at https://www.ncbi.nlm.nih.gov/account/
Account Settings → API Key Management → create a key
Add it to your config:
{
"mcpServers": {
"pubcrawl": {
"command": "npx",
"args": ["-y", "@pharmatools/pubcrawl"],
"env": { "NCBI_API_KEY": "your_key_here" }
}
}
}HTTP transport
PubCrawl also ships a stateless Streamable HTTP transport for hosted and browser-based clients:
npm run start:http # serves POST /mcp and GET /health on PORT (default 3000)🏢 Run in your own environment
For teams who need PubCrawl inside their own cloud project rather than on a laptop, it runs as a container serving MCP over Streamable HTTP. Each request is handled by a fresh server instance with no sessions, so it scales horizontally behind any load balancer.
docker build -t pubcrawl .
docker run --rm -p 8080:8080 pubcrawl
curl http://localhost:8080/health # {"status":"ok","server":"pubcrawl","version":"…"}Point any MCP client, or an agent registry such as Google Cloud Agent Registry, Microsoft Foundry or Amazon Bedrock AgentCore, at https://<your-host>/mcp. Authentication is left to the platform in front of the container (Cloud Run IAM, API Gateway, an identity-aware proxy), so PubCrawl itself holds no credentials for your users.
The image runs as a non-root user, has a container health check, and shuts down cleanly on SIGTERM. CI builds it on every push and checks the health endpoint, the MCP handshake, the full tool list and a clean stop.
Google Cloud Run and Agent Registry
These steps were run end to end in November 2026. Replace PROJECT_ID and REGION; the project needs billing and the run, cloudbuild, artifactregistry and agentregistry APIs enabled.
1. Deploy behind Cloud Run IAM. From a clone of this repo (the --functional-type flag needs a current gcloud with the beta component):
gcloud beta run deploy pubcrawl --source . --project=PROJECT_ID --region=REGION \
--no-allow-unauthenticated --functional-type=mcp-server --max-instances=2Unauthenticated requests to any path now get 403 from Google before reaching PubCrawl. With an identity token, /health answers as usual:
URL=$(gcloud run services describe pubcrawl --project=PROJECT_ID --region=REGION --format='value(status.url)')
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $URL/health2. Register the endpoint and its tools. --functional-type=mcp-server adds an entry to Agent Registry that links to the Cloud Run service, but it carries no endpoint URL and no tools, because the registry can't read tools from a server that requires authentication. Register the endpoint manually with the tool spec in deploy/agent-registry/toolspec.json:
gcloud agent-registry services create pubcrawl-mcp --project=PROJECT_ID --location=REGION \
--display-name="PubCrawl" \
--mcp-server-spec-type=tool-spec \
--mcp-server-spec-content=deploy/agent-registry/toolspec.json \
--interfaces=url=$URL/mcp,protocolBinding=jsonrpcAfter a minute or so, gcloud agent-registry mcp-servers list --project=PROJECT_ID --location=REGION shows PubCrawl with its /mcp URL and all 14 tools.
The tool spec is generated from the server itself (npm run build && npm run toolspec), and a test fails if the committed file falls out of step with the code. The registry requires an input schema for every tool and caps the spec at 10 KB, so the schemas keep their types, required fields, enums, defaults and ranges but drop parameter descriptions. Clients that connect still get the complete schemas from the server.
3. Connect a client. Any client that can send a header can call the service with a Google identity token. With Claude Code:
claude mcp add --transport http pubcrawl-gcp $URL/mcp \
--header "Authorization: Bearer $(gcloud auth print-identity-token)"The token expires after an hour and is stored in the client's config, so this suits a quick test; remove it afterwards with claude mcp remove pubcrawl-gcp. For everyday use, gcloud run services proxy pubcrawl --project=PROJECT_ID --region=REGION --port=3000 keeps refreshing your credentials, and the client connects to http://localhost:3000/mcp with no header. The proxy needs the cloud-run-proxy gcloud component. In our test it reported the binary as missing straight after installing it; the header route above works without it.
Agents running in Google Cloud should call the service as their own service account, granted roles/run.invoker on it, rather than with a user's token.
Environment variables
Variable | Default | Purpose |
|
| Port to listen on. Cloud Run and most platforms set this. |
|
| Interface to bind. |
| none | Raises PubMed's limit from 3 to 10 requests per second. |
|
| Comma-separated browser origins allowed to call the server. When set, requests from any other origin are refused with 403. Requests with no |
| on | Set to |
Network egress
PubCrawl needs outbound HTTPS to these hosts only, which is the complete list for a firewall allowlist:
Host | Used for |
| PubMed and PubMed Central (search, abstracts, full text, related articles, citations) |
| Europe PMC |
| ClinicalTrials.gov API v2 |
| US prescribing information (openFDA) |
| US/UK drug-name resolution (RxNorm) |
| UK Summaries of Product Characteristics (eMC) |
Data handling
What leaves your environment: the search terms, identifiers and drug names in each tool call are sent to the public source that answers it, from the table above. Nothing goes anywhere else, and PharmaTools.AI receives nothing.
What is kept: upstream responses are held in an in-memory cache (500 entries, up to 24 hours) to stay within the sources' rate limits. Nothing is written to disk, and the cache is gone when the instance stops.
What is logged: one line at startup and one at shutdown, plus one JSON line per new MCP connection with the client's self-reported name and version (e.g.
claude-ai,cursor) and a running count for the UTC day. Queries, tool arguments and IP addresses are not logged. SetPUBCRAWL_USAGE_LOG=offto turn the connection lines off.Identification to NCBI: per NCBI's usage policy, E-utilities requests identify the tool as
pubcrawlwith the maintainer's contact address.No model in the path: every tool is a deterministic API call and parse. Nothing is generated.
🗺 Roadmap
Highlights of what's planned — see ROADMAP.md for the full list.
get_europepmc_fulltext— read preprints & OA articles surfaced bysearch_europepmcget_adverse_events— openFDA FAERS adverse-event lookupsEMA / EPAR labelling to complement the US + UK
compare_labelsMeSH query helper for sharper PubMed searches
MCP resources & prompts for common review workflows
Ideas welcome — open an issue.
🛠 Development
git clone https://github.com/nickjlamb/pubcrawl.git
cd pubcrawl
npm install
npm run dev # TypeScript watch mode
npm run build # compile to dist/
npm start # run the stdio server
npm test # Vitest unit suite
npm run lint # ESLintUnit tests live in tests/ and cover the parsing, caching, citation, formatting and label-pairing logic with fixture payloads (no network calls). CI runs lint → test → build on every push and pull request. New to the codebase? Start with CONTRIBUTING.md.
Measuring fidelity
npm run bench # labelling + trials fidelity benchmark against the live sources
npm run bench -- --ci # what the release gate runs: exit 1 if a verified case failsTwo gates run on every release and weekly. OpenGATE's retrieval scorer checks PubMed and Europe PMC records against hand-verified anchors. The in-repo fidelity benchmark does the same for drug labelling and trials: compare_labels is held to a gold set of US/UK anchors (a phrase must appear on one side and must not on the other, so real divergences are surfaced rather than smoothed over) plus a verbatim check that refetches the raw openFDA record and eMC page and confirms every returned sentence is a substring of the source. No LLM judge anywhere in either gate.
📦 Releases & changelog
Versions follow Semantic Versioning. See the CHANGELOG for a full history and Releases for notes and assets.
🤝 Contributing
Contributions are welcome and appreciated — bug reports, new data sources, new tools. Read the contributing guide to get started, then open an issue or a pull request.
📚 Citation
If PubCrawl supports work you publish, please cite it — see CITATION.cff, or:
@software{lamb_pubcrawl,
author = {Lamb, Nick},
title = {PubCrawl: verifiable biomedical literature, drug labelling and clinical trials for AI assistants},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.22101559},
url = {https://doi.org/10.5281/zenodo.22101559}
}📄 License
Available Tools
14 toolscompare_labelsARead-only
Compare US FDA Prescribing Information vs UK/EU SmPC for a drug side-by-side. Maps equivalent sections (e.g., US Indications ↔ UK 4.1) and returns paired verbatim content. A missing side is always explained: us_label/uk_label say whether the label was retrieved, each comparison notes why a section is null, and sections longer than max_chars are flagged truncated with next_offset (read on with get_uspi / get_smpc).
Inputs: drug (required), uk_drug, us_drug, sections, +1 more.
format_citationARead-only
Format a citation for a PubMed article in APA, Vancouver, Harvard, or BibTeX style.
Inputs: pmid (required), style.
get_abstractARead-only
Get the full structured abstract and metadata for a PubMed article. Returns abstract sections (background, methods, results, conclusions), keywords, MeSH terms, and PMC ID.
Inputs: pmid (required), structured.
get_full_textARead-only
Get the full text of an open-access article from PubMed Central. Returns article sections, figure/table captions, and reference count. Only works for articles available in PMC.
Inputs: pmid, pmcid, sections.
get_smpcARead-only
Get UK/EU Summary of Product Characteristics (SmPC) for a drug from eMC (medicines.org.uk). Returns structured labelling sections, verbatim. Long sections are paged: a cut section has truncated: true, total_chars and next_offset — call again with that section and offset to read on. Check drug_name: the best eMC match may be a different product or formulation from the one you meant.
Inputs: drug (required), offset, sections, max_chars.
get_trialARead-only
Get detailed information about a specific clinical trial from ClinicalTrials.gov. Returns eligibility criteria, study design, arms, outcomes, locations, and associated PubMed IDs.
Inputs: nctId (required).
get_uspiARead-only
Get FDA US Prescribing Information (USPI) for a drug from openFDA (cited to DailyMed). Returns structured labelling sections with LOINC codes, verbatim. Long sections are paged: a cut section has truncated: true, total_chars and next_offset — call again with that section and offset to read on. Check drug_name: the best openFDA match may be a different product from the one you meant.
Inputs: drug (required), offset, sections, max_chars.
resolve_drug_nameARead-only
Convert a brand drug name to its generic name (or a generic to its US brand names), with drug class and common indications. Deterministic — sourced from RxNorm/openFDA, no AI.
Inputs: drug (required).
search_by_indicationARead-only
Find drugs approved for a medical condition. Searches US FDA labelling for the condition, then checks UK (eMC) availability for each drug found.
Inputs: condition (required), maxResults.
search_europepmcARead-only
Search Europe PMC — a broader biomedical corpus than PubMed that also indexes preprints (bioRxiv, medRxiv), patents, and agricultural/biomedical databases. Unlike search_pubmed, each result includes an abstract snippet, citation count, open-access status, and whether a preprint. Use preprintsOnly to surface work ahead of formal publication.
Inputs: query (required), sort, maxResults, preprintsOnly, +1 more.
search_pubmedBRead-only
Search PubMed for biomedical literature. Returns article summaries with PMIDs, titles, authors, journals, and DOIs.
Inputs: query (required), sort, dateTo, dateFrom, +2 more.
search_trialsARead-only
Search ClinicalTrials.gov for clinical trials. Filter by condition, intervention, status, and phase. Returns trial summaries with NCT IDs, status, sponsors, and enrollment info.
Inputs: sort, term, phase, status, +3 more.
trending_papersARead-only
Find recent/trending papers on a topic. Sorted by date, with optional filtering to high-impact journals.
Inputs: topic (required), days, maxResults, highImpactOnly.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
The tools are mostly split by distinct resource and action: clinical trials, US/UK drug labels, literature search, and article utilities. There is some potential overlap among search_pubmed, search_europepmc, and trending_papers, and compare_labels versus fetching labels individually, but the descriptions make the intended boundaries clear.
Names consistently use snake_case and are mostly verb-led (get_, search_, find_, format_, compare_, resolve_). The main minor deviation is trending_papers, which is a noun phrase rather than a verb_noun pattern.
At 14 tools, the surface is well-scoped for a biomedical research server covering trials, labels, and literature. Each tool maps to a distinct workflow rather than inflating the count with redundant operations.
The set covers core workflows: trial search/detail, US and UK label retrieval and comparison, literature search, abstracts, full text, related articles, citation formatting, trending papers, and drug-name resolution. Minor gaps exist around direct safety/interaction lookup or broader label search, but agents can work around them with the available tools.
Maintenance
Related MCP Connectors
Search biomedical papers, inspect publication records, and traverse citation or semantic graphs.
Linked life-science search: 43M+ papers, 1.2M+ trials, drugs, genes, FDA/EMA approvals, patents.
Search 36M+ PubMed biomedical articles and ClinicalTrials.gov studies.
Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive biomedical literature research through PubMed database access with advanced search, full-text retrieval, citation analysis, and batch processing capabilities. Supports both local deployment and cloud hosting for seamless integration with AI assistants.1MIT
- AlicenseCqualityDmaintenanceA PubMed MCP server that enables LLMs to search, retrieve details, and download full-text articles from PubMed, with support for batch queries, cross-referencing, and EndNote export.1347 npm6Apache 2.0
- AlicenseAqualityCmaintenanceProvides structured PubMed literature data for LLM agents, supporting search, caching, and open-access full-text downloads via the MCP protocol.547 npm11Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables PubMed literature search, metadata retrieval, BibTeX export, and evidence table generation for biomedical research agents.2MIT