ARES MCP
Local Model Context Protocol server for academic literature search and writing. It talks to open catalogs (OpenAlex, arXiv, Crossref), downloads open-access PDFs (PDF files only), extracts IMRaD sections on demand, and appends BibTeX — designed to run next to Cursor or any MCP host.
License: MIT. Free to use locally. Contributions: CONTRIBUTING.md.
ARES does not bypass publisher paywalls. If no OA PDF exists, tools return
no_open_pdfinstead of scraping HTML.
This project is a literature helper, not a PRISMA screening/audit
workbench. It is also not the Czech business-registry MCP
(ares-mcp-server).
Install (PyPI)
Python 3.11+. uv is recommended.
Cursor / MCP host (uvx downloads the published wheel, no clone):
{
"mcpServers": {
"ares": {
"command": "uvx",
"args": ["ares-mcp"]
}
}
}
Optional identity for the OpenAlex / Unpaywall polite pool (still no .env):
{
"mcpServers": {
"ares": {
"command": "uvx",
"args": ["ares-mcp", "--mailto", "you@university.edu"]
}
}
}
Or install into an environment:
pip install ares-mcp
# or: uv tool install ares-mcp
ares-mcp --mailto you@university.edu
A .env file is not required. Contact email is resolved in this order:
ares-mcp --mailto you@university.eduARES_MAILTOin the process environment (Cursormcp.jsonenvblock)- Optional cwd
.env(ARES_MAILTO=...) — local checkouts only git config user.email- Placeholder
ares-mcp@localhost(server still starts)
After publish, confirm the package at pypi.org/project/ares-mcp.
Tools
| Tool | Purpose |
|---|---|
search_papers |
Query OpenAlex + arXiv; sort=cited_by or relevance; optional DOI/arXiv lookup |
download_and_parse_paper |
DOI or arXiv id → PDF only in papers/ |
get_bibtex |
Crossref BibTeX → append references.bib (no duplicates) |
extract_sections |
Heuristic IMRaD headings from a local PDF |
list_local_papers |
Inventory PDFs under papers/ (or another dir) |
screen_papers_for_rqs |
Heuristic include/maybe/exclude of local PDFs vs research questions + snippets |
query_local_papers |
Ranked excerpts from the local corpus for a free-form question |
Typical agent flow: search (sort=cited_by for famous papers) → download an OA
hit → extract Abstract/Methods → get_bibtex. For RQ screening over downloads:
list_local_papers → screen_papers_for_rqs (host agent narrates justifications
from the evidence pack; ARES does not call an external LLM).
Install (development)
git clone https://github.com/benetche/ares-mcp.git
cd ares-mcp
uv sync
Run tests:
uv run pytest
uv run ruff check src tests
Live API checks (optional):
uv run pytest -m integration
Configure Cursor (local checkout)
Copy .cursor/mcp.json and replace the --project path
with your clone. Email is optional; git user.email is used when unset.
Recommended — uv run:
{
"mcpServers": {
"ares": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/ares-mcp",
"ares-mcp"
]
}
}
}
venv Python:
{
"mcpServers": {
"ares": {
"command": "/absolute/path/to/ares-mcp/.venv/bin/python",
"args": ["-m", "ares_mcp"]
}
}
}
On Windows, use .venv/Scripts/python.exe instead of .venv/bin/python.
uvx from a local checkout (no PyPI install required):
{
"mcpServers": {
"ares": {
"command": "uvx",
"args": ["--from", "/absolute/path/to/ares-mcp", "ares-mcp"]
}
}
}
Reload MCP servers in Cursor, then ask: “Search open-access papers on graph neural networks since 2022.”
Inspector (outside Cursor):
uv run fastmcp dev src/ares_mcp/server.py
Environment
| Variable / flag | Default | Meaning |
|---|---|---|
--mailto / ARES_MAILTO |
git user.email, else ares-mcp@localhost |
Contact in User-Agent / OpenAlex mailto / Unpaywall email |
ARES_METADATA_TIMEOUT_S |
20 |
Metadata HTTP timeout |
ARES_PDF_TIMEOUT_S |
60 |
PDF download timeout |
ARES_MAX_PDF_BYTES |
52428800 |
Max PDF size (~50 MiB) |
Writes are jailed to the server current working directory (the project Cursor opened). Path traversal is rejected. PDF candidate URLs that point at loopback or private IPs are rejected.
API notes
- OpenAlex:
GET /workswithsearch+filter. Abstracts are stored as inverted indexes and reconstructed locally. Download uses alllocationswith apdf_url, plus arXiv/PMC ids when present. - Unpaywall:
GET /v2/{doi}for legal OA copies (preprints, accepted manuscripts, repositories). This is how many IEEE/Elsevier papers become downloadable without touching the paywall HTML. - arXiv: Atom API at
export.arxiv.org. All hits are OA. - Crossref: DOI content negotiation
Accept: application/x-bibtex. - Identify your process with
--mailtoorARES_MAILTOwhen you can. Do not hammer the APIs; each tool call is a handful of requests with one retry on 429/5xx.
If every OA candidate 403s or returns HTML, the tool reports download_failed
or no_open_pdf. Pass an arXiv id when you know a preprint exists. ARES
will not scrape publisher HTML.
License alternative
MIT is the project license. Apache-2.0 may be considered later if a patent grant is required; discuss that in an issue before relicensing.
Status
0.2.0. Releases are built in CI and uploaded to PyPI with
Trusted Publishing (OIDC, no
long-lived API tokens). After a GitHub Release tag v0.2.0 (and matching
publisher config on PyPI), Cursor can run uvx ares-mcp with no .env.
Metadata
Release files for ares-mcp 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ares_mcp-0.2.0.tar.gz | 162.4 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ares_mcp-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 213.6 kB
Release files / ares_mcp-0.2.0.tar.gz
| Download URL | ares_mcp-0.2.0.tar.gz |
|---|---|
| Size | 162.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b812c30110ee19adac55decf82850cdbadde8a3e35d890c10da3204618cfed6
|
|
BLAKE2b-256 checksum How to use checksums |
ce3d8aafa4bf6ff1788f0f5e393c07703dec42fc75da787cc3064099efed16f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ares_mcp-0.2.0-py3-none-any.whl
| Download URL | ares_mcp-0.2.0-py3-none-any.whl |
|---|---|
| Size | 51.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6aef2589b08766c3a396ec02f8d66d075fa9349fcbd7e7aa595c9241bf253880
|
|
BLAKE2b-256 checksum How to use checksums |
23e33bfd0d0a6923a2996c1e3f52ab8c652eb98f8d0a5e116c4017e48a102f0e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for ares-mcp 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.