Standalone MCP server: deterministic paper identity resolution + PDF retrieval
Project description
paper-tools (MCP)
A standalone MCP server that turns "find a paper" into a deterministic capability. Two tools:
resolve_paper(query)— any input (DOI, arXiv id/URL, SSRN, a bare title, a messy citation string) → decide whether it points to one real paper and return that paper's unique identifier (DOI, else OpenAlex Work ID), orambiguous/not_found. Never guesses a binding.get_pdf(ids)— that identifier → actually downloads the open-access PDF, trying arXiv → Unpaywall → OpenAlex OA/green/SSRN. Returns the saved path, or an honestdownloadable=falsewith human follow-up leads (SSRN, OA Button) when no open-access copy exists.
Built by an unattended Ralph loop from GOAL.md. Status and
remaining work live in PROGRESS.md. This project is fully
independent — it has no dependency on any other repository.
Setup
conda env create -f environment.yml
conda activate paper-tools-mcp
pytest -q # offline golden-set suite
pytest -q -m live # live smoke (hits real APIs)
Institutional access (your own subscription)
When a paper has no open-access copy, get_pdf tries the caller's own subscription
(disable with institutional=False). Two legitimate mechanisms:
-
Elsevier full-text API (covers
10.1016/...): export your own key —export ELSERVIER_API_KEY=...(optionalELSERVIER_INSTTOKEN=...). Uses the Elsevier Article Retrieval API, entitled via your institutional network/token. -
Publisher fetch (curl_cffi): follows the DOI to the publisher and grabs the PDF; works for publishers that grant access by IP when run on campus/VPN.
-
Your Chrome login cookies (curl_cffi): the publisher fetch reuses your existing Chrome session via
browser_cookie3— stay logged into the publishers in Chrome. Works for publishers without a JS bot-wall. Disable withPAPER_TOOLS_NO_BROWSER_COOKIES=1. -
Strong layer (ON by default): one-click institutional fetch for publishers behind a Cloudflare human-check + SSO (SAGE → POMS/JMR/JM, OUP → JCR, INFORMS). Runs whenever a desktop display is present (chromium auto-installs on first use); opt out with
PAPER_TOOLS_NONINTERACTIVE=1(e.g. on headless servers, where it degrades to leads). When the automated cascade can't get a gated paper,get_pdfpops ONE browser window — already seeded with your Chrome login cookies — you clear the one-time "are you human" check (and sign in if needed) once per publisher, and the tool downloads that paper and reuses the session for every later paper from the same publisher. The human check is solved by you (never auto-defeated); everything else is automatic.
Install = environment solved (no manual setup)
Installing the package pulls all Python dependencies; the chromium browser for
the strong layer auto-installs on first use — no separate conda/pip/
patchright install steps.
Zero-setup registration (uv creates an isolated env and installs on first run):
// .mcp.json
{
"mcpServers": {
"paper-tools": {
"command": "uvx",
"args": ["--from", "git+https://github.com/<you>/paper-tools-mcp", "paper-tools-mcp"],
"env": { "PAPER_TOOLS_INTERACTIVE": "1", "ELSERVIER_API_KEY": "<optional>" }
}
}
}
Or with pip: pip install git+https://github.com/<you>/paper-tools-mcp then use
"command": "paper-tools-mcp". (A desktop display is required only for the strong
interactive layer; the OA/API layers run anywhere.)
Cross-platform: Linux, macOS, and Windows. The OA/API layers run anywhere. The
strong interactive layer uses your local Chrome cookies (browser_cookie3 decrypts
per-OS: Linux keyring / macOS Keychain / Windows DPAPI) and pops a desktop window, so
it needs a logged-in Chrome + a desktop session. Launch flags are auto-selected per
OS (--no-sandbox only on Linux). Note: very recent Chrome on Windows uses app-bound
cookie encryption that browser_cookie3 may not read — sign in once in the popped
window if cookie reuse misses.
Register with Claude Code (dev / conda)
// .mcp.json / Claude Code MCP config
{
"mcpServers": {
"paper-tools": {
"command": "conda",
"args": ["run", "-n", "paper-tools-mcp", "python", "-m", "paper_tools.server"]
}
}
}
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file paper_tools_mcp-0.1.1.tar.gz.
File metadata
- Download URL: paper_tools_mcp-0.1.1.tar.gz
- Upload date:
- Size: 22.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
770e68ed3957e8deac08922296037c1c96795c8eccc40b7e32697aa02a712963
|
|
| MD5 |
2ebc1886093d130030d0ad6b58a1e862
|
|
| BLAKE2b-256 |
aad31d9cea039946625dde1cde41fe52678ca925878639f70418e3ecdf957e12
|
Provenance
The following attestation bundles were made for paper_tools_mcp-0.1.1.tar.gz:
Publisher:
publish.yml on zhangsh1416/paper-tools-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paper_tools_mcp-0.1.1.tar.gz -
Subject digest:
770e68ed3957e8deac08922296037c1c96795c8eccc40b7e32697aa02a712963 - Sigstore transparency entry: 1646586361
- Sigstore integration time:
-
Permalink:
zhangsh1416/paper-tools-mcp@fee8951a115f366eff49466077f7bcd5d312e096 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/zhangsh1416
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fee8951a115f366eff49466077f7bcd5d312e096 -
Trigger Event:
release
-
Statement type:
File details
Details for the file paper_tools_mcp-0.1.1-py3-none-any.whl.
File metadata
- Download URL: paper_tools_mcp-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6bb0c89ab1ccbd65c6ca02992b34ff8d60fa4739ee0babd5b280669ffb2a8e49
|
|
| MD5 |
72201b211fcee186a0fd5da25494e96f
|
|
| BLAKE2b-256 |
773a996bb87b7955e1f1027e0f16ef76e0ad535198419ecb367ae0365a9f575a
|
Provenance
The following attestation bundles were made for paper_tools_mcp-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on zhangsh1416/paper-tools-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paper_tools_mcp-0.1.1-py3-none-any.whl -
Subject digest:
6bb0c89ab1ccbd65c6ca02992b34ff8d60fa4739ee0babd5b280669ffb2a8e49 - Sigstore transparency entry: 1646586486
- Sigstore integration time:
-
Permalink:
zhangsh1416/paper-tools-mcp@fee8951a115f366eff49466077f7bcd5d312e096 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/zhangsh1416
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fee8951a115f366eff49466077f7bcd5d312e096 -
Trigger Event:
release
-
Statement type: