mcpField
S
Searching Scientific Literature

Searching Scientific Literature

github.com/kthorn生产力13167 次安装53 周前更新
代码仓库

关于 Searching Scientific Literature

Searching Scientific Literature 是一项通过 PubMed 搜索科学文献并提取论文元数据的研究技能,适用于需要为研究问题建立初始论文集的人。它提供从拆解查询、构造检索式到整理结果以供相关性评估的流程。

主要功能

  1. 01拆解关键词、数据需求和约束
  2. 02使用布尔运算符构造 PubMed 查询
  3. 03按字段和日期范围筛选
  4. 04提取论文元数据与 DOI
  5. 05提供限流和空结果处理建议

适用场景

  1. 01为新的研究问题查找论文
  2. 02查找特定方法、化合物或疾病相关文献
  3. 03整理初始论文集供相关性评估

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kthorn/research-superpower --skill searching-scientific-literature

安装后在 Claude Code 中输入/searching-scientific-literature确认已加载。

详细介绍

搜索科学文献

概述

使用优化后的查询在 PubMed 中搜索科学文献。提取元数据,并为相关性评估准备论文。

核心原则: 搜索范围要足够广,以找到相关论文,同时使用有针对性的关键词控制结果数量。

适用场景

在以下情况下使用此技能:

  • 开始一项新的研究
  • 用户要求“查找有关……的论文”
  • 需要准备一组初始论文以供评估
  • 搜索特定的方法、化合物、疾病或技术

搜索策略

1. 解析用户查询

提取:

  • 关键词:主要概念(例如,“BTK inhibitor”“selectivity”“kinase”)
  • 数据类型:用户需要的内容(IC50 值、方法、结构、结果)
  • 限制条件:日期范围、特定期刊、作者姓名
  • 同义词:其他说法(例如,“Bruton's tyrosine kinase” = “BTK”)
2. 构建 PubMed 查询

布尔运算符:

  • AND - 缩小结果范围(必须同时包含两个词)
  • OR - 扩大结果范围(包含任一词即可)
  • NOT - 排除词语

查询示例:

"BTK inhibitor"[Title/Abstract] AND selectivity[Title/Abstract]

("kinase inhibitor" OR "protein kinase") AND (selectivity OR "off-target")

"ibrutinib"[Title/Abstract] AND ("IC50" OR "inhibitory concentration")

字段标签:

  • [Title/Abstract] - 仅搜索标题和摘要
  • [Title] - 仅搜索标题(更精确)
  • [Author] - 特定作者
  • [Journal] - 特定期刊
  • [Date] - 日期范围
3. 执行搜索

API 端点:

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?\
db=pubmed&\
term=YOUR_QUERY&\
retmax=100&\
retmode=json&\
sort=relevance

参数:

  • db=pubmed - 搜索 PubMed 数据库
  • term= - 查询内容(对空格和特殊字符进行 URL 编码)
  • retmax=100 - 最大结果数(从 100 开始)
  • retmode=json - 返回 JSON
  • sort=relevance - 按相关性从高到低排序(或使用 pub_date 按最新排序)

Bash 示例:

curl "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=BTK+inhibitor+selectivity&retmax=100&retmode=json&sort=relevance"

响应格式:

{
  "esearchresult": {
    "count": "156",
    "retmax": "100",
    "idlist": ["12345678", "87654321", ...]
  }
}
4. 获取论文元数据

API 端点:

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?\
db=pubmed&\
id=12345678,87654321&\
retmode=json

从响应中提取:

  • 标题
  • 作者(列表)
  • 期刊名称
  • 发表日期
  • 摘要(通过单独的 efetch 调用获取,或使用 esummary)
  • PMID
  • DOI(如果 articleids 中提供)

根据 PMID 获取 DOI:

"articleids": [
  {"idtype": "pubmed", "value": "12345678"},
  {"idtype": "doi", "value": "10.1234/example.2023"}
]

如果缺少 DOI:

  • 使用 PMID 作为备用标识符
  • 稍后尝试通过 PubMed Central 或出版商 API 解析 DOI

输出格式

创建论文对象列表:

[
  {
    "pmid": "12345678",
    "doi": "10.1234/example.2023",
    "title": "Selective BTK inhibitors for autoimmune diseases",
    "authors": ["Smith J", "Doe A", "Johnson B"],
    "journal": "Nature Chemical Biology",
    "year": "2023",
    "abstract": "We developed a series of...",
    "source": "pubmed_search"
  }
]

错误处理

速率限制(重要 - 所有进程/子 Agent 共用):

  • 无 API 密钥:每秒 3 个请求(官方限制)
  • 有 API 密钥:每秒 10 个请求
  • 单个 Agent/脚本: 延迟 500ms(每秒 2 个请求,留有安全余量)
    • 理论上 350ms 已足够,但实际使用中会导致约 20% 的 HTTP 429 错误
  • 多个并行子 Agent: 增加延迟,以共享请求容量
    • 并行 2 个:每个延迟 1 秒(总计每秒 2 个请求)
    • 并行 3 个:每个延迟 1.5 秒(总计每秒 2 个请求)
    • 并行 5 个:每个延迟 2.5 秒(总计每秒 2 个请求)
    • 公式:delay_seconds = (num_parallel / rate_limit) + safety_margin
  • 如果收到 HTTP 429 错误: 等待 5 秒,然后将延迟时间加倍后继续

结果为空:

  • 尝试更宽泛的词语
  • 移除字段标签
  • 检查是否有拼写错误
  • 使用 OR 添加同义词

结果过多(>500):

  • 添加更具体的词语
  • 使用字段标签缩小范围
  • 添加日期限制
  • 考虑拆分为多个子查询

与其他技能集成

搜索完成后:

  1. 将结果保存到研究文件夹,文件名为 initial-search-results.json
  2. 对每篇论文调用 evaluating-paper-relevance 技能
  3. 在 papers-reviewed.json 中跟踪(使用 DOI 作为键,若无则使用 PMID)

快速参考

任务命令
搜索 PubMedcurl "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=QUERY&retmax=100&retmode=json"
获取元数据curl "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=PMID1,PMID2&retmode=json"
对查询进行 URL 编码将空格替换为 +,将特殊字符替换为 %XX
缩小结果范围使用 AND,添加字段标签,使用更具体的词语
扩大结果范围使用 OR,移除字段标签,添加同义词

常见错误

范围过窄: 仅有 5 条结果 → 使用 OR,移除限制条件 范围过广: 有 5000 条结果 → 添加 AND 词项,使用字段标签 缺少摘要: 使用 efetch 而不是 esummary,以获取完整的摘要文本 未找到 DOI: 许多较早的论文没有 DOI,可使用 PMID 作为备用 请求频率受限: 添加 500ms 的延迟(单个 Agent),或设置更长的延迟(共享请求频率限制的并行子 Agent)

后续步骤

完成搜索后:

  • 通知:“找到 N 篇符合查询条件的论文”
  • 使用 skills/research/evaluating-paper-relevance 开始评估
  • 随着论文筛选的进行,向用户更新进度

评论

支持 Markdown