PubMed SearchBLOCK
MCP SDK v2 server for PubMed and multi-source biomedical research, with resilient search, full text, citations, and tenant-safe deployment.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://badge.fury.io/py/pubmed-search-mcp) [](https://www.python.org/downloads/) [](https://opensource.org/licenses/Apache-2.0) [](https://modelcontextprotocol.io/) [](https://github.com/u9401066/pubmed-search-mcp/actions/workflows/ci.yml)
Professional Literature Research Assistant for AI Agents - More than just an API wrapper
A Domain-Driven Design (DDD) based MCP server that serves as an intelligent research assistant for AI agents, providing task-oriented literature search and analysis capabilities.
✨ What's Included:
- 🔧 41 MCP Tools - Streamlined PubMed, Europe PMC, CORE, NCBI database access, and the versioned Research Chronicle
- 🛡️ Multi-Agent Service Mode - Deploy once and serve many agents: per-tenant sessions, caches, and artifacts, bearer-token auth, and per-tenant fair-share limits. See DEPLOYMENT.md
- 🖼️ OA Figure Extraction - Pull figure captions, direct image URLs, and PDF links from PMC Open Access articles
- 📘 Docs Site - Browse the complete language-switchable handbook: user workflows, architecture, 41-tool reference, pipeline tutorials, source/broker contracts, integrations and operations, security, and deployment at u9401066.github.io/pubmed-search-mcp
- 📖 GitHub Wiki - GitHub-native mirror of the same canonical documentation at github.com/u9401066/pubmed-search-mcp/wiki
- 📚 26 Claude Skills - Ready-to-use workflow guides for AI agents
b043d5b88d5cOBSERVED · 2026-10-09Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add pubmed-search-mcp --env BROWSER_FETCH_BROKER_TOKEN=${BROWSER_FETCH_BROKER_TOKEN} --env BROWSER_FETCH_TOKEN=${BROWSER_FETCH_TOKEN} --env KEY=${KEY} --env NCBI_API_KEY=${NCBI_API_KEY} -- uvx pubmed-search-mcp{
"mcpServers": {
"pubmed-search-mcp": {
"command": "uvx",
"args": [
"pubmed-search-mcp"
],
"env": {
"BROWSER_FETCH_BROKER_TOKEN": "${BROWSER_FETCH_BROKER_TOKEN}",
"BROWSER_FETCH_TOKEN": "${BROWSER_FETCH_TOKEN}",
"KEY": "${KEY}",
"NCBI_API_KEY": "${NCBI_API_KEY}"
}
}
}
}Exposed tools (38)
34 read · 2 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
analyze_search_query | read | |
build_citation_tree | read | |
build_research_chronicle | read | |
convert_icd_mesh | read | Query the curated ICD/MeSH crosswalk in one explicit direction. |
delete_pipeline | destructive | Permanently delete a saved pipeline configuration and execution history. |
diagnose_institutional_access | read | |
fetch_article_details | read | |
find_citing_articles | read | |
find_related_articles | read | |
generate_search_queries | read | |
get_article_figures | read | Get structured figure metadata (label, caption, image URL) and PDF links from a PMC Open Access article. |
get_article_references | read | |
get_citation_metrics | read | |
get_compound_details | read | |
get_compound_literature | read | |
get_fulltext | read | |
get_gene_details | read | |
get_gene_literature | read | |
get_institutional_link | read | |
get_pipeline_history | read | Get execution history for a saved pipeline. |
get_text_mined_terms | read | |
list_resolver_presets | read | |
load_pipeline | read | Load a pipeline configuration for review or editing. |
prepare_export | read | |
read | read | Read corpus records using numeric transport IDs returned by search. |
read_research_chronicle | read | |
read_session | read | Read session data through one schema-exact discriminated request. |
save_literature_notes | write | |
schedule_pipeline | write | Schedule a saved pipeline for periodic execution. |
search | read | Search title/abstract text with plain lexical terms. Supports iterative queries. |
search_biomedical_images | read | |
search_clinvar | read | |
search_compound | read | |
search_gene | read | |
test_institutional_access | read | |
unschedule_pipeline | destructive | Remove the active schedule for a saved pipeline. |
validate_pico_plan | read | Validate agent-provided P/I/C/O and return a runnable PICO pipeline. |
verify_reference_list | read | Verify a plain-text reference list against PubMed evidence. |
Trust audit
BLOCKgrade F · trust 42/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (12 observation(s))
- Shell
- declared (1 observation(s))
- Dependencies
- pinned
- Secrets in source
- found
Findings (25)
parsed = yaml.load(text, Loader=_BoundedSafeLoader) # noqa: S506 # nosec B506
"metadata.google.internal",
PUBMED_ALLOWED_ORIGINS: http://localhost:${PUBMED_LOCAL_PORT:-8765},http://127.0.0.1:${PUBMED_LOCAL_PORT:-8765}token = "local-dev-token-0123456789abcdefgh"
secret = "PRIVATE_CACHE_KEY_AND_EXCEPTION_DETAIL"
secret = "oauth-client-secret-sentinel"
secret = "PRIVATE_ERROR_DETAIL_MUST_NOT_PERSIST"
secret = "TOPSECRET_RESPONSE_SENTINEL"
delete_pipeline, unschedule_pipeline
.bandit
.env.service.example
.instruction_drift_fingerprint
.ngrok.env
.pre-commit-config.yaml
session_id = hashlib.md5( # nosec B324
"](../images/": "](../../../../docs/images/",
"](../images/": "](../../../../docs/images/",
"[README section](../../README.md#-configuration)",
"[Deployment check](../../DEPLOYMENT.md#10-驗證清單)",
"[Stale deployment check](../../DEPLOYMENT.md#9-驗證清單)",
"http://169.254.169.254/latest/meta-data.pdf",
"http://169.254.169.254/latest/meta-data/",
"BROWSER_FETCH_CONFIG": "{\"enabled\":true,\"auto_enabled\":true,\"broker_url\":\"http://127.0.0.1:8766/fetch\",\"token\":\"<random-32-byte-token>\",\"allowed_hosts\":[\"jamanetwork.com\",\"*.jamanetw"BROWSER_FETCH_CONFIG": "{\"enabled\":true,\"auto_enabled\":true,\"broker_url\":\"http://127.0.0.1:8766/fetch\",\"token\":\"<random-32-byte-token>\",\"allowed_hosts\":[\"jamanetwork.com\",\"*.jamanetw| `BROWSER_FETCH_BROKER_URL` | No | Local broker endpoint, e.g. `http://127.0.0.1:8766/fetch` | — |
Gates applied: no_behavioural_pass.
b043d5b88d5cfull audit observations/trust-audit/mcp-server/u9401066__pubmed-search-2.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-09 | b043d5b88d5c | BLOCK | F | 42 | first audit |
Questions
What is the PubMed Search MCP server?
MCP SDK v2 server for PubMed and multi-source biomedical research, with resilient search, full text, citations, and tenant-safe deployment.
What tools does PubMed Search expose?
38 in total: 34 read-only, 2 that write, and 2 that can delete or overwrite (delete_pipeline, unschedule_pipeline). Every one is listed on this page with its risk.
Is PubMed Search safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (42/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does PubMed Search need?
It reads BROWSER_FETCH_BROKER_TOKEN, BROWSER_FETCH_TOKEN, KEY, NCBI_API_KEY and PUBMED_BEARER_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does PubMed Search run?
It speaks streamable-http, so it runs as a service you connect to over the network. It is published on PyPI as pubmed-search-mcp.
How current is this page?
The grade is for one exact copy of the source (b043d5b88d5c), read on 2026-10-09. The repository is watched and re-audited when it changes.