The Abstractinator について
The Abstractinatorは、研究者やAIアシスタント向けに、免疫学・ウイルス学の文献、臨床試験、助成金を複数データベースから検索します。並列検索、重複レコードの統合、免疫細胞や病原体のタグ付けを行い、リモートMCPサーバーからAPIキーなしでオープンアクセスの情報を検索できます。
主な機能
- 01複数の研究データベースを並列検索
- 02データソース間の重複レコード統合
- 03免疫細胞と病原体のタグ付け
- 04インタラクティブな傾向グラフ
- 05Zoteroまたは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 | ソースごとの取得件数を 50 件から最大 250 件に増やすオプションモードです(カバー範囲は約 4 倍、所要時間は約 15~30 秒)。 |
| Deduplicatinator | DOI(プレプリントから出版版への DOI リンクを含む)でソース間のレコードを統合し、次にタイトルで統合します。その際、最も適切にキュレーションされたソースを優先します。 |
| タグ付け | キュレーションされた別名リストを使い、各レコードが最も強く関連する免疫細胞の種類、ウイルス、細菌を示すラベルを付けます。 |
| Plotinator pools | 検索をやり直さずに、プロットの病原体軸をウイルス、細菌、または追加した任意のプールに切り替えられます。 |
| Plotinator | ウイルスと免疫の経時的な傾向を示すインタラクティブなグラフです。 |
| Readinator | 読書リストを作成し、Zotero または EndNote にエクスポートできます。 |
| Agentinator | AI アシスタント(Claude など)が The Abstractinator を直接検索できる MCP サーバーです。 |
📚 データソース
| ソース | アクセス | 対象 |
|---|---|---|
| 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 は、AI アシスタントがツールに接続するために使うオープン標準である、リモート MCP サーバーとして利用できます。
https://mcp.abstractinator.me/mcp
Claude での設定: Settings → Connectors → Add custom connector の順に選び、上記の URL を貼り付け、認証には No sign-in を選択してください。その後は、たとえば 「The Abstractinator でメラノーマの腫瘍溶解性 ウイルスの試験を検索して」 と尋ねるだけです。リモート(ストリーミング可能な HTTP)サーバーに対応する MCP クライアントであれば、どれでも利用できます。
サーバーが公開するツールは 1 つです。
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) ┘
- 検索エンジンは1つ、入口は2つです。
orchestrate_extraction.Rがキャッシュを確認し、すべてのソースをバックグラウンドジョブ(future)として起動してから、結果を統合、重複排除し、タグ付けします。ウェブサイトは Shiny のExtendedTaskを介して非同期に呼び出すため、ある訪問者の検索によって他の訪問者のページが停止することはありません。REST API は同じコードを同期的に呼び出します。 - 共有キャッシュ。 結果は
.cache/s3_mimic/に7日間キャッシュされます(検索ごとに1つの.rdsファイルを保存し、検索語、深度、使用したキー付きソースを基に管理します)。ある人が行った検索は AI にとっても即座に利用でき、その逆も同様です。 - ローカルのプレプリント。 bioRxiv/medRxiv は、検索のたびに API にアクセスするのではなく、Arrow を使って
biorxiv_local_db/(年ごとに1つの Parquet ファイル)から検索されます。 - ヒット検出。 タイトルと要旨を免疫細胞、ウイルス、細菌のエイリアスリスト(
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に項目を1つ追加します。貢献を歓迎します。 - ログ記録。 ウェブサイトでの検索は、小さな JSON レコード(検索語、所要時間、結果数、キャッシュヒットの有無、キーが存在したかどうか。キー自体は記録しません)を
.cache/s3_mimic/logs/に書き込みます。アプリから送信されたフィードバックは.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 キーは必要ありません。ウェブサイトは厳密に BYOK(独自のキーを持ち込む方式)であり、.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 エージェントからのすべての検索は、個人データを含めずに記録されます。 チャネル別に分けた1日あたりの検索数:
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を指定すると、そのリクエストで該当ソースが有効になります - サーバー全体で1分あたり20回に制限されます(超過時は HTTP 429)
GET /health は {"status":"ok"} を返します。
🗂️ リポジトリの構成
| パス | 内容 |
|---|---|
app.R | Shiny ウェブアプリ |
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 | 検索キャッシュと検索ログ(ウェブサイトおよびエージェントの検索) |
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 | 以前のローカルエージェントインターフェース(ナレッジベース機能は再設計中) |
🛣️ ロードマップ
目指す方向は、検索からキュレーションへの移行です。パイプラインではすでに一貫した編集ルールを適用しています。つまり、2つのレコードが同じ研究を指す場合にどのバージョンを残すか、どの語彙ラベルを適用するか、ソース間でどのようにサンプリングするかを決めています。しかし、研究の妥当性や、質問との関連性はまだ評価していません。以下の各項目で、評価基準を1つずつ追加します。
- 関連度のランキング(ヒットスコアと新しさを使い、最適な一致を先頭に表示)
- ソースでエラーが発生した検索はキャッシュしない
- ウェブサイトの検索と並行して AI エージェントの検索も記録する
- リレーショナルナレッジベースに基づく、よりスマートなエージェントツール(ギャップ分析、「研究が不十分な分野」の特定)
⚖️ ライセンスとブランド
コードは MIT License の下でオープンソースです。著作権表示を残せば、自由に使用、変更、改良できます。
名称とブランドはこのライセンスの対象ではありません。「The Abstractinator」、-inator の機能名(Searchinator、Deduplicatinator、Plotinator、Readinator、Agentinator)、およびサイトの外観は、abstractinator.me の公式プロジェクトを示すものです。独自のコピーやフォークを運用する場合は、ご自身の名称とブランドを使用し、公式の Abstractinator であるかのように表示しないでください。「The Abstractinator を基にしています」とリンクを付けてクレジットを記載していただけると幸いです。
www/ 内のサードパーティ製アイコンは各制作者に帰属し、Flaticon ライセンスの下で使用されています(詳細は CREDITS.md を参照)。これらは MIT License の対象ではありません。
🙏 謝辞
Flaticon のマスコットとアイコン(narwhal:Smashicons、dinosaur:imaginationlol、frog prince: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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。