{"id":"d55961e8-b51d-4d80-97f3-99ff1ea66f90","shortId":"PTRvJp","kind":"skill","title":"paper-fetch","tagline":"Use whenever the user wants to obtain, download, or fetch a paper's PDF — given a DOI, an arXiv id, a paper title, a citation, or a list of DOIs. Trigger on phrases like \"download this paper\", \"find the PDF for [DOI]\", \"grab me the [Nature/bioRxiv/arXiv] paper on X\", \"get the ope","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## 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 `semanticscholar-skill` is registered**, it can serve as a richer pre-step for title → DOI resolution — useful when you also need relevance ranking, snippet search, or citation context, not just a DOI. The agent writes a Python script using the skill's `match_title()` to read `externalIds.DOI`, then runs `paper-fetch <doi>`. When the result has only an `ArXiv` id (no DOI), synthesize `10.48550/arXiv.<ArXiv>` and pass that to paper-fetch.\n\nWhen only the DOI is needed, `--title` is the single-command path — paper-fetch's built-in Crossref → S2 chain handles most cases.\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\nThe flags below are the ones an agent composes in normal use. For the complete contract — including `--dry-run`, `--pretty`, `--stream`, `--overwrite`, `--timeout`, `--version`, plus parameter types and exit-code mappings — run `python scripts/fetch.py schema` (machine-readable, drift-checked via `schema_version`).\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| `--format` | auto | `json` for agents, `text` for humans. Auto-detects: `json` when stdout is not a TTY, `text` when it is |\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\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.9.0\",\n    \"cli_version\": \"0.13.1\",\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.13.1\", \"schema_version\": \"1.9.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- **Default output directory:** `./pdfs/`.","tags":["paper","fetch","agents365-ai","academic","agent-skill","agent-skills","biorxiv","claude-code","claude-code-skill","claude-skills","crossref","doi"],"capabilities":["skill","source-agents365-ai","skill-paper-fetch","topic-academic","topic-agent-skill","topic-agent-skills","topic-biorxiv","topic-claude-code","topic-claude-code-skill","topic-claude-skills","topic-crossref","topic-doi","topic-open-access","topic-openclaw","topic-openclaw-skills"],"categories":["paper-fetch"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Agents365-ai/paper-fetch/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.497","qualityRationale":"deterministic score 0.50 from registry signals: · indexed on github topic:agent-skills · 94 github stars · SKILL.md body (16,713 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-18T18:56:35.177Z","embedding":null,"createdAt":"2026-05-10T06:56:19.109Z","updatedAt":"2026-05-18T18:56:35.177Z","lastSeenAt":"2026-05-18T18:56:35.177Z","tsv":"'-80':1493,1975 '/.paper-fetch-idem':706 '/articles/s41586-021-03819-2.pdf':801 '/arxiv':361,505 '/details/':147 '/graph/v1/paper/doi:':108 '/nonexistent':871,929 '/paper/search/match':313 '/papers':1649 '/pdf':135 '/pdf/':120 '/pdfs':2353 '/pmc/articles/':133 '/s41586-020-2649-2':1555,1585,1622,1637,1706 '/s41586-021-03819-2':792,864,1010 '/v2/':88 '0':826,1093,1300 '0.13.1':841,1096 '1':84,165,222,301,822,824,921,923,1305,1363,1462,1517,1740,1748,1885,1921,1945,2006,2152 '1.9.0':838,1099 '10.1038':791,863,1009,1109,1554,1584,1621,1636,1705 '10.1101':143 '10.1234':870,928 '10.48550':360,504 '168':903,1445 '2':103,310,919,1107,1118,1325,1919 '2021':814 '2036':835,1130 '24':1508 '3':113,336,370,980,1332,1367 '4':124,1340,1357,1701,2232 '40':326 '4120':1144 '443':1494,1976 '5':136 '50':1504,2026,2256 '6':156,1892 '7':207,208,1777 '8':275 'a908f5156fc1':832 'abbrev':2321 'ac':176 'accept':2171 'access':895,1441,1803,1812,1830 'accur':807,1569 'across':1187 'action':2295 'activ':1746 'add':1882 'affect':2193 'agent':404,474,570,668,710,748,1215,1614,1672,2073,2133,2204,2222,2269,2273 'allow':1479 'almost':2144 'alphafold':812,1574 'alreadi':972,1003,1247,1858,2313 'already-succeed':971 'also':460,2341 'ambigu':399 'anoth':1245,1660 'api':1718,1865 'api.biorxiv.org':146 'api.biorxiv.org/details/':145 'api.semanticscholar.org':107 'api.semanticscholar.org/graph/v1/paper/doi:':106 'api.unpaywall.org':87 'api.unpaywall.org/v2/':86 'appear':916 'argument':977,1336,1408,2238 'array':938,1254 'arxiv':22,114,121,341,356,499 'arxiv-on':340 'arxiv.org':119 'arxiv.org/pdf/':118 'aspect':1951 'attent':1603 'auth':1328,1837,2200 'author':193,815,1242,1915,2318 'auto':665,673 'auto-detect':672 'autom':2068 'avail':906 'back':1282 'backfil':1240 'bad':976,1335,1407 'bail':407 'ban':1935,2192 'bash':540,714,1540 'batch':550,642,643,846,963,993,1640,1646,1656,1671,1690,1927 'best':373 'best_oa_location.url':94 'biorxiv':137,1869 'block':1495,1980 'bound':2172 'boundari':2098 'browser':2067 'bucket':2009 'bug':1370 'built':238,531,1799 'built-in':237,530,1798 'bulk':652 'byte':2023,2252 'cach':753,764,1041,1222 'call':1059,1237,1269 'caller':184,1373 'campus':1821 'candid':430,1598 'cannot':2074,2274 'canon':359,1524 'cap':2029,2259 'captcha':262,2040 'carri':777,1209,1381 'case':538 'central':126 'chain':300,367,535 'challeng':2048 'chang':907,1947 'check':201,605,1485,2024,2253 'citat':28,467 'class':856,1299 'cleaner':1428 'cli':727,733,839,1094,1210,2237 'cloud':1977 'code':594,740,742,852,888,979,985,1295,1296,1375,1399,1538 'color':1630 'combin':954 'comma':1784 'comma-separ':1783 'command':524,944 'complet':577,720 'compos':571 'confid':323,377,389,394 'confirm':409 'construct':1895 'contact':1714 'context':468 'contract':578,768 'cooki':189,1842 'copi':1223,1314,2108 'correl':1185 'cover':305,339 'critic':337 'crossref':302,316,345,371,533,634,1416,1562 'current':1058,1330 'data':788,860 'decid':1843 'default':215,240,610,1709,1801,1953,2350 'defens':1879,1963,1966,2247 'degrad':2227 'deleg':2202 'descript':561,611,724 'design':2164 'destin':1002 'detect':674,1217 'determinist':1355,2315 'differ':1853 'dir':660 'direct':158,296,1434,1756,1889,1986,2236 'directori':663,2352 'disabl':216,1770 'discoveri':711,1673 'doi':20,33,45,67,89,109,140,149,167,309,346,418,455,472,502,516,612,613,622,632,641,648,783,790,849,862,869,991,1008,1108,1119,1131,1145,1203,1302,1310,1433,1542,1560,1596,1658,1668,1686,1903,1991 'doi-prefix':166,1990 'dois.txt':1647,1691 'download':11,38,366,636,653,969,1137,1164,1166,1168,1344,1454,1460,1463,1476,1499,1509,1564,1581,1641,1938,2150,2299 'dri':412,581,1170,1576,1587,1591,1609 'drift':604,766,1219 'drift-check':603 'dry-run':411,580,1575,1586,1590,1608 'e.g':1739,1793 'either':406,414 'elaps':1091,1105,1116,1128,1142,1180 'elsevi':182 'email':90,92,100,1696,1712,1715,2217,2226 'embargo':912,1451 'emit':718,770,1078,1289 'empti':1410 'enforc':1967,1981,2261 'enrich':1160,1162,1231,1263,1268 'entir':2195 'entri':2244 'env':2131 'envelop':386,704,743,774,776,1042,1193,1229,2117,2345 'environ':746,1707,2093,2220,2264,2297 'error':741,887,984,987,1167,1329,1334,1342,1374,1380,1389,1406,1456,1511,1519,1521,2116 'even':1615 'event':1086,1100,1110,1122,1136,1147,1175,1196 'ever':2042 'everi':775,1378,1906,2145 'exact':1256,2344 'exampl':1539 'exceed':1501,1503 'exclus':638 'exist':1004,1025,2158,2314 'exit':593,739,851,978,1294,1356,1362,1366 'exit-cod':592 'export':1941 'externalid':112 'externalids.arxiv':116 'externalids.doi':487 'ezproxi':190 'f':181,1663 'fail':198,825,850,922,952,1163,1264,1270,1415,1482,1515,2140 'failur':278,855,975,1317,1346,1354,1458 'fall':203,272,1281,2060 'fallback':226,314,1757,1775,1890,1987 'fals':873,983,996 'fetch':3,13,58,59,163,195,219,233,492,512,528,615,927,1732,1761,1779,1826,1872,1917,1943,2059,2081,2102,2178 'field':110,1253,1258 'file':551,644,645,802,879,994,1017,1024,1146,2161,2311 'filenam':1280,2316 'filesystem':1513 'fill':1260 'final':1191,1228 'find':41,2105 'fire':1197,1232,1265 'first':80,2317 'flag':562,564,609,2280 'follow':942 'follow-up':941 'forc':1611 'format':664,1075,1286,1623,1638 'found':890,897,1173,1437,1443 'fresh':260 'full':252,423 'gap':329 'get':53,1930 'given':18,65,293,1422 'grab':46 'grace':2228 'guess':374,1398 'handl':536 'high':806,1568 'hint':1386,2124 'hit':81,1124,1154 'host':1477,1497,1849,1875,1955,1960 'hostnam':1787 'hour':902,1324,1385,1404,1530 'html':1472,2031 'http':1490,1972 'https':1874,1959 'hub':211,1774 'human':671,1291,1626,2088,2211 'human-read':1290,1625 'i/o':709,1069,1207,2349 'id':23,122,357,500,830,1048,1089,1103,1114,1126,1140,1178 'idempot':687,957,1029,1038,1063,1651,2162,2302,2338 'idempotency-key':686,956,1037,1650,2337 'ids.json':1664 'ifram':270 'ill':287 'immedi':1361 'includ':579,732,2118 'individu':2167 'inherit':2223 'input':1338,1411 'insid':1616 'institut':159,164,1733,1744,1802,1815,1880,1912,1944,1949,1954,2015,2082,2120,2196,2283 'intern':1518 'invoc':1200 'invok':947 'io':1345,1510 'ip':188,1487,1817,1839,1932,1969,2191 'ip/cookies':1913 'item':974,1000,1419 'job':1928 'journal':2320,2326 'journal/conference':308 'journal/venue':2334 'jq':1666 'json':666,675,773,785,857,981,1007,1076,1080,1377,1543,1612,1624 'jumper':816 'keep':1926,2166 'key':688,689,693,700,958,1039,1064,1652,2339 'lack':2332 'land':1449,1473,2032 'last':224,1996 'last-resort':223 'latenc':833 'latest':152 'layer':2265 'legitim':1810 'let':1182,1350,1832 'lift':913,2181 'like':37 'limit':1506,1751,1924,2004,2155,2184,2289 'line':650,1083,1683 'list':31,230,426,1255 'live':1085,1526 'local':1512 'login':2208 'longer':1427 'loosen':2275 'low':322,376,393 'low-confid':321,375 'machin':557,601,722 'machine-read':556,600,721 'magic':2022,2251 'magic-byt':2021,2250 'major':307 'make':960 'mani':1807,2174 'map':595,1525 'match':319,324,431,483,1599 'mb':1505,2027,2257 'mean':1297,1400 'medrxiv':138 'messag':891,988 'meta':779,804,828,881,932,997 'meta.auth':2012 'meta.latency':1050 'meta.replayed':1061 'meta.request':1047 'meta.title':436 'meta.title_resolution.low':388 'metadata':1496,1978,2331 'mirror':212,229,235,261,1781,1786 'miss':253,264,1156,1241,1337,1909,2002,2225 'missing-pap':263 'mode':160,847,1679,1745,1855,1857,1881,1950,2013,2114,2284 'monday':1654 'monday-review-batch':1653 'ms':834,1051,1092,1106,1117,1129,1143,1181 'multipl':71 'must':2083 'mutual':637 'natur':172,2301 'nature/biorxiv/arxiv':49 'ndjson':1073 'need':461,518,1607 'nejm':178 'network':708,731,1068,1206,1343,1455,1457,2348 'never':2205 'next':827,924,934,2064 'non':1489,1492,1971,1974 'non-http':1488,1970 'none':2005 'normal':573 'note':2199 'notic':2143 'null':875,878,880 'oa':127,905,1313,1448,1864,1907,2000,2107 'object':1081,1390 'obtain':10 'occur':1070 'ok':786,858,982,1138,1165 'omit':2329 'on-campus':1819 'one':568,647,1079,1307,1446,1680 'ope':55 'open':894,1440 'open-access':893,1439 'openaccesspdf':111 'oper':2089,2294 'opt':1742,1805,1939,2075,2281 'opt-in':1804 'option':543,547,552,1719 'orchestr':1184,1352,1393,2214 'order':75,83,250,1792 'origin':703 'otherwis':276 'outbound':2011 'output':662,767,1544,2351 'overrid':1797 'overs':2035 'overwrit':585,1006 'page':266,1474,2033 'pair':2335 'paper':2,15,25,40,50,57,64,162,218,232,265,351,491,511,527,627,926,1731,1760,1778,1825,1942,2058,2080,2101,2177 'paper-fetch':1,56,490,510,526,925,1824,2057,2100,2176 'parallel':2175 'paramet':589,737 'partial':845,859 'pass':294,507,1431,1877,1961,2278 'path':525 'pdf':17,43,61,96,123,154,170,200,269,797,876,896,1015,1019,1134,1250,1273,1442,1466,1471,1480,1848,1900,1994,2020,2055,2249,2324 'pdfs':661,931 'pdfs/jumper_2021_':1018 'pdfs/jumper_2021_highly_accurate_protein_structure_predic.pdf':803 'per':257,649,999,1082,1199,1682,2160 'per-fil':2159 'per-item':998 'phrase':36 'pipe':1546,1657 'pipelin':1633 'playwright':2070 'plus':391,588,2156 'pmc':1870 'pmcid':129,134 'pnas':177 'point':2245 'posit':616,640 'pre':451 'pre-step':450 'predict':810,1572 'prefix':141,168,1904,1992 'preprint':343,915,1452 'present':117,130 'pretti':583,1629,1677 'prevent':2030 'preview':1304,1578,1593 'primari':304 'prioriti':74,1791 'privat':1486,1968 'process':258,2179 'profil':2291 'progress':1072,1186 'prohibit':2148 'prose':1293 'protein':808,1570 'provid':989,1248 'public':1856,1952,1958,2014,2113 'publish':157,169,1755,1834,1888,1898,1985,1993,2045,2146,2189 'publisher-direct':1754,1887,1984 'publisher-sid':1897 'publisher-wid':2188 'pubm':125 'pure':1238 'purpos':1710 'python':477,541,544,548,553,597,715,1552,1565,1582,1600,1619,1634,1644,1669,1674,1688,1703 'queri':144,1424,1665 'query.title':303 'r':1667 'rang':1818 'rank':463 'rate':1750,1923,2003,2154,2183,2288 'rate-limit':2287 'rather':2138 're':695,760,946,968,1032,1054,2111,2304 're-download':967 're-invok':945 're-read':759 're-run':694,1031,2303 're-stamp':1053 'reachabl':1850,1956 'read':93,486,619,656,750,761 'readabl':558,602,723,1292,1627 'reason':395,904,1023 'recommend':1721 'reflect':853 'regist':443 'relev':462 'remain':1700,1727,2231 'replay':701,1030,2342 'report':277 'req':831,1090,1104,1115,1127,1141 'req/s':1749,1922,2007,2153 'request':285,829,1088,1102,1113,1125,1139,1177,2271 'research':1808,2168 'reserv':1326 'resolut':82,299,437,456 'resolv':382,417,421,424,629,784,1303,1414,1558,1579,1595,1687 'resort':225,1997 'respons':197,1467,1502,2036,2050 'result':385,495,789,861,1681 'retri':692,900,910,949,1320,1322,1360,1383,1396,1402,1528 'retriabl':965,1643 'retryabl':898,995,1298,1379,1401 'return':1044,1417,1861 'review':1655 'richer':449 'risk':2290 'rout':1353 'rule':1983 'run':413,489,582,596,696,1033,1171,1577,1588,1592,1610,2173,2206,2305 'runner':333,400 'runner-up':332 's2':338,348,534 'safe':691,964,1642 'safe-retri':690 'safeti':1484,2276 'sage':179 'schedul':1395 'schema':555,599,607,712,717,735,756,836,1097,1212,1218,1676 'schema.error':1537 'scholar':105,312,886,1235,1868 'sci':210,1773 'sci-hub':209,1772 'sci-hub.al':246 'sci-hub.box':244 'sci-hub.ee':248 'sci-hub.mk':247 'sci-hub.red':245 'sci-hub.ru':241,1794 'sci-hub.st':242,1795 'sci-hub.su':243,1796 'scienc':173 'scihub':221,234,1763,1780 'score':325,396 'scrape':254 'script':478 'scripts/fetch.py':542,545,549,554,598,716,1532,1553,1566,1583,1601,1620,1635,1645,1670,1675,1689,1704 'search':465 'see':1758 'segment':2327 'self':560 'self-descript':559 'semant':104,311,885,1234,1867 'semanticscholar':440 'semanticscholar-skil':439 'separ':1785 'serv':446,1846 'server':148 'session':1087,1149,1195,1841 'set':102,387,1066,1735,1765,2085,2129,2215 'shape':744 'share':1176 'shell':2092 'short':2322 'show':2046 'side':1899 'silent':274,2141 'singl':523,621,772,1541,1556 'single-command':522 'size':1500,2028,2258 'skill':441,481 'skill-paper-fetch' 'skip':97,1001,1020,1022,1158,1169,1697,1726,2310 'slip':2037 'slot':780,935 'snippet':464 'solv':2041 'sourc':72,795,817,842,867,874,882,1013,1026,1111,1120,1123,1132,1151,1153,1155,1157,1159,1161,1230,1246,1262,1702,1728,1908,2001,2065,2233 'source-agents365-ai' 'springer':175 'ssrf':1483,1878,1962,1965,2246 'stamp':1055 'start':1101,1150,2053 'stay':368,2017 'stderr':1071,1077,1188,1288 'stdin':624,658 'stdout':677,729,769,1192 'stealth':2072 'step':206,452,1776,1891 'still':1276,1729 'stop':77 'stream':584,1678,1692 'structur':809,1571 'struggl':383 'subcommand':713,2209 'subscript':187,1811,2147 'subset':953 'succeed':823,920,973 'success':781,793,865,872,1011 'suggest':940,2119 'summari':820,917 'surfac':349,434,1535,2135 'synthes':363,503 'systemat':1937,2149 'taxonomi':1349 'tell':2125 'templat':171 'termin':1551,1618 'text':669,682,1287,1547,1639 'thing':1884 'threshold':398 'throttl':1933 'time':909 'timeout':586 'timescal':1453 'titl':26,69,291,298,454,484,519,546,625,626,628,805,1243,1413,1423,1429,1557,1567,1589,1602,2323 'title/authors':280 'token':2008 'tool':1661 'top':318,429 'topic-academic' 'topic-agent-skill' 'topic-agent-skills' 'topic-biorxiv' 'topic-claude-code' 'topic-claude-code-skill' 'topic-claude-skills' 'topic-crossref' 'topic-doi' 'topic-open-access' 'topic-openclaw' 'topic-openclaw-skills' 'tos':2142 'total':821,918 'transport':1316,1341 'tri':70,227,425,818,843,883,1027,1112,1152,1425,1789 'trigger':34,2186 'true':390,787,794,866,899,1012,1021,2121 'trust':1859,2097,2234 'tti':681 'two':1883 'type':590,738,1148 'unauthor':196 'unexpect':1520 'uniform':369 'unknown':1284 'unpaywal':85,91,99,796,819,844,868,884,1014,1028,1121,1133,1272,1695,1698,1711,1717,1724,1866,2216 'unresolv':1306 'unset':1713,1734,1764,1782 'unus':1331 'url':155,798,877,1016,1135,1251,1274,1481,1860,1901,1995 'usag':539 'use':4,378,457,479,574,617,654,1277,1699,1828,2169 'user':7,283,2127 'valid':986,1333,1405,2240 'valu':1738,1768 'var':2132 'variabl':747,1708,2298 'verbatim':1045,2137 'version':153,587,608,734,736,757,765,837,840,1095,1098,1211,1213 'via':286,297,410,606,633,1561,2296 'vpn':1823 'wait':1225 'want':8 'way':415 'week':1447 'whenev':5 'whether':1844 'whole':962 'wide':2190 'wiley':174 'win':420 'within':2170 'without':707,966,1224,1397,1580,1694,1722,2346 'won':2051 'work':1204,1693,1730 'worth':1359 'write':475,1514 'www.nature.com':800 'www.nature.com/articles/s41586-021-03819-2.pdf':799 'www.ncbi.nlm.nih.gov':132 'www.ncbi.nlm.nih.gov/pmc/articles/':131 'www.sci-hub.pub':255 'x':52 'year':813,2319 'yes':1347,1444,1461,1507,1516 'zot':1662","prices":[{"id":"de220b88-9100-4e40-87f3-effbf7966fca","listingId":"d55961e8-b51d-4d80-97f3-99ff1ea66f90","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-05-10T06:56:19.109Z"}],"sources":[{"listingId":"d55961e8-b51d-4d80-97f3-99ff1ea66f90","source":"github","sourceId":"Agents365-ai/paper-fetch/paper-fetch","sourceUrl":"https://github.com/Agents365-ai/paper-fetch/tree/main/skills/paper-fetch","isPrimary":false,"firstSeenAt":"2026-05-10T06:56:19.109Z","lastSeenAt":"2026-05-18T18:56:35.177Z"}],"details":{"listingId":"d55961e8-b51d-4d80-97f3-99ff1ea66f90","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":94,"topics":["academic","agent-skill","agent-skills","biorxiv","claude-code","claude-code-skill","claude-skills","crossref","doi","open-access","openclaw","openclaw-skills","paper-fetch","pdf-downloader","pubmed","research","semantic-scholar","skill-md","skillsmp","unpaywall"],"license":"mit","html_url":"https://github.com/Agents365-ai/paper-fetch","pushed_at":"2026-05-17T09:02:32Z","description":"DOI → PDF resolver with 7-source fallback (Unpaywall, S2, arXiv, PMC, bioRxiv, publisher, Sci-Hub). Multi-agent, zero-deps Python.","skill_md_sha":"03f81a15a85b58fe26dcbaf683f3aee5cb51470b","skill_md_path":"skills/paper-fetch/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Agents365-ai/paper-fetch/tree/main/skills/paper-fetch"},"layout":"multi","source":"github","category":"paper-fetch","frontmatter":{"name":"paper-fetch","description":"Use whenever the user wants to obtain, download, or fetch a paper's PDF — given a DOI, an arXiv id, a paper title, a citation, or a list of DOIs. Trigger on phrases like \"download this paper\", \"find the PDF for [DOI]\", \"grab me the [Nature/bioRxiv/arXiv] paper on X\", \"get the open-access version\", \"I need this article\", or any bulk/batch paper download request, even when the user doesn't explicitly say \"PDF\" or \"DOI\". Resolves via Unpaywall → Semantic Scholar → arXiv → PubMed Central → bioRxiv/medRxiv → publisher direct (institutional opt-in) → Sci-Hub mirrors as last-resort fallback."},"skills_sh_url":"https://skills.sh/Agents365-ai/paper-fetch/paper-fetch"},"updatedAt":"2026-05-18T18:56:35.177Z"}}