acatome-quest-mcp
Fetches PDFs and metadata from arXiv for scientific papers.
Resolves metadata and fetches open-access PDFs using Semantic Scholar's index.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@acatome-quest-mcpsubmit paper with DOI 10.1021/jacs.2c01234"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
acatome-quest-mcp
Paper-request MCP for scientific papers. The missing piece between
precis-mcp (navigates what's
already in your library) and
acatome-extract (ingests
PDFs that land in an inbox).
An LLM says "I want this paper" (DOI, arXiv id, title, or free-form citation). Quest:
Checks the store first — no duplicate work if we already have it.
Resolves the metadata via Crossref + Semantic Scholar + arXiv.
Flags misconceptions — broken DOI, DOI↔title mismatch, duplicate of an existing slug, fabrication suspect.
Fetches the PDF from legitimate open-access sources only and drops it into the existing watch inbox, where
acatome-extracttakes over.Returns a request id in milliseconds. Slow extraction happens out of band; the MCP call never blocks.
Open access only — by policy
Quest fetches from arXiv, Unpaywall, OpenAlex, Europe PMC, and Semantic
Scholar's open-access index only. It does not, will not, and cannot be
configured to use Sci-Hub, LibGen, institutional proxies without explicit opt-
in, or any other paywall-circumvention mechanism. Failed retrievals yield a
needs_user status with the publisher URL, for you to retrieve manually.
Related MCP server: paper-fetch-mcp
Install
pip install acatome-quest-mcp
# or with uv
uv add acatome-quest-mcpFor dedup against a local acatome-store:
pip install 'acatome-quest-mcp[store]'Four tools
Tool | What it does |
| Resolve + optionally queue. Idempotent. |
| Read one or many requests. |
| Mutate. Modes: |
| Attach a user-supplied PDF (e.g. Discord attachment) to an existing request or create a new one, flip to |
submit
submit(ref={"doi": "10.1021/jacs.2c01234"})
submit(ref={"title": "Anion exchange membranes for NOx reduction",
"authors": ["Feng, Z."], "year": 2024})
submit(ref={"raw": "Feng et al. 2024, Adv. Funct. Mater. 34, 2300512"})
submit(ref={"doi": "10.1234/x"}, dry_run=True) # resolve only, no queue
submit(ref={"doi": "10.1234/x"},
source={"document": "ch02.tex", "line": 147})Response:
{
"id": "9f3b…",
"status": "found_in_store",
"resolved": {"doi": "10.1021/jacs.2c01234",
"title": "…", "authors": ["…"], "year": 2024,
"ref": "smith2022jacs"},
"candidates": [],
"misconceptions": []
}status
status(id="9f3b…")
status(filter={"status": "needs_user"})
status(filter={"created_by": "asa", "has_misconception": True})
status(filter={"source_document": "ch02.tex"})update
update(id, mode="confirm", choice=0) # pick candidates[0]
update(id, mode="repoint", doi="10.1023/A:…") # user-corrected DOI
update(id, mode="flag", code="retracted",
evidence="Retraction Watch 2024-08-12")
update(id, mode="priority", priority=5)
update(id, mode="cancel")submit_file
# User drops a PDF for an already-tracked request (reopens failed / needs_user):
submit_file(url="https://cdn.discordapp.com/…/paper.pdf",
request_id="7f3a…",
filename="feng2024.pdf")
# User supplies both a PDF and a DOI in one step (creates the request):
submit_file(url="https://cdn.discordapp.com/…/paper.pdf",
ref={"doi": "10.1021/jacs.2c01234"},
created_by="asa")
# Bytes already in memory (no URL to fetch):
submit_file(content_base64="JVBERi0xLjQKJf…",
request_id="7f3a…")PDF magic bytes are validated; HTML error pages are rejected. The file is written to the extractor's inbox (~/.acatome/inbox/ by default) and the request flips to ingesting. If the paper's DOI is already in the store, the tool short-circuits to found_in_store without writing anything.
CLI
The acatome-quest binary exposes the same surface as the MCP plus a couple of
shell-friendly helpers:
acatome-quest submit 10.1021/jacs.2c01234
acatome-quest status <id>
acatome-quest status --filter status=needs_user
acatome-quest status --filter status=needs_user --count # just prints "3"
acatome-quest update <id> repoint --doi 10.1023/A:…
acatome-quest submit-file --path ./feng2024.pdf --request-id 7f3a…
acatome-quest submit-file --url https://.../paper.pdf --doi 10.1021/jacs.2c01234
acatome-quest report # markdown worklist
acatome-quest report --document ch04.tex --format markdown # scoped
acatome-quest runner [--once]
acatome-quest reconcilereport renders a paste-ready markdown document for every request in
needs_user, failed, or extract_failed — each entry with citation,
DOI/arXiv link, failure reason, misconception evidence, and a concrete
suggested action (repoint DOI, drop PDF into ~/.acatome/inbox/, request via
interlibrary loan, …). Hand it to a librarian or paste into an ILL form.
Statuses
Status | Meaning |
| Accepted, not yet fetched |
| Metadata lookup in progress (transient) |
| Dedup hit — slug in |
| Disambiguation or manual fetch required |
| Runner has claimed and is downloading |
| PDF in inbox, waiting for |
| Extraction done, slug in |
| PDF delivered but extraction failed |
| All sources exhausted |
|
|
Misconception codes
Code | Severity | Trigger |
| major | Crossref 404 or syntactically malformed |
| major | 404, but |
| critical | DOI resolves but title fuzz < 60 vs request |
| critical | No S2/Crossref hit (fabrication suspect) |
| minor | Already in store under another slug |
| critical | S2 / Retraction Watch flag |
| info | arXiv preprint of a later journal paper |
| critical | User-dropped PDF resolved to a different paper than the request it was attached to |
Architecture
agent ──submit()──► acatome-quest-mcp (FastMCP, stdio)
│
▼
cluster.papers.requests (Postgres)
│
▼
acatome-quest-runner (launchd, poll 30 s)
│
fetch: arxiv → unpaywall → …
│
▼
~/.acatome/inbox/<slug>__<hash>.pdf
│
▼
acatome-extract watch → acatome-store
▲
└── runner polls by DOI, flips to `ingested`Configuration
Env var | Default | Description |
|
| Postgres DSN |
|
| Schema name for the |
|
| Drop directory watched by |
| (required at runner start) | Polite-pool contact |
| (recommended) | Crossref polite pool |
| (optional) | Raises S2 rate limit |
|
| Runner tick seconds |
|
| Max parallel fetches |
|
| Seconds to wait for ingest after PDF drop |
|
| Per- |
Development
uv sync
uv run pytest
uv run ruff check .
uv run mypy src testsLicense
GPL-3.0-or-later. See LICENSE.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/retospect/acatome-quest-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server