biolit について
biolitは、生物医学研究者向けにPubMed、DOI、GEOの文献をLLMで選別し、構造化データを抽出するツールです。処理機能をMCPサーバーのツールとしても提供します。
主な機能
- 01PMID、DOI、GEOを混在して入力
- 02指定条件による文献選別
- 03項目抽出とCSV出力
- 04全文と抄録の取得
- 05Markdown要約の生成
- 06複数のLLMプロバイダーに対応
活用シーン
- 01PubMedアラートメールの文献整理
- 02研究課題に関連する論文の選別
- 03GEOレコードから実験情報を抽出
- 04週次の文献リストを一括要約
MCP 対応
biolitはMCPサーバーを提供し、文献の取得、選別、抽出を互換クライアント向けのツールとして公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx biolitANTHROPIC_API_KEYシークレットAnthropic API key (required when using the default Anthropic provider)OPENAI_API_KEYシークレットOpenAI API key (required when using LLM_PROVIDER=openai)LLM_PROVIDERLLM provider: anthropic (default), openai, or ollamaLLM_MODELModel name override (e.g. claude-sonnet-4-6, gpt-4o)SEMANTIC_SCHOLAR_API_KEYシークレットSemantic Scholar API key for higher rate limits on citation lookup (optional)UNPAYWALL_EMAILEmail address for Unpaywall API access to improve PDF retrieval (optional)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
biolit
mcp-name: io.github.rachadele/biolit
LLM の支援による生物医学文献のスクリーニングと構造化抽出を行います。PubMed アラートメールと、PMID、DOI、GEO アクセッション番号を自由に組み合わせたリストを受け付けます。PMC、Europe PMC、bioRxiv/medRxiv、Unpaywall、Semantic Scholar から全文を取得します。複数の LLM プロバイダーに対応し、すべての機能を MCP サーバーとして提供します。
セットアップ
要件: Python 3.8+
PyPI からインストールします:
pip install biolit
または、開発用にソースからインストールします:
pip install -e .
.env.example を .env にコピーし、API キーを追加します:
cp .env.example .env
# edit .env and set ANTHROPIC_API_KEY (or OPENAI_API_KEY)
macOS では、.env の代わりにシステムのキーチェーンにキーを保存できます。biolit はサービス名のみでキーチェーンを参照するため、アカウントは必要ありません:
security add-generic-password -s ANTHROPIC_API_KEY -w
# or for OpenAI:
security add-generic-password -s OPENAI_API_KEY -w
-w <value> を省略すると、キーを画面に表示せずに入力するよう求められます。まずキーチェーンが確認され、環境変数はフォールバックとしてのみ使用されます(そのため、.env に古い値があっても、使用可能なキーチェーンのエントリーが優先されます)。
使い方
このツールは、PubMed アラートメール(.eml)、識別子を記載したプレーンテキストファイル、および --ids によるインラインの識別子を受け付けます。識別子には PMID、DOI、GEO アクセッション番号を指定でき、1 回の実行で自由に組み合わせられます。
| 入力 | 指定方法 | 例 |
|---|---|---|
| PubMed アラートメール | 位置引数の .eml ファイル | alert.eml |
| BibTeX ファイル | 位置引数の .bib ファイル | refs.bib |
| 識別子ファイル(混在可) | 位置引数のプレーンテキストファイル(1 行に 1 件) | identifiers.txt |
| インラインの識別子 | --ids フラグにカンマ区切りで指定 | --ids 41795042,GSE53987,10.1101/2025.03.17.25324098 |
プロンプトなしで統合失調症ゲノミクスのデフォルト設定を使って実行するには、--default を指定します:
biolit docs/alert.eml --default
biolit docs/pmids.txt --default
biolit docs/geo_accessions.txt --default
biolit --ids 41795042,41792186,GSE53987 --default
biolit --ids 10.1101/2025.03.17.25324098 --default
または、フラグで基準とフィールドを指定します:
biolit identifiers.txt \
--criterion "Is this about treatment-resistant schizophrenia?" \
--fields "methodology, sample_size, treatment, outcomes"
--markdown(または --md)を追加すると、CSV とともに文章形式の .md サマリーも出力されます。各レコードは ### field サブセクションを含む Markdown セクションになり、失敗またはスキップされたレコードはスタブエントリーとして表示されます:
biolit refs.bib --config my_config.json --markdown
biolit refs.bib --config my_config.json --markdown --markdown-max-tokens 2048
--batch を追加すると、レコードごとに 1 回ずつ呼び出す代わりに、プロバイダーの Message Batches / Batch API を使ってスクリーニング、抽出、Markdown の生成を実行します。リクエストあたりのコストは約 50% 下がりますが、各バッチは完了まで待機します(各ステージは通常数分、最大 6 時間かかります)。そのため、単発の検索ではなく、週次アラートをまとめて処理する用途を想定しています。Anthropic と OpenAI のみ対応しており、Ollama またはカスタムの base_url を持つ OpenAI 互換エンドポイントでは、逐次呼び出しにフォールバックします。設定ファイルでは "batch": true としても指定できます。
biolit docs/alert.eml --default --batch
biolit docs/alert.eml --default --batch --markdown # batches markdown too
または、再利用可能なパラメーターを保存する JSON 設定ファイルを使います(CLI フラグが優先されます)。設定には ids または input_file(.eml、.bib、識別子リストのいずれかへのパス)を含められます。また、Markdown 出力を有効にするには "markdown": true を指定します:
biolit alert.eml --config my_config.json
biolit refs.bib --config my_config.json # DOIs extracted from .bib automatically
biolit --config my_config.json # ids or input_file supplied by config
設定ファイルの fields キーには、カンマ区切りの文字列、またはフィールド名と抽出内容の説明を対応付ける JSON オブジェクトを指定できます。文字列を使う場合、抽出の前に LLM の呼び出しがもう 1 回行われ、フィールド名が説明に変換されます。辞書を使う場合、この呼び出しは省略され、説明がそのままモデルに渡されます:
{
"fields": {
"tf_name": "HGNC symbol of the transcription factor perturbed in this experiment",
"organism": "scientific name of the organism used",
"platform": "GPL accession of the microarray platform"
}
}
--criterion を省略すると、スクリーニングをスキップし、すべてのレコードを抽出します。--fields を省略すると、デフォルトのフィールド(methodology, sample_type, causal_claims, summary)が使われます:
# fetch + extract with defaults (no screening)
biolit alert.eml
# fetch + screen only, then extract with defaults
biolit alert.eml --criterion "Is this about treatment-resistant schizophrenia?"
1 件のレコードのスクリーニング
biolit screen を使うと、抽出パイプライン全体を実行せずに、論文または GEO レコード 1 件の関連性をすばやく確認できます:
biolit screen --pmid 41627908 --default
biolit screen --accession GSE53987 --default
biolit screen --doi 10.64898/2026.02.16.706214 --default
biolit screen --pmid 41627908 --criterion "Is this about treatment-resistant schizophrenia?"
出力は stdout に 1 行で表示されます:
RELEVANT [abstract] — Paper uses GWAS to investigate schizophrenia risk loci.
識別子の混在リスト
PMID、DOI、GEO アクセッション番号は、ファイルまたは --ids で自由に組み合わせられます。各識別子は形式から自動判定されます:
41795042→ PMID(すべて数字)10.1101/2025.03.17.25324098→ DOI(10.で始まる)GSE53987→ GEO アクセッション番号(GSE、GDS、GSM、またはGPLで始まる)
biolit --ids 41795042,GSE53987,10.1101/2025.03.17.25324098 --default
GEO レコードには linked_pmids 列も含まれます。すべてのレコードタイプで pmid、doi、geo_accession 列が共通して含まれ、該当しない場合は null になります。
全文検索
すべての PMID および DOI(プレプリントを含む)に対して、全文検索が自動的に実行されます。GEO レコードの場合、パイプラインはリンクされた各 PMID を順にたどって全文を取得しようとします。アクセス可能な全文を持つ論文がない場合は、GEO レコードのメタデータにフォールバックします。パイプラインは、次のソースを順に試します。
- PMC JATS XML(オープンアクセス)
- Europe PMC JATS XML(より広範なオープンアクセス対象範囲)
- プレプリント XML(bioRxiv / medRxiv)
- Unpaywall PDF(
--unpaywall-emailが必要) - Semantic Scholar オープンアクセス PDF
- OpenAlex グリーン OA PDF(Unpaywall / S2 が見つけられない著者原稿。キー不要)
- Europe PMC オープンアクセス全文 PDF(OA 対象のみ)
- CORE 集約グリーン OA PDF(オプトイン。
CORE_API_KEYが必要) - 出版社のランディングページのスクレイピング(
citation_pdf_urlメタタグ。キー不要) - カスタムリゾルバー(機関の OpenURL / 図書館プロキシ。
BIOLIT_CUSTOM_RESOLVERSでオプトイン) - 出版社のランディングページのHTML全文(
citation_fulltext_html_urlメタタグ。キー不要) - 抄録へのフォールバック
手順 6~9 はすべてオープンアクセスのみが対象です(グリーン OA の著者原稿、機関リポジトリのコピー、出版社が独自に案内する OA PDF リンク)。ペイウォールの回避は行いません。OpenAlex、Europe PMC、ランディングページのスクレイピングにはキーは不要です。CORE_API_KEY が設定されていない場合、CORE は何もしません。ランディングページのスクレイピング(手順 9)では、DOI をたどって論文ページに移動し、出版社自身が埋め込んだ citation_pdf_url リンク(Highwire / Google Scholar 標準)を読み取ります。これにより、アグリゲーター API が誤分類したり、インデックスに登録していなかったりする OA PDF を取得できます。bioRxiv / medRxiv は(サーバーがエージェントをブロックするため)ここではスキップします。前述のプレプリント手順で対応します。手順 10 は、ご自身が認可されているアクセスを組み込むための接続点です。カスタム全文フェッチャーを参照してください。手順 11 は手順 9 に対応する HTML 版です。ダウンロード可能な PDF が存在しない場合に、出版社の HTML 全文ページ(PLOS / eLife / BMC / Frontiers や多くの学会誌が設定する citation_fulltext_html_url の Highwire シグナル)から論文本文を抽出し、PDF の取得経路ではたどり着けない OA 論文の Methods のテキストを取得します。それでも取得できない場合は、抄録へのフォールバックによって、呼び出し元が全文を取得できなかった理由を確認できるよう、レコードごとの成果物に paper_status 分類(bot_blocked / js_shell / abstract)を記録します。
Unpaywall(手順 4)を有効にするには、メールアドレスを渡します。
biolit alert.eml --default --unpaywall-email [email protected]
LLM に送信するセクションを制限します。
biolit alert.eml --default --sections methods,results
LLM プロバイダー
このツールは Anthropic(デフォルト)、OpenAI、ローカルの Ollama モデルに対応しています。
# OpenAI
biolit pmids.txt --default --provider openai --model gpt-4o
# Ollama (local)
biolit pmids.txt --default --provider ollama --model llama3
環境変数として LLM_PROVIDER と LLM_MODEL を設定することもできます。
出力
実行ごとに、次の内容を含むタイムスタンプ付きディレクトリ(例:run_20260313_142000/)が作成されます。
results.csv— 関連するレコードを1行ずつ収録しますresults.md— 散文形式のMarkdown要約です(--markdownまたは設定ファイルの"markdown": trueを指定した場合に書き込まれます)artifacts/<id>/— レコードごとのフォルダーです。LLM に送信したテキスト、メタデータ、取得した全文ファイルが含まれます
パイプラインのいずれかの段階(取得エラー、未検出、コンテンツなし、スクリーニングまたは抽出エラー)で失敗したレコードは CSV から除外されますが、失敗メモ付きのプレースホルダー項目として Markdown に表示されます。
デフォルトのフィールドでは、CSV の列は次のとおりです。
| 列 | 説明 |
|---|---|
title | 論文タイトル |
authors | 著者一覧(カンマ区切り。PubMed XML、bioRxiv/medRxiv API、または GEO の寄稿者情報から解析) |
url | PubMed、GEO、または DOI へのリンク |
pmid | PubMed ID(インデックス未登録のプレプリントでは null) |
doi | DOI(GEO レコードでは null) |
geo_accession | GEO アクセッション(GEO 以外のレコードでは null) |
text_source | テキストの取得元(abstract、pmc_fulltext、europepmc_fulltext、preprint_fulltext、unpaywall_pdf、s2_pdf、openalex_pdf、europepmc_oa_pdf、core_pdf、landing_page_pdf、custom_resolver_pdf、landing_page_html、geo_linked_fulltext、geo_linked_abstract、geo_record) |
citation_count | Semantic Scholar の被引用数(見つからない場合は null) |
methodology | 一般的な手法(例:GWAS、scRNA-seq、プロテオミクス) |
sample_type | 組織/サンプルの種類と由来 |
causal_claims | データから推定された統合失調症の原因に関する主張 |
summary | トリアージ用の平易な言葉による2~3文の要約 |
GEO レコードには、関連する PubMed ID をすべて列挙した linked_pmids 列も含まれます。
CSV は Google Sheets に直接インポートできます(File → Import)。
MCP サーバー
biolit には、パイプラインをツールとして公開する MCP サーバーが付属しており、MCP 対応クライアント(Claude Desktop、Claude CLI、OpenAI Agents SDK など)から利用できます。
サーバーを起動します。
biolit-mcp
# or pick a provider/model explicitly (overrides LLM_PROVIDER / LLM_MODEL env vars):
biolit-mcp --provider openai --model gpt-4o-mini
または、MCP inspector を使って対話的にテストします。
mcp dev biolit/mcp_server.py
Claude Desktop の設定
~/Library/Application Support/Claude/claude_desktop_config.json に追加します。
{
"mcpServers": {
"biolit": {
"command": "biolit-mcp",
"args": ["--provider", "openai"]
}
}
}
Claude Desktop を再起動します。ツールピッカーにツールが表示されます。デフォルトの Anthropic プロバイダーを使用するには args を削除してください(または、代わりに LLM_PROVIDER / LLM_MODEL 環境変数を設定します)。
Claude CLI の設定
プロジェクトのルートに .mcp.json を追加します。
{
"mcpServers": {
"biolit": {
"command": "biolit-mcp",
"args": ["--provider", "openai"]
}
}
}
利用可能なツール
バッチパイプライン(biolit CLI と同等):
| ツール | 説明 |
|---|---|
run_pipeline | PMID、DOI、GEO アクセッションの混在リストを取得し、必要に応じてスクリーニングと抽出を行い、結果を CSV に書き込みます(markdown=True の場合は .md の要約も任意で作成します)。ids(カンマ区切り)、bib_path(.bib ファイル)、または ids_file(識別子を記載したプレーンテキストファイル)を受け取ります。sections(カンマ区切り。例:"methods,results")を渡すと、LLM に渡す全文のセクションを制限できます。max_tokens で入力テキストの上限を指定します(デフォルトは 12500)。extraction_max_tokens でフィールド抽出の出力上限を指定します(デフォルトは 4096)。markdown_max_tokens で Markdown レンダリングの上限を指定します(デフォルトは 1024)。トークン関連のパラメーターに 0 を渡すと、デフォルト値が使用されます。batch=True を渡すと、プロバイダーのバッチ API を使ってスクリーニング、抽出、Markdown レンダリングを実行します(約 50% 割安で、完了まで処理をブロックします)。すべてのパラメーターは任意です。config_path のみを渡すと、JSON ファイルに基づいて実行全体を進められます。 |
低レベル(カスタムワークフロー向け):
| ツール | 説明 |
|---|---|
fetch_pubmed_metadata | PMID を指定して PubMed のメタデータを取得します |
fetch_geo_record | GEO レコードを取得し、アクセッションに基づいて解析します |
fetch_fulltext | PMID の全文を取得します(6 ステップのチェーン) |
fetch_geo_fulltext | 関連付けられた PMID を介して、GEO アクセッションの全文を取得します |
fetch_supplementary | Europe PMC を介して、論文の補足ファイル(補足メソッド、表)を取得し、テキストを抽出します |
screen_paper | 事前に取得したテキストに基づいて、LLM による関連性スクリーニングを実行します |
extract_fields | 事前に取得したテキストから構造化されたフィールドを抽出します |
resolve_doi | NCBI ID Converter を介して DOI を PMID と PMCID に変換します |
lookup_s2_pdf | Semantic Scholar に DOI のオープンアクセス PDF があるか確認します |
read_pmids_from_eml | PubMed アラートの .eml ファイルから PMID を解析します |
get_version | インストール済みの biolit パッケージのバージョンを返します |
Python ライブラリとして使用する
パイプライン関数は直接インポートできます。
from biolit.pipeline import run, screen_paper, fetch_record
from biolit.llm import get_llm_client
client = get_llm_client("anthropic")
# Batch pipeline — PMIDs, DOIs, and GEO accessions can be mixed freely
# criterion and fields_description are optional; omit either to skip that step
# markdown=True writes results.md alongside the CSV
# Returns (csv_path, record_count)
csv_path, count = run(client, ids=["41627908", "GSE53987", "10.1101/2025.03.17.25324098"],
criterion="...", fields_description="methodology, summary", output_path="results.csv",
markdown=True)
# Fetch + write metadata only (no LLM calls)
csv_path, count = run(client, ids=["41627908", "GSE53987"])
# Fetch a single record (auto-detects PMID / DOI / GEO)
paper = fetch_record("10.1101/2025.03.17.25324098")
# Screen pre-fetched text
result = screen_paper(client, paper, "Is this about schizophrenia genomics?", paper["abstract"])
# {"relevant": True, "reason": "..."}
カスタム全文取得ツール
組み込みのチェーン(PMC → Europe PMC → プレプリント → Unpaywall → Semantic Scholar → OpenAlex → Europe PMC OA PDF → CORE → ランディングページの PDF スクレイピング → カスタムリゾルバー → ランディングページの HTML → 抄録)では、購読が必要な論文や最近公開された論文を十分にカバーできない場合があります。biolit をフォークせずに、Zotero ライブラリ、PDF のフラットディレクトリ、機関の全文データベースなど、全文の追加ソースを組み込めます。
ランディングページのスクレイピングとカスタムリゾルバー(組み込み、環境変数によるオプトイン)
組み込みのチェーンステップを2つ用意しています。Zotero の「全文検索」ファイルリゾルバーを再現し、Unpaywall/CORE と同じ方法で設定します。環境変数を使うため、コードの変更は不要です。
ランディングページのスクレイピング(ステップ 9)。 常時有効で、キーは不要です。DOI から出版社の記事ページに移動し、そのページ自体が案内している PDF リンクを読み取ります。まず <meta name="citation_pdf_url">(多くの出版社が埋め込んでいる Highwire/Google-Scholar 標準)を確認し、次に <link rel="alternate" type="application/pdf">、Open Graph/Twitter カードの PDF リンク、明らかな *.pdf アンカーを確認します。<meta http-equiv="refresh"> によるリダイレクトは1回追跡します。候補はすべて、先頭が %PDF であることを検証します。出版社が独自に案内している OA リンクをたどるものであり、ペイウォールを回避するものではありません。アグリゲーターの API が誤って分類したり、まったくインデックス化していなかったりする OA PDF を見つけられます。bioRxiv/medRxiv はスキップします(サーバーがエージェントをブロックするためです。プレプリントのステップが対象とします)。ソースラベル:landing_page_pdf。
# Optional: override the browser User-Agent used for the landing-page
# request (some publishers serve a stub or 403 to non-browser agents).
export BIOLIT_LANDING_USER_AGENT="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
ランディングページの HTML 全文(ステップ 11)。 常時有効で、キーは不要です。ステップ 9 の HTML 版です。ダウンロード可能な PDF がどこにも見つからなかった場合に、DOI から記事ページに移動し、出版社の <meta name="citation_fulltext_html_url"> にある「HTML の全文版が存在する」というシグナル(PLOS/eLife/BMC/Frontiers および多くの学会誌が設定)を読み取り、記事本文を抽出します。ナビゲーション、スクリプト、スタイル、ページ装飾は除外し、<article>/<main> コンテナーを優先します。PDF がまったくない OA 論文からも、方法の本文を取得できます。ボット対策ページ(Cloudflare の「Just a moment」)や JavaScript でレンダリングされるシェルは、「テキスト」として返さずに拒否します。bioRxiv/medRxiv はスキップします(プレプリントのステップが対象とします)。ソースラベル:landing_page_html。上記の BIOLIT_LANDING_USER_AGENT による上書き設定を共有します。
チェーン全体で見つからなかった場合、要旨へのフォールバックでは、全文に到達できなかった理由(bot_blocked/js_shell/abstract)を分類し、レコードごとのアーティファクトに paper_status として記録します。これにより、後続の呼び出し側で「ボット対策によりブロックされた」「出版社が JavaScript シェルのみを提供している」「実際に要旨しかない」を区別できます。
# Optional: visible-character floor below which a fetched landing page is
# treated as a JS-rendered shell (no server-rendered article body) rather
# than full text. Default 2000.
export BIOLIT_JS_SHELL_CHAR_THRESHOLD=2000
カスタムリゾルバー(ステップ 10)。 オプトインです。ご自身が許可を得ているアクセス方法を設定するための仕組みです。通常は、所属機関の OpenURL エンドポイントや、図書館の EZproxy URL パターンを指定します。BIOLIT_CUSTOM_RESOLVERS にリゾルバーエントリーの JSON 配列を設定します。各エントリーには {doi}/{url} プレースホルダーを含む url_template が必要です。設定済みのヘッダーを使って URL を取得し、実際に PDF であれば返します。解決された URL が PDF への直接リンクではなく OpenURL/プロキシのランディングページである場合は、"scrape": true を設定すると、その HTML を上記のランディングページスクレイパーで処理できます。何も設定していない場合、このステップは何もしません。ソースラベル:
custom_resolver_pdf。
export BIOLIT_CUSTOM_RESOLVERS='[
{
"url_template": "https://proxy.lib.example.edu/login?url=https://doi.org/{doi}",
"headers": {"Cookie": "ezproxy=YOUR_SESSION"},
"scrape": true
},
{
"url_template": "https://resolver.example.edu/openurl?id=doi:{doi_encoded}&svc=fulltext"
}
]'
リゾルバーエントリーのスキーマ(必須なのは url_template のみです):
| キー | 意味 |
|---|---|
url_template | プレースホルダー {doi}、{doi_encoded}(URL エンコード済み)、{url}、{url_encoded} を含む URL です。テンプレートが利用できない値を必要とする場合、そのエントリーはスキップされます。 |
user_agent | エントリーごとに User-Agent を上書きする場合に指定します(任意)。 |
headers | 追加のリクエストヘッダーを指定する辞書です(例:プロキシセッションの Cookie)。 |
scrape | 任意のブール値です。true の場合、解決された URL が HTML を返すときに、ランディングページスクレイパーで PDF リンクを取得します。 |
biolit は認証情報をハードコード、要求、保存しません。カスタム リゾルバーは、ご自身が許可を得ているアクセス方法(プロキシへの ログイン、セッション Cookie など)を使って、ご自身が設定した URL パターンに従います。ご利用が所属機関および出版社の利用規約に 準拠していることを確認する責任は、ご自身にあります。
参考文献の取得機能(環境変数によるオプトイン)
biolit に同梱されている3つの取得機能は、該当する環境変数が設定されている場合、インポート時に自動で登録されます。デフォルトの優先度(数値が小さいほど先に試行)は、bibtex=2.0、local_pdf=3.0、zotero=5.0 です。
BibTeX。 DOI、PMID、または citekey を使って .bib エクスポートを検索し、各エントリの file = {...} フィールドからパスを読み取り、PDF を直接解析します。Better-BibTeX(または同等の機能)の自動エクスポートを管理しているユーザーに最適です。検索はオフラインでメモリ内で行われ、正確です。ネットワーク通信は不要で、Zotero の検索インデックスにも依存しません。Zotero のウェブ API の q-search では構造化された DOI フィールドがインデックス化されないため、その API を使った DOI 検索が、インデックス化された添付ファイルの全文に DOI が含まれないアイテムでは信頼できないという問題を回避します。BBT のセミコロン区切りの file リストと、従来の JabRef の description:path:type 形式の両方に対応しています。.bib ファイルは mtime が変更されると自動的に再解析されます。
export BIOLIT_BIBTEX=~/Zotero/My\ Library.bib
# Optional:
export BIOLIT_BIBTEX_PRIORITY=2.0 # lower = tried earlier (default 2.0)
Zotero。 DOI、次に PMID でユーザーの Zotero ライブラリを検索し、添付ファイルの検索結果を親アイテムまでたどり、添付された PDF を見つけてダウンロードし、biolit の PDF パーサーで解析します。Zotero の /file API エンドポイントが 404 を返す場合(linked_file 添付ファイル、または同期されていないアカウントのインポート済み添付ファイル)は、ローカルの Zotero ストレージ($ZOTERO_DATA_DIR/storage/<key>/<filename>、デフォルトのデータディレクトリは ~/Zotero)から PDF を読み取ります。注:Zotero のウェブ API の q-search では構造化された DOI フィールドがインデックス化されないため、両方を利用できる場合は、上記の BibTeX 取得機能のほうが信頼性に優れています。
export ZOTERO_API_KEY=...
export ZOTERO_USER_ID=... # or ZOTERO_GROUP_ID for a group library
# Optional:
export ZOTERO_PRIORITY=5.0 # lower = tried earlier (default 5.0)
export ZOTERO_DATA_DIR=~/Zotero # only needed if Zotero is not at ~/Zotero
macOS では、環境変数に設定されていない ZOTERO_API_KEY、ZOTERO_USER_ID、ZOTERO_GROUP_ID の値は、macOS のキーチェーン(security find-generic-password -s <NAME> -w)から取得されます。これは、LLM API キーで使用される解決順序と同じです。つまり、プロファイルをシェルで読み込まない Claude Code のようなホストでも、.mcp.json に env ブロックを追加せずに Zotero の認証情報を取得できます。
ローカル PDF ディレクトリ。 事前に作成した JSON インデックスを使って、DOI で論文を検索します。ファイル名は任意です。各 PDF の /Info メタデータ辞書から DOI を抽出し、抽出できない場合は1ページ目のテキストから抽出します。
インデックスを作成(または更新)します。再実行のコストは低く、デフォルトでは新規または変更された PDF のみ再抽出されます。
python -m biolit.fetchers.local_pdf --dir ~/Papers
python -m biolit.fetchers.local_pdf --dir ~/Papers --rebuild # force full re-extraction
次に、同じディレクトリを biolit に指定します。
export BIOLIT_LOCAL_PDF_DIR=~/Papers
export BIOLIT_LOCAL_PDF_PRIORITY=3.0 # default 3.0
取得機能自体はインデックスを作成せず、参照のみを行います。DOI を抽出できない PDF は、確認できるようインデックスの unindexed_sample に一覧表示されます。
設定すると、これらのソースから取得された結果の CSV/Markdown 出力では、text_source フィールドが bibtex_pdf、zotero_pdf、または local_pdf になります。生のバイト列は、組み込みの PMC/Europe PMC アーティファクトと同様に、artifacts/<id>/bibtex_pdf/zotero_pdf/local_pdf に保存されます。
独自の取得機能を作成する
取得機能とは、FetchContext を受け取り、見つかった場合は FetchResult、見つからなかった場合は None を返す、任意の呼び出し可能オブジェクトです。
from biolit.fetchers import FetchContext, FetchResult, register_fetcher
def my_internal_db_fetcher(ctx: FetchContext) -> FetchResult | None:
pmid = ctx.paper.get("pmid")
if not pmid:
return None
text = my_db.lookup_fulltext(pmid) # whatever you have
if not text:
return None
return FetchResult(text=text, source="internal_db", artifacts={})
register_fetcher(my_internal_db_fetcher, priority=1.0, name="internal_db")
run/screen_by_* の最初の呼び出しより前(たとえば、モジュールのインポート時)に登録します。登録された取得機能は、優先度順に組み込みの処理チェーンより前に試行され、空でない FetchResult.text を最初に返したものが採用されます。取得機能内で例外が発生した場合は標準エラーに記録され、次の取得機能が試行されます。
検証
GEO のスクリーニングとメタデータ抽出のワークフローに関する独立評価は、rachadele/biolit-eval で公開されています。この評価では、転写因子の摂動実験としてラベル付けされた、手作業でキュレーションした509件の GEO アクセッションの正解データと照合し、ブートストラップ再サンプリングのパイプラインを使って適合率、再現率、F1 を推定します。
既知の制限事項
- 抄録がない論文、または全文にアクセスできない論文は、通知なしでスキップされます。
- GEO レコードでは、リンクされた PMID を通じて全文の取得を試みます。アクセスできた内容に応じて、
text_sourceはgeo_linked_fulltext、geo_linked_abstract、またはgeo_recordになります。 - bioRxiv/medRxiv の JATS XML は、ヘッダーにかかわらず Cloudflare によって頻繁にブロックされます。パイプラインは bioRxiv API からタイトルと抄録を取得する方法にフォールバックします(
text_source: preprint_abstract)。 - Semantic Scholar API では、認証なしのリクエストは1日あたりおよそ100回までです。上限を増やすには、
.envにSEMANTIC_SCHOLAR_API_KEYを設定してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。