cyanheads avatar

Pubmed Mcp Server

cyanheads/pubmed-mcp-server

Connects Claude to PubMed, PubMed Central, and Europe PMC through ten tools covering search, metadata retrieval, and full-text access. The search tools handle both standard PubMed queries and Europe PMC's broader corpus including preprints and patents. Article fetching returns structured metadata with MeSH terms and affiliations, while the full-text chain attempts NCBI PMC first, falls back to Europe PMC, then tries Unpaywall for open access PDFs. Citation formatting covers APA, MLA, BibTeX, and RIS. ID conversion moves between PMID, PMCID, and DOI. Reach for this when building research workflows that need programmatic access to biomedical literature beyond simple web searches, especially when you need structured article data or need to locate full text across multiple repositories.

install copies · 90 days. Times the install command was copied on this site in the last 90 days, bots filtered.
11
GitHub stars
167
tools
12
transport
STDIO, HTTP
env vars
10
last updated
Nov 11, 2026

Install

From registry metadata
$ npx add-mcp https://pubmed.caseyjhand.com/mcp --name pubmed

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http pubmed https://pubmed.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 12 tools

Verified live against the running server on Nov 13, 2026.

pubmed_search_articlesSearch PubMed with full query syntax, filters, and date ranges. Returns PMIDs and optional brief summaries. Supports field-specific filters (author, journal, MeSH terms), common filters (language, species, free full text), and pagination via offset for paging through large res...14 params

Search PubMed with full query syntax, filters, and date ranges. Returns PMIDs and optional brief summaries. Supports field-specific filters (author, journal, MeSH terms), common filters (language, species, free full text), and pagination via offset for paging through large res...

Parameters* required
authorstring
Filter by author name (e.g. "Smith J"). An empty string applies no filter; a value of only whitespace, invisible characters, markup, parentheses, brackets, or double quotes is rejected.
dateRangeobject
Filter by date range. The filter is applied only when both `minDate` and `maxDate` are non-empty; either one empty disables the entire date range. A partial date covers its whole year or month, and...
freeFullTextboolean
Only include free full text articles
hasAbstractboolean
Only include articles with abstracts
journalstring
Filter by journal: its NLM title abbreviation (e.g. "N Engl J Med") or ISSN; a full title matches only as NLM records it. An empty string applies no filter; a value of only whitespace, invisible ch...
languagestring
Filter by language: its English name or three-letter NLM code (e.g. "english" or "eng"); a two-letter code such as "en" matches nothing. An empty string applies no filter; a value of only whitespac...
maxResultsinteger
Maximum results to return, up to 1000 per call; a larger value returns 1000 with a notice naming the next `offset`. 0 returns only `totalCount`.default: 20
meshTermsarray
Filter by MeSH headings, each searched as `"term"[MeSH Terms]`. Multiple terms are AND'd — all must match. A supplementary concept, as many drugs are, is not a heading and matches nothing here: sea...
offsetinteger
Result offset for pagination (0-based). PubMed serves at most the first 9999 records of a result set, so this caps at 9998; narrow the query or add filters to reach anything beyond it.default: 0
publicationTypesarray
Filter by publication type (e.g. "Review", "Clinical Trial", "Meta-Analysis"). Multiple values are OR'd — any match qualifies. Empty strings are skipped; an element of only whitespace, invisible ch...
querystring
PubMed search query (supports full NCBI syntax), sent as written apart from inline formatting tags such as `<i>`, which are removed. Omit it or pass an empty string to search on the filters alone,...
sortstring
Sort order: relevance (default), pub_date (publication date, newest first), author (first author A–Z), or journal (journal name A–Z)one of relevance · pub_date · author · journaldefault: relevance
speciesstring
Filter by species: `humans` adds `humans[MeSH Terms]`, `animals` adds `"animals"[mh:noexp]` (animals other than humans; a record indexed for both stays in). Both match only records with MEDLINE spe...one of humans · animals
summaryCountinteger
Fetch brief summaries for the top N results (0 = PMIDs only), up to 50 per call; a larger value fetches 50 with a notice. Pass the PMIDs past the cap to pubmed_fetch_articles.default: 0
pubmed_fetch_articlesFetch full article metadata by PubMed IDs. Returns detailed article information including abstract, authors, journal, MeSH terms, linked retraction, erratum, and comment notices, and databank accessions such as trial registration IDs; grants and the members of a collective aut...5 params

Fetch full article metadata by PubMed IDs. Returns detailed article information including abstract, authors, journal, MeSH terms, linked retraction, erratum, and comment notices, and databank accessions such as trial registration IDs; grants and the members of a collective aut...

Parameters* required
includeGrantsboolean
Include grant informationdefault: false
includeInvestigatorsboolean
Include `investigators`: the members NCBI lists for a collective author such as "TGU Investigators". Off by default because the list is unbounded: consortium trials name thousands, at about 60 char...default: false
includeMeshboolean
Include MeSH termsdefault: true
maxResponseCharactersinteger
Opt-in ceiling for the whole response, in characters. Each article is measured as the JSON record it is returned as — title, abstract, authors, journal, MeSH terms, grants, identifiers, every field...
pmids*array
PubMed IDs to fetch
pubmed_fetch_fulltextFetch full-text articles from PubMed Central as structured sections — the body, then back matter such as acknowledgments, declarations, and appendices — with tables and references. When PMC misses, transparently falls back to Europe PMC `fullTextXML` (structured JATS for its o...12 params

Fetch full-text articles from PubMed Central as structured sections — the body, then back matter such as acknowledgments, declarations, and appendices — with tables and references. When PMC misses, transparently falls back to Europe PMC `fullTextXML` (structured JATS for its o...

Parameters* required
doisarray
DOIs to resolve (e.g. ["10.21203/rs.3.rs-9010375/v1"]), one per element. Combinable with `pmcids` and `pmids` — up to 50 distinct identifiers across the three; the first 10 are fetched per call, th...
includeAssetsboolean
Include the article's figures and supplementary material — `assets[]`, each with its label, caption, enclosing section and deposit pointer. On by default because it is cheaper than tables: a median...default: true
includeReferencesboolean
Include reference list. Applies to `source=pmc` results only.default: false
includeTablesboolean
Include the article's tables — cells, captions, labels and footnotes. On by default because a dropped table takes its numbers with it. Table-dense articles pay for it: rendered tables typically add...default: true
maxCharactersinteger
Per-article budget for body text, in characters. Counts `source=pmc` section and subsection text — which carries the inline blocks the parser renders in place, such as lists, definition lists, bloc...
maxCharactersPerSectioninteger
Budget for a single top-level section, in characters, counting the section text plus its subsections. Combine with `maxCharacters` to cap both one section and the article; the tighter of the two wi...
maxResponseCharactersinteger
Opt-in ceiling for the whole response, in characters — the true response-wide counterpart to the per-article `maxCharacters`. Each article is measured as the JSON record it is returned as, after ev...
maxSectionsinteger
Maximum top-level sections, counted after `sections`. Back-matter sections count and follow the body, so a cap drops them first. The sections it drops are named per article in `sectionCap`. Applies...
overflowModestring
How to spend `maxCharacters` across an article that exceeds it. truncate: fill sections in document order, so early sections stay whole, the section the budget runs out in is cut, and every section...one of truncate · outlinedefault: truncate
pmcidsarray
PMC IDs to fetch (e.g. ["PMC9575052"]). Combinable with `pmids` and `dois` — up to 50 distinct identifiers across the three; the first 10 are fetched per call, the rest returned in `overLimit`. PMC...
pmidsarray
PubMed IDs. Combinable with `pmcids` and `dois` — up to 50 distinct identifiers across the three; the first 10 are fetched per call, the rest returned in `overLimit`. Articles in PMC are returned a...
sectionsarray
Filter to specific sections by title (e.g. ["Introduction", "Methods", "Results", "Discussion"]). A term matches a section or subsection title at any nesting depth, case-insensitively, as a substri...
pubmed_format_citationsGet formatted citations for PubMed articles in one or more formats (apa, mla, bibtex, ris, vancouver). Pass a single format as a string or multiple as an array. Retractions, errata, and expressions of concern NCBI links to an article come back in `notices`; Vancouver and APA a...2 params

Get formatted citations for PubMed articles in one or more formats (apa, mla, bibtex, ris, vancouver). Pass a single format as a string or multiple as an array. Retractions, errata, and expressions of concern NCBI links to an article come back in `notices`; Vancouver and APA a...

Parameters* required
formatvalue
Citation format(s) to generate — single style as a string or multiple as an array. Allowed values: apa, mla, bibtex, ris, vancouver.default: apa
pmids*array
PubMed IDs to cite
pubmed_find_relatedFind articles related to a source article — similar content (similar), articles citing this one (cited_by), or articles this one cites (references). Uses NCBI ELink as the primary source; falls back to Europe PMC then OpenAlex when NCBI is unavailable.4 params

Find articles related to a source article — similar content (similar), articles citing this one (cited_by), or articles this one cites (references). Uses NCBI ELink as the primary source; falls back to Europe PMC then OpenAlex when NCBI is unavailable.

Parameters* required
maxResultsinteger
Maximum related articles per page, up to 50 per call. A larger value is served at 50, with a notice naming the next `offset` when more remain.default: 10
offsetinteger
Result offset for pagination (0-based). For the next page, add the number of articles returned (at most 50) to this offset.default: 0
pmid*string
Source PubMed ID
relationshipstring
Relationship type: similar (content-based), cited_by (articles citing this one), references (articles this one cites)one of similar · cited_by · referencesdefault: similar
pubmed_spell_checkSpell-check a PubMed search query against NCBI ESpell and get the corrected query back. Use after a zero-hit or thin `pubmed_search_articles` result, or when a drug, gene, disease, or author name may be misspelled. Corrections are applied in place, so field tags, operators, sp...1 params

Spell-check a PubMed search query against NCBI ESpell and get the corrected query back. Use after a zero-hit or thin `pubmed_search_articles` result, or when a drug, gene, disease, or author name may be misspelled. Corrections are applied in place, so field tags, operators, sp...

Parameters* required
query*string
PubMed search query to spell-check. Must carry a term: a value of only whitespace or invisible characters, such as a zero-width space, is rejected rather than sent to ESpell.
pubmed_lookup_meshSearch and explore the MeSH (Medical Subject Headings) controlled vocabulary. Returns MeSH records of every type — descriptors, supplementary concepts, qualifiers, and pharmacological actions — each with its record type and the PubMed clause that searches it, plus tree numbers...4 params

Search and explore the MeSH (Medical Subject Headings) controlled vocabulary. Returns MeSH records of every type — descriptors, supplementary concepts, qualifiers, and pharmacological actions — each with its record type and the PubMed clause that searches it, plus tree numbers...

Parameters* required
includeDetailsboolean
Include each record's details: scope note, tree numbers, entry terms, year introduced, previous indexing, and — on the exact heading match only — its allowable subheadings. `recordType` and `search...default: true
maxResultsinteger
Maximum results per page, up to 50 per call. A larger value is served at 50, with a notice; continue from `nextOffset`.default: 10
offsetinteger
Result offset for pagination (0-based). Pass the `nextOffset` from the previous response to get the following page; the exact match is pinned to the first page only.default: 0
query*string
MeSH term (a heading, supplementary concept, or qualifier name) or free-text term to look up. Must carry a term: a value of only whitespace or invisible characters, such as a zero-width space, is r...
pubmed_lookup_citationLook up PubMed IDs from partial bibliographic citations. Useful when you have a reference (journal, year, volume, page, author) and need the PMID — deterministic citation matching, more reliable than free-text search for structured references. Each citation must include at lea...1 params

Look up PubMed IDs from partial bibliographic citations. Useful when you have a reference (journal, year, volume, page, author) and need the PMID — deterministic citation matching, more reliable than free-text search for structured references. Each citation must include at lea...

Parameters* required
citations*array
Citations to look up, 1–25, each matched independently. More fields = better match accuracy.
pubmed_convert_idsConvert between article identifiers (DOI, PMID, PMCID). Accepts up to 50 IDs of a single type per request. Only resolves articles indexed in PubMed Central — for articles not in PMC, use pubmed_search_articles instead.2 params

Convert between article identifiers (DOI, PMID, PMCID). Accepts up to 50 IDs of a single type per request. Only resolves articles indexed in PubMed Central — for articles not in PMC, use pubmed_search_articles instead.

Parameters* required
idType*string
The type of IDs being submitted. Required so the API can unambiguously resolve them.one of pmcid · pmid · doi
ids*array
Article identifiers to convert — one identifier per element, all of the same type. Each element is checked against `idType` before the request: `doi` starts with "10." and carries a "/" ("10.1093/n...
pubmed_fetch_citation_metricsFetch NIH iCite citation metrics for PubMed articles: the Relative Citation Ratio (RCR), NIH percentile, citation count, citations per year, expected and field citation rates, the Approximate Potential to Translate (APT), the human, animal, and molecular/cellular shares of eac...1 params

Fetch NIH iCite citation metrics for PubMed articles: the Relative Citation Ratio (RCR), NIH percentile, citation count, citations per year, expected and field citation rates, the Approximate Potential to Translate (APT), the human, animal, and molecular/cellular shares of eac...

Parameters* required
pmids*array
PubMed IDs to look up (e.g. ["23456789"]). The first 200 distinct PMIDs are fetched; the rest are returned in `overLimit`. Leading zeros are ignored, so "00023456789" and "23456789" name one article.
pubmed_europepmc_searchSearch 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 typic...6 params

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 typic...

Parameters* required
cursorMarkstring
Pagination cursor. Use `*` (default) for the first page; pass the previous response's `nextCursorMark` verbatim for subsequent pages. Under relevance ranking (no `sort`), a record can reappear on t...default: *
pageSizeinteger
Results per page, up to 100 per call (this server's cap; Europe PMC itself serves up to 1,000). A larger value is served at 100, with a notice; continue from `nextCursorMark`.default: 25
query*string
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>`...
resultTypestring
`core` returns abstract, IDs, dates, license; `lite` is a smaller payload with the same IDs, title, authors, journal, and dates, but no abstract or license.one of core · litedefault: core
sortstring
Optional EPMC sort: `<field> asc|desc`, or several comma-separated keys applied in order (`PUB_YEAR desc, CITED desc`). Documented sortable fields: `P_PDATE_D` (publication date), `CITED` (citation...
sourcesarray
Filter 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.
pubmed_europepmc_fetchFetch complete Europe PMC records — including the full, untruncated abstract — addressed as `records: [{ source, epmcId }]`, an array even for one record. Pairs with `pubmed_europepmc_search`, which returns bounded `abstractSnippet` values and flags cut ones with `abstractTrun...2 params

Fetch complete Europe PMC records — including the full, untruncated abstract — addressed as `records: [{ source, epmcId }]`, an array even for one record. Pairs with `pubmed_europepmc_search`, which returns bounded `abstractSnippet` values and flags cut ones with `abstractTrun...

Parameters* required
maxResponseCharactersinteger
Opt-in ceiling for the whole response, in characters. Each record is measured as the JSON record it is returned as — title, authors, journal, abstract, identifiers, every field it carries. Records...
records*array
Records to retrieve, each addressed by the `source` and `epmcId` of a `pubmed_europepmc_search` hit. The whole batch resolves in one Europe PMC request.

Sponsors

Configuration

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

NCBI_API_KEY

NCBI API key for higher rate limits (10 req/s vs 3 req/s).

NCBI_ADMIN_EMAIL

Contact email sent with NCBI requests (recommended by NCBI).

UNPAYWALL_EMAIL

Contact email for Unpaywall. When set, pubmed_fetch_fulltext falls back to Unpaywall open-access copies for DOIs not in PMC.

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_PUBLIC_URL

Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/pubmed-mcp-server

Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms via MCP. STDIO or Streamable HTTP.

12 Tools • 1 Resource • 1 Prompt

Details

Repository
github.com/cyanheads/pubmed-mcp-server
Category
Search & Web Crawling
Package
@cyanheads/pubmed-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
2
Prompts
1
Tools verified
Nov 13, 2026

More from cyanheads

Related Search & Web Crawling MCP servers

View all
1skillmds avatarSkillmdskillmds/skillmdSearch, fetch, lint, and install Agent Skills (SKILL.md) from the SkillMD registry.144stars
2pinkpixel-dev avatarPinkpixel Dev Web Scout Mcppinkpixel-dev/web-scout-mcpSearch the web and extract clean, readable text from webpages. Process multiple URLs at once to sp…131stars
3devshero avatarShadowCrawldevshero/shadowcrawlRust MCP stealth scraper: anti-bot search/scrape with CDP fallback + HITL non-robot.66stars
4olostep avatarOlostep MCP Serverolostep/olostep-mcp-serverLive web search, scraping and crawling API for AI. Get structured, LLM-ready data from any site.25stars
5zenrows avatarZenrows Mcpzenrows/zenrows-mcpZenrows MCP server: Fetch, Extract, Batch, and Browser Sessions for AI agents21stars
6scrapfly avatarMcpscrapfly/scrapfly-mcpScrape any website, extract structured data, and collect web content at scale with AI agents15stars