mcpField
A
arxiv

arxiv

github.com/wanshuiyin生産性18.2k577 回インストール5 日前に更新
リポジトリ

arxiv について

arxivは、arXiv論文の検索、詳細情報の取得、PDFのダウンロードを行う研究スキルです。トピックや論文IDで検索でき、結果数や保存先の指定、既存の研究Wikiへの登録にも対応します。

主な機能

  1. 01トピックまたはarXiv IDで検索
  2. 02論文のメタデータと要旨を取得
  3. 03指定ディレクトリへのPDF保存
  4. 04既存ファイルのスキップと検証
  5. 05論文の研究Wikiへの取り込み

活用シーン

  1. 01研究テーマに関連する論文の検索
  2. 02指定したarXiv IDの論文詳細の取得
  3. 03検索結果のPDFをローカルに保存
  4. 04取得した論文を研究Wikiに追加

インストール

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

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill arxiv

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

詳細

arXiv 論文の検索とダウンロード

トピックまたは arXiv 論文 ID を検索:$ARGUMENTS

定数

  • PAPER_DIR - ダウンロードした PDF を保存するローカルディレクトリ。デフォルト:現在のプロジェクトディレクトリ内の papers/。
  • MAX_RESULTS = 10 - 検索結果のデフォルト件数。
  • ARXIV_FETCHER — 正式名称は arxiv_fetch.py で、shared-references/integration-contract.md §2(ポリシー D1 — 優先手段 + フォールバックのカスケード)に従って解決します。解決できない場合(正式な解決チェーンをすべて試した場合)は、ステップ 2 に記載されているインライン Python の代替手段を使用します。

引数に追加して指定するオーバーライド:

  • /arxiv "attention mechanism" - max: 20 - 最大 20 件の結果を返します
  • /arxiv "2301.07041" - download - ID で指定した論文をダウンロードします
  • /arxiv "query" - dir: literature/ - カスタムディレクトリに PDF を保存します
  • /arxiv "query" - download: all - すべての検索結果の PDF をダウンロードします

ワークフロー

ステップ 1:引数を解析する

$ARGUMENTS を解析して、次の指示を確認します。

  • クエリまたは ID:主な検索語、または 2301.07041 や cs/0601001 のような arXiv ID のみ
  • - max: N:MAX_RESULTS を上書きします(例:- max: 20)
  • - dir: PATH:PAPER_DIR を上書きします(例:- dir: literature/)
  • - download:検索結果を表示した後、最初の結果の PDF をダウンロードします
  • - download: all:すべての検索結果の PDF をダウンロードします

引数が arXiv ID のパターン(YYMM.NNNNN または category/NNNNNNN)に一致する場合は、検索をスキップしてステップ 3 に進みます。

ステップ 2:arXiv を検索する

正式な厳格セーフチェーンを使用して $ARXIV_FETCHER を解決します(shared-references/integration-contract.md §2 を参照)。

cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
ARXIV_FETCHER=".aris/tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER="tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && ARXIV_FETCHER="$ARIS_REPO/tools/arxiv_fetch.py"; }
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER=""

$ARXIV_FETCHER が空でない場合、次を実行します。

python3 "$ARXIV_FETCHER" search "QUERY" --max MAX_RESULTS

$ARXIV_FETCHER が空の場合(ポリシー D1 のカスケード)、インライン Python にフォールバックします。

python3 - <<'PYEOF'
import json
import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET

NS = "http://www.w3.org/2005/Atom"
query = urllib.parse.quote("QUERY")
url = (f"http://export.arxiv.org/api/query"
       f"?search_query={query}&start=0&max_results=MAX_RESULTS"
       f"&sortBy=relevance&sortOrder=descending")
with urllib.request.urlopen(url, timeout=30) as r:
    root = ET.fromstring(r.read())
papers = []
for entry in root.findall(f"{{{NS}}}entry"):
    aid = entry.findtext(f"{{{NS}}}id", "").split("/abs/")[-1].split("v")[0]
    title = (entry.findtext(f"{{{NS}}}title", "") or "").strip().replace("\n", " ")
    abstract = (entry.findtext(f"{{{NS}}}summary", "") or "").strip().replace("\n", " ")
    authors = [a.findtext(f"{{{NS}}}name", "") for a in entry.findall(f"{{{NS}}}author")]
    published = entry.findtext(f"{{{NS}}}published", "")[:10]
    cats = [c.get("term", "") for c in entry.findall(f"{{{NS}}}category")]
    papers.append({
        "id": aid,
        "title": title,
        "authors": authors,
        "abstract": abstract,
        "published": published,
        "categories": cats,
        "pdf_url": f"https://arxiv.org/pdf/{aid}.pdf",
        "abs_url": f"https://arxiv.org/abs/{aid}",
    })
print(json.dumps(papers, ensure_ascii=False, indent=2))
PYEOF

結果を次の表として表示します。

| # | arXiv ID   | Title               | Authors        | Date       | Category |
|---|------------|---------------------|----------------|------------|----------|
| 1 | 2301.07041 | Attention Is All... | Vaswani et al. | 2017-06-12 | cs.LG    |
ステップ 3:特定の ID の詳細を取得する

単一の論文 ID が指定された場合(直接指定された場合、またはステップ 2 で取得した場合):

python3 "$ARXIV_FETCHER" search "id:ARXIV_ID" --max 1
# or fallback:
python3 -c "
import urllib.request, xml.etree.ElementTree as ET
NS = 'http://www.w3.org/2005/Atom'
url = 'http://export.arxiv.org/api/query?id_list=ARXIV_ID'
with urllib.request.urlopen(url, timeout=30) as r:
    root = ET.fromstring(r.read())
# print full details ...
"

表示する情報:タイトル、全著者、カテゴリ、要旨全文、公開日、PDF URL、要旨 URL。

ステップ 4:PDF をダウンロードする

ダウンロードが要求された場合、ダウンロード対象の各論文 ID について:

# Using fetch script:
python3 "$ARXIV_FETCHER" download ARXIV_ID --dir PAPER_DIR

# Fallback:
mkdir -p PAPER_DIR && python3 -c "
import pathlib
import sys
import urllib.request

out = pathlib.Path('PAPER_DIR/ARXIV_ID.pdf')
if out.exists():
    print(f'Already exists: {out}')
    sys.exit(0)
req = urllib.request.Request(
    'https://arxiv.org/pdf/ARXIV_ID.pdf',
    headers={'User-Agent': 'arxiv-skill/1.0'},
)
with urllib.request.urlopen(req, timeout=60) as r:
    out.write_bytes(r.read())
print(f'Downloaded: {out} ({out.stat().st_size // 1024} KB)')
"

各ダウンロードの後:

  • ファイルサイズが 10 KB を超えていることを確認します(それより小さいファイルは拒否します。エラー HTML ページの可能性があります)。
  • レート制限を避けるため、連続するダウンロードの間に 1 秒の待機時間を設けます。
  • 次のように報告します:Downloaded: papers/2301.07041.pdf (842 KB)
ステップ 5:要約する

各論文について(ダウンロードした論文、または API で取得した論文):

## [Title]

- **arXiv**: [ID] - [abs_url]
- **Authors**: [full author list]
- **Date**: [published]
- **Categories**: [cs.LG, cs.AI, ...]
- **Abstract**: [full abstract]
- **Key contributions** (extracted from abstract):
  - [contribution 1]
  - [contribution 2]
  - [contribution 3]
- **Local PDF**: papers/[ID].pdf (if downloaded)
ステップ 6:リサーチ Wiki を更新する(有効な場合)

プロジェクトに research-wiki/ が存在する場合は必須です。それ以外の場合は、何も通知せずにスキップします。Wiki ディレクトリが存在する場合は、shared-references/wiki-helper-resolution.md の正式なチェーン(バリアント B — 警告してスキップ)に従って $WIKI_SCRIPT を解決し、この実行で取得したすべての論文を取り込みます。

if [ -d research-wiki/ ]; then
  cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
  ARIS_REPO="${ARIS_REPO:-$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null)}"
  if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
  fi
  WIKI_SCRIPT=".aris/tools/research_wiki.py"
  [ -f "$WIKI_SCRIPT" ] || WIKI_SCRIPT="tools/research_wiki.py"
  [ -f "$WIKI_SCRIPT" ] || { [ -n "${ARIS_REPO:-}" ] && WIKI_SCRIPT="$ARIS_REPO/tools/research_wiki.py"; }
  [ -f "$WIKI_SCRIPT" ] || {
    echo "WARN: research_wiki.py not found; arxiv results delivered, wiki ingest skipped. Fix: bash tools/install_aris.sh or smart_update.sh (refreshes ~/.aris/repo), export ARIS_REPO, or cp <ARIS-repo>/tools/research_wiki.py tools/." >&2
    WIKI_SCRIPT=""
  }
  if [ -n "$WIKI_SCRIPT" ]; then
    for each arxiv_id in results:
        python3 "$WIKI_SCRIPT" ingest_paper research-wiki/ \
            --arxiv-id "<arxiv_id>"
  fi
fi

ヘルパーは、メタデータの取得、スラッグの生成、重複排除、ページの作成、インデックスの再構築、ログへの追記を 1 回の呼び出しで処理します。papers/<slug>.md を手作業で作成しないでください。正式なヘルパーのルールについては、shared-references/integration-contract.md を参照してください。取り込み漏れは、上記の手順で $WIKI_SCRIPT を解決した後、python3 "$WIKI_SCRIPT" sync research-wiki/ --arxiv-ids <id1>,<id2>,... を使って後から補完できます。

ステップ 7:最終出力

実行した内容を要約します。

  • Found N papers for "query"
  • Downloaded: papers/2301.07041.pdf (842 KB)(ダウンロードごと)
  • Wiki-ingested N papers(research-wiki/ が存在した場合)
  • 警告(レート制限への到達、ファイルサイズが小さすぎる、すでに存在する場合)

次に使えるスキルを提案します。

/research-lit "topic"     - multi-source review: Zotero + Obsidian + local PDFs + web
/novelty-check "idea"     - verify your idea is novel against these papers

主なルール

  • arXiv ID は常に目立つように表示します。引用と再現性のために必要です。
  • ダウンロードした PDF を検証します。ファイルサイズが 10 KB 以下の場合は、警告を表示して削除します。
  • レート制限:連続して PDF をダウンロードする場合は 1 秒間隔を空けます。HTTP 429 が発生した場合は、5 秒後に 1 回再試行します。
  • 同じパスにある既存の PDF は上書きしません。スキップして「すでに存在します」と報告します。
  • 新形式(2301.07041)と旧形式(cs/0601001)の両方の arXiv ID に対応します。
  • PAPER_DIR は存在しない場合、自動的に作成されます。
  • arXiv API に接続できない場合は、エラーを明確に報告し、代替手段として - sources: web を指定した /research-lit の使用を提案します。

コメント