{"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) via legal open-access sources. Tries Unpaywall, arXiv, bioRxiv/medRxiv, PubMed Central, and Semantic Scholar in order.","description":"# paper-fetch\n\nFetch the legal open-access PDF for a paper given a DOI (or title). Tries multiple OA 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## 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`)* — last-resort 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. Otherwise → report failure with title/authors so the user can request via ILL\n\nIf only a title is given, resolve to a DOI first via Semantic Scholar `search_paper_by_title` (asta MCP) or Crossref.\n\n## Usage\n\n```bash\npython scripts/fetch.py <DOI> [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| `--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`, `update_check_spawned`. 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| `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# Dry-run preview (resolve without downloading)\npython scripts/fetch.py 10.1038/s41586-020-2649-2 --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 4 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 to protect the operator's IP from publisher-side throttling. See below. |\n| `PAPER_FETCH_NO_AUTO_UPDATE` | unset | Set to any value to disable silent background self-update |\n| `PAPER_FETCH_UPDATE_INTERVAL` | `86400` | Cooldown in seconds between update checks |\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 honestly — it does not bypass paywalls, it just lets 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}_{short_title}.pdf`). Pair with `--idempotency-key` to also replay the exact envelope without any network I/O.\n- **Never bypasses paywalls.** Optionally uses the caller's own institutional subscription (via IP, cookies, or EZproxy) when explicitly enabled via `PAPER_FETCH_INSTITUTIONAL=1`. If no OA copy exists and no institutional access is available, the skill reports failure honestly.\n- **Default output directory:** `./pdfs/`.\n\n## Auto-update\n\nWhen installed via `git clone`, the skill keeps itself in sync with upstream automatically. On each invocation, `fetch.py` spawns a **detached background `git pull --ff-only`** in the skill directory:\n\n- **Non-blocking** — the current invocation is not delayed; the pull runs in a new session and is fully detached\n- **Silent** — all git output goes to `/dev/null`, the stdout envelope is never polluted\n- **Throttled** — at most once every 24 hours (stamped via `.git/.paper-fetch-last-update`)\n- **Safe** — `--ff-only` refuses to merge if you have local edits; conflicts never happen\n- **Observable** — when a pull is spawned, stderr emits `{\"event\": \"update_check_spawned\", ...}` (JSON mode) or a prose notice (text mode)\n- **Convergence** — updates apply on the **next** invocation, not the current one (because the pull is backgrounded)\n\nForce an immediate check with `rm <skill_dir>/.git/.paper-fetch-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.477","qualityRationale":"deterministic score 0.48 from registry signals: · indexed on github topic:agent-skills · 55 github stars · SKILL.md body (15,795 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-04-22T18:57:35.510Z","embedding":null,"createdAt":"2026-04-18T23:56:23.197Z","updatedAt":"2026-04-22T18:57:35.510Z","lastSeenAt":"2026-04-22T18:57:35.510Z","tsv":"'-80':1217,1657 '/.git/.paper-fetch-last-update':2198 '/.paper-fetch-idem':436 '/articles/s41586-021-03819-2.pdf':545 '/details/':185 '/dev/null':2124 '/graph/v1/paper/doi:':146 '/nonexistent':615,673 '/papers':1332 '/pdf':173 '/pdf/':158 '/pdfs':2063 '/pmc/articles/':171 '/s41586-020-2649-2':1279,1290,1305,1320,1389 '/s41586-021-03819-2':536,608,754 '/v2/':126 '0':570,837,1047 '0.6.1':840 '0.7.0':585 '1':122,203,566,568,665,667,1052,1110,1186,1241,1424,1432,1567,1603,1627,1688,1834,2043 '1.3.0':582,843 '10.1038':535,607,753,853,1278,1289,1304,1319,1388 '10.1101':181 '10.1234':614,672 '168':647,1169 '2':141,383,663,851,862,1072,1601 '2021':558 '2036':579,874 '24':1232,2136 '3':151,724,1079,1114 '30':442 '4':162,1087,1104,1384,1411,1914 '4120':888 '443':1218,1658 '5':174 '50':1228,1708,1938 '6':194,1574 '7':248,249 '86400':1470 'a908f5156fc1':576 'ac':217 'accept':1853 'access':28,49,639,1165,1478,1487,1505,2052 'accur':551 'across':934 'action':1977 'activ':1430 'add':1564 'affect':1875 'agent':73,358,454,492,962,1297,1355,1755,1815,1886,1904,1951,1955 'agent-n':72 'allow':1203 'almost':1826 'alphafold':556 'alreadi':414,716,747,994,1540,1995 'already-succeed':715 'also':2011 'anoth':992,1343 'api':1401,1547 'api.biorxiv.org':184 'api.biorxiv.org/details/':183 'api.semanticscholar.org':145 'api.semanticscholar.org/graph/v1/paper/doi:':144 'api.unpaywall.org':125 'api.unpaywall.org/v2/':124 'appear':660 'appli':2178 'argument':721,1083,1155,1920 'array':682,1001 'arxiv':32,152,159 'arxiv.org':157 'arxiv.org/pdf/':156 'aspect':1633 'asta':280 'auth':1075,1519,1882 'author':234,559,989,1597,2000 'auto':355,363,1452,2065 'auto-detect':362 'auto-upd':2064 'autom':1750 'automat':2080 'avail':650,2054 'awar':105 'back':1029 'backfil':987 'background':1462,2088,2191 'bad':720,1082,1154 'ban':1617,1874 'bash':285,458,1264 'batch':291,320,403,590,707,737,1323,1329,1339,1354,1373,1609 'best_oa_location.url':132 'biorxiv':175,1551 'biorxiv/medrxiv':33 'block':1219,1662,2100 'bound':1854 'boundari':1780 'browser':1749 'bucket':1691 'bug':1117 'bulk':329 'bypass':1510,2021 'byte':1705,1934 'cach':497,508,785,969 'call':803,984,1016 'caller':225,1120,2026 'campus':1496 'cannot':1756,1956 'canon':1248 'cap':1711,1941 'captcha':1722 'carri':521,956,1128 'central':35,164 'challeng':1730 'chang':651,1629 'check':242,919,1209,1476,1706,1935,2166,2195 'class':119,600,1046 'cli':91,449,471,477,583,838,957,1919 'clone':2071 'cloud':1659 'code':98,484,486,596,632,723,729,1042,1043,1122,1146,1262 'color':1313 'combin':698 'command':688 'complet':464 'conflict':2153 'construct':1577 'contact':1397 'contract':512 'converg':2176 'cooki':230,1524,2033 'cooldown':1471 'copi':970,1061,1790,2047 'correl':932 'crossref':283 'current':802,1077,2102,2185 'data':532,604 'decid':1525 'default':107,305,1392,1635,2060 'defens':1561,1645,1648,1929 'degrad':1909 'delay':2106 'deleg':1884 'descript':302,306,468 'design':1846 'destin':353,412,746 'detach':2087,2117 'detect':95,364,964 'determinist':1102,1997 'differ':1535 'dir':337 'direct':196,1571,1668,1918 'directori':340,2062,2097 'disabl':1460 'discoveri':455,1356 'doi':16,22,56,127,147,178,187,208,271,307,308,317,325,397,527,534,593,606,613,735,752,852,863,875,889,950,1049,1057,1266,1341,1351,1369,1585,1673 'doi-prefix':207,1672 'dois.txt':1330,1374 'download':10,330,348,409,713,881,908,910,912,1091,1178,1184,1187,1200,1223,1233,1286,1324,1620,1832,1981 'dri':342,914,1281,1292 'drift':94,510,966 'dry-run':341,1280,1291 'e.g':1423 'edit':2152 'elaps':835,849,860,872,886,927 'elsevi':223 'email':128,130,138,1379,1395,1398,1899,1908 'embargo':656,1175 'emit':88,114,388,462,514,822,1036,2163 'empti':1157 'enabl':2038 'enforc':1649,1663,1943 'enrich':904,906,978,1010,1015 'entir':1877 'entri':1926 'env':1813 'envelop':77,434,487,518,520,786,940,976,1799,2015,2127 'environ':490,1390,1775,1902,1946,1979 'error':118,485,631,728,731,911,1076,1081,1089,1121,1127,1136,1153,1180,1235,1243,1245,1798 'even':410,1298 'event':830,844,854,866,880,891,922,943,2164 'ever':1724 'everi':116,519,1125,1588,1827,2135 'exact':1003,2014 'exampl':1263 'exceed':1225,1227 'exist':415,748,769,1840,1996,2048 'exit':97,453,483,595,722,1041,1103,1109,1113 'explicit':2037 'export':1623 'externalid':150 'externalids.arxiv':154 'ezproxi':231,2035 'f':222,1346 'fail':239,569,594,666,696,907,1011,1017,1206,1239,1822 'failur':252,599,719,1064,1093,1101,1182,2058 'fall':244,1028,1742 'fallback':1572,1669 'fals':617,727,740 'fetch':3,43,44,201,236,310,671,1416,1450,1467,1501,1554,1599,1625,1741,1763,1784,1860,2041 'fetch.py':2084 'ff':2092,2143 'ff-on':2091,2142 'field':148,1000,1005 'file':292,321,322,413,546,623,738,761,768,890,1843,1993 'filenam':1027,1998 'filesystem':1237 'fill':1007 'final':938,975 'find':1787 'fire':944,979,1012 'first':23,70,272,1999 'flag':303,304,1962 'follow':686 'follow-up':685 'forc':1294,2192 'format':106,354,819,1033,1306,1321 'found':634,641,917,1161,1167 'fulli':2116 'get':1612 'git':2070,2089,2120 'git/.paper-fetch-last-update':2140 'given':54,267 'goe':2122 'grace':1910 'guess':1145 'happen':2155 'header':87 'high':550 'hint':1133,1806 'hit':71,868,898 'honest':1506,2059 'host':1201,1221,1531,1557,1637,1642 'hour':112,646,1071,1132,1151,1254,2137 'html':1196,1713 'http':443,1214,1654 'https':1556,1641 'human':361,1038,1309,1770,1893 'human-read':1037,1308 'i/o':439,813,954,2019 'id':160,574,792,833,847,858,870,884,925 'idempot':108,417,701,773,782,807,1334,1844,1984,2008 'idempotency-key':416,700,781,1333,2007 'ids.json':1347 'ill':261 'immedi':1108,2194 'includ':476,1800 'indent':385 'individu':1849 'inherit':1905 'input':1085,1158 'insid':1299 'instal':2068 'institut':197,202,1417,1428,1477,1490,1562,1594,1626,1631,1636,1697,1764,1802,1878,1965,2029,2042,2051 'intern':1242 'interv':1469 'invoc':947,2083,2103,2182 'invok':691 'io':1092,1234 'ip':229,1211,1441,1492,1521,1614,1651,1873,2032 'ip/cookies':1595 'item':718,744 'job':1610 'jq':1349 'json':76,356,365,381,517,529,601,725,751,820,824,1124,1267,1295,1307,2168 'jumper':560 'keep':1608,1848,2074 'key':418,419,423,430,702,783,808,1335,2009 'land':1173,1197,1714 'last':205,1678 'last-resort':204 'latenc':577 'latest':190 'layer':1947 'legal':25,46 'legitim':1485 'let':929,1097,1514 'lift':657,1863 'limit':1230,1435,1606,1686,1837,1866,1971 'line':327,392,402,827,1366 'list':1002 'live':829,1250 'local':1236,2151 'login':1890 'loosen':1957 'machin':100,298,466 'machine-read':99,297,465 'magic':1704,1933 'magic-byt':1703,1932 'make':704 'mani':1482,1856 'map':1249 'mb':1229,1709,1939 'mcp':281 'mean':1044,1147 'medrxiv':176 'merg':2147 'messag':635,732 'meta':523,548,572,625,676,741 'meta.auth':1694 'meta.latency':794 'meta.replayed':805 'meta.request':791 'metadata':1220,1660 'miss':900,988,1084,1591,1684,1907 'mode':198,404,591,1362,1429,1537,1539,1563,1632,1695,1796,1966,2169,2175 'monday':1337 'monday-review-batch':1336 'ms':578,795,836,850,861,873,887,928 'multipl':60 'must':1765 'nativ':74 'natur':213,1983 'ndjson':80,390,817 'nejm':219 'network':438,475,812,953,1090,1179,1181,2018 'never':1887,2020,2129,2154 'new':2112 'next':571,668,678,1746,2181 'non':1213,1216,1653,1656,2099 'non-block':2098 'non-http':1212,1652 'none':1687 'note':1881 'notic':1825,2173 'null':619,622,624 'oa':61,165,649,1060,1172,1546,1589,1682,1789,2046 'object':825,1137 'observ':2156 'occur':814 'ok':530,602,726,882,909 'on-campus':1494 'one':324,389,823,1054,1170,1363,2186 'open':27,48,638,1164 'open-access':26,47,637,1163 'openaccesspdf':149 'oper':1439,1771,1976 'opt':1426,1480,1621,1757,1963 'opt-in':1479 'option':288,293,1402,2023 'orchestr':931,1099,1140,1896 'order':40,65,121 'origin':433 'otherwis':250 'outbound':1693 'output':339,511,1268,2061,2121 'overs':1717 'overwrit':405,750 'page':1198,1715 'pair':2005 'paper':2,12,42,53,200,277,670,1415,1449,1466,1500,1624,1740,1762,1783,1859,2040 'paper-fetch':1,41,669,1499,1739,1782,1858 'parallel':1857 'paramet':481 'partial':589,603 'pass':1559,1643,1960 'paywal':1511,2022 'pdf':13,50,134,161,192,211,241,350,541,620,640,759,763,878,997,1020,1166,1190,1195,1204,1530,1582,1676,1702,1737,1931,2004 'pdfs':338,675 'pdfs/jumper_2021_':762 'pdfs/jumper_2021_highly_accurate_protein_structure_predic.pdf':547 'per':326,391,445,743,826,946,1365,1842 'per-fil':1841 'per-item':742 'pipe':1270,1340 'pipelin':1316 'playwright':1752 'plus':1838 'pmc':1552 'pmcid':167,172 'pnas':218 'point':1927 'pollut':2130 'posit':311 'predict':554 'prefix':179,209,1586,1674 'preprint':659,1176 'present':155,168 'pretti':376,379,1312,1360 'pretty-print':378 'prevent':1712 'preview':349,1051,1283 'print':380,448 'prioriti':64 'privat':1210,1650 'process':1861 'profil':1973 'progress':81,816,933 'prohibit':1830 'prose':1040,2172 'protect':1437 'protein':552 'provid':733,995 'public':1538,1634,1640,1696,1795 'publish':195,210,1444,1516,1570,1580,1667,1675,1727,1828,1871 'publisher-direct':1569,1666 'publisher-sid':1443,1579 'publisher-wid':1870 'pubm':34,163 'pull':2090,2108,2159,2189 'pure':985 'purpos':1393 'python':286,289,294,459,1276,1287,1302,1317,1327,1352,1357,1371,1386 'queri':182,1348 'r':1350 'rang':1493 'rate':1434,1605,1685,1836,1865,1970 'rate-limit':1969 'rather':1820 're':408,425,504,690,712,776,798,1793,1986 're-download':407,711 're-invok':689 're-read':503 're-run':424,775,1985 're-stamp':797 'reachabl':1532,1638 'read':131,314,333,494,505 'readabl':101,299,467,1039,1310 'reason':648,767 'recommend':1404 'reflect':597 'refus':2145 'remain':1383,1410,1913 'replay':431,774,2012 'report':251,2057 'req':575,834,848,859,871,885 'req/s':1433,1604,1689,1835 'request':259,446,573,832,846,857,869,883,924,1953 'research':1483,1850 'reserv':1073 'resolut':120 'resolv':19,268,345,398,528,1050,1284,1370 'resort':206,1679 'respons':238,1191,1226,1718,1732 'result':533,605,1364 'retri':109,110,422,644,654,693,1067,1069,1107,1130,1143,1149,1252 'retriabl':709,1326 'retryabl':117,642,739,1045,1126,1148 'return':788,1543 'review':1338 'risk':1972 'rm':2197 'rout':1100 'rule':1665 'run':343,426,777,915,1282,1293,1855,1888,1987,2109 'safe':421,708,1325,2141 'safe-retri':420 'safeti':1208,1958 'sage':220 'schedul':1142 'schema':89,102,296,450,456,461,479,500,580,841,959,965,1359 'schema.error':1261 'scholar':38,143,275,630,982,1550 'scienc':214 'scripts/fetch.py':287,290,295,460,1256,1277,1288,1303,1318,1328,1353,1358,1372,1387 'search':276 'second':441,1473 'see':1447 'self':301,1464 'self-descript':300 'self-upd':1463 'semant':37,142,274,629,981,1549 'serv':1528 'server':186 'session':86,831,893,942,1523,2113 'set':140,810,1419,1455,1767,1811,1897 'shape':488 'share':923 'shell':1774 'short':2002 'show':1728 'side':1445,1581 'silent':1461,1823,2118 'singl':316,516,1265 'size':1224,1710,1940 'skill':2056,2073,2096 'skill-paper-fetch' 'skip':135,745,764,766,902,913,1380,1409,1992 'slip':1719 'slot':524,679 'solv':1723 'sourc':29,62,346,539,561,586,611,618,626,757,770,855,864,867,876,895,897,899,901,903,905,977,993,1009,1385,1412,1590,1683,1747,1915 'source-agents365-ai' 'space':384 'spawn':920,2085,2161,2167 'springer':216 'ssrf':1207,1560,1644,1647,1928 'stabl':96 'stamp':799,2138 'start':845,894,1735 'stay':1699 'stderr':83,815,821,935,1035,2162 'stdin':319,335 'stdout':79,367,394,473,513,939,2126 'stealth':1754 'step':247,1573 'still':1023,1413 'stop':67 'stream':386,1361,1375 'structur':75,553 'subcommand':457,1891 'subscript':228,1486,1829,2030 'subset':697 'succeed':567,664,717 'success':525,537,609,616,755 'suggest':684,1801 'summari':401,564,661 'surfac':1259,1817 'sync':2077 'systemat':1619,1831 'taxonomi':1096 'tell':1807 'templat':212 'termin':1275,1301 'text':359,372,1034,1271,1322,2174 'thing':1566 'throttl':1446,1615,2131 'time':653 'timeout':440,444 'timescal':1177 'titl':18,58,265,279,549,990,2003 'title/authors':254 'token':1690 'tool':1344 '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':1824 'total':565,662 'transport':1063,1088 'tri':30,59,562,587,627,771,856,896 'trigger':1868 'true':531,538,610,643,756,765,1803 'trust':1541,1779,1916 'tti':104,371 'tty-awar':103 'two':1565 'type':482,892 'unauthor':237 'unexpect':1244 'unknown':1031 'unpaywal':31,123,129,137,540,563,588,612,628,758,772,865,877,1019,1378,1381,1394,1400,1407,1548,1898 'unresolv':1053 'unset':1396,1418,1454 'unus':1078 'updat':918,1453,1465,1468,1475,2066,2165,2177 'upstream':2079 'url':193,351,542,621,760,879,998,1021,1205,1542,1583,1677 'usag':284 'use':4,312,331,1024,1382,1503,1851,2024 'user':7,257,1809 'valid':730,1080,1152,1922 'valu':1422,1458 'var':1814 'variabl':491,1391,1980 'verbatim':789,1819 'version':90,92,191,447,451,478,480,501,509,581,584,839,842,958,960 'via':24,260,273,1978,2031,2039,2069,2139 'vpn':1498 'wait':972 'want':8 'week':1171 'whether':1526 'whole':706 'wide':1872 'wiley':215 'within':1852 'without':347,437,710,971,1144,1285,1377,1405,2016 'won':1733 'work':951,1376,1414 'worth':1106 'write':1238 'www.nature.com':544 'www.nature.com/articles/s41586-021-03819-2.pdf':543 'www.ncbi.nlm.nih.gov':170 'www.ncbi.nlm.nih.gov/pmc/articles/':169 'year':557,2001 'yes':1094,1168,1185,1231,1240 'zot':1345","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-04-22T18:57:35.510Z"}],"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":55,"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-04-21T05:14:15Z","description":"Legal open-access PDF downloader by DOI — Unpaywall, arXiv, PMC, bioRxiv. Multi-platform Agent Skill.","skill_md_sha":"2fa772522ac9730a387cc0a967601c2ae2957a93","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) via legal open-access sources. Tries Unpaywall, arXiv, bioRxiv/medRxiv, PubMed Central, and Semantic Scholar in order."},"skills_sh_url":"https://skills.sh/Agents365-ai/paper-fetch"},"updatedAt":"2026-04-22T18:57:35.510Z"}}