使用说明
PubMed MCP服务器
模型上下文协议(MCP)服务器,通过六个核心功能提供对PubMed/PMC研究数据的访问:
- 搜索:使用MeSH支持查询PubMed,最多返回100篇包含PMCID信息的论文标题
- 取:检索单个PMID的摘要(符合OpenAI MCP)
- 提取批次:高效检索多个PMID的摘要
- 获取全文:检索PMCID的全文内容(JATS XML或OA URL)
- 计数:获取查询优化和细化的结果计数
- 计数批次:高效地获取多个查询的计数
特性
- MeSH查询支持:高级医学主题标题搜索
- PMCID检测:自动识别具有PMC全文可用性的论文
- 速率限制:遵守NCBI指南(3-10个请求/秒,取决于API密钥)
- XML解析:通过适当的错误处理来处理PubMed XML响应
- 开放获取集成:检测并提供OA文章的PDF URL
- 综合元数据:返回标题、摘要、作者、期刊、日期
设置
1.安装依赖项
pip install -r requirements.txt
2.环境配置(可选)
所有配置都是可选的。服务器无需任何设置即可开箱即用。
要进行自定义,请复制 .env.example 到 .env:
cp .env.example .env
可用设置:
# All settings are optional
NCBI_API_KEY=your_ncbi_api_key_here # For higher rate limits (10 req/s vs 3 req/s)
NCBI_TOOL_NAME=PubMedMCPServer # Custom tool identifier
NCBI_EMAIL=your.email@example.com # Contact email (uses default if not provided)
# Server settings
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=INFO
3.启动服务器
python pubmed_mcp_server.py
服务器将在以下位置可用: http://localhost:8000/sse/
4.获取NCBI API密钥(可选,用于更高的速率限制)
对于更高的吞吐量(10请求/秒而不是3请求/秒):
- 访问 NCBI API密钥设置
- 登录您的NCBI帐户
- 创建新的API密钥
- 添加
NCBI_API_KEY=your_key_here到你的.env文件
API密钥的优点:
- 10个请求/秒(无密钥时为3个)
- 高容量使用的可靠性更好
MCP工具
1.搜索
使用高级搜索功能查询PubMed数据库。
参数:
query(string):支持MeSH的搜索查询
查询示例:
"COVID-19 AND vaccine"
"asthma[mh] AND adult[mh]"
"diabetes[tiab] AND 2023:2024[dp]"
"cancer treatment[majr]"
答复:
{
"results": [
{
"id": "12345678",
"title": "Study Title",
"url": "https://pubmed.ncbi.nlm.nih.gov/12345678/",
"pmcid": "PMC1234567", // Present if full text available in PMC
"full_text_available": true // Indicates PMC full text availability
}
]
}
2.取
检索摘要 仅限单个PMID (符合OpenAI MCP标准)。
重要提示: 此工具每个请求只接受一个PMID。对于多个PMID,请使用 fetch_batch.
参数:
id(string):单一PubMed ID(PMID)- 无数组或通用分离值
例子:
{
"id": "40930554"
}
答复:
{
"id": "40930554",
"title": "Paper Title",
"text": "Background: ... Methods: ... Results: ... Conclusions: ...",
"url": "https://pubmed.ncbi.nlm.nih.gov/40930554/",
"metadata": {
"journal": "Journal Name",
"year": "2024",
"authors": ["Author 1", "Author 2"]
}
}
3.提取批次
在一个请求中高效检索多个PMID的摘要。
参数:
pmids(数组):PubMed ID(PMIDs)列表
例子:
{
"pmids": ["40930554", "40929575", "40929571"]
}
答复:
{
"items": [
{
"pmid": "40930554",
"title": "Paper Title 1",
"abstract": "Background: ... Methods: ... Results: ... Conclusions: ...",
"journal": "Journal Name",
"year": "2024",
"authors": ["Author 1", "Author 2"]
},
{
"pmid": "40929575",
"title": "Paper Title 2",
"abstract": "Background: ... Methods: ... Results: ... Conclusions: ...",
"journal": "Another Journal",
"year": "2024",
"authors": ["Author 3", "Author 4"]
}
]
}
4.获取全文
检索PMCID的全文内容。
参数:
pmcids(数组):PMC ID列表(带或不带“PMC”前缀)
例子:
{
"pmcids": ["PMC1234567", "7654321"]
}
答复:
{
"items": [
{
"pmcid": "PMC1234567",
"jats_xml": "<article>...</article>",
"pdf_url": "https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1234567/pdf/",
"status": "success"
}
],
"notes": [
"Full text availability depends on PMC Open Access status",
"JATS XML is provided when available",
"PDF URLs are only available for Open Access articles"
]
}
5.计数
在不检索论文的情况下获取搜索查询的结果计数(用于查询优化)。
参数:
query(string):支持MeSH的搜索查询
例子:
{
"query": "lung cancer[mh] AND 2024[dp]"
}
答复:
{
"query": "lung cancer[mh] AND 2024[dp]",
"count": 12543,
"query_translation": "\"lung neoplasms\"[MeSH Terms] AND 2024[dp]",
"warnings": []
}
6.计数批次
高效地获取多个查询的计数(用于比较搜索策略)。
参数:
queries(array):搜索查询列表
例子:
{
"queries": [
"diabetes",
"diabetes[mh]",
"diabetes[majr]",
"diabetes[mh] AND clinical trial[pt]"
]
}
答复:
[
{"query": "diabetes", "count": 1072365, "query_translation": "..."},
{"query": "diabetes[mh]", "count": 562256, "query_translation": "..."},
{"query": "diabetes[majr]", "count": 287431, "query_translation": "..."},
{"query": "diabetes[mh] AND clinical trial[pt]", "count": 45123, "query_translation": "..."}
]
查询优化工作流
计数工具实现了高效的查询细化:
# Start broad, then refine
"cancer" # 5,000,000+ results (too broad)
"lung cancer" # 800,000 results
"lung cancer[mh]" # 400,000 results (MeSH term)
"lung cancer[mh] AND 2024[dp]" # 12,000 results
"lung cancer[majr] AND clinical trial[pt] AND 2024[dp]" # 450 results (optimal)
MeSH搜索示例
服务器支持高级PubMed搜索语法:
# MeSH terms
"diabetes mellitus[mh]"
# MeSH major topic
"cancer[majr]"
# Title/Abstract
"machine learning[tiab]"
# Publication date
"2023:2024[dp]"
# Combined search
"COVID-19[mh] AND vaccine[tiab] AND 2023:2024[dp]"
# Author search
"Smith J[au]"
# Journal search
"nature[ta]"
使用ChatGPT/Claude
- 在本地启动服务器
- 使用URL:
http://localhost:8000/sse/ - 在AI接口中配置为MCP连接器
- 启用工具:
search,fetch,fetch_batch,get_full_text
费率限制和合规性
- 没有API密钥:每秒最多3个请求
- 使用API密钥:每秒最多10个请求
- 指数回退自动重试
- 遵循NCBI使用指南
- 所有请求中的工具和电子邮件标识
错误处理
服务器处理各种错误情况:
- 超出速率限制(429)→自动重试
- 无效的PMID/PMCID→ 优雅的错误响应
- 网络超时→ 使用回退重试
- XML分析错误→ 详细的错误消息
- 缺少摘要→ “没有可用摘要”消息
发展
测试单个功能
您可以直接测试服务器功能:
import asyncio
from pubmed_mcp_server import PubMedClient
async def test_search():
async with PubMedClient() as client:
results = await client.search_pubmed("COVID-19 AND vaccine", retmax=5)
print(f"Found {results['count']} papers")
for item in results['items']:
print(f"- {item['title']}")
asyncio.run(test_search())
日志记录
集 LOG_LEVEL=DEBUG 在 .env 用于详细的请求/响应日志记录。
许可证
此实现遵循NCBI使用政策和指南。请确保遵守:
- NCBI电子公用事业使用指南
- PMC开放获取许可条款
- 速率限制要求
- 研究使用中的正确归因