{"id":"c0fcd2f2-40b2-4c2d-865e-97506ad756bb","shortId":"6QG9Cz","kind":"skill","title":"paper-fetch","tagline":"Use when the user wants to download a paper PDF from a DOI (or title, resolved to a DOI first). Tries Unpaywall, arXiv, bioRxiv/medRxiv, PubMed Central, Semantic Scholar, and Sci-Hub mirrors as a last-resort fallback.","description":"# paper-fetch\n\nFetch the PDF for a paper given a DOI (or title). Tries multiple sources in priority order and stops at the first hit.\n\n**Agent-native.** Structured JSON envelope on stdout, NDJSON progress on stderr (with a session header emitting `schema_version` / `cli_version` for drift detection), stable exit codes, machine-readable schema, TTY-aware format default, idempotent retries. `retry_after_hours` is emitted on every retryable error class.\n\n## Step 0. Update check (notify, don't pull) — first use per conversation\n\nThrottle to one check per 24 hours per installation; never mutate the skill directory without explicit user consent.\n\n1. If `<this-skill-dir>/.last_update` exists and is less than 24 hours old, skip this step entirely.\n\n2. Otherwise, fetch the latest tag from upstream:\n\n   ```bash\n   git -C <this-skill-dir> ls-remote --tags origin 'v*' 2>/dev/null \\\n     | awk '{print $2}' | sed 's|refs/tags/||' \\\n     | sort -V | tail -1\n   ```\n\n3. Compare with this skill's `metadata.version` from the frontmatter. If the upstream tag is strictly newer (semver), tell the user one line and ask:\n\n   > \"A newer version of this skill is available: vX.Y.Z → vA.B.C. Want me to `git pull`?\"\n\n   If they say yes, run `git -C <this-skill-dir> pull --ff-only`. Refresh `.last_update` either way so the prompt doesn't repeat for 24 hours.\n\n4. If upstream is the same or older, refresh `.last_update` silently and continue.\n\n5. On any failure (offline, not a git checkout — e.g. ClawHub-installed copy, read-only path, no permission), swallow the error silently and continue with the user's task. Do not mention the failure.\n\n## Resolution order\n\n1. **Unpaywall** — `https://api.unpaywall.org/v2/{doi}?email=$UNPAYWALL_EMAIL`, read `best_oa_location.url_for_pdf` (skipped if `UNPAYWALL_EMAIL` not set)\n2. **Semantic Scholar** — `https://api.semanticscholar.org/graph/v1/paper/DOI:{doi}?fields=openAccessPdf,externalIds`\n3. **arXiv** — if `externalIds.ArXiv` present, `https://arxiv.org/pdf/{arxiv_id}.pdf`\n4. **PubMed Central OA** — if PMCID present, `https://www.ncbi.nlm.nih.gov/pmc/articles/{pmcid}/pdf/`\n5. **bioRxiv / medRxiv** — if DOI prefix is `10.1101`, query `https://api.biorxiv.org/details/{server}/{doi}` for the latest version PDF URL\n6. **Publisher direct** *(institutional mode only — `PAPER_FETCH_INSTITUTIONAL=1`)* — DOI-prefix → publisher PDF template (Nature / Science / Wiley / Springer / ACS / PNAS / NEJM / Sage / T&F / Elsevier). The caller's own subscription IP / cookies / EZproxy are what authorize the fetch; unauthorized responses fail the `%PDF` check and fall through to step 7.\n7. **Sci-Hub mirrors** *(on by default; disable with `PAPER_FETCH_NO_SCIHUB=1`)* — last-resort fallback. Tries the mirror list in `PAPER_FETCH_SCIHUB_MIRRORS` (or built-in defaults `sci-hub.ru`, `sci-hub.st`, `sci-hub.su`, `sci-hub.box`, `sci-hub.red`, `sci-hub.al`, `sci-hub.mk`, `sci-hub.ee`) in order; on full miss, scrapes `https://www.sci-hub.pub/` once per process for fresh mirrors. CAPTCHA / missing-paper pages have no PDF iframe and fall through silently.\n8. Otherwise → report failure with title/authors so the user can request via ILL\n\nIf only a title is given, pass it directly via `--title \"<title>\"`. Resolution chain:\n\n1. **Crossref** `query.title` — primary; covers all major journal/conference DOIs\n2. **Semantic Scholar `/paper/search/match`** — fallback when Crossref's top match is low-confidence (`match_score < 40`) or the gap to the runner-up is `< 3`. Critically, S2 covers arXiv-only preprints (no Crossref DOI). When S2 surfaces a paper that has only an arXiv id, the canonical `10.48550/arXiv.<id>` is synthesized so the download chain stays uniform.\n3. **Crossref's best guess (low-confidence)** — used only when both resolvers struggled. The result envelope sets `meta.title_resolution.low_confidence: true` plus a `low_confidence_reason` (`score_below_threshold` / `ambiguous_runner_up`) so an agent can either bail or confirm via `--dry-run`.\n\nEither way the resolved DOI, the winning resolver, the full `resolvers_tried` list, and the top candidate matches are all surfaced under `meta.title_resolution`.\n\n**If `asta-skill` is registered**, the agent can alternatively resolve title → DOI through the Asta MCP first, then pass the DOI directly here. This skips paper-fetch's two-stage Crossref/S2 chain in favor of Asta's richer search surface (relevance ranking, snippet search, citation graph). Workflow: call `asta__search_paper_by_title(\"<title>\", fields=\"title,year,authors,externalIds\")`, read `externalIds.DOI` (or `10.48550/arXiv.<ArXiv>` when only `ArXiv` is present), then `paper-fetch <doi>`. Use `--title` when Asta isn't available or when a single command is preferred.\n\n## Usage\n\n```bash\npython scripts/fetch.py <DOI> [options]\npython scripts/fetch.py --title \"<paper title>\" [options]\npython scripts/fetch.py --batch <FILE|-> [options]\npython scripts/fetch.py schema           # machine-readable self-description\n```\n\n### Flags\n\n| Flag | Default | Description |\n|------|---------|-------------|\n| `doi` | — | DOI to fetch (positional). Use `-` to read a single DOI from stdin |\n| `--title TITLE` | — | Paper title; resolved to a DOI via Crossref before download. Mutually exclusive with positional DOI / `--batch` |\n| `--batch FILE` | — | File with one DOI per line for bulk download. Use `-` to read from stdin |\n| `--out DIR` | `pdfs` | Output directory |\n| `--dry-run` | off | Resolve sources without downloading; preview PDF URL and destination |\n| `--format` | auto | `json` for agents, `text` for humans. Auto-detects: `json` when stdout is not a TTY, `text` when it is |\n| `--pretty` | off | Pretty-print JSON with 2-space indent |\n| `--stream` | off | Emit one NDJSON per line on stdout as each DOI resolves, then a summary line (batch mode) |\n| `--overwrite` | off | Re-download even when destination file already exists |\n| `--idempotency-key KEY` | — | Safe-retry key. Re-running with the same key replays the original envelope from `<out>/.paper-fetch-idem/` without network I/O |\n| `--timeout SECONDS` | `30` | HTTP timeout per request |\n| `--version` | — | Print CLI + schema version and exit |\n\n### Agent discovery: `schema` subcommand\n\n```bash\npython scripts/fetch.py schema\n```\n\nEmits a complete machine-readable description of the CLI on stdout (no network). Includes `cli_version`, `schema_version`, parameter types, exit codes, error codes, envelope shapes, and environment variables. Agents should read this once, cache it against `schema_version`, and re-read when the cached version drifts.\n\n### Output contract\n\n**stdout** emits a single JSON envelope. Every envelope carries a `meta` slot.\n\n**Success** (all DOIs resolved):\n\n```json\n{\n  \"ok\": true,\n  \"data\": {\n    \"results\": [\n      {\n        \"doi\": \"10.1038/s41586-021-03819-2\",\n        \"success\": true,\n        \"source\": \"unpaywall\",\n        \"pdf_url\": \"https://www.nature.com/articles/s41586-021-03819-2.pdf\",\n        \"file\": \"pdfs/Jumper_2021_Highly_accurate_protein_structure_predic.pdf\",\n        \"meta\": {\"title\": \"Highly accurate protein structure prediction with AlphaFold\", \"year\": 2021, \"author\": \"Jumper\"},\n        \"sources_tried\": [\"unpaywall\"]\n      }\n    ],\n    \"summary\": {\"total\": 1, \"succeeded\": 1, \"failed\": 0},\n    \"next\": []\n  },\n  \"meta\": {\n    \"request_id\": \"req_a908f5156fc1\",\n    \"latency_ms\": 2036,\n    \"schema_version\": \"1.3.0\",\n    \"cli_version\": \"0.7.0\",\n    \"sources_tried\": [\"unpaywall\"]\n  }\n}\n```\n\n**Partial** (batch mode — some DOIs failed, exit code reflects the failure class):\n\n```json\n{\n  \"ok\": \"partial\",\n  \"data\": {\n    \"results\": [\n      { \"doi\": \"10.1038/s41586-021-03819-2\", \"success\": true, \"source\": \"unpaywall\", ... },\n      {\n        \"doi\": \"10.1234/nonexistent\",\n        \"success\": false,\n        \"source\": null,\n        \"pdf_url\": null,\n        \"file\": null,\n        \"meta\": {},\n        \"sources_tried\": [\"unpaywall\", \"semantic_scholar\"],\n        \"error\": {\n          \"code\": \"not_found\",\n          \"message\": \"No open-access PDF found\",\n          \"retryable\": true,\n          \"retry_after_hours\": 168,\n          \"reason\": \"OA availability changes over time; retry after embargo lifts or preprint appears\"\n        }\n      }\n    ],\n    \"summary\": {\"total\": 2, \"succeeded\": 1, \"failed\": 1},\n    \"next\": [\"paper-fetch 10.1234/nonexistent --out pdfs\"]\n  },\n  \"meta\": { ... }\n}\n```\n\nThe `next` slot is an array of suggested follow-up commands: re-invoking them retries only the failed subset. Combine with `--idempotency-key` to make the whole batch safely retriable without re-downloading the already-succeeded items.\n\n**Failure** (bad arguments, exit code 3):\n\n```json\n{\n  \"ok\": false,\n  \"error\": {\n    \"code\": \"validation_error\",\n    \"message\": \"Provide a DOI or --batch file\",\n    \"retryable\": false\n  },\n  \"meta\": { ... }\n}\n```\n\n**Per-item skipped** (destination already exists, no `--overwrite`):\n\n```json\n{\n  \"doi\": \"10.1038/s41586-021-03819-2\",\n  \"success\": true,\n  \"source\": \"unpaywall\",\n  \"pdf_url\": \"https://...\",\n  \"file\": \"pdfs/Jumper_2021_...pdf\",\n  \"skipped\": true,\n  \"skip_reason\": \"file_exists\",\n  \"sources_tried\": [\"unpaywall\"]\n}\n```\n\n**Idempotency replay** (re-run with the same `--idempotency-key`):\n\nThe cached envelope is returned verbatim, but `meta.request_id` and `meta.latency_ms` are re-stamped for the current call, and `meta.replayed_from_idempotency_key` is set. No network I/O occurs.\n\n### Stderr progress (NDJSON)\n\nWhen `--format json`, stderr emits one JSON object per line for liveness:\n\n```\n{\"event\": \"session\",     \"request_id\": \"req_...\", \"elapsed_ms\": 0,    \"cli_version\": \"0.6.1\", \"schema_version\": \"1.3.0\"}\n{\"event\": \"start\",       \"request_id\": \"req_...\", \"elapsed_ms\": 2,    \"doi\": \"10.1038/...\"}\n{\"event\": \"source_try\",  \"request_id\": \"req_...\", \"elapsed_ms\": 2,    \"doi\": \"...\", \"source\": \"unpaywall\"}\n{\"event\": \"source_hit\",  \"request_id\": \"req_...\", \"elapsed_ms\": 2036, \"doi\": \"...\", \"source\": \"unpaywall\", \"pdf_url\": \"...\"}\n{\"event\": \"download_ok\", \"request_id\": \"req_...\", \"elapsed_ms\": 4120, \"doi\": \"...\", \"file\": \"...\"}\n```\n\nEvent types: `session`, `start`, `source_try`, `source_hit`, `source_miss`, `source_skip`, `source_enrich`, `source_enrich_failed`, `download_ok`, `download_error`, `download_skip`, `dry_run`, `not_found`. All events share `request_id` and `elapsed_ms`, letting an orchestrator correlate progress across stderr and the final stdout envelope. The `session` event fires once per invocation, before any DOI work or network I/O, and carries `cli_version` / `schema_version` so agents can detect schema drift against a cached copy without waiting for the final envelope.\n\n`source_enrich` fires when Semantic Scholar is called purely to backfill missing `author` / `title` after another source already provided the PDF URL; its `fields` array lists exactly which fields were filled in. `source_enrich_failed` fires when that enrichment call fails — the Unpaywall PDF URL is still used and the filename falls back to `unknown_<year>_…`.\n\nWhen `--format text`, stderr emits human-readable prose.\n\n### Exit codes\n\n| Code | Meaning | Retryable class |\n|------|---------|-----------------|\n| `0` | All DOIs resolved / previewed | — |\n| `1` | Unresolved — one or more DOIs had no OA copy; no transport failure | Not now (retry after `retry_after_hours`) |\n| `2` | Reserved for auth errors (currently unused) | — |\n| `3` | Validation error (bad arguments, missing input) | No |\n| `4` | Transport error (network / download / IO failure) | Yes |\n\nThe taxonomy lets an orchestrator route failures deterministically: exit 4 is worth retrying immediately, exit 1 is not, exit 3 is a bug in the caller.\n\n### Error codes in JSON\n\nEvery retryable error carries a `retry_after_hours` hint in the error object, so an orchestrator can schedule retries without guessing.\n\n| Code | Meaning | Retryable | `retry_after_hours` |\n|------|---------|-----------|---------------------|\n| `validation_error` | Bad arguments or empty input | No | — |\n| `title_resolve_failed` | Crossref returned no items for the given `--title` query (try a longer / cleaner title, or pass the DOI directly) | No | — |\n| `not_found` | No open-access PDF found | Yes | `168` (one week — OA lands on embargo / preprint timescale) |\n| `download_network_error` | Network failure during download | Yes | `1` |\n| `download_not_a_pdf` | Response was not a PDF (HTML landing page) | No | — |\n| `download_host_not_allowed` | PDF URL failed SSRF safety check (private IP / non-http(s) / non-80,443 / blocked metadata host) | No | — |\n| `download_size_exceeded` | Response exceeded 50 MB limit | Yes | `24` |\n| `download_io_error` | Local filesystem write failed | Yes | `1` |\n| `internal_error` | Unexpected error | No | — |\n\nThe canonical mapping lives in `RETRY_AFTER_HOURS` in `scripts/fetch.py` and is surfaced in `schema.error_codes`.\n\n### Examples\n\n```bash\n# Single DOI (JSON output when piped; text when in a terminal)\npython scripts/fetch.py 10.1038/s41586-020-2649-2\n\n# Single title (resolved to DOI via Crossref, then downloaded)\npython scripts/fetch.py --title \"Highly accurate protein structure prediction with AlphaFold\"\n\n# Dry-run preview (resolve without downloading)\npython scripts/fetch.py 10.1038/s41586-020-2649-2 --dry-run\n\n# Title + dry-run — preview the resolved DOI and candidate matches\npython scripts/fetch.py --title \"Attention Is All You Need\" --dry-run\n\n# Force JSON (for agents even inside a terminal)\npython scripts/fetch.py 10.1038/s41586-020-2649-2 --format json\n\n# Human-readable with pretty colors in a pipeline\npython scripts/fetch.py 10.1038/s41586-020-2649-2 --format text\n\n# Batch download, safely retriable\npython scripts/fetch.py --batch dois.txt --out ./papers \\\n    --idempotency-key monday-review-batch\n\n# Pipe DOIs from another tool\nzot -F ids.json query ... | jq -r '.[].doi' | python scripts/fetch.py --batch -\n\n# Agent discovery\npython scripts/fetch.py schema --pretty\n\n# Streaming mode — one result per line as each DOI resolves\npython scripts/fetch.py --batch dois.txt --stream\n\n# Works without UNPAYWALL_EMAIL (skips Unpaywall, uses remaining 4 sources)\npython scripts/fetch.py 10.1038/s41586-020-2649-2\n```\n\n## Environment\n\n| Variable | Default | Purpose |\n|---|---|---|\n| `UNPAYWALL_EMAIL` | unset | Contact email for Unpaywall API. Optional but recommended. Without it, Unpaywall is skipped (remaining sources still work). |\n| `PAPER_FETCH_INSTITUTIONAL` | unset | Set to any value (e.g. `1`) to opt into **institutional mode** — activates a 1 req/s rate limiter and the publisher-direct fallback. See below. |\n| `PAPER_FETCH_NO_SCIHUB` | unset | Set to any value to disable the Sci-Hub fallback (step 7). |\n| `PAPER_FETCH_SCIHUB_MIRRORS` | unset | Comma-separated mirror hostnames to try in priority order (e.g. `sci-hub.ru,sci-hub.st,sci-hub.su`). Overrides built-in defaults. |\n\n## Institutional access (opt-in)\n\nMany researchers have legitimate subscription access through their institution's IP range (on-campus or VPN). Paper-fetch can use that access by letting the publisher's own auth (your IP, your session cookies) decide whether to serve the PDF.\n\nHost reachability does not differ between modes — public mode already trusts URLs returned by the OA APIs (Unpaywall, Semantic Scholar, bioRxiv, PMC) and fetches any HTTPS host that passes SSRF defense. Institutional mode adds two things: (1) a **publisher-direct fallback** (step 6 above) that constructs a publisher-side PDF URL by DOI prefix when every OA source missed, so your institutional IP/cookies can authorize the fetch, and (2) a **1 req/s rate limiter** to keep batch jobs from getting your IP throttled or banned for \"systematic downloading.\"\n\n**Opt in:** `export PAPER_FETCH_INSTITUTIONAL=1`\n\n**What changes in institutional mode:**\n\n| Aspect | Public (default) | Institutional |\n|---|---|---|\n| Host reachability | Any public HTTPS host passing SSRF defense | Same |\n| SSRF defense | Enforced (private IP / non-http(s) / non-80,443 / cloud metadata all blocked) | Enforced — same rules |\n| Publisher-direct fallback | Off | On — DOI-prefix → publisher PDF URL, last resort after all OA sources miss |\n| Rate limit | None | 1 req/s token bucket (all outbound) |\n| `meta.auth_mode` | `\"public\"` | `\"institutional\"` |\n\n**What stays the same:**\n\n- `%PDF` magic-byte check and 50 MB size cap (prevents HTML landing pages and oversized responses slipping through)\n- No CAPTCHA solving, ever. If a publisher shows a challenge, the response won't start with `%PDF` and paper-fetch falls through to the next source.\n- No browser automation, no Playwright, no stealth.\n- Agent cannot opt in on its own — `PAPER_FETCH_INSTITUTIONAL` must be set by the human operator in the shell environment. This is the trust boundary.\n\n**When paper-fetch can't find an OA copy and you're in public mode**, the error envelope includes `suggest_institutional: true` and a hint telling the user to set the env var. Agents can surface this verbatim rather than failing silently.\n\n**ToS notice:** almost every publisher subscription prohibits \"systematic downloading.\" The 1 req/s rate limit plus the existing per-file idempotency are designed to keep individual research use within acceptable bounds. Running many parallel paper-fetch processes, or lifting the rate limit, can trigger a publisher-wide IP ban affecting your entire institution. Don't.\n\n## Notes\n\n- **Auth is delegated.** The agent never runs a login subcommand. The human or the orchestrator sets `UNPAYWALL_EMAIL` in the environment; the agent inherits it. Missing email degrades gracefully to the remaining 4 sources.\n- **Trust is directional.** CLI arguments are validated once at the entry point. SSRF defense, the `%PDF` magic-byte check, and the 50 MB size cap are enforced in the environment layer, not at the agent's request. An agent cannot loosen safety by passing a flag — opting into institutional mode (and its rate-limit risk profile) is an operator action via environment variable.\n- **Downloads are naturally idempotent.** Re-running against the same `--out` skips files that already exist (deterministic filename: `{first_author}_{year}_{journal_abbrev}_{short_title}.pdf`; the journal segment is omitted if metadata lacks a journal/venue). Pair with `--idempotency-key` to also replay the exact envelope without any network I/O.\n- **Institutional mode** is opt-in via `PAPER_FETCH_INSTITUTIONAL=1` and uses the caller's own subscription (IP, cookies, or EZproxy).\n- **Default output directory:** `./pdfs/`.\n\n## Auto-update\n\nSee **Step 0** at the top of this file. When installed via `git clone`, the agent runs a synchronous `git pull --ff-only` on the first invocation per conversation, throttled to once per 24h via `<skill_dir>/.last_update`. Updates apply to the current invocation.\n\nForce an immediate check with `rm <skill_dir>/.last_update`.","tags":["paper","fetch","agents365-ai","agent-skills","claude-code","claude-code-skill","claude-skills","doi","open-access","openclaw","openclaw-skills","pdf-downloader"],"capabilities":["skill","source-agents365-ai","skill-paper-fetch","topic-agent-skills","topic-claude-code","topic-claude-code-skill","topic-claude-skills","topic-doi","topic-open-access","topic-openclaw","topic-openclaw-skills","topic-pdf-downloader","topic-skill-md","topic-skillsmp","topic-unpaywall"],"categories":["paper-fetch"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Agents365-ai/paper-fetch","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Agents365-ai/paper-fetch","source_repo":"https://github.com/Agents365-ai/paper-fetch","install_from":"skills.sh"}},"qualityScore":"0.494","qualityRationale":"deterministic score 0.49 from registry signals: · indexed on github topic:agent-skills · 88 github stars · SKILL.md body (18,833 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-10T00:56:25.319Z","embedding":null,"createdAt":"2026-04-18T23:56:23.197Z","updatedAt":"2026-05-10T00:56:25.319Z","lastSeenAt":"2026-05-10T00:56:25.319Z","tsv":"'-1':190 '-80':1726,2208 '/.last_update':149,2648,2661 '/.paper-fetch-idem':925 '/articles/s41586-021-03819-2.pdf':1034 '/arxiv':585,727 '/details/':371 '/dev/null':180 '/graph/v1/paper/doi:':332 '/nonexistent':1104,1162 '/paper/search/match':537 '/papers':1882 '/pdf':359 '/pdf/':344 '/pdfs':2608 '/pmc/articles/':357 '/s41586-020-2649-2':1788,1818,1855,1870,1939 '/s41586-021-03819-2':1025,1097,1243 '/v2/':312 '0':118,1059,1326,1533,2614 '0.6.1':1329 '0.7.0':1074 '1':147,308,389,446,525,1055,1057,1154,1156,1538,1596,1695,1750,1973,1981,2118,2154,2178,2239,2385,2593 '1.3.0':1071,1332 '10.1038':1024,1096,1242,1342,1787,1817,1854,1869,1938 '10.1101':367 '10.1234':1103,1161 '10.48550':584,726 '168':1136,1678 '2':162,179,183,327,534,872,1152,1340,1351,1558,2152 '2021':1047 '2036':1068,1363 '24':134,155,254,1741 '24h':2646 '3':191,337,560,594,1213,1565,1600 '30':931 '4':256,348,1573,1590,1934,2465 '40':550 '4120':1377 '443':1727,2209 '5':270,360 '50':1737,2259,2489 '6':380,2125 '7':431,432,2010 '8':499 'a908f5156fc1':1065 'abbrev':2554 'ac':400 'accept':2404 'access':1128,1674,2036,2045,2063 'accur':1040,1802 'across':1420 'action':2528 'activ':1979 'add':2115 'affect':2426 'agent':70,628,669,847,943,981,1448,1847,1905,2306,2366,2437,2455,2502,2506,2627 'agent-n':69 'allow':1712 'almost':2377 'alphafold':1045,1807 'alreadi':903,1205,1236,1480,2091,2546 'already-succeed':1204 'also':2574 'altern':671 'ambigu':623 'anoth':1478,1893 'api':1951,2098 'api.biorxiv.org':370 'api.biorxiv.org/details/':369 'api.semanticscholar.org':331 'api.semanticscholar.org/graph/v1/paper/doi:':330 'api.unpaywall.org':311 'api.unpaywall.org/v2/':310 'appear':1149 'appli':2650 'argument':1210,1569,1641,2471 'array':1171,1487 'arxiv':26,338,345,565,580,730 'arxiv-on':564 'arxiv.org':343 'arxiv.org/pdf/':342 'ask':215 'aspect':2184 'asta':664,677,700,713,740 'asta-skil':663 'attent':1836 'auth':1561,2070,2433 'author':417,721,1048,1475,2148,2551 'auto':844,852,2610 'auto-detect':851 'auto-upd':2609 'autom':2301 'avail':223,743,1139 'awar':102 'awk':181 'back':1515 'backfil':1473 'bad':1209,1568,1640 'bail':631 'ban':2168,2425 'bash':170,752,947,1773 'batch':762,808,809,892,1079,1196,1226,1873,1879,1889,1904,1923,2160 'best':597 'best_oa_location.url':318 'biorxiv':361,2102 'biorxiv/medrxiv':27 'block':1728,2213 'bound':2405 'boundari':2331 'browser':2300 'bucket':2242 'bug':1603 'built':462,2032 'built-in':461,2031 'bulk':818 'byte':2256,2485 'c':172,237 'cach':986,997,1274,1455 'call':712,1292,1470,1502 'caller':408,1606,2597 'campus':2054 'candid':654,1831 'cannot':2307,2507 'canon':583,1757 'cap':2262,2492 'captcha':486,2273 'carri':1010,1442,1614 'central':29,350 'chain':524,591,696 'challeng':2281 'chang':1140,2180 'check':120,132,425,1718,2257,2486,2658 'checkout':278 'citat':709 'class':116,1089,1532 'clawhub':281 'clawhub-instal':280 'cleaner':1661 'cli':88,938,960,966,1072,1327,1443,2470 'clone':2625 'cloud':2210 'code':95,973,975,1085,1121,1212,1218,1528,1529,1608,1632,1771 'color':1863 'combin':1187 'comma':2017 'comma-separ':2016 'command':748,1177 'compar':192 'complet':953 'confid':547,601,613,618 'confirm':633 'consent':146 'construct':2128 'contact':1947 'continu':269,295 'contract':1001 'convers':128,2641 'cooki':413,2075,2602 'copi':283,1456,1547,2341 'correl':1418 'cover':529,563 'critic':561 'crossref':526,540,569,595,800,1649,1795 'crossref/s2':695 'current':1291,1563,2653 'data':1021,1093 'decid':2076 'default':104,439,464,776,1942,2034,2186,2605 'defens':2112,2196,2199,2480 'degrad':2460 'deleg':2435 'descript':773,777,957 'design':2397 'destin':842,901,1235 'detect':92,853,1450 'determinist':1588,2548 'differ':2086 'dir':826 'direct':382,520,684,1667,1989,2122,2219,2469 'directori':142,829,2607 'disabl':440,2003 'discoveri':944,1906 'doesn':250 'doi':16,22,54,313,333,364,373,391,533,570,642,674,683,778,779,788,798,807,814,886,1016,1023,1082,1095,1102,1224,1241,1341,1352,1364,1378,1436,1535,1543,1666,1775,1793,1829,1891,1901,1919,2136,2224 'doi-prefix':390,2223 'dois.txt':1880,1924 'download':10,590,802,819,837,898,1202,1370,1397,1399,1401,1577,1687,1693,1696,1709,1732,1742,1797,1814,1874,2171,2383,2532 'dri':636,831,1403,1809,1820,1824,1842 'drift':91,999,1452 'dry-run':635,830,1808,1819,1823,1841 'e.g':279,1972,2026 'either':245,630,638 'elaps':1324,1338,1349,1361,1375,1413 'elsevi':406 'email':314,316,324,1929,1945,1948,2450,2459 'embargo':1145,1684 'emit':85,111,877,951,1003,1311,1522 'empti':1643 'enforc':2200,2214,2494 'enrich':1393,1395,1464,1496,1501 'entir':161,2428 'entri':2477 'env':2364 'envelop':74,610,923,976,1007,1009,1275,1426,1462,2350,2578 'environ':979,1940,2326,2453,2497,2530 'error':115,292,974,1120,1217,1220,1400,1562,1567,1575,1607,1613,1622,1639,1689,1744,1752,1754,2349 'even':899,1848 'event':1319,1333,1343,1355,1369,1380,1408,1429 'ever':2275 'everi':113,1008,1611,2139,2378 'exact':1489,2577 'exampl':1772 'exceed':1734,1736 'exclus':804 'exist':150,904,1237,1258,2391,2547 'exit':94,942,972,1084,1211,1527,1589,1595,1599 'explicit':144 'export':2174 'externalid':336,722 'externalids.arxiv':340 'externalids.doi':724 'ezproxi':414,2604 'f':405,1896 'fail':422,1058,1083,1155,1185,1396,1497,1503,1648,1715,1748,2373 'failur':273,305,502,1088,1208,1550,1579,1587,1691 'fall':427,496,1514,2293 'fallback':42,450,538,1990,2008,2123,2220 'fals':1106,1216,1229 'favor':698 'fetch':3,45,46,164,387,419,443,457,690,736,781,1160,1965,1994,2012,2059,2105,2150,2176,2292,2314,2335,2411,2591 'ff':240,2634 'ff-on':239,2633 'field':334,718,1486,1491 'file':763,810,811,902,1035,1112,1227,1250,1257,1379,2394,2544,2620 'filenam':1513,2549 'filesystem':1746 'fill':1493 'final':1424,1461 'find':2338 'fire':1430,1465,1498 'first':23,67,125,679,2550,2638 'flag':774,775,2513 'follow':1175 'follow-up':1174 'forc':1844,2655 'format':103,843,1308,1519,1856,1871 'found':1123,1130,1406,1670,1676 'fresh':484 'frontmatt':200 'full':476,647 'gap':553 'get':2163 'git':171,229,236,277,2624,2631 'given':52,517,1655 'grace':2461 'graph':710 'guess':598,1631 'header':84 'high':1039,1801 'hint':1619,2357 'hit':68,1357,1387 'host':1710,1730,2082,2108,2188,2193 'hostnam':2020 'hour':109,135,156,255,1135,1557,1618,1637,1763 'html':1705,2264 'http':932,1723,2205 'https':2107,2192 'hub':35,435,2007 'human':850,1524,1859,2321,2444 'human-read':1523,1858 'i/o':928,1302,1440,2582 'id':346,581,1063,1281,1322,1336,1347,1359,1373,1411 'idempot':105,906,1190,1262,1271,1296,1884,2395,2535,2571 'idempotency-key':905,1189,1270,1883,2570 'ids.json':1897 'ifram':494 'ill':511 'immedi':1594,2657 'includ':965,2351 'indent':874 'individu':2400 'inherit':2456 'input':1571,1644 'insid':1849 'instal':137,282,2622 'institut':383,388,1966,1977,2035,2048,2113,2145,2177,2182,2187,2248,2315,2353,2429,2516,2583,2592 'intern':1751 'invoc':1433,2639,2654 'invok':1180 'io':1578,1743 'ip':412,1720,2050,2072,2165,2202,2424,2601 'ip/cookies':2146 'isn':741 'item':1207,1233,1652 'job':2161 'journal':2553,2559 'journal/conference':532 'journal/venue':2567 'jq':1899 'json':73,845,854,870,1006,1018,1090,1214,1240,1309,1313,1610,1776,1845,1857 'jumper':1049 'keep':2159,2399 'key':907,908,912,919,1191,1272,1297,1885,2572 'lack':2565 'land':1682,1706,2265 'last':40,243,265,448,2229 'last-resort':39,447 'latenc':1066 'latest':166,376 'layer':2498 'legitim':2043 'less':153 'let':1415,1583,2065 'lift':1146,2414 'limit':1739,1984,2157,2237,2388,2417,2522 'line':213,816,881,891,1316,1916 'list':454,650,1488 'live':1318,1759 'local':1745 'login':2441 'longer':1660 'loosen':2508 'low':546,600,617 'low-confid':545,599 'ls':174 'ls-remot':173 'machin':97,769,955 'machine-read':96,768,954 'magic':2255,2484 'magic-byt':2254,2483 'major':531 'make':1193 'mani':2040,2407 'map':1758 'match':543,548,655,1832 'mb':1738,2260,2490 'mcp':678 'mean':1530,1633 'medrxiv':362 'mention':303 'messag':1124,1221 'meta':1012,1037,1061,1114,1165,1230 'meta.auth':2245 'meta.latency':1283 'meta.replayed':1294 'meta.request':1280 'meta.title':660 'meta.title_resolution.low':612 'metadata':1729,2211,2564 'metadata.version':197 'mirror':36,436,453,459,485,2014,2019 'miss':477,488,1389,1474,1570,2142,2235,2458 'missing-pap':487 'mode':384,893,1080,1912,1978,2088,2090,2114,2183,2246,2347,2517,2584 'monday':1887 'monday-review-batch':1886 'ms':1067,1284,1325,1339,1350,1362,1376,1414 'multipl':58 'must':2316 'mutat':139 'mutual':803 'nativ':71 'natur':396,2534 'ndjson':77,879,1306 'need':1840 'nejm':402 'network':927,964,1301,1439,1576,1688,1690,2581 'never':138,2438 'newer':207,217 'next':1060,1157,1167,2297 'non':1722,1725,2204,2207 'non-http':1721,2203 'none':2238 'note':2432 'notic':2376 'notifi':121 'null':1108,1111,1113 'oa':351,1138,1546,1681,2097,2140,2233,2340 'object':1314,1623 'occur':1303 'offlin':274 'ok':1019,1091,1215,1371,1398 'old':157 'older':263 'omit':2562 'on-campus':2052 'one':131,212,813,878,1312,1540,1679,1913 'open':1127,1673 'open-access':1126,1672 'openaccesspdf':335 'oper':2322,2527 'opt':1975,2038,2172,2308,2514,2587 'opt-in':2037,2586 'option':755,759,764,1952 'orchestr':1417,1585,1626,2447 'order':62,307,474,2025 'origin':177,922 'otherwis':163,500 'outbound':2244 'output':828,1000,1777,2606 'overrid':2030 'overs':2268 'overwrit':894,1239 'page':490,1707,2266 'pair':2568 'paper':2,12,44,51,386,442,456,489,575,689,715,735,793,1159,1964,1993,2011,2058,2175,2291,2313,2334,2410,2590 'paper-fetch':1,43,688,734,1158,2057,2290,2333,2409 'parallel':2408 'paramet':970 'partial':1078,1092 'pass':518,681,1664,2110,2194,2511 'path':287 'pdf':13,48,320,347,378,394,424,493,839,1030,1109,1129,1248,1252,1367,1483,1506,1675,1699,1704,1713,2081,2133,2227,2253,2288,2482,2557 'pdfs':827,1164 'pdfs/jumper_2021_':1251 'pdfs/jumper_2021_highly_accurate_protein_structure_predic.pdf':1036 'per':127,133,136,481,815,880,934,1232,1315,1432,1915,2393,2640,2645 'per-fil':2392 'per-item':1231 'permiss':289 'pipe':1779,1890 'pipelin':1866 'playwright':2303 'plus':615,2389 'pmc':2103 'pmcid':353,358 'pnas':401 'point':2478 'posit':782,806 'predict':1043,1805 'prefer':750 'prefix':365,392,2137,2225 'preprint':567,1148,1685 'present':341,354,732 'pretti':865,868,1862,1910 'pretty-print':867 'prevent':2263 'preview':838,1537,1811,1826 'primari':528 'print':182,869,937 'prioriti':61,2024 'privat':1719,2201 'process':482,2412 'profil':2524 'progress':78,1305,1419 'prohibit':2381 'prompt':249 'prose':1526 'protein':1041,1803 'provid':1222,1481 'public':2089,2185,2191,2247,2346 'publish':381,393,1988,2067,2121,2131,2218,2226,2278,2379,2422 'publisher-direct':1987,2120,2217 'publisher-sid':2130 'publisher-wid':2421 'pubm':28,349 'pull':124,230,238,2632 'pure':1471 'purpos':1943 'python':753,756,760,765,948,1785,1798,1815,1833,1852,1867,1877,1902,1907,1921,1936 'queri':368,1657,1898 'query.title':527 'r':1900 'rang':2051 'rank':706 'rate':1983,2156,2236,2387,2416,2521 'rate-limit':2520 'rather':2371 're':897,914,993,1179,1201,1265,1287,2344,2537 're-download':896,1200 're-invok':1178 're-read':992 're-run':913,1264,2536 're-stamp':1286 'reachabl':2083,2189 'read':285,317,723,785,822,983,994 'read-on':284 'readabl':98,770,956,1525,1860 'reason':619,1137,1256 'recommend':1954 'reflect':1086 'refresh':242,264 'refs/tags':186 'regist':667 'relev':705 'remain':1933,1960,2464 'remot':175 'repeat':252 'replay':920,1263,2575 'report':501 'req':1064,1323,1337,1348,1360,1374 'req/s':1982,2155,2240,2386 'request':509,935,1062,1321,1335,1346,1358,1372,1410,2504 'research':2041,2401 'reserv':1559 'resolut':306,523,661 'resolv':19,606,641,645,648,672,795,834,887,1017,1536,1647,1791,1812,1828,1920 'resort':41,449,2230 'respons':421,1700,1735,2269,2283 'result':609,1022,1094,1914 'retri':106,107,911,1133,1143,1182,1553,1555,1593,1616,1629,1635,1761 'retriabl':1198,1876 'retryabl':114,1131,1228,1531,1612,1634 'return':1277,1650,2094 'review':1888 'richer':702 'risk':2523 'rm':2660 'rout':1586 'rule':2216 'run':235,637,832,915,1266,1404,1810,1821,1825,1843,2406,2439,2538,2628 'runner':557,624 'runner-up':556 's2':562,572 'safe':910,1197,1875 'safe-retri':909 'safeti':1717,2509 'sage':403 'say':233 'schedul':1628 'schema':86,99,767,939,945,950,968,989,1069,1330,1445,1451,1909 'schema.error':1770 'scholar':31,329,536,1119,1468,2101 'sci':34,434,2006 'sci-hub':33,433,2005 'sci-hub.al':470 'sci-hub.box':468 'sci-hub.ee':472 'sci-hub.mk':471 'sci-hub.red':469 'sci-hub.ru':465,2027 'sci-hub.st':466,2028 'sci-hub.su':467,2029 'scienc':397 'scihub':445,458,1996,2013 'score':549,620 'scrape':478 'scripts/fetch.py':754,757,761,766,949,1765,1786,1799,1816,1834,1853,1868,1878,1903,1908,1922,1937 'search':703,708,714 'second':930 'sed':184 'see':1991,2612 'segment':2560 'self':772 'self-descript':771 'semant':30,328,535,1118,1467,2100 'semver':208 'separ':2018 'serv':2079 'server':372 'session':83,1320,1382,1428,2074 'set':326,611,1299,1968,1998,2318,2362,2448 'shape':977 'share':1409 'shell':2325 'short':2555 'show':2279 'side':2132 'silent':267,293,498,2374 'singl':747,787,1005,1774,1789 'size':1733,2261,2491 'skill':141,195,221,665 'skill-paper-fetch' 'skip':158,321,687,1234,1253,1255,1391,1402,1930,1959,2543 'slip':2270 'slot':1013,1168 'snippet':707 'solv':2274 'sort':187 'sourc':59,835,1028,1050,1075,1100,1107,1115,1246,1259,1344,1353,1356,1365,1384,1386,1388,1390,1392,1394,1463,1479,1495,1935,1961,2141,2234,2298,2466 'source-agents365-ai' 'space':873 'springer':399 'ssrf':1716,2111,2195,2198,2479 'stabl':93 'stage':694 'stamp':1288 'start':1334,1383,2286 'stay':592,2250 'stderr':80,1304,1310,1421,1521 'stdin':790,824 'stdout':76,856,883,962,1002,1425 'stealth':2305 'step':117,160,430,2009,2124,2613 'still':1509,1962 'stop':64 'stream':875,1911,1925 'strict':206 'structur':72,1042,1804 'struggl':607 'subcommand':946,2442 'subscript':411,2044,2380,2600 'subset':1186 'succeed':1056,1153,1206 'success':1014,1026,1098,1105,1244 'suggest':1173,2352 'summari':890,1053,1150 'surfac':573,658,704,1768,2368 'swallow':290 'synchron':2630 'synthes':587 'systemat':2170,2382 'tag':167,176,204 'tail':189 'task':300 'taxonomi':1582 'tell':209,2358 'templat':395 'termin':1784,1851 'text':848,861,1520,1780,1872 'thing':2117 'threshold':622 'throttl':129,2166,2642 'time':1142 'timeout':929,933 'timescal':1686 'titl':18,56,515,522,673,717,719,738,758,791,792,794,1038,1476,1646,1656,1662,1790,1800,1822,1835,2556 'title/authors':504 'token':2241 'tool':1894 'top':542,653,2617 'topic-agent-skills' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-skills' 'topic-doi' 'topic-open-access' 'topic-openclaw' 'topic-openclaw-skills' 'topic-pdf-downloader' 'topic-skill-md' 'topic-skillsmp' 'topic-unpaywall' 'tos':2375 'total':1054,1151 'transport':1549,1574 'tri':24,57,451,649,1051,1076,1116,1260,1345,1385,1658,2022 'trigger':2419 'true':614,1020,1027,1099,1132,1245,1254,2354 'trust':2092,2330,2467 'tti':101,860 'tty-awar':100 'two':693,2116 'two-stag':692 'type':971,1381 'unauthor':420 'unexpect':1753 'uniform':593 'unknown':1517 'unpaywal':25,309,315,323,1029,1052,1077,1101,1117,1247,1261,1354,1366,1505,1928,1931,1944,1950,1957,2099,2449 'unresolv':1539 'unset':1946,1967,1997,2015 'unus':1564 'updat':119,244,266,2611,2649 'upstream':169,203,258 'url':379,840,1031,1110,1249,1368,1484,1507,1714,2093,2134,2228 'usag':751 'use':4,126,602,737,783,820,1510,1932,2061,2402,2595 'user':7,145,211,298,507,2360 'v':178,188 'va.b.c':225 'valid':1219,1566,1638,2473 'valu':1971,2001 'var':2365 'variabl':980,1941,2531 'verbatim':1278,2370 'version':87,89,218,377,936,940,967,969,990,998,1070,1073,1328,1331,1444,1446 'via':510,521,634,799,1794,2529,2589,2623,2647 'vpn':2056 'vx.y.z':224 'wait':1458 'want':8,226 'way':246,639 'week':1680 'whether':2077 'whole':1195 'wide':2423 'wiley':398 'win':644 'within':2403 'without':143,836,926,1199,1457,1630,1813,1927,1955,2579 'won':2284 'work':1437,1926,1963 'workflow':711 'worth':1592 'write':1747 'www.nature.com':1033 'www.nature.com/articles/s41586-021-03819-2.pdf':1032 'www.ncbi.nlm.nih.gov':356 'www.ncbi.nlm.nih.gov/pmc/articles/':355 'www.sci-hub.pub':479 'year':720,1046,2552 'yes':234,1580,1677,1694,1740,1749 'zot':1895","prices":[{"id":"69468f9c-96f7-4034-b1d2-85fe06fc5295","listingId":"c0fcd2f2-40b2-4c2d-865e-97506ad756bb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Agents365-ai","category":"paper-fetch","install_from":"skills.sh"},"createdAt":"2026-04-18T23:56:23.197Z"}],"sources":[{"listingId":"c0fcd2f2-40b2-4c2d-865e-97506ad756bb","source":"github","sourceId":"Agents365-ai/paper-fetch","sourceUrl":"https://github.com/Agents365-ai/paper-fetch","isPrimary":false,"firstSeenAt":"2026-04-18T23:56:23.197Z","lastSeenAt":"2026-05-10T00:56:25.319Z"}],"details":{"listingId":"c0fcd2f2-40b2-4c2d-865e-97506ad756bb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Agents365-ai","slug":"paper-fetch","github":{"repo":"Agents365-ai/paper-fetch","stars":88,"topics":["agent-skills","claude-code","claude-code-skill","claude-skills","doi","open-access","openclaw","openclaw-skills","pdf-downloader","skill-md","skillsmp","unpaywall"],"license":null,"html_url":"https://github.com/Agents365-ai/paper-fetch","pushed_at":"2026-05-05T08:19:41Z","description":"Legal open-access PDF downloader by DOI — Unpaywall, arXiv, PMC, bioRxiv. Multi-platform Agent Skill.","skill_md_sha":"d815708134ab1274cd345b3a48c5b34d9a90eaf4","skill_md_path":"SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Agents365-ai/paper-fetch"},"layout":"root","source":"github","category":"paper-fetch","frontmatter":{"name":"paper-fetch","description":"Use when the user wants to download a paper PDF from a DOI (or title, resolved to a DOI first). Tries Unpaywall, arXiv, bioRxiv/medRxiv, PubMed Central, Semantic Scholar, and Sci-Hub mirrors as a last-resort fallback."},"skills_sh_url":"https://skills.sh/Agents365-ai/paper-fetch"},"updatedAt":"2026-05-10T00:56:25.319Z"}}