/aris-arxiv
Search, download, and summarize academic papers from arXiv. Use when user says "search arxiv", "download paper", "fetch arxiv", "arxiv search", "get paper pdf", or wants to find and save papers from arXiv to the local paper library.
Claude Code
$ npx -y skills add OpenLAIR/dr-claw --skill aris-arxiv --agent claude-code
Codex
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a codex -y
Cursor
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a cursor -y
Gemini CLI
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a gemini-cli -y
GitHub Copilot
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a github-copilot -y
OpenCode
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a opencode -y
Windsurf
$ npx skills add OpenLAIR/dr-claw --skill aris-arxiv -a windsurf -y
SKILL.md
aris-arxiv.SKILL.mdname: aris-arxiv
description: Search, download, and summarize academic papers from arXiv. Use when user says "search arxiv", "download paper", "fetch arxiv", "arxiv search", "get paper pdf", or wants to find and save papers from arXiv to the local paper library.
argument-hint: "[query-or-arxiv-id]"
allowed-tools: Bash(*), Read, Write
license: MIT
metadata:
author: wanshuiyin/ARIS
version: "1.0.0"
arXiv Paper Search & Download
Search topic or arXiv paper ID: $ARGUMENTS
Constants
- **PAPER_DIR** - Local directory to save downloaded PDFs. Default: `papers/` in the current project directory.
- **MAX_RESULTS = 10** - Default number of search results.
- **FETCH_SCRIPT** - `$ARIS_INFRA/tools/arxiv_fetch.py` (the ARIS helper bundle, located in Step 2). Fall back to inline Python if not found.
> Overrides (append to arguments): > - `/aris-arxiv "attention mechanism" - max: 20` - return up to 20 results > - `/aris-arxiv "2301.07041" - download` - download a specific paper by ID > - `/aris-arxiv "query" - dir: literature/` - save PDFs to a custom directory > - `/aris-arxiv "query" - download: all` - download all result PDFs
Workflow
Step 1: Parse Arguments
Parse `$ARGUMENTS` for directives:
- **Query or ID**: main search term or a bare arXiv ID such as `2301.07041` or `cs/0601001`
- **`- max: N`**: override MAX_RESULTS (e.g., `- max: 20`)
- **`- dir: PATH`**: override PAPER_DIR (e.g., `- dir: literature/`)
- **`- download`**: download the first result's PDF after listing
- **`- download: all`**: download PDFs for all results
If the argument matches an arXiv ID pattern (`YYMM.NNNNN` or `category/NNNNNNN`), skip the search and go directly to Step 3.
Step 2: Search arXiv
Locate the fetch script:
# Locate the ARIS helper bundle (skills/aris-infra in Dr. Claw; it sits next to
# this skill's own folder). Non-fatal: the steps below fall back when it is missing.
ARIS_INFRA="${ARIS_INFRA:-}"
if [ ! -f "$ARIS_INFRA/tools/research_wiki.py" ]; then
ARIS_INFRA=""
for candidate in \
"${CLAUDE_SKILL_DIR:-/nonexistent}/../aris-infra" \
".claude/skills/aris-infra" \
".agents/skills/library/aris-infra" \
"skills/aris-infra" \
"${HOME:-/nonexistent}/.claude/skills/aris-infra"; do
if [ -f "$candidate/tools/research_wiki.py" ]; then ARIS_INFRA="$candidate"; break; fi
done
fi
if [ -z "$ARIS_INFRA" ]; then
# Project skill links point into the bundled skills folder, so ../aris-infra
# resolves through any linked aris-* skill even when aris-infra is not linked.
for linked in .claude/skills/aris-* .agents/skills/aris-* .agents/skills/library/aris-* .gemini/skills/aris-*; do
if [ -f "$linked/../aris-infra/tools/research_wiki.py" ]; then ARIS_INFRA="$linked/../aris-infra"; break; fi
done
fiIf `ARIS_INFRA` is still empty, it is the `aris-infra` folder beside this skill's own folder: set it to that absolute path.
SCRIPT="$ARIS_INFRA/tools/arxiv_fetch.py"
[ -n "$ARIS_INFRA" ] && [ -f "$SCRIPT" ] || SCRIPT=""
**If SCRIPT is found**, run:
python3 "$SCRIPT" search "QUERY" --max MAX_RESULTS
**If SCRIPT is not found**, fall back to inline 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))
PYEOFPresent results as a table:
| # | arXiv ID | Title | Authors | Date | Category |
|---|------------|---------------------|----------------|------------|----------|
| 1 | 2301.07041 | Attention Is All... | Vaswani et al. | 2017-06-12 | cs.LG |
Step 3: Fetch Details for a Specific ID
When a single paper ID is requested (either directly or from Step 2):
python3 "$SCRIPT" 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 ...
"Display: title, all authors, categories, full abstract, published date, PDF URL, abstract URL.
Step 4: Download PDFs
When download is requested, for each paper ID to download:
# Using fetch script:
python3 "$SCRIPT" 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)')Read more
name: aris-arxiv description: Search, download, and summarize academic papers from arXiv. Use when user says "search arxiv", "download paper", "fetch arxiv", "arxiv search", "get paper pdf", or wants to find and save papers from arXiv to the local paper library. argument-hint: "[query-or-arxiv-id]" allowed-tools: Bash(*), Read, Write license: MIT metadata: author: wanshuiyin/ARIS version: "1.0.0"
arXiv Paper Search & Download
Search topic or arXiv paper ID: $ARGUMENTS
Constants
- **PAPER_DIR** - Local directory to save downloaded PDFs. Default: `papers/` in the current project directory.
- **MAX_RESULTS = 10** - Default number of search results.
- **FETCH_SCRIPT** - `$ARIS_INFRA/tools/arxiv_fetch.py` (the ARIS helper bundle, located in Step 2). Fall back to inline Python if not found.
> Overrides (append to arguments): > - `/aris-arxiv "attention mechanism" - max: 20` - return up to 20 results > - `/aris-arxiv "2301.07041" - download` - download a specific paper by ID > - `/aris-arxiv "query" - dir: literature/` - save PDFs to a custom directory > - `/aris-arxiv "query" - download: all` - download all result PDFs
Workflow
Step 1: Parse Arguments
Parse `$ARGUMENTS` for directives:
- **Query or ID**: main search term or a bare arXiv ID such as `2301.07041` or `cs/0601001`
- **`- max: N`**: override MAX_RESULTS (e.g., `- max: 20`)
- **`- dir: PATH`**: override PAPER_DIR (e.g., `- dir: literature/`)
- **`- download`**: download the first result's PDF after listing
- **`- download: all`**: download PDFs for all results
If the argument matches an arXiv ID pattern (`YYMM.NNNNN` or `category/NNNNNNN`), skip the search and go directly to Step 3.
Step 2: Search arXiv
Locate the fetch script:
# Locate the ARIS helper bundle (skills/aris-infra in Dr. Claw; it sits next to
# this skill's own folder). Non-fatal: the steps below fall back when it is missing.
ARIS_INFRA="${ARIS_INFRA:-}"
if [ ! -f "$ARIS_INFRA/tools/research_wiki.py" ]; then
ARIS_INFRA=""
for candidate in \
"${CLAUDE_SKILL_DIR:-/nonexistent}/../aris-infra" \
".claude/skills/aris-infra" \
".agents/skills/library/aris-infra" \
"skills/aris-infra" \
"${HOME:-/nonexistent}/.claude/skills/aris-infra"; do
if [ -f "$candidate/tools/research_wiki.py" ]; then ARIS_INFRA="$candidate"; break; fi
done
fi
if [ -z "$ARIS_INFRA" ]; then
# Project skill links point into the bundled skills folder, so ../aris-infra
# resolves through any linked aris-* skill even when aris-infra is not linked.
for linked in .claude/skills/aris-* .agents/skills/aris-* .agents/skills/library/aris-* .gemini/skills/aris-*; do
if [ -f "$linked/../aris-infra/tools/research_wiki.py" ]; then ARIS_INFRA="$linked/../aris-infra"; break; fi
done
fiIf `ARIS_INFRA` is still empty, it is the `aris-infra` folder beside this skill's own folder: set it to that absolute path.
SCRIPT="$ARIS_INFRA/tools/arxiv_fetch.py" [ -n "$ARIS_INFRA" ] && [ -f "$SCRIPT" ] || SCRIPT=""
**If SCRIPT is found**, run:
python3 "$SCRIPT" search "QUERY" --max MAX_RESULTS
**If SCRIPT is not found**, fall back to inline 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))
PYEOFPresent results as a table:
| # | arXiv ID | Title | Authors | Date | Category | |---|------------|---------------------|----------------|------------|----------| | 1 | 2301.07041 | Attention Is All... | Vaswani et al. | 2017-06-12 | cs.LG |
Step 3: Fetch Details for a Specific ID
When a single paper ID is requested (either directly or from Step 2):
python3 "$SCRIPT" 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 ...
"Display: title, all authors, categories, full abstract, published date, PDF URL, abstract URL.
Step 4: Download PDFs
When download is requested, for each paper ID to download:
# Using fetch script:
python3 "$SCRIPT" 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)')A Super AI Lab with massive AI Doctors as Assistants. Best IDE for Research via AI Power.
More skills from other plugins.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
agent-browser
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…
Questions about aris-arxiv.
- Which coding agents can use aris-arxiv?
- aris-arxiv installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.

