mcpField
S
search-lit

search-lit

github.com/aperivue生产力353138 次安装1 天前更新
代码仓库

关于 search-lit

search-lit 是面向研究者的文献检索与引用管理技能,按工作流搜索数据库、核验书目信息并整理参考文献。它要求引用基于实时数据库结果,并包含结果去重、引文追溯和全文检索交接等步骤。

主要功能

  1. 01跨数据库检索文献与预印本
  2. 02核验 DOI、PMID 和书目元数据
  3. 03去重并整理检索结果
  4. 04沿引用关系扩展候选文献
  5. 05生成带核验状态的 BibTeX

适用场景

  1. 01为研究问题构建并执行文献检索
  2. 02筛选和核验论文引用信息
  3. 03为系统综述进行引文追溯
  4. 04整理候选文献并交接全文检索

MCP 相关

主要通过 MCP 工具搜索 PubMed、Semantic Scholar 和 bioRxiv/medRxiv,并获取文章或预印本信息;PubMed MCP 调用不可用时可切换至 E-utilities。

安装

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

$npx skills add https://github.com/aperivue/medsci-skills --skill search-lit

安装后在 Claude Code 中输入/search-lit确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

skill.yml
references/
embase_browser.md
parse_pubmed.py
pubmed_eutils.sh
snowball.py
references/snowball_challenge/
problem.md
verify.sh
references/snowball_challenge/expected/
snowball.bib
references/snowball_challenge/fixture/
DOI_10_0_seed_err.backward.json
DOI_10_0_seed_trunc.forward.json
DOI_10_0_seed1.backward.json
DOI_10_0_seed1.forward.json
DOI_10_0_seed1.similar.json
library.bib
scripts/
check_doi_record_match.py
scripts/check_doi_record_match_challenge/
verify.sh
scripts/check_doi_record_match_challenge/fixture/
screening.tsv
update_notice.tsv
scripts/check_doi_record_match_challenge/fixture/cache/
10.1000%2Farticle.008.json
10.1000%2Ferratum.007.json
10.1000%2Fmarkup.005.json
10.1000%2Fmatch.001.json
10.1000%2Fother.002.json
10.1000%2Fsuppl.003.json
10.1000%2Fversion.009.json
tests/
test_parse_pubmed.sh
test_pubmed_eutils.sh

详细介绍

文献检索技能

你提供的每条参考文献都必须来自实时数据库结果——切勿仅凭记忆生成引文,因为凭记忆回想出的引文可能看起来真实,却并不存在。

检索工具:MCP(主要)+ E-utilities(备用)

主要:MCP 工具(Claude.ai 远程)
数据库MCP 工具用途
PubMedmcp__claude_ai_PubMed__search_articles按查询词、MeSH 术语检索
PubMedmcp__claude_ai_PubMed__get_article_metadata获取 PMID 的完整元数据
PubMedmcp__claude_ai_PubMed__find_related_articles查找 PMID 的相关文章
PubMedmcp__claude_ai_PubMed__lookup_article_by_citation核验引文
PubMedmcp__claude_ai_PubMed__convert_article_ids在 PMID/DOI/PMCID 之间转换
Semantic Scholarmcp__claude_ai_Scholar_Gateway__semanticSearch跨所有字段进行语义检索
bioRxiv/medRxivmcp__claude_ai_bioRxiv__search_preprints检索预印本服务器
bioRxiv/medRxivmcp__claude_ai_bioRxiv__get_preprint获取预印本的完整元数据
CrossRef使用 https://api.crossref.org/works/{DOI} 的 WebFetch核验 DOI
备用:NCBI E-utilities(通过 Bash 调用直接 API)

如果任何 mcp__claude_ai_PubMed__* 调用返回包含 "terminated"、"not found"、"not available" 或 "not connected" 的错误,请在本次会话中将后续所有 PubMed 调用切换到随附的 E-utilities 脚本。连接断开后不要重试 MCP——在同一对话中无法恢复。

EUTILS="${CLAUDE_SKILL_DIR}/references/pubmed_eutils.sh"
PARSER="${CLAUDE_SKILL_DIR}/references/parse_pubmed.py"

# Search PubMed (returns PMIDs)
bash "$EUTILS" search "diagnostic test accuracy meta-analysis radiology" 20 \
  | python3 "$PARSER" esearch

# Get article summaries as markdown table
bash "$EUTILS" fetch_json "16168343,16085191,31462531" \
  | python3 "$PARSER" esummary

# Get detailed metadata
bash "$EUTILS" fetch "16168343" \
  | python3 "$PARSER" efetch

# Generate BibTeX entries
bash "$EUTILS" fetch "16168343,16085191" \
  | python3 "$PARSER" bibtex

# Verify a citation by exact title
bash "$EUTILS" cite_lookup "Bivariate analysis of sensitivity and specificity" \
  | python3 "$PARSER" esearch

# Find related articles for a PMID
bash "$EUTILS" related "16168343" 10 \
  | python3 "$PARSER" esummary

该脚本会在每次调用之间休眠 350 ms(NCBI 允许无 API 密钥时每秒 3 次请求,使用 NCBI_API_KEY 时每秒 10 次);批量调用须按顺序执行。

MCP 工具E-utilities 命令解析器模式
search_articlessearch <query> [retmax]esearch
get_article_metadatafetch <pmids>efetch 或 bibtex
find_related_articlesrelated <pmid> [retmax]esummary
lookup_article_by_citationcite_lookup <title>esearch → fetch
convert_article_ids不可用(请使用 CrossRef DOI 查询)—

工作流

阶段 1:检索策略
  1. 获取需要参考文献的研究主题、问题或稿件章节。
  2. 根据关键概念(人群、干预/暴露、对照、结局)构建查询,并为 PubMed 添加 MeSH 术语:(concept1 OR synonym1) AND (concept2 OR synonym2)。
  3. 设定范围:日期区间(默认最近 10 年,除非用户另有指定)、文章类型和语言(默认英语)。
  4. 向用户展示布尔查询、数据库和筛选条件。

关卡: 运行检索前等待用户批准。

阶段 2:执行检索
  1. 检索 PubMed(search_articles,布尔查询)、Semantic Scholar(semanticSearch,自然语言查询);若预印本相关,则检索 bioRxiv/medRxiv(search_preprints)。
  2. 按 DOI 或标题相似度对不同数据库的结果去重。
  3. 将结果呈现在下表中,并将相同的行写入 references/search_results.tsv:
| # | Title | Authors (first + last) | Year | Journal | PMID/DOI | Relevance |
|---|-------|----------------------|------|---------|----------|-----------|
| 1 | ...   | Kim J, ... Lee S     | 2024 | Radiology | 12345678 | High      |
  1. 请用户选择要纳入的论文。
记录来源声明存在的记录,而不只是下载的记录

错误的收录不会触发错误,而基于错误数字构建的 PRISMA 流程图就是虚构的,下游也不会有任何环节对此提出质疑。请检查以下两点:

  • 计数恰好等于页面上限。 每个来源都会报告总数: esearchresult.count、opensearch:totalResults、meta.count。将 api_total 与 downloaded 一并记录;当 downloaded < api_total,或 downloaded 恰好等于页面或 循环上限时,都要明确报错(例如,循环中的 if start >= 2000: break 恰好返回 2,000 条记录)。打印 TRUNCATED,并拒绝写入搜索记录。
  • 从未实际生效的布尔运算符。 OpenAlex 的 search= 是按相关性排序的全文搜索参数,会静默忽略 AND/OR;filter=title_and_abstract.search: 才会按这些运算符筛选。将查询再运行一次,并否定其中一个必需条件。如果命中数没有下降,说明布尔运算符被忽略了——引擎只是在排序,而不是筛选。

只有通过 E-utilities 查询 PubMed 时,简单模式才安全。其他所有情况都要同时执行这两项检查。

筛选表中的 DOI 不一定属于该条记录

如果流程是通过标题相似度与 Crossref 匹配来填入 doi 列,而不是从记录中直接获取 DOI,那么错误匹配也可能是有效且可解析、但属于另一篇论文的 DOI。在据此作出任何决定之前,请先解析 DOI 并读回标题:

python3 "${CLAUDE_SKILL_DIR}/scripts/check_doi_record_match.py" --table 2_Screening/round3.tsv \
        --email <contact> --json qc/doi_record_match.json

DOI_NOT_THIS_RECORD 表示该 DOI 解析到另一篇论文;DOI_IS_CONTAINER 表示其解析到期刊期、增刊或会议论文集,而非文章;DOI_IS_UPDATE_NOTICE 表示其解析到更正、勘误或撤稿通知(Crossref update-to),而非该通知所更新的文章;DOI_UNRESOLVED 表示该 DOI 无法解析,不会被直接丢弃。这项检查在筛选阶段运行,此时错误的 DOI 仍很容易处理;/verify-refs 则用于审查已完成的参考文献列表。

阶段 2.5:引文检索(滚雪球法)

可选;建议用于系统综述和全面的背景研究(PRISMA 条目 7,“通过引文检索识别的记录”)。使用 Semantic Scholar Graph API 辅助工具,沿引文图扩展种子集:

python3 "${CLAUDE_SKILL_DIR}/references/snowball.py" \
  --seed DOI:10.1000/synthetic.example,PMID:00000000 \
  --direction all \
  --pool references/library.bib \
  --out references/library.bib
  • 方向:backward(种子论文引用的参考文献)、forward(引用种子论文的论文)、 similar(S2 推荐),或 all(默认值)。按 DOI 和标准化标题,与 --pool 中的记录以及本次 收集的记录进行去重。
  • 可信标记:候选记录将标记为 verified=false + verified_by=semantic_scholar。引用前请对每条记录运行 /verify-refs(或阶段 4 的验证)。
  • 输出约定:仅追加到 references/library.bib;脚本会硬性拒绝写入 manuscript/_src/refs.bib。
  • PRISMA 行:脚本会打印 Records identified through citation searching (snowballing): N raw (backward=…, forward=…, similar=…); after dedup against existing pool: M new candidates. 将 M 记录在 PRISMA 流程图的引文检索框中。
  • 未完成的运行:如果任何种子/方向的抓取失败,或者来源表明 --limit 之后还有更多记录(存在 next 页),脚本会针对每个 种子/方向打印一行 FAILED 或 TRUNCATED,在 PRISMA 行末尾附上 INCOMPLETE,并以退出码 1 结束。这些计数只是下限。 不要记录这些计数;请重新运行(或提高 --limit),直到运行以退出码 0 结束。
阶段 3:深入阅读

对于每篇入选论文,获取完整元数据(PubMed 使用 get_article_metadata,bioRxiv 使用 get_preprint),并提取研究设计、样本量/数据集、关键方法、主要发现(附具体数字)以及作者明确指出的局限性。对于多篇论文,请整理文献矩阵以便审阅:

| Paper | Design | N | Key Finding | Limitation | Relevance to Our Study |
|-------|--------|---|-------------|------------|----------------------|
阶段 4:引文管理
核验
  1. 绝不编造 DOI 或 PMID。 如果找不到,请将参考文献标记为 [UNVERIFIED - NEEDS MANUAL CHECK]。
  2. 对照 API 结果核查每条参考文献:第一作者和末位作者、发表年份、期刊、文章标题(必须完全一致,不得改写),以及可用的卷号/页码。标出每个不匹配的字段。
  3. 使用 WebFetch https://api.crossref.org/works/{DOI} 确认每个 DOI 均可解析(CrossRef 出错时,请遵循“错误处理”)。
生成 BibTeX

为每条参考文献生成一个条目,无论是否已核验,都必须明确标注 verified:

@article{FirstAuthorLastName_Year_ShortKey,
  author    = {Last1, First1 and Last2, First2 and Last3, First3},
  title     = {Full Title As Retrieved From Database},
  journal   = {Journal Name},
  year      = {2024},
  volume    = {310},
  number    = {2},
  pages     = {e234567},
  doi       = {10.1001/jama.2024.12345},
  pmid      = {12345678},
  verified  = {true},
  verified_by = {pubmed+crossref},
  verified_on = {2026-04-24},
}
verified(每个条目都必须填写)含义
true已通过 PubMed/CrossRef 确认 DOI 或 PMID;标题、作者和年份均匹配
false从文本中解析得出,但 API 查询失败或结果不匹配;手稿中必须显示 [UNVERIFIED - NEEDS MANUAL CHECK]
manual用户在查询失败后明确添加;仍未经核验

verified_by 列出用于确认的来源(pubmed、crossref、semantic_scholar,或它们的组合);verified_on 是最近一次成功核验的 ISO 日期。下游脚本不会读取这些字段——/verify-refs 会重新核验每个条目——因此这些字段用于记录可信度,而不是作为可信凭证。

BibTeX 键命名规则:FirstAuthorLastName_Year_OneWord(例如,Kim_2024_Validation)。该键是临时的:/lit-sync 将条目导入 Zotero 时,Better BibTeX 会分配可引用的键。

输出
  1. 将条目追加到 references/library.bib(不要覆盖)——这是 /lit-sync 导入 Zotero 的候选条目池。绝不要写入 manuscript/_src/refs.bib,因为它只能由 /lit-sync(通过 Better BibTeX)写入。
  2. 打印包含核验状态的摘要:
Verified:    12 references (verified=true)
Unverified:   1 reference  (verified=false) [NEEDS MANUAL CHECK]
Total:       13 references
阶段 4b:Zotero 文献库集成

将内容导入 Zotero 属于 /lit-sync 的职责;它负责写入 Zotero 和 references/zotero_collection.json:将 references/library.bib 交给它。如果已连接 Zotero MCP 服务,你可以在此处从中读取信息——使用 zotero_search_items(按 DOI)标记文献库中已有的候选条目,使用 zotero_get_annotations 引用用户之前的阅读笔记。

阶段 5:全文检索

交由 /fulltext-retrieval 处理,它是开放获取检索流程的唯一入口;不要在此重新实现开放获取文件检索。传入 references/library.bib 中已核验候选条目的 DOI:

ENGINE="${CLAUDE_SKILL_DIR}/../fulltext-retrieval/fetch_oa.py"
# extract DOI + Title (and PMID/FirstAuthor when available) → worklist.tsv
python3 "$ENGINE" worklist.tsv -o pdfs/ -e <contact-email> --report pdfs/retrieval_report.json

请在任务清单中使用已核验的文献标题,而不是仅列出 DOI。将检索报告中的 source_identity 和 file_sha256 与记录一并保留。引用前,不能仅凭下载成功和标题一致就认定 PDF 已核验:请检查冲突、未解决/不可用的证据,以及哈希值发生变化的文件。较早报告中缺失的身份字段表示尚未评估;即使标记为 consistent,也只是对首页信息的佐证,并非对论文论点的核验。

对于 Zotero 中已有的 PDF 和支持代理的检索,请使用 /lit-sync 阶段 2.7。对于 pdfs/manual_needed.txt 中的 DOI,只能使用机构渠道(图书馆自有订阅、代理或 VPN)、馆际互借,或联系通讯作者。绝不要绕过付费墙或出版商的访问控制,也不要配置未经授权的 PDF 镜像。

阶段 6:差距分析

在撰写手稿期间调用时,提取手稿中的行内引用,与搜索结果进行比较,并报告具体差距:未引用的关键论文、有更新版本的过时参考文献,以及缺失的方法学参考文献(统计方法、报告指南)。


专项搜索模式

模式:手稿参考文献候选池

提供手稿的参考文献候选池——通常由 /write-paper 第 7.3c 步骤(或 /self-review 第 2.5c-2 阶段)调用,用于在参考文献充足性检查发现草稿的参考文献数量未达目标,或某个具名方法尚未引用时;也可直接用于原创研究的参考文献列表。

对于原创研究文章,返回 25–40 篇经核实的候选文献,而不是快速搜索后凑出的约 10 篇。如果该领域确实文献稀少,请明确说明,而不要默默返回一份单薄的列表。如果用户指定了更严格的期刊参考文献上限或范围,请遵守。

涵盖 六类候选文献:

  1. 背景/疾病负担/临床背景 — 说明研究问题为何重要。
  2. 界定研究空白的既往研究 — 手稿在此基础上扩展或提出相反观点的工作。
  3. 对照研究/设计相近的队列研究 — Results 将与之进行比较的研究。
  4. 方法/统计学经典来源 — 为每个具名方法、模型、评分、方程或诊断标准提供其源头参考文献(例如竞争风险模型、多重插补、E 值、eGFR 方程、一致性统计量)。此类别用于填补 Methods 中具名方法的引用空白。
  5. 报告指南来源 — STROBE、TRIPOD(+AI)、CONSORT、PRISMA(-DTA)、STARD 等。
  6. 支持解读/机制/局限性的文献 — 为 Discussion 中的论断提供依据。

对于每个候选文献,报告 PMID/DOI、核实状态、候选类别、目标手稿章节,以及一句话说明所需理由。条目在第 4 阶段后才会进入 references/library.bib。此模式仅生成候选文献:是否纳入由用户决定,且不会将参考文献插入手稿的 bib 文件。

模式:文献拥挤度检查

在设计研究之前运行。背景搜索(“关于这个主题已有何研究”)会留下盲区;应改为提出四个更具体的问题:

询问对象判断
研究问题已被研究/部分被研究/尚未研究
抽样框(涉及哪些人群、哪些记录、哪些年份)已被研究/部分被研究/尚未研究
测量维度(编码或测量什么,以及粒度如何)已被研究/部分被研究/尚未研究
目标期刊已在该刊发表/相近/尚未发表

分别给出判断:一项设计可能在某个维度上具有原创性,却在另一个维度上已被充分研究;把四项合并成一个答案会掩盖这一点。期刊这一项并非虚荣指标:曾有一项设计在研究框架、编码维度和期刊上都与现有论文吻合——而该期刊正是它的首选。大多数情况下,此模式会收窄论断,而非终止项目(例如,从“没人研究过这个问题”收窄为“没人按来源对其进行分解”),而收窄后的论断经得起评审。

像竞争者那样搜索:查找确切的研究框架、确切的测量指标,以及期刊官网,而不只是搜索主题。报告四项判断及其背后的论文,然后交由用户决定。

模式:系统性检索

用于系统综述或全面的文献章节:

  1. 记录完整的检索策略(符合 PRISMA 要求)。
  2. 记录:数据库、检索日期、查询字符串、结果数量。
  3. 跟踪每个筛选步骤中的纳入/排除情况。
  4. 输出 PRISMA 流程图数据摘要。
模式:快速引用

对于用户描述的单篇参考文献(“那篇 Smith 在 2023 年发表的关于 AI 用于胸部 X 光的论文”):根据所给细节搜索 PubMed 和 Semantic Scholar,列出排名最高的 3 个候选项,并为用户确认的文献生成 BibTeX 条目。

模式:相关论文

根据 PMID 或 DOI,使用 find_related_articles 获取相关论文,并结合基于 Semantic Scholar 引用关系的推荐,按相关性排序。若要进行结构化、去重感知且可计入 PRISMA 的扩展检索(向后追溯 + 向前追踪 + 相似文献),请改用 references/snowball.py 中的 第 2.5 阶段:引文检索。

模式:Embase 浏览器自动化

Embase 没有公共 API。搜索必须包含 Embase 时,请阅读 ${CLAUDE_SKILL_DIR}/references/embase_browser.md,其中包含 Chrome 自动化导出步骤、CSV 行格式,以及 PubMed → Embase 查询转换说明。


错误处理

  • 如果搜索返回 0 条结果,请扩大查询范围(移除一个概念或使用更宽泛的 MeSH 术语)并重试。
  • CrossRef HTTP 错误(节省令牌规则):
    • **403(触发速率限制):**请勿重试。跳过 CrossRef → 改用 PubMed 标题搜索进行验证。
    • **303(重定向):**如果可能,请跟随重定向。如果无法跟随,则跳过 CrossRef → 回退到 PubMed。
    • 会话中首次遇到 CrossRef 403/303 后,剩余所有参考文献均跳过 CrossRef,直接使用 PubMed 标题验证,以避免 N× 重试造成的令牌浪费。
    • 请勿打印原始错误消息(“Request failed with status code 403.”)。在末尾报告一行摘要:CrossRef unavailable for {N} references (rate-limited). Verified via PubMed instead.
  • 如果 DOI 无法通过 CrossRef 解析(遵循上述规则后),请按标题搜索 PubMed,以确认该参考文献确实存在。
  • 如果无法通过任何方法验证某条参考文献,请说明:“此参考文献无法验证。请在提交前手动检查。”绝不要悄然纳入未经验证的参考文献。

已知限制

  • check_doi_record_match.py 会按相似度阈值比较标题,并读取结构化的 Crossref 字段(type、update-to)。研究方案或多部分论文的第 2 部分,如果标题与行中的标题只差一个词或一个数字,就不会与该行所描述的论文区分开来;没有结构化字段可以标记这种差异。请将未发现问题的运行结果视为“未检测到不匹配”,而不是每个 DOI 都正确的证明。

评论

支持 Markdown