Skip to main content
Glama
polarizetech

paperlib-mcp

by polarizetech

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 Research

What 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-location is_oa, Unpaywall's best_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, directories 0700, 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 --help

The 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

PAPERLIB_EMAIL

Contact email. Sent to OpenAlex (polite pool), NCBI and PubMed, and in the User-Agent. Required by Unpaywall; without it the unpaywall route is skipped. Never sent unless set.

OPENALEX_API_KEY

Optional (free). Raises limits and enables OpenAlex's own cached full texts. A wrong key fails loudly rather than silently degrading.

OPENCITATIONS_ACCESS_TOKEN

Optional; OpenCitations asks applications to send one.

NCBI_API_KEY

Optional; raises PubMed from 3 to 10 requests/s.

CORE_API_KEY

Optional; raises CORE's limits.

SEARXNG_URL

Optional. A SearXNG instance with JSON output enabled, used as a last-resort search fallback (never a download source).

PAPERLIB_PROVIDERS

Comma-separated locate order (default below).

PAPERLIB_SEARCH_PROVIDERS

Comma-separated federated-search set (default below).

PAPERLIB_WEB_FALLBACK

0 disables the web fallback.

PAPERLIB_STORE

local (default), s3 or memory.

PAPERLIB_DATA_DIR

Local store directory. Default ~/.local/share/paperlib ($XDG_DATA_HOME/paperlib).

PAPERLIB_CACHE

Read-through cache for the S3 store. Default ~/.cache/paperlib.

PAPERLIB_S3_BUCKET

S3 store: bucket (required when PAPERLIB_STORE=s3).

PAPERLIB_S3_ENDPOINT_URL, PAPERLIB_S3_REGION

S3 store: endpoint for non-AWS services (DigitalOcean Spaces, MinIO, R2, ...) and region.

PAPERLIB_S3_ACCESS_KEY_ID, PAPERLIB_S3_SECRET_ACCESS_KEY

S3 store credentials; if unset, boto3's usual credential chain applies.

PAPERLIB_S3_PUBLIC_URL

S3 store: the anonymous base URL used to prove objects are not public. Default https://<bucket>.<endpoint host>.

Providers

name

search

locate

notes

pmc-s3

yes

PMC open-access subset on AWS Open Data; md5 per file.

europepmc

yes

yes

Includes bioRxiv/medRxiv preprints; OA JATS XML.

plos

yes

yes

PLOS DOIs only; 10 requests/minute.

openalex

yes

yes

Metered in USD (search ~$0.001, lookups free); searches are cached.

biorxiv

yes

JATS XML and licence by DOI.

openaire

yes

yes

Only copies with an explicit open licence on an OPEN record.

hal

yes

yes

Licence recorded verbatim (HAL's deposit authorisation is not a reuse licence).

osf

yes

yes

OSF preprints via SHARE; only Creative Commons copies.

core

yes

yes

Repository copies; CORE reports no licence, and none is claimed.

unpaywall

yes

Needs PAPERLIB_EMAIL.

pubmed

yes

Finds papers and PMCIDs; PMC routes hold the copies.

doaj

yes

Search only (its full-text links are landing pages).

web

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-orphans

python -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

data

search

query: str, include_closed: bool = false, limit: int = 10

{"query", "providers": {name: {"status", ...}}, "hits": [...]}

fetch

identifier: str

a catalogue row (below) plus "from"

library

query: str = "", full_text: bool = false, limit: int = 50

{"works": [row, ...], "n": int}

text

identifier: str, offset: int = 0, max_chars: int = 100000

{"text", "offset", "end", "total_chars"}

provenance

identifier: str

the stored provenance record (below)

citations

identifier: str, direction: "citations" | "references" = "citations", limit: int = 25

{"of", "direction", "status", "n", "held", "source", "items": [...]}

providers

{"providers": [{"name", "label", "search", "locate", "needs", "recommends", "available", "why", "terms"}]}

status

{"works", "with_full_text", "not_obtainable", "store", "locate_providers", "openalex_key", "network_calls", "openalex_spent_usd", "openalex_remaining_usd"}

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>.json

The 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 (--refresh bypasses 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.

  • library search 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 --cov

The 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 tools
citationsB

Works citing a paper (direction='citations') or cited by it ('references'), via OpenCitations. Identifiers only, and no citation intent: a citation is not agreement.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
directionNocitations
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
full_textNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

statusA

Counts of works held, with and without full text, and OpenAlex allowance remaining.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
max_charsNo
identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 8 tool updatesv0.1.0
    • First observedcitations
    • First observedfetch
    • First observedlibrary
    • First observedprovenance
    • First observedproviders
    • First observedsearch
    • First observedstatus
    • First observedtext

TDQS

A3.6/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers