PubMed研究数据访问服务

PubMed MCP服务器提供对PubMed/PMC研究数据的访问,支持搜索、获取摘要、获取全文、计数等核心功能,适用于医学研究和数据分析。

  • by masa-med-ai
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 masa-med-ai/pubmed-mcp-remote

使用说明

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请求/秒):

  1. 访问 NCBI API密钥设置
  2. 登录您的NCBI帐户
  3. 创建新的API密钥
  4. 添加 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

  1. 在本地启动服务器
  2. 使用URL: http://localhost:8000/sse/
  3. 在AI接口中配置为MCP连接器
  4. 启用工具: 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开放获取许可条款
  • 速率限制要求
  • 研究使用中的正确归因