paperlib-mcp
Allows searching and retrieving open-access papers from HAL (hal.science), recording the licence verbatim from the deposit.
Allows searching and retrieving preprints from OSF via SHARE, restricted to Creative Commons licensed copies.
Allows searching PubMed for papers and PMCIDs, and uses NCBI's ID converter to fill in missing identifiers.
Provides a last-resort web search fallback through a SearXNG instance to locate open-access copies; never used as a download source.
Click on "Deploy 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., "@paperlib-mcpfetch the paper 10.1371/journal.pcbi.1003285 and summarize its main findings"
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.
paper-library (paperlib)
A deduplicated, private library of legal open-access scientific papers. Give it a DOI, OpenAlex ID, PMID, PMCID or arXiv ID; it looks in what it already holds first, and only then asks a chain of open-access providers for a copy. Every copy it keeps is validated (checksum, format, readable text) and stored with a provenance record: where it came from, under what licence, and every route that was tried.
It ships as a Python library, a command line (paperlib), and an MCP server (paperlib-mcp) so
that an LLM agent can search, fetch and read papers through a small, stable tool contract.
$ paperlib fetch 10.1371/journal.pcbi.1003285
ā W2036318837 [retrieved] 2013 Ten Simple Rules for Reproducible Computational Research
oa=gold route=pmc-s3:jats-xml format=jats-xml license=CC BY
$ paperlib fetch 10.1371/journal.pcbi.1003285 # second time: no network at all
ā W2036318837 [library] 2013 Ten Simple Rules for Reproducible Computational ResearchWhat it will and will not do
Open-access copies only. A provider returns a location only for a copy it reports as open access (Europe PMC's
isOpenAccess, PMC's open-access subset, OpenAlex's per-locationis_oa, Unpaywall'sbest_oa_location, a preprint server's own copy, a Creative Commons licence on the record). There is no code path that follows a paywall, scrapes a publisher page or uses a shadow library. If no provider reports an open copy, nothing is downloaded and the answer says so.Open access is a right to read, not to republish. Many OA copies carry no reuse licence at all, and NIH author manuscripts in PMC are under a text-and-data-mining licence. So the store is private (files
0600, directories0700, checked after every write; S3 objects never get an ACL and are checked with an anonymous request), and each copy records the licence exactly as its provider reported it. Quote briefly and cite; do not redistribute stored files.A copy you legitimately hold (an author copy, a purchased PDF) can be added with
paperlib add file.pdf <id> --rights "...". The rights statement is required and recorded. This is deliberately not an MCP tool: that statement is the operator's to make, not a model's.Validated, not assumed. A candidate is refused if its md5 does not match the provider's published checksum, if it is an HTML page (a login screen served as "PDF"), if it is not the format claimed, or if the extracted text does not look like prose.
Loud, per-provider failure. A rate-limited or unreachable provider is reported by name as
unavailable; it is never silently folded into "no results".Not Google Scholar. It has no API and its terms forbid automated querying.
Related MCP server: PubMed MCP Server
Install
Python 3.11+.
pip install "paper-library[mcp]" # CLI + MCP server
pip install "paper-library[mcp,s3]" # ... plus the S3-compatible store (boto3)
# or, from a checkout:
uv sync && uv run paperlib --helpThe core depends only on the standard library and pypdf
(pure Python, used for PDF text extraction; no external binaries such as pdftotext). mcp is
needed only for the server, boto3 only for the S3 store.
Configure
Everything is configured with environment variables; none is required. Both paperlib and
paperlib-mcp also read KEY=value lines from *.env files in ~/.config/paperlib/ (or
$PAPERLIB_ENV_DIR), taking only the variables below and never overriding the environment. Keep
those files out of repositories (chmod 600).
Variable | Purpose |
| Contact email. Sent to OpenAlex (polite pool), NCBI and PubMed, and in the User-Agent. Required by Unpaywall; without it the |
| Optional (free). Raises limits and enables OpenAlex's own cached full texts. A wrong key fails loudly rather than silently degrading. |
| Optional; OpenCitations asks applications to send one. |
| Optional; raises PubMed from 3 to 10 requests/s. |
| Optional; raises CORE's limits. |
| Optional. A SearXNG instance with JSON output enabled, used as a last-resort search fallback (never a download source). |
| Comma-separated locate order (default below). |
| Comma-separated federated-search set (default below). |
|
|
|
|
| Local store directory. Default |
| Read-through cache for the S3 store. Default |
| S3 store: bucket (required when |
| S3 store: endpoint for non-AWS services (DigitalOcean Spaces, MinIO, R2, ...) and region. |
| S3 store credentials; if unset, boto3's usual credential chain applies. |
| S3 store: the anonymous base URL used to prove objects are not public. Default |
Providers
name | search | locate | notes |
| yes | PMC open-access subset on AWS Open Data; md5 per file. | |
| yes | yes | Includes bioRxiv/medRxiv preprints; OA JATS XML. |
| yes | yes | PLOS DOIs only; 10 requests/minute. |
| yes | yes | Metered in USD (search ~$0.001, lookups free); searches are cached. |
| yes | JATS XML and licence by DOI. | |
| yes | yes | Only copies with an explicit open licence on an OPEN record. |
| yes | yes | Licence recorded verbatim (HAL's deposit authorisation is not a reuse licence). |
| yes | yes | OSF preprints via SHARE; only Creative Commons copies. |
| yes | yes | Repository copies; CORE reports no licence, and none is claimed. |
| yes | Needs | |
| yes | Finds papers and PMCIDs; PMC routes hold the copies. | |
| yes | Search only (its full-text links are landing pages). | |
| fallback | SearXNG; identifiers are parsed from URLs and never trusted as open. |
Default locate order: pmc-s3, europepmc, plos, openalex, biorxiv, openaire, hal, osf, core, unpaywall. Default search set: openalex, europepmc, pubmed, openaire, plos, osf, hal, doaj, core, with web asked only when none of those returns an open-access hit. NCBI's ID converter
fills in missing PMCIDs/PMIDs before providers are asked, and OpenCitations answers the citation
graph. paperlib providers lists what is enabled and what each needs, without touching the network.
Command line
paperlib fetch <doi|W123|pmid:N|PMCN|arxiv:ID> [...] [--force]
paperlib search "<query>" [--providers a,b] [--include-closed] [-n N] [--refresh]
paperlib providers
paperlib library ["<query>"] [--full-text]
paperlib text <id>
paperlib provenance <id>
paperlib verify <id> # re-hash stored files against their recorded sha256
paperlib add <file.pdf> <id> --rights "..."
paperlib citations <id> [--references] [-n N] [--refresh]
paperlib status | rebuild-index | adopt-orphanspython -m paperlib is the same program. Exit codes: 1 not found, 2 unavailable or bad input,
3 checksum verification failed.
Python
from paperlib import Library
lib = Library.default()
rec = lib.fetch("10.1371/journal.pcbi.1003285") # rec["from"]: library | retrieved | not-obtainable
text = lib.text(rec["work"]) # raises NotFound if there is no readable text
prov = lib.provenance(rec["work"])
res = lib.search("reproducible computational research")Library(store, openalex, providers=[...], search_providers=[...]) accepts any store with the
Store protocol and any Provider subclasses, which is how the test suite runs offline.
MCP server
paperlib-mcp is a stdio MCP server (works with mcp 1.x and 2.x). Any MCP client can run it:
{
"mcpServers": {
"papers": {
"command": "paperlib-mcp",
"args": [],
"env": {
"PAPERLIB_EMAIL": "you@example.org",
"PAPERLIB_DATA_DIR": "/path/to/paper-library"
}
}
}
}Without a global install, use uvx: "command": "uvx", "args": ["--from", "paper-library[mcp] @ git+https://github.com/polarizetech/paper-library", "paperlib-mcp"].
Secrets can stay out of client configuration by putting them in ~/.config/paperlib/*.env.
Tool contract
Every tool returns one JSON object:
{"ok": true, "data": "..."}
{"ok": false, "code": "not_found | unavailable | tool_error", "error": "human-readable message"}not_found: not held, no readable text, or no DOI/PMID to ask OpenCitations with.
unavailable: a remote service refused or did not answer; this never means "zero results".
tool_error: bad arguments or configuration (unparseable identifier, unknown provider, bad key).
tool | arguments |
|
|
|
|
|
| a catalogue row (below) plus |
|
|
|
|
|
|
|
| the stored provenance record (below) |
|
|
|
|
| |
|
|
search: providers[name].status is ok or cache (with n, cost_usd), skipped
(missing configuration; why), unavailable or error (why), or for web also not-needed
(with why_ran when it did run). Each hit is {"title", "year", "ids": {"doi", "pmid", "pmcid", "openalex", "arxiv", ...}, "authors", "providers": [...], "is_oa", "locations": ["provider:format", ...], "urls": [...], "in_library", "full_text_in_library", "work"}, merged across providers by
identifier and sorted by how many providers returned it, then by year.
Catalogue row (fetch, library): work (the OpenAlex ID, or doi-.../pmcid-... when
OpenAlex has no record), doi, pmid, pmcid, title, year, authors (first three),
full_text (true only if readable text passed the gate), oa_status, license, route
(provider:format), format, retrieved, retry_after (when a paper with no open copy will be
asked about again), is_retracted; fetch adds from (library | retrieved |
not-obtainable) and library adds matched_in when a query was given.
text: max_chars is clamped to 1,000..100,000. Page through with offset = end until
end >= total_chars.
Provenance record: work, retrieved, full_text, file_stored, route, source_url,
format, license, version, md5_verified, text_method, text_gate, oa_status, rights,
refused, providers (tried, in order), attempts ([[route, outcome], ...]), sha256
({file: hex}), ids, ids_note, retry_after.
citations: n is the total; items holds at most limit, newest citing work first for
direction="citations". Each item is {"ids": {"doi", "pmid", "openalex", "omid"}, "oci", "citing_date", "timespan", "journal_self_citation", "author_self_citation", "in_library", "full_text_in_library", "work"}. There is no citation intent: a citation is not agreement.
Storage layout
papers/index.jsonl catalogue (derived; `paperlib rebuild-index` recreates it)
papers/doi/<quoted-doi>.json DOI -> work pointer
papers/works/<work>/work.json the OpenAlex record
papers/works/<work>/provenance.json authoritative: routes tried, source, licence, sha256s
papers/works/<work>/fulltext.{pdf,jats.xml,tei.xml,provider.txt}
papers/works/<work>/fulltext.txt only when the text passed the readability gate
papers/searches/<provider>/<sha256>.json
papers/citations/<direction>/<id>.jsonThe same layout is used on disk and in a bucket. A lookup reads the catalogue first and falls back to the per-work provenance, so a stale or deleted catalogue can slow a lookup down but can never cause a second download.
Limits
Coverage is whatever the providers report as open; a paper with no open copy stays
not-obtainable(asked about again after 30 days, since embargoes lift).Text is machine-extracted: figures, tables and equations may be missing or garbled. Scanned PDFs without a text layer fail the readability gate (there is no OCR).
Licences are recorded as reported, not adjudicated. CORE and some repositories report none.
Searches are cached for 30 days, so a repeated query can miss papers indexed since (
--refreshbypasses the cache).Rate limits are the providers': PLOS allows 10 requests/minute, unkeyed OpenAlex has a small daily budget, and so on. Requests are spaced politely per provider.
librarysearch is term matching over titles and authors (optionally full text), not ranking.
Development
uv sync # Python 3.11+; installs the dev group
uv run ruff check . && uv run ruff format --check .
uv run pyright
uv run pytest --covThe suite is offline: HTTP is replaced by a fake that serves small synthetic fixtures
(tests/fixtures/), and one test drives the real paperlib-mcp entry point over stdio. CI runs
all of the above on Python 3.11, 3.12 and 3.13.
License
MIT. See LICENSE. The papers you retrieve are under their own licences.
Available Tools
8 toolscitationsB
Works citing a paper (direction='citations') or cited by it ('references'), via OpenCitations. Identifiers only, and no citation intent: a citation is not agreement.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| direction | No | citations | |
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses that only identifiers are accepted and that citation intent is not classified, which is useful, but it omits details on error handling, output format, authentication, or rate limits. For a read-style tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the core purpose and immediately clarify scope. No unnecessary words, and the key differentiator (no citation intent) is included early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has three parameters and an output schema, the description is not complete enough for correct invocation. It does not specify identifier format (e.g., DOI, PMID), behavior of limit, or any preconditions. An agent would need to infer or discover these details elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the direction parameter with its two values, but does not clarify what kind of identifier is expected (e.g., DOI) or the semantics of the limit parameter. The description adds minimal value beyond the schema for two of the three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists citations or references of a paper via OpenCitations, with a specific verb and resource. It distinguishes itself from sibling tools by implying a focused citation lookup, but does not explicitly name alternatives or contrast with search/fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (when you need citation/reference relationships) and gives context like identifiers only and no intent. However, it does not explicitly state when not to use it or how it differs from siblings like search or fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchB
Fetch and privately store a legal open-access copy of a paper (held papers cost nothing).
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses that the copy is stored privately and that held papers cost nothing, which is useful behavioral context. However, it doesn't mention what happens if the paper is not open-access, whether the operation is read-only or creates a record, or any rate limits or auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, and the parenthetical adds a key cost detail without bloat. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are covered elsewhere. But with no annotations, no parameter semantics, and no mention of failure modes or identifier format, the description is only minimally adequate for an agent to call this correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'identifier' parameter beyond the schema's name and type. The agent must infer what kind of identifier is expected (DOI, URL, PMID, etc.). With zero coverage and no compensation in the description, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('a legal open-access copy of a paper'), and clarifies that held papers cost nothing. It doesn't explicitly distinguish from siblings like 'search' or 'library', but the action is clear enough for an agent to understand the tool's core function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need a paper's full text and want to store it privately. It does not explicitly state when not to use it or name alternatives like 'search' for discovery or 'text' for extracting content. The context is clear but exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
libraryA
Search papers already held (titles and authors; optionally inside stored full text).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| full_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It does disclose the optional full-text search behavior and the scope limitation to already-held papers, which is helpful. However, it doesn't mention default limit behavior, pagination, or what happens when query is empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core action and scope, then adds the optional full-text detail. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are covered elsewhere. The description covers the core search scope and the optional full-text mode, but with no annotations and no mention of default behavior or result ordering, an agent has only partial context for invoking it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'full_text' parameter's purpose (searching inside stored full text) and implies 'query' is the search term. However, it doesn't clarify the 'limit' parameter's behavior or the meaning of an empty query, leaving some semantics to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and resource ('papers already held'), and clarifies the search scope (titles and authors, optionally full text). It is clear enough to distinguish from a general web search, though it doesn't explicitly name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for searching the user's existing library rather than external sources, which is useful context. However, it doesn't explicitly state when to use this tool versus the sibling 'search' tool, nor does it provide exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provenanceA
Return acquisition route, licence, checksums, and every route tried for a held paper.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It discloses the type of information returned and the constraint that the paper must be 'held', but it does not explicitly state that the tool performs no mutations, nor does it describe permissions or error behavior. The verb 'Return' provides some read-only signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no fluff; the main action and object are front-loaded. It is appropriately sized for a simple one-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered elsewhere. The description conveys the tool's purpose and input context. However, it leaves out usage boundaries and explicit side-effect clarity, which matters because there are no annotations. For a one-parameter read tool, it is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only provides type and title for identifier. The description adds that the identifier refers to a 'held paper', giving some context, but it does not specify the identifier format or how to obtain it. With only one parameter, this is modest but insufficient compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('return') and resource (acquisition route, licence, checksums, every route tried) for a held paper. This content is clearly distinct from sibling tools like fetch or search, though the description does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when provenance details of a paper are needed, but it does not explicitly state when to use it over siblings or mention any exclusions. No guidance is provided on when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
providersA
List every provider, what it can do, what it needs, and its terms. No network.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It discloses one meaningful traitā'No network'āand 'List' implies a read-only operation. However, it does not mention output size, data source, error behavior, or any limitations beyond network usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. It front-loads the action and resource, then adds the network constraint, making every word valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters and an output schema present, the description adequately covers what the tool does and the scope of its output. The 'No network' note adds useful operational context. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is nothing for the description to add about parameter meaning. Per the rubric, a zero-parameter tool receives a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List every provider') and adds concrete content details: what each provider can do, needs, and terms. This clearly distinguishes it from sibling tools like search, fetch, and status, whose purposes are different.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is only implicit: if the agent needs provider information, this tool provides the full list. The note 'No network' hints at offline suitability, but the description does not explicitly state when to prefer this tool over alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchB
Search all configured literature providers and mark papers already held.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| include_closed | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose a notable behavior beyond the name: it searches all configured providers and marks papers already held. However, it does not say whether marking is persistent, whether external providers are queried live, or whether side effects are possible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action and scope, then adds the distinguishing 'mark papers already held' behavior. Every word earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three parameters, no annotations, and zero parameter documentation, yet the description only covers the general action. It leaves include_closed unexplained, does not define what 'already held' means, and omits any operational caveats. The output schema covers return shape, but invocation semantics are incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no meaning for query, limit, or include_closed. The agent must infer the semantics of include_closed and limit entirely from names/defaults, with no compensating detail in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and a specific resource ('all configured literature providers'), and adds a distinct behavioral outcome ('mark papers already held'). This clearly separates it from siblings like fetch, library, and providers without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Search all configured literature providers' implies this is the cross-provider discovery tool, but the description never explicitly says when to use search versus siblings like fetch or library. Usage context is only implied, with no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
Counts of works held, with and without full text, and OpenAlex allowance remaining.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the burden of disclosure. It explicitly states what the tool returns (counts and allowance), but does not disclose any potential side effects, rate limits, or edge-case behavior. For a simple read-only status tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the primary output (counts) and secondary output (allowance). No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (no params, no annotations) and an output schema exists to define the return structure. The description covers the essential semantics of what the tool reports. No additional context is needed to call or interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to explain any. Consistent with the baseline for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: providing counts of works held (with/without full text) and OpenAlex allowance remaining. It uses specific terms and is distinct from siblings like search or fetch, which handle content retrieval rather than counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus its siblings. It neither mentions alternatives nor conditions. A user might infer that this is for checking availability, but there's no explicit statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
textC
Read a page of a held paper's machine-extracted full text.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| max_chars | No | ||
| identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Read' which implies non-destructive, but it doesn't mention how offset and max_chars affect behavior, whether there are rate limits, or what the output structure is (though an output schema exists, its content isn't disclosed here). No side effects or edge cases are described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no fluff. It front-loads the core purpose and is easy to parse. However, it is so short that it sacrifices useful detail, but that's a completeness issue, not a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 parameters, one required) and the presence of an output schema, the description should at least clarify the parameters and the notion of 'page'. It doesn't explain pagination, what 'held paper' means, or any error conditions. The description is far from complete for an agent to call it correctly without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters, but it doesn't. It doesn't clarify what 'identifier' refers to (the paper ID), what 'offset' does (page offset or character offset?), or how 'max_chars' limits the returned text. The agent has to guess parameter meaning from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb ('Read') and specific resource ('a page of a held paper's machine-extracted full text'). It distinguishes from siblings like search or fetch by implying a direct text-retrieval operation, though it doesn't explicitly name alternatives. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus siblings like fetch or search. It doesn't state prerequisites, such as needing an identifier from a prior search, nor does it explain when not to use it. The description leaves the selection decision entirely to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
citations - First observed
fetch - First observed
library - First observed
provenance - First observed
providers - First observed
search - First observed
status - First observed
text
TDQS
Scored across 8 tools
Each tool targets a distinct aspect of the paper workflow: search for external discovery, library for held papers, fetch for acquisition, text for reading, provenance for metadata, citations for references, providers for source configuration, and status for aggregate counts. There is no overlap or ambiguity in their purposes.
All tool names are single lowercase words, forming a consistent and predictable pattern. Although the names mix verbs (fetch, search) and nouns (library, status), the uniform lowercase style establishes a coherent convention that is easy to follow.
With 8 tools, the server is well-scoped for a paper management and citation service. Each tool covers a necessary function without redundancy, and the count feels neither sparse nor overwhelming.
The tool set covers the full lifecycle of paper handling: discover (search), acquire (fetch), search held (library), read (text), inspect provenance, explore citations, understand providers, and check status. No obvious gaps exist for the stated domaināevery action a user would reasonably need is represented.
Maintenance
Related MCP Connectors
Open scientific and engineering knowledge for AI agents: search, evidence, document publishing.
Shared, peer-validated knowledge archive for AI agents ā search, contribute, and validate via MCP
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Read-only MCP over an agentic SLR workspace with per-claim citation verification
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to download, index, and semantically search PDF research papers using 8 MCP tools.2GPL 3.0
- AlicenseAqualityCmaintenanceProvides structured PubMed literature data for LLM agents, supporting search, caching, and open-access full-text downloads via the MCP protocol.541 npm11Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables scientific literature research through multi-agent search, analysis, and semantic memory, exposing 9 MCP tools for querying, storing, and retrieving research findings.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients such as Claude to search over 450,000+ open-access papers, standards, and legal documents, download PDFs, retrieve citations, and fetch full document metadata.MIT