关于 The Abstractinator
The Abstractinator 面向研究人员和 AI 助手,跨多个数据库搜索免疫学与病毒学文献、临床试验和资助项目。它并行查询来源、合并重复记录,并为结果标注免疫细胞和病原体类别;远程 MCP 服务可免密钥访问开放来源。
主要功能
- 01并行搜索多个研究数据库
- 02跨来源合并重复记录
- 03标注免疫细胞和病原体
- 04交互式趋势图表
- 05导出阅读列表到 Zotero 或 EndNote
适用场景
- 01检索免疫学主题相关文献
- 02查找相关临床试验和资助项目
- 03查看病毒与免疫细胞的趋势
- 04将选定论文导出到 Zotero 或 EndNote
MCP 相关
远程 MCP 服务提供 `search_literature` 工具,返回来自开放来源且按来源均衡的记录。MCP 访问无需 API 密钥,并设有调用频率限制。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.abstractinator.me/mcpclaude mcp add --transport http ckangas2-abstractinator https://mcp.abstractinator.me/mcp{"mcpServers":{"ckangas2-abstractinator":{"type":"http","url":"https://mcp.abstractinator.me/mcp"}}}在 Cursor 中打开{"servers":{"ckangas2-abstractinator":{"type":"http","url":"https://mcp.abstractinator.me/mcp"}}}在 VS Code 中打开{"mcpServers":{"ckangas2-abstractinator":{"type":"http","url":"https://mcp.abstractinator.me/mcp"}}}{"mcpServers":{"ckangas2-abstractinator":{"serverUrl":"https://mcp.abstractinator.me/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
详细介绍
The Abstractinator
一次搜索,同时检索多个数据库中的免疫学与病毒学文献。
abstractinator.me ·
连接你的 AI ·
自行托管
The Abstractinator 将文献检索整合为一次搜索。它会并行查询 Europe PMC、OpenAlex、 ClinicalTrials.gov、bioRxiv/medRxiv、NIH RePORTER 和 NSF Awards,合并不同来源的 重复记录,并使用加权标题/摘要评分矩阵,为每条记录标注最显著的免疫细胞类型 和病毒。
新搜索大约需要 5–10 秒;7 天内重复搜索可即时完成。
✨ 功能
| Searchinator | 同时查询所有来源;搜索速度取决于最慢的来源,而非所有来源耗时之和。 |
| Deep search | 可选模式,每个来源最多提取 250 条结果,而不是 50 条(覆盖范围约提升 4 倍,耗时约 15–30 秒)。 |
| Deduplicatinator | 按 DOI(包括预印本 → 已发表论文的 DOI 链接)合并不同来源的记录,再按标题合并,并优先采用整理质量最佳的来源。 |
| 标注 | 根据整理过的别名列表,为每条记录标注其最相关的免疫细胞类型、病毒和细菌。 |
| Plotinator pools | 无需重新搜索,即可在病毒和细菌(或你添加的任何类别)之间切换图表的病原体轴。 |
| Plotinator | 展示病毒与免疫趋势随时间变化的交互式图表。 |
| Readinator | 创建阅读列表,并导出到 Zotero 或 EndNote。 |
| Agentinator | 一个 MCP 服务,让 AI 助手(Claude 等)可以直接搜索 The Abstractinator。 |
📚 数据来源
| 来源 | 访问方式 | 覆盖范围 |
|---|---|---|
| Europe PMC | 开放 | 生物医学文献(包括 PubMed) |
| OpenAlex | 开放 | 全球学术图谱 |
| ClinicalTrials.gov | 开放 | 人体临床研究注册信息 |
| bioRxiv / medRxiv | 开放(本地副本) | 预印本,从每日更新的本地 Parquet 存储中检索 |
| NIH RePORTER | 开放 | 美国联邦政府资助项目 |
| NSF Awards | 开放 | 基础研究资助项目 |
| CORE | 你的 API 密钥 | 开放获取全文聚合 |
| USPTO (PatentsView) | 你的 API 密钥 | 专利 |
| Scopus / Embase | 你的 API 密钥,默认关闭 | 摘要检索仅在订阅机构的网络中可用,因此除非设置 ENABLE_SCOPUS=1,否则会禁用 |
需要密钥的来源采用自带密钥模式:在 Settings(☰)中输入密钥。密钥仅保存在你的 浏览器会话中,不会被记录或写入磁盘,也不会与其他访客共享。
🤖 与 AI 搭配使用
The Abstractinator 提供远程 MCP 服务。MCP 是 AI 助手用来连接工具的开放标准。
https://mcp.abstractinator.me/mcp
**在 Claude 中:**依次选择 Settings → Connectors → Add custom connector → 粘贴上方的 URL,并选择 No sign-in 进行身份验证。然后直接提问,例如:“在 The Abstractinator 中搜索黑色素瘤的溶瘤 病毒试验。” 任何支持远程(可流式传输的 HTTP)服务的 MCP 客户端也都能使用。
该服务提供一个工具:
search_literature(query, max_results=25, abstract_chars=1500, deep=False)
返回 total_found、source_counts,以及一个均衡呈现各来源的记录列表,包含 title、
abstract、authors、publication_date、doi、url、source、primary_cell、
primary_virus 和 is_bioinformatics。
AI 连接器仅使用开放获取来源(无需密钥,也不会消耗密钥),并设有速率限制,以确保所有人都能使用该服务。
🏗️ 工作原理
Browser ──► Cloudflare ──► abstractinator.me ──► Shiny Server :3838 (app.R) ─────────┐
├─► search engine ──► shared cache
AI ──► Cloudflare ──► mcp.abstractinator.me ──► MCP server :8200 (agent/mcp_server.py)│ (orchestrate_extraction.R)
└──► REST API :8100 (agent/api.R) ┘
- 一个搜索引擎,两个入口。
orchestrate_extraction.R会检查缓存,将每个来源作为后台任务(future)启动,然后合并、去重并标记结果。网站通过 Shiny 的ExtendedTask异步调用它,因此一位访客的搜索不会让其他人的页面卡住。REST API 则同步调用相同的代码。 - 共享缓存。 搜索结果会在
.cache/s3_mimic/中缓存 7 天(每次搜索对应一个.rds文件,按搜索词、深度和使用了哪些需要密钥的来源作为键)。一个人搜索过的内容,AI 搜索时也会立即返回,反之亦然。 - 本地预印本。 bioRxiv/medRxiv 的搜索通过 Arrow 从
biorxiv_local_db/中读取(每年一个 Parquet 文件),而不是每次搜索都调用它们的 API。 - 命中检测。 系统会根据免疫细胞、病毒和细菌别名列表(
aliases.R)匹配标题和摘要;标题命中权重为 20,摘要命中权重为 3,得分最高的类别会成为primary_cell/primary_virus/primary_bacteria。别名按完整单词匹配,因此 “salmonella” 不会匹配 “salmonellosis”。 - 可切换的类别池。 Plotinator 的病原体轴并未硬编码为病毒:通过切换类别池,可以选择要绘制的已标记类别,同一次搜索也可以从不同视角查看。添加类别池(真菌、寄生虫、药物类别、实验室自定义词汇)只需在
aliases.R中定义别名列表,在orchestrate_extraction.R中使用tag_with_alias_list()为其添加标记,并在app.R的PATHOGEN_POOLS中添加一项——欢迎贡献。 - 日志记录。 网站搜索会向
.cache/s3_mimic/logs/写入一条简短的 JSON 记录(搜索词、耗时、结果数量、是否命中缓存,以及是否存在密钥,但绝不记录密钥)。通过应用提交的反馈会保存到.cache/s3_mimic/feedback/;如果设置了DATA_WEBHOOK_URL,还会转发到 Discord。 - 显示安全。 外部数据库中的文本在显示前会进行 HTML 转义,仅允许基本格式标签(斜体、粗体、下标/上标、换行)通过,并且链接仅限普通
http(s)URL。
🖥️ 自托管
要求
- Linux(已在 Ubuntu 上测试)、R ≥ 4.1、Python ≥ 3.10(用于 MCP 服务)
- 系统库:
sudo apt install -y r-base r-base-dev libcurl4-openssl-dev libssl-dev libxml2-dev \ libsqlite3-dev libfontconfig1-dev libharfbuzz-dev libfribidi-dev libfreetype6-dev \ libpng-dev libtiff5-dev libjpeg-dev libglpk-dev libgmp3-dev libsodium-dev cmake gfortran - R 软件包(请安装到系统库,以便 Shiny Server 能够访问):
sudo /usr/bin/Rscript -e 'install.packages(c("shiny","bslib","shinyjs","shinythemes","shinyWidgets", "tidyverse","DT","plotly","htmltools","htmlwidgets","htmlTable","jsonlite","digest","future", "promises","parallelly","arrow","httr","httr2","RSQLite","DBI","uuid","lubridate","ggbeeswarm", "plumber"), repos = "https://cloud.r-project.org", Ncpus = 8)'
使用 conda? Shiny Server 和各项服务使用的是系统 R,路径为
/usr/bin/R。请使用/usr/bin/Rscript安装软件包(或先运行conda deactivate),确保软件包安装到正确位置。
1. 获取代码并进行配置
git clone https://github.com/ckangas2/abstractinator.git
cd abstractinator
可选:在项目根目录中创建 .Renviron:
INTEGRATE_NIH_NSF=1 # include NIH & NSF grants (the app also sets this)
[email protected] # sent to OpenAlex for its "polite pool"
ENABLE_SCOPUS=0 # set to 1 only on a subscribing institution's network
DATA_WEBHOOK_URL= # optional Discord webhook for updater notifications
服务器不需要 API 密钥:网站严格采用自带密钥模式,绝不会使用 .Renviron 中的密钥;AI 连接器仅使用开放访问的来源。(.Renviron 中的密钥仅供你自行运行的命令行脚本读取。)
2. 构建预印本存储库(仅需一次,需要数小时)
tmux new -s biorxiv
Rscript write_parquet_bioRxiV.R # resumable: finished years are skipped on rerun
按 Ctrl+B, D 脱离会话。每年数据写入后,搜索即可立即使用。
3. 在本地运行
/usr/bin/Rscript -e 'shiny::runApp(port = 4000)' # website
/usr/bin/Rscript agent/run_api.R # REST API on 127.0.0.1:8100 (run from repo root)
4. 生产环境设置(abstractinator.me 的运行方式)
Shiny Server 在根路径提供应用,且仅监听 localhost
(/etc/shiny-server/shiny-server.conf):
run_as shiny;
server {
listen 3838 127.0.0.1;
location / {
app_dir /srv/shiny-server/abstractinator;
log_dir /var/log/shiny-server;
app_idle_timeout 0;
}
}
API 和 MCP 服务(以 shiny 用户身份运行):
sudo /usr/bin/python3 -m venv /opt/abstractinator-mcp
sudo /opt/abstractinator-mcp/bin/pip install "mcp[cli]" # MCP Python SDK 2.x
sudo cp agent/abstractinator-api.service agent/abstractinator-mcp.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now abstractinator-api abstractinator-mcp
每日更新预印本(初始构建完成后):
sudo -u shiny mkdir -p logs
sudo cp deploy/abstractinator.cron /etc/cron.d/abstractinator # runs update_biorxiv_db.R at 4:15am
通过 Cloudflare Tunnel 公开访问
(无需开放端口):将 abstractinator.me 路由到 http://localhost:3838,并将
mcp.abstractinator.me 路由到 http://localhost:8200。REST API 保持私有。
更新线上网站
cd /srv/shiny-server/abstractinator
sudo -u shiny git pull
sudo systemctl restart shiny-server # app.R, www/, search scripts
sudo systemctl restart abstractinator-api # agent/api.R, search scripts
sudo systemctl restart abstractinator-mcp # agent/mcp_server.py
运行测试
# Fast offline tests (these also run on GitHub with every push)
Rscript -e 'testthat::test_dir("tests/testthat")'
# Plus live end-to-end searches against the real databases (needs internet, ~1-2 min)
ABSTRACTINATOR_LIVE_TESTS=1 Rscript -e 'testthat::test_dir("tests/testthat")'
使用日志
网站或 AI Agent 发起的每次搜索都会记录,且不包含个人数据。 按渠道划分的每日搜索次数:
cd /srv/shiny-server/abstractinator
sudo -u shiny /usr/bin/Rscript -e 'source("R/log_utils_local.R"); print(summarize_search_logs())'
REST API 参考(仅限本地)
GET /search?q=<term>&limit=25&abstract_chars=1500&deep=false
limit:返回的结果数(1–100),从各来源轮流选取abstract_chars:摘要截断长度;0表示不包含摘要deep:设为true时,每个来源最多返回 250 条结果- 可选请求头
X-CORE-Key和X-USPTO-Key可在本次请求中启用相应来源 - 服务端全局限制为每分钟 20 次搜索(超出时返回 HTTP 429)
GET /health 返回 {"status":"ok"}。
🗂️ 仓库布局
| 路径 | 内容 |
|---|---|
app.R | Shiny Web 应用 |
orchestrate_extraction.R | 搜索引擎:缓存 → 并行查询来源 → 去重 → 命中检测 |
*_extraction.R | 每个来源对应一个提取器(EPMC、OpenAlex、CORE、ClinicalTrials.gov、bioRxiv、NIH、NSF、PatentsView、Scopus) |
deduplication.R、aliases.R | 跨来源去重;免疫细胞和病毒别名列表 |
R/db_utils_local.R、R/log_utils_local.R | 搜索缓存和搜索日志(网站和 Agent 搜索) |
R/display_utils.R | HTML 清理、导出文本清理,以及应用的稳定结果 ID |
tests/ | 离线单元测试和可选的实时搜索测试(testthat);在 GitHub Actions 上运行 |
agent/ | REST API(api.R、run_api.R)、MCP 服务(mcp_server.py)、systemd 单元 |
deploy/ | Cron 计划 |
write_parquet_bioRxiV.R、update_biorxiv_db.R | 构建并更新本地预印本存储 |
www/ | 样式、脚本、图标和吉祥物插画 |
agent_api.R、cli_engine.R、abstractinator_bridge.py | 较旧的本地 Agent 接口(知识库功能正在重新开发) |
🛣️ 路线图
发展方向是从检索转向整理。当前流程已应用一致的编辑规则——当两条记录指向同一项研究时,确定保留哪个版本、适用哪些词汇标签,以及如何对各来源进行抽样——但尚未判断一项研究是否可靠,或与所提问题的相关程度。以下各项都会增加一项判断。
- 相关性排序(优先显示最佳匹配,依据命中分数和时效性)
- 跳过对查询失败的来源进行缓存
- 将 AI Agent 搜索与网站搜索一并记录
- 由关系型知识库支持的更智能 Agent 工具(差距分析、“哪些主题研究不足”)
⚖️ 许可证与品牌
代码采用 MIT License 开源:欢迎使用、修改和扩展,但须保留版权声明。
名称和品牌不属于该许可证的范围。“The Abstractinator”、-inator 功能名称(Searchinator、Deduplicatinator、Plotinator、Readinator、Agentinator)以及网站的外观,均用于标识 abstractinator.me 上的官方项目。如果你运行自己的副本或派生项目,请使用自己的名称和品牌,不要将其宣传为官方 Abstractinator。注明“基于 The Abstractinator”并附上链接,我们将不胜感激。
www/ 中的第三方图标归其创作者所有,并依据 Flaticon 许可证使用(详见 CREDITS.md);这些图标不受 MIT License 涵盖。
🙏 致谢
吉祥物和图标来自 Flaticon(海象由 Smashicons 创作,恐龙由 imaginationlol 创作,青蛙王子由 Magnific 创作);线描动画来自 Noun Project。详情见 CREDITS.md。
📜 引用
如果你在研究中使用 The Abstractinator,请引用:
Kangas, C. (2026). The Abstractinator: Automated Boolean Search Tool for Rapid Acquisition, Classification, and Triage of Immuno-Networks And Therapeutic Oncolytic Research (Version 2.0.0) [Computer software]. https://abstractinator.me
@software{TheAbstractinator2026,
author = {Kangas, Chase},
title = {The Abstractinator: Automated Boolean Search Tool for Rapid Acquisition, Classification, and Triage of Immuno-Networks And Therapeutic Oncolytic Research},
year = {2026},
url = {https://abstractinator.me},
version = {2.0.0}
}
重现环境
renv.lock 记录了线上部署所运行的确切软件包版本,这些版本取自该机器的库(R 4.6.1,155 个软件包)。如需安装相同的软件包:
install.packages("renv")
renv::restore(lockfile = "renv.lock", library = .libPaths()[1], prompt = FALSE)
锁文件是记录,而非已激活的 renv 项目:此仓库中没有 .Rprofile 和 renv/ 目录,这两者均已加入 gitignore。线上服务通过 git pull 更新;若以这种方式引入 .Rprofile,Shiny 和 plumber 服务就会切换到一个尚未为服务用户填充的软件包库,导致网站停机。
.github/workflows/tests.yml 会在每次推送时,使用当前软件包版本运行离线测试套件;.github/workflows/deps.yml 每周恢复锁定的版本并运行相同的测试套件,因此无需拖慢每次提交,也能及时发现版本偏差。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。