io. github. cyanheads/ pubmed-mcp-server
by cyanheads · remote · local (npm) · no sign-in to list tools · v2.10.22 · published by GitHub user cyanheads
Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms.
11 tools: 2 change things and 9 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things2Claude Code: ask: see these tools
- Only reads9Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http pubmed https://pubmed.caseyjhand.com/mcpFindings
Matches of fixed checks, with the text they matched.
The server marks "pubmed_convert_ids" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "pubmed_convert_ids" says "convert": a word for a change.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
11 tools
Changes things 2Claude Code: ask
pubmed_convert_idsConvert between article identifiers (DOI, PMID, PMCID).1 finding
Why it is in this group
- The name "pubmed_convert_ids" says "convert": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "pubmed_convert_ids" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "pubmed_convert_ids" says "convert": a word for a change.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_spell_checkSpell-check a PubMed search query against NCBI ESpell and get the corrected query back.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it 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, spacing, and gene symbols stay as written (`alzhiemer diseese treatmnt outcomse` → `alzheimer disease treatment outcomes`). Words in all capitals, with digits or non-ASCII letters, or differing only in case are never changed, words after a number or symbol ESpell skips are left as written, and `hasSuggestion` is false when no correction was applied. Re-run the search with `corrected`.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
Only reads 9Claude Code: allow
pubmed_europepmc_fetchFetch complete Europe PMC records — including the full, untruncated abstract — addressed as `records: [{ source, epmcId }]`, an array even for one record.No findings
Why it is in this group
- The name "pubmed_europepmc_fetch" says "fetch": a word for reading.
Description, as the server wrote it 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 `abstractTruncated: true`; copy each hit's `source` and `epmcId` into `records` here to read the whole abstract. This is the retrieval path for preprint (`PPR`), patent (`PAT`), and Agricola (`AGR`) records, which frequently carry no PMID and no DOI, so `pubmed_fetch_articles` and `pubmed_fetch_fulltext` cannot address them. Up to 25 records per call. Set `maxResponseCharacters` to bound the whole response: records past the ceiling are deferred whole and listed in `deferred.records` for a follow-up call.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_europepmc_searchSearch Europe PMC, a broad open-access biomedical corpus.No findings
Why it is in this group
- The name "pubmed_europepmc_search" says "search": a word for reading.
Description, as the server wrote it 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 typical recovery. Paginate via `cursorMark`. Defaults to `MED`, `PMC`, and `PPR`; pass `sources` to include `PAT` / `AGR`. Abstracts arrive as a bounded `abstractSnippet` with `abstractTruncated` marking the cut ones — pass a hit to `pubmed_europepmc_fetch` as `records: [{ source, epmcId }]` for the complete abstract.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_fetch_articlesFetch full article metadata by PubMed IDs.No findings
Why it is in this group
- The name "pubmed_fetch_articles" says "fetch": a word for reading.
Description, as the server wrote it Fetch full article metadata by PubMed IDs. Returns detailed article information including abstract, authors, journal, MeSH terms, and linked retraction, erratum, and comment notices; grants and the members of a collective author are opt-in (`includeGrants`, `includeInvestigators`). Set `maxResponseCharacters` to bound the whole response: articles past the ceiling are deferred whole and listed in `deferred.ids` for a follow-up call.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
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.No findings
Why it is in this group
- The name "pubmed_fetch_fulltext" says "fetch": a word for reading.
Description, as the server wrote it 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 records with a PMC counterpart), then to Unpaywall — publisher-hosted or institutional open-access copies as HTML-as-Markdown or PDF-as-text. Name articles by `pmcids` (PMC IDs directly), `pmids` (PubMed IDs, auto-resolved), `dois` (DOIs, auto-resolved to PMC via the ID Converter; preprints and EPMC-only OA fall through to the Europe PMC and Unpaywall layers), or any mix of the three — up to 50 distinct identifiers; the first 10 are fetched per call, the rest returned in `overLimit`; an article several of them name is fetched and returned once. Two independent character controls: `maxCharacters` caps body text per article, `maxResponseCharacters` caps the whole response and defers articles past the ceiling whole, listing them in `deferred.ids` for a follow-up call.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_format_citationsGet formatted citations for PubMed articles in one or more formats (apa, mla, bibtex, ris, vancouver).No findings
Why it is in this group
- The description's first verb is "get": a word for reading.
Description, as the server wrote it 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 also cite a retraction in the reference itself.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_lookup_citationLook up PubMed IDs from partial bibliographic citations.No findings
Why it is in this group
- The name "pubmed_lookup_citation" says "lookup": a word for reading.
Description, as the server wrote it 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 least journal or a four-digit year (ECitMatch primary-keys on journal+volume+page; author-only or volume-only inputs guarantee no match); more fields = better match accuracy.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_lookup_meshSearch and explore the MeSH (Medical Subject Headings) controlled vocabulary.No findings
Why it is in this group
- The name "pubmed_lookup_mesh" says "lookup": a word for reading.
Description, as the server wrote it Search and explore the MeSH (Medical Subject Headings) controlled vocabulary. Returns descriptor records with tree numbers, scope notes, and entry terms, plus pagination via offset for paging past the maxResults cap.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
pubmed_search_articlesSearch PubMed with full query syntax, filters, and date ranges.No findings
Why it is in this group
- The name "pubmed_search_articles" says "search": a word for reading.
Description, as the server wrote it 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 result sets.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 2.10.22. Values in angle brackets are yours to fill in.
claude mcp add --transport http pubmed https://pubmed.caseyjhand.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__pubmed__pubmed_search_articles",
"mcp__pubmed__pubmed_fetch_articles",
"mcp__pubmed__pubmed_fetch_fulltext",
"mcp__pubmed__pubmed_format_citations",
"mcp__pubmed__pubmed_find_related",
"mcp__pubmed__pubmed_lookup_mesh",
"mcp__pubmed__pubmed_lookup_citation",
"mcp__pubmed__pubmed_europepmc_search",
"mcp__pubmed__pubmed_europepmc_fetch"
],
"ask": [
"mcp__pubmed__pubmed_spell_check",
"mcp__pubmed__pubmed_convert_ids"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as pubmed. Review it before you use it.
