mcpField
F
Finding Open Access Papers

Finding Open Access Papers

github.com/kthorn生産性13165 回インストール53 週間前に更新
リポジトリ

Finding Open Access Papers について

Finding Open Access Papersは、Unpaywallを使って論文の合法的なオープンアクセス版を探す研究向けスキルです。出版社のページがペイウォールで全文が必要な場合に、公開版、受理原稿、プレプリントを区別して候補を提示します。

主な機能

  1. 01DOIによるオープンアクセス状況の確認
  2. 02推奨版とPDF URLの取得
  3. 03複数の公開先の一覧表示
  4. 04公開版、受理原稿、投稿原稿の識別
  5. 05エラー処理とリクエストのキャッシュ

活用シーン

  1. 01論文のDOI先がペイウォールの場合に全文を探す
  2. 02PubMed Centralに全文がない場合に公開版を探す
  3. 03関連性の高い論文の入手可能なPDFを探す

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kthorn/research-superpower --skill finding-open-access-papers

インストール後、Claude Code で/finding-open-access-papersを入力して読み込まれたか確認します。

詳細

オープンアクセス論文を探す

概要

Unpaywall を使って、ペイウォールの向こうにある論文の、合法的に利用できるオープンアクセス版を探します。

基本原則: ペイウォールのある論文の多くには、無料版(プレプリント、著者原稿、機関リポジトリ)があります。Unpaywall はそれらを見つけます。

使用するタイミング

以下の場合にこのスキルを使用します:

  • DOI の解決先がペイウォールになっている
  • 論文が PubMed Central で入手できない
  • 出版社のサイトで購読が必要
  • 関連性の高い論文(スコア ≥7)の全文が必要

全文へのアクセスを諦める前に使用してください

Unpaywall API

シンプルな REST API です。通常の利用であれば認証は不要です

基本リクエスト
curl "https://api.unpaywall.org/v2/DOI?email=YOUR_EMAIL"

パラメーター:

  • DOI - 論文の DOI(必要に応じて URL エンコード)
  • email - ユーザーのメールアドレス(必須。連絡および礼儀のため)

重要:調査セッションの開始時にユーザーのメールアドレスを尋ねてください。[email protected] や [email protected] のようなプレースホルダーのメールアドレスは使用しないでください。

例:

curl "https://api.unpaywall.org/v2/10.1038/[email protected]"
レスポンス形式
{
  "doi": "10.1038/nature12373",
  "title": "Paper Title",
  "is_oa": true,
  "best_oa_location": {
    "url": "https://europepmc.org/articles/pmc3858213",
    "url_for_pdf": "https://europepmc.org/articles/pmc3858213?pdf=render",
    "version": "publishedVersion",
    "license": "cc-by",
    "host_type": "repository"
  },
  "oa_locations": [
    {
      "url": "https://europepmc.org/articles/pmc3858213",
      "version": "publishedVersion"
    },
    {
      "url": "https://arxiv.org/abs/1234.5678",
      "version": "submittedVersion"
    }
  ]
}

主なレスポンスフィールド

is_oa(ブール値)

  • true - オープンアクセス版が入手可能です
  • false - 無料版が見つかりません

best_oa_location(オブジェクトまたは null)

  • Unpaywall が推奨する最適なオープンアクセスの提供元
  • プレプリントより出版済みの版を優先します
  • 利用可能な場合は PDF の URL が含まれます

oa_locations(配列)

  • 既知のすべてのオープンアクセス提供先
  • リポジトリ、プレプリントサーバー、機関サイトが含まれます
  • 品質/版の順に並んでいます

version の種類:

  • publishedVersion - 最終出版版(最適)
  • acceptedVersion - 著者の受理済み原稿(良好)
  • submittedVersion - 査読前のプレプリント(有用)

実装パターン

1. ペイウォールに遭遇したら Unpaywall を確認
# Try DOI first
curl -L "https://doi.org/10.1234/example.2023"

# If paywall detected (403, subscription required, etc):
curl "https://api.unpaywall.org/v2/10.1234/[email protected]"
2. 最適な URL を抽出
# Parse JSON response
response=$(curl -s "https://api.unpaywall.org/v2/DOI?email=EMAIL")

# Check if OA available
is_oa=$(echo $response | jq -r '.is_oa')

if [ "$is_oa" = "true" ]; then
  # Get best PDF URL
  pdf_url=$(echo $response | jq -r '.best_oa_location.url_for_pdf // .best_oa_location.url')

  # Download
  curl -L -o "papers/paper.pdf" "$pdf_url"
fi
3. ユーザーに報告

OA が見つかった場合:

⚠️ Paper behind paywall at publisher
✓ Found open access version via Unpaywall!
   Source: Europe PMC (published version)
   PDF: https://europepmc.org/articles/pmc3858213?pdf=render
   → Downloading...

OA が見つからなかった場合:

⚠️ Paper behind paywall at publisher
✗ No open access version found via Unpaywall
   Options:
   - Request via institutional access
   - Contact authors for preprint
   - Continue with abstract only
4. 版の種類に基づいて優先順位を付ける

複数の提供先がある場合:

優先順位:

  1. 出版社または PMC の publishedVersion
  2. 機関リポジトリの acceptedVersion
  3. プレプリントサーバー(arXiv、bioRxiv)の submittedVersion

evaluating-paper-relevance との統合

全文取得ワークフローに追加:

Stage 2: Fetch Full Text

Try in order:
A. PubMed Central (free full text)
B. DOI resolution → If paywall, try Unpaywall
C. Unpaywall direct lookup
D. Preprints (bioRxiv, arXiv)

更新後のワークフロー:

# 1. Try PMC
pmc_result=$(curl "https://eutils.ncbi.nlm.nih.gov/...")
if has_pmc_fulltext; then
  fetch_pmc
  exit 0
fi

# 2. Try DOI
doi_result=$(curl -L "https://doi.org/$doi")
if is_paywall; then
  # 3. Try Unpaywall
  unpaywall_result=$(curl "https://api.unpaywall.org/v2/$doi?email=$EMAIL")
  if has_oa; then
    fetch_unpaywall_pdf
    exit 0
  fi
fi

# 4. No full text available
report_no_fulltext

レート制限

無料プラン(メールアドレスあり):

  • 1 日あたり 100,000 リクエスト
  • 厳密なレート制限はありませんが、節度を守ってください
  • リクエストにメールアドレスを含めてください(必須)

ベストプラクティス:

  • リクエスト間に 100ms の間隔を空ける
  • レスポンスをキャッシュする(同じ DOI を再確認しない)
  • 実際に必要な論文のみを確認する

Python ヘルパーの例

import requests
import time

def find_open_access(doi, email):
    """
    Find open access version via Unpaywall
    Returns: (pdf_url, version, source) or (None, None, None)
    """
    url = f"https://api.unpaywall.org/v2/{doi}"
    params = {"email": email}

    try:
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        data = response.json()

        if not data.get('is_oa'):
            return None, None, None

        best_loc = data.get('best_oa_location')
        if not best_loc:
            return None, None, None

        pdf_url = best_loc.get('url_for_pdf') or best_loc.get('url')
        version = best_loc.get('version', 'unknown')
        source = best_loc.get('host_type', 'unknown')

        return pdf_url, version, source

    except Exception as e:
        print(f"Error checking Unpaywall for {doi}: {e}")
        return None, None, None

# Usage
doi = "10.1038/nature12373"
pdf_url, version, source = find_open_access(doi, "[email protected]")

if pdf_url:
    print(f"Found {version} at {source}")
    print(f"PDF: {pdf_url}")
    # Download PDF
    response = requests.get(pdf_url)
    with open(f'papers/{doi.replace("/", "_")}.pdf', 'wb') as f:
        f.write(response.content)
else:
    print("No open access version found")

time.sleep(0.1)  # Rate limiting

よく見つかる提供元

リポジトリ:

  • Europe PMC / PubMed Central
  • 機関リポジトリ(大学のサイト)
  • PubMed Central の国際ミラー

プレプリントサーバー:

  • bioRxiv(生物学)
  • medRxiv(医学)
  • arXiv(物理学、CS、数学)
  • ChemRxiv(化学)

出版社のサイト:

  • オープンアクセスジャーナル
  • ハイブリッドジャーナル(購読制ジャーナル内の OA 論文)
  • 遅延オープンアクセス(エンバーゴ期間終了済み)

エラー処理

DOI が見つからない場合:

{
  "error": "true",
  "message": "DOI not found"
}

→ DOI の形式を確認し、別の識別子を試してください

ネットワークエラー:

  • 指数バックオフで再試行する
  • 最大 3 回まで試行する
  • すべて失敗した場合はユーザーに報告する

不正な形式のレスポンス:

  • is_oa フィールドを確認する
  • best_oa_location がない場合は oa_locations 配列にフォールバックする

クイックリファレンス

タスクコマンド
OA が利用可能か確認curl "https://api.unpaywall.org/v2/DOI?email=EMAIL"
最適な PDF URL を取得.best_oa_location.url_for_pdf を解析
すべての OA 提供元を一覧表示.oa_locations[] を解析
版の種類を確認.version フィールドを確認
PDF をダウンロードcurl -L -o paper.pdf "$pdf_url"

統合ポイント

呼び出し元:

  • evaluating-paper-relevance - 全文が PMC にない場合
  • answering-research-questions - 関連性の高い論文の場合

更新対象:

  • papers-reviewed.json - OA が見つかったかどうかを記録
  • SUMMARY.md - OA の提供元情報を含める

よくある間違い

プレースホルダーのメールアドレスを使用する: [email protected] または [email protected] を使用する → ユーザーに実際のメールアドレスを尋ねてください メールアドレスを含めない: 必須パラメーターです。リクエストは失敗します すべての論文をチェックする: 必要な場合にのみチェックしてください(スコア ≥7、PMC がない場合) バージョンの種類を無視する: プレプリントより出版済みバージョンのほうが優れています 単一のソースのみを確認する: 代替候補について oa_locations 配列を確認してください レート制限を設けない: 厳格な制限がなくても、間隔を空けてください

成功基準

以下を満たすと成功です:

  • ペイウォールで保護された論文の OA 版が見つかり、ダウンロードされている
  • バージョンの種類(出版済み/採択済み/投稿済み)が記録されている
  • ソースとバージョンについてユーザーに伝えられている
  • OA 版を利用できない場合に、代替手段が提示されている

次のステップ

OA 版が見つかった後:

  • PDF を papers/ フォルダーにダウンロードする
  • SUMMARY.md にソースとバージョンを記録する
  • 詳細な分析を続ける
  • OA 版がない場合:概要のみに基づいて進めることを要約に記載する

コメント