fulltext-article-downloader — Claude Code MCP server: fetch paper
Pulls a paper's full text from a DOI, arXiv, PMC or OpenReview id and confirms the returned file is the one you asked for. Use it when an agent needs the article itself, not its abstract.
claude mcp add --env UNPAYWALL_EMAIL=<UNPAYWALL_EMAIL> --env FULLTEXT_OUTPUT_DIR=<FULLTEXT_OUTPUT_DIR> --env WILEY_API_KEY=<WILEY_API_KEY> --env ELSEVIER_API_KEY=<ELSEVIER_API_KEY> --env SPRINGER_API_KEY=<SPRINGER_API_KEY> --transport stdio fulltext-article-downloader -- uvx fulltext-article-downloaderWhat fulltext-article-downloader does
Give it an identifier and it works through sources one after another: publisher APIs, open-access indexes, preprint archives. A failed route hands off to the next. Each PDF is matched against the article title, while abstract-only records and supporting-information files get thrown out. What comes back is the paper you named.
The report says which route delivered the file and flags a preprint or accepted manuscript when that is what you got. No keys and off campus still covers open-access work, preprints and DOE-funded manuscripts. Paywalled papers usually fail without a publisher key; the server spots a truncated response and moves on.
Elsevier, Wiley, Springer and Semantic Scholar credentials go into environment variables when you register the server. UNPAYWALL_EMAIL is your contact address for Unpaywall and Crossref, and it puts Crossref requests in the faster pool. Two optional extras go further: tls mimics Chrome's TLS fingerprint, aps reuses your APS login session. Check both against your institution's agreements before turning them on.
What it helps with
- fetch a paper's PDF by DOI from inside an agent chat
- locate an open copy of a paywalled article via Unpaywall and Europe PMC
- confirm a downloaded file matches the requested paper
- tell a preprint from the publisher's version in the download report
- download a batch of papers from a list of identifiers
Example prompts for the agent
- Download the full text of
10.1371/journal.pone.0171501intopapers - Get the PDF for
arXiv:2310.19377and tell me which source it came from - Fetch
PMC6561843and check that it is the right article
How to install fulltext-article-downloader
Platform CLI
claude mcp add --env UNPAYWALL_EMAIL=<UNPAYWALL_EMAIL> --env FULLTEXT_OUTPUT_DIR=<FULLTEXT_OUTPUT_DIR> --env WILEY_API_KEY=<WILEY_API_KEY> --env ELSEVIER_API_KEY=<ELSEVIER_API_KEY> --env SPRINGER_API_KEY=<SPRINGER_API_KEY> --transport stdio fulltext-article-downloader -- uvx fulltext-article-downloaderReplace <…> with your own values. 1 more environment variable is in the server README. uvx runs the command named after the package; if the README names another one, use uvx --from fulltext-article-downloader <command>
Platform CLI
codex mcp add fulltext-article-downloader --env UNPAYWALL_EMAIL=<UNPAYWALL_EMAIL> --env FULLTEXT_OUTPUT_DIR=<FULLTEXT_OUTPUT_DIR> --env WILEY_API_KEY=<WILEY_API_KEY> --env ELSEVIER_API_KEY=<ELSEVIER_API_KEY> --env SPRINGER_API_KEY=<SPRINGER_API_KEY> -- uvx fulltext-article-downloaderReplace <…> with your own values. 1 more environment variable is in the server README. uvx runs the command named after the package; if the README names another one, use uvx --from fulltext-article-downloader <command>
Config file
{
"mcpServers": {
"fulltext-article-downloader": {
"command": "uvx",
"args": [
"fulltext-article-downloader"
],
"env": {
"UNPAYWALL_EMAIL": "<UNPAYWALL_EMAIL>",
"FULLTEXT_OUTPUT_DIR": "<FULLTEXT_OUTPUT_DIR>",
"WILEY_API_KEY": "<WILEY_API_KEY>",
"ELSEVIER_API_KEY": "<ELSEVIER_API_KEY>",
"SPRINGER_API_KEY": "<SPRINGER_API_KEY>"
}
}
}
}Replace <…> with your own values. 1 more environment variable is in the server README. uvx runs the command named after the package; if the README names another one, use uvx --from fulltext-article-downloader <command>
Config file
{
"servers": {
"fulltext-article-downloader": {
"type": "stdio",
"command": "uvx",
"args": [
"fulltext-article-downloader"
],
"env": {
"UNPAYWALL_EMAIL": "<UNPAYWALL_EMAIL>",
"FULLTEXT_OUTPUT_DIR": "<FULLTEXT_OUTPUT_DIR>",
"WILEY_API_KEY": "<WILEY_API_KEY>",
"ELSEVIER_API_KEY": "<ELSEVIER_API_KEY>",
"SPRINGER_API_KEY": "<SPRINGER_API_KEY>"
}
}
}
}Replace <…> with your own values. 1 more environment variable is in the server README. uvx runs the command named after the package; if the README names another one, use uvx --from fulltext-article-downloader <command>
Platform CLI
gemini mcp add -e UNPAYWALL_EMAIL=<UNPAYWALL_EMAIL> -e FULLTEXT_OUTPUT_DIR=<FULLTEXT_OUTPUT_DIR> -e WILEY_API_KEY=<WILEY_API_KEY> -e ELSEVIER_API_KEY=<ELSEVIER_API_KEY> -e SPRINGER_API_KEY=<SPRINGER_API_KEY> fulltext-article-downloader uvx fulltext-article-downloaderReplace <…> with your own values. 1 more environment variable is in the server README. uvx runs the command named after the package; if the README names another one, use uvx --from fulltext-article-downloader <command>
Step by step, with commands for each platform: How to add an MCP server to Claude Code, Codex, Cursor, VS Code, Gemini CLI and more
Questions about fulltext-article-downloader
How do I install fulltext-article-downloader in Claude Code?
Run `claude mcp add fulltext-article-downloader -e WILEY_API_KEY=<WILEY_API_KEY> -e ELSEVIER_API_KEY=<ELSEVIER_API_KEY> -e SPRINGER_API_KEY=<SPRINGER_API_KEY> -e SEMANTIC_SCHOLAR_API_KEY=<SEMANTIC_SCHOLAR_API_KEY> -- uvx fulltext-article-downloader`. Put in your own keys; without them only open routes remain.
What does fulltext-article-downloader do?
It takes an article identifier, tries several sources in sequence and checks the result against the paper's title. You get the file path, the source that worked and a note if the file is a preprint or accepted manuscript.
Which keys does it need for paywalled publishers?
Elsevier, Wiley and Springer Nature each unlock their own API with a key, and Semantic Scholar raises your request limit. UNPAYWALL_EMAIL holds your address for Unpaywall and Crossref. Keys stay on your machine.