From research-papers
Retrieves scientific paper PDFs from arXiv URLs, DOIs, titles, or other identifiers, saving to papers/ directory. Uses direct arXiv downloads or sci-hub with Chrome for paywalled papers.
npx claudepluginhub ctoth/research-papers-plugin --plugin research-papersThis skill uses the workspace's default tool permissions.
Download a scientific paper PDF to the `papers/` directory.
Downloads academic paper PDFs given URL, DOI, title, or citation. Searches open-web sources, Sci-Hub mirrors, then arXiv using curl and grep.
Searches academic literature via arXiv, Semantic Scholar, and open-access sources. Fetches and parses PDFs for abstracts, key findings, methodology, and citations. Use for research, literature reviews, or formal citations.
Uses Unpaywall API to find free full-text open access versions of paywalled academic papers by DOI. Useful when direct DOI resolution, publisher sites, or PMC fail.
Share bugs, ideas, or general feedback.
Download a scientific paper PDF to the papers/ directory.
The command examples below use scripts/... paths that are relative to this skill's directory. Resolve them against the installed skill location, not the user's project root.
The argument can be:
https://arxiv.org/abs/XXXX.XXXXX or https://arxiv.org/pdf/XXXX.XXXXX10.XXXX/...https://aclanthology.org/...https://ojs.aaai.org/...$ARGUMENTS names exactly one intended paper. Preserve that identity throughout retrieval.
The goal of this skill is to obtain the intended paper's PDF. Metadata resolution and canonical naming support that goal; they are not the definition of success.
Before downloading, decide whether the input is already a strong paper identifier:
If the input is weak, first infer the intended paper and continue with the strongest identity-preserving input available. Prefer:
Do not keep retrying a weak URL mechanically when a stronger identifier is already apparent.
If the input is a paper title (not a URL or DOI), search for it first:
uv run scripts/search_papers.py "PAPER TITLE" --source all --max-results 5 --json
Review the results. If there's a clear match, extract the strongest available identifier and continue to Step 3. If ambiguous, present the top results to the user and ask which one.
For weak URL input, use the inferred title or metadata from Step 1.5 and perform the same search/normalization before Step 3.
Use the fetch_paper.py script to download the PDF and extract metadata:
uv run scripts/fetch_paper.py "<identifier>" --papers-dir papers/
Where <identifier> is the arxiv ID/URL, DOI, ACL URL, or S2 paper ID from the input or search results.
If you had to normalize a weak input first, use the normalized identifier here rather than the original weak URL.
Use fetch_paper.py as the first download path, not as the definition of whether retrieval is possible. One metadata-resolution failure does not by itself mean the paper is unretrievable.
The script will:
Author_Year_ShortTitle)metadata.json alongside paper.pdfBefore treating Step 3 as successful, verify that the resolved metadata still matches the intended paper. If not, stop on mismatch.
If fetch_paper.py obtains the intended paper's PDF through an allowed path, Step 3 succeeded even if metadata had to be materialized afterward.
If fetch_paper.py returns "fallback_needed": true, the paper couldn't be downloaded via open-access channels. In that case it returns the planned dirname/directory plus inline metadata, but it does not create metadata.json or the paper directory yet. Fall back to browser automation for sci-hub:
Try browser automation in this order:
If you have browser automation available, use it to:
https://sci-hub.st/const iframe = document.querySelector('#pdf');
if (iframe) return iframe.src;
const embed = document.querySelector('embed[type="application/pdf"]');
if (embed) return embed.src;
const links = [...document.querySelectorAll('a')].filter(a => a.href.includes('.pdf'));
return links.map(a => a.href);
mkdir -p "./papers/<dirname>" && curl -L -o "./papers/<dirname>/paper.pdf" "EXTRACTED_URL" 2>&1metadata.json only after paper.pdf exists:
uv run scripts/fetch_paper.py "<identifier>" --papers-dir papers/ --output-dir "<dirname>" --metadata-onlyIf browser automation or a direct PDF URL yields the intended paper's PDF, retrieval succeeded. Finalize metadata afterward.
Report the DOI/URL and ask the user to download the PDF manually to the paper directory.
file "./papers/<dirname>/paper.pdf"
ls -la "./papers/<dirname>/"
Confirm:
metadata.json exists with title, authors, yearThe core success condition is that the intended paper's PDF exists at ./papers/<dirname>/paper.pdf. metadata.json should also exist by the end of the step, but earlier metadata-resolution failures do not negate successful retrieval if the correct PDF and final metadata are in place.
When done, report:
Retrieved: papers/<dirname>/paper.pdf
Source: [arxiv/aclanthology/unpaywall/sci-hub]
Size: [file size]
rm -f ./papers/temp_*.pdfIf Edit/Write fails with "file unexpectedly modified":
./relative, C:/forward/slashes, C:\back\slashesYou may be running alongside other agents in parallel.
FORBIDDEN GIT COMMANDS - NEVER USE THESE:
git stash, git restore, git checkout, git reset, git clean