Skip to main content
Glama
jtl-neo

crossref-mcp

by jtl-neo

crossref-mcp

CI License: MIT Docker

English | 中文

An MCP server wrapping the Crossref REST API, exposing scholarly-metadata lookups (works, members, journals, funders, types, licenses, prefixes) as tools an LLM client can call.

Not affiliated with or endorsed by Crossref. Data is served live from the public Crossref API. Set CROSSREF_MAILTO to join Crossref's polite pool.

Features

  • All major Crossref resource endpoints as 18 read-only tools.

  • Dual transport: stdio (local) and Streamable HTTP (container).

  • Polite pool (User-Agent + mailto), optional Crossref Plus token.

  • Token-bucket rate limiting (auto-tuned from X-Rate-Limit-* headers) with exponential backoff honoring Retry-After.

  • Cursor deep paging, field select, raw vs simplified output.

  • Optional X-API-Key HTTP auth (/health exempt), /health endpoint.

  • Optional Redis response cache + cross-replica rate limiting.

  • Optional Caddy TLS reverse proxy for public deployment.

Related MCP server: crossref-mcp

Quick start (local, stdio)

uv sync
export CROSSREF_MAILTO="you@example.com"   # recommended (polite pool)
uv run crossref-mcp                         # starts a stdio MCP server

Inspect with the MCP Inspector: uv run mcp dev src/crossref_mcp/server.py.

Configuration

Env var

Required

Default

Description

CROSSREF_MAILTO

recommended

Email for Crossref's polite pool.

CROSSREF_PLUS_TOKEN

no

Crossref Plus API token (sent as a header).

CROSSREF_BASE_URL

no

https://api.crossref.org

API base URL.

CROSSREF_TIMEOUT

no

30

Per-request timeout (seconds).

MCP_TRANSPORT

no

stdio

stdio or http.

MCP_API_KEY

no

If set, HTTP requests need a matching X-API-Key header (/health exempt).

LOG_LEVEL

no

INFO

Log level (logs go to stderr).

REDIS_URL

no

Enable Redis cache + shared rate limiting (optional).

CACHE_TTL

no

86400

Cache TTL in seconds.

RATELIMIT_BACKEND

no

in-memory

in-memory or redis.

Tools

Workssearch_works, get_work (by DOI), get_work_references (capped at 50), get_work_quality (registration agency). Members / Journals / Funderssearch_members · get_member · get_member_works; search_journals · get_journal (ISSN) · get_journal_works; search_funders · get_funder · get_funder_works. Types / Licenses / Prefixeslist_types · get_type; list_licenses; get_prefix. Plus ping.

Shared parameters. Search/list tools take query (and query_bibliographic / query_author / query_title on works), filter (Crossref key:value,… syntax), sort + order, rows (≤1000) + offset, and select. Deep paging: set cursor="*" then reuse the returned next_cursor. All tools return simplified fields by default; pass raw=true for the full Crossref JSON.

Connecting an MCP client

stdio (Claude Desktop / Cursor)claude_desktop_config.json:

{
  "mcpServers": {
    "crossref": {
      "command": "uvx",
      "args": ["crossref-mcp"],
      "env": { "CROSSREF_MAILTO": "you@example.com" }
    }
  }
}

Or run the container over stdio: "command": "docker", "args": ["run", "-i", "--rm", "-e", "CROSSREF_MAILTO", "heyinnaneo/crossref-mcp"].

Streamable HTTP — once the container is up, point an HTTP-capable client at http://localhost:8000/mcp. If MCP_API_KEY is set, send it as X-API-Key.

Use as a skill (no server)

Prefer not to run a server? skill.md is a self-contained skill that teaches an agent to call the Crossref REST API directly — it only needs an HTTP/fetch capability (no install, no key, no container). Trade-off: the agent issues raw HTTP and parses Crossref JSON itself, without the MCP server's polite-pool throttling, field simplification, or structured errors.

Claude Code (Agent Skill):

mkdir -p ~/.claude/skills/crossref-api
curl -fsSL https://raw.githubusercontent.com/jtl-neo/crossref-api-MCP/main/skill.md \
  -o ~/.claude/skills/crossref-api/SKILL.md

(Project-scoped instead: place it at .claude/skills/crossref-api/SKILL.md in your repo.)

Other agents (Cursor, Claude Projects, custom): paste the contents of skill.md into your system prompt / project knowledge / rules file.

Docker / HTTP deployment

cp .env.example .env          # set CROSSREF_MAILTO
docker compose up -d          # pulls heyinnaneo/crossref-mcp, HTTP on :8000
curl http://localhost:8000/health

Serves Streamable HTTP at /mcp and /health (compose health check). Set MCP_API_KEY to require X-API-Key on /mcp. To build locally, uncomment build: . in docker-compose.yml.

Public deployment (TLS / reverse proxy) — optional

Put it behind the bundled Caddy proxy (Caddyfile + docker-compose.proxy.yml): TLS termination (auto Let's Encrypt), HTTP→HTTPS, SSE streaming, backend not published on the host.

cp .env.example .env   # add DOMAIN=, ACME_EMAIL=, MCP_API_KEY=
docker compose -f docker-compose.proxy.yml up -d
curl https://your-domain/health

Defense in depth: proxy edge (optional IP allowlist / Basic auth) + MCP_API_KEY app layer; both leave /health open. Needs a domain with DNS pointing at the host and ports 80/443 reachable. Caddy rate limiting needs the caddy-ratelimit plugin (custom build).

Redis cache + cross-replica rate limiting — optional

Set REDIS_URL for a response cache (cache-aside on the raw envelope; mailto/ secrets excluded from keys) and, with RATELIMIT_BACKEND=redis, a shared token bucket so replicas stay within Crossref's polite-pool rate.

docker compose -f docker-compose.redis.yml up -d
curl http://localhost:8000/health   # cache_enabled + ratelimit_backend + redis: up

Redis failures degrade gracefully (no cache, in-memory limiting); /health stays 200 with redis: down.

CI / publishing

.github/workflows/ci.yml: test (ruff + format + pytest with coverage on every push/PR), security (Trivy fs scan), build-push (multi-arch image to heyinnaneo/crossref-mcp on main / v* tags), and on tags publish-pypi (OIDC Trusted Publisher) + publish-registry (MCP registry).

Repository secrets (Settings → Secrets and variables → Actions): DOCKERHUB_USERNAME = heyinnaneo, DOCKERHUB_TOKEN = a Docker Hub Access Token (Read/Write). Tag a release (git tag v0.1.0 && git push origin v0.1.0); the tag must match pyproject.toml.

Install from the MCP registry

Published as io.github.jtl-neo/crossref-mcp (see server.json), with a PyPI package (uvx crossref-mcp) and an OCI image. Publishing is automated on version tags (publish-pypi + publish-registry); requires a public repo and a configured PyPI Trusted Publisher.

Security & trust

  • Read-only. Every tool is a lookup, annotated readOnlyHint.

  • Rate limiting. Single-process in-memory by default — don't run as a public proxy for heavy traffic; for replicas use RATELIMIT_BACKEND=redis.

  • Polite pool. Use your own CROSSREF_MAILTO.

  • Public HTTP. Set MCP_API_KEY and front with TLS.

  • No bundled secrets. .env is excluded from image and git.

License

MIT. Bibliographic data comes from the public Crossref REST API; not affiliated with Crossref.


中文

English | 中文

Crossref REST API 封裝成 MCP server,將學術文獻 metadata 查詢(works、members、journals、funders、types、 licenses、prefixes)包成 LLM client 可呼叫的工具。

非 Crossref 官方、未經其背書。資料即時取自公開的 Crossref API。請設定 CROSSREF_MAILTO 以加入 Crossref 的 polite pool

特色

  • 主要 Crossref 資源端點,共 18 個唯讀工具

  • 雙傳輸:stdio(本機)與 Streamable HTTP(容器)。

  • Polite pool(User-Agent + mailto)、可選 Crossref Plus token。

  • Token-bucket 速率控制(依 X-Rate-Limit-* header 自動調整),429 指數退避並 尊重 Retry-After

  • cursor 深分頁、欄位 selectraw 與精簡輸出切換。

  • 可選 X-API-Key HTTP 認證(/health 豁免)、/health 端點。

  • 可選 Redis 回應快取 + 跨副本速率控制。

  • 可選 Caddy TLS 反向代理,供公開部署。

快速開始(本機 stdio)

uv sync
export CROSSREF_MAILTO="you@example.com"   # 建議(polite pool)
uv run crossref-mcp                         # 啟動 stdio MCP server

用 MCP Inspector 檢視:uv run mcp dev src/crossref_mcp/server.py

設定

環境變數

必填

預設

說明

CROSSREF_MAILTO

建議

Crossref polite pool 用的 email。

CROSSREF_PLUS_TOKEN

Crossref Plus API token(以 header 送出)。

CROSSREF_BASE_URL

https://api.crossref.org

API base URL。

CROSSREF_TIMEOUT

30

每請求逾時(秒)。

MCP_TRANSPORT

stdio

stdiohttp

MCP_API_KEY

設了則 HTTP 請求需帶相符的 X-API-Key header(/health 豁免)。

LOG_LEVEL

INFO

日誌層級(日誌走 stderr)。

REDIS_URL

啟用 Redis 快取 + 共享速率控制(選用)。

CACHE_TTL

86400

快取 TTL(秒)。

RATELIMIT_BACKEND

in-memory

in-memoryredis

工具

Workssearch_worksget_work(依 DOI)、get_work_references(上限 50)、get_work_quality(註冊機構)。 Members / Journals / Funderssearch_membersget_memberget_member_workssearch_journalsget_journal(ISSN)/get_journal_workssearch_fundersget_funderget_funder_worksTypes / Licenses / Prefixeslist_typesget_typelist_licensesget_prefix。另有 ping

共用參數。 搜尋/列表工具接受 query(works 另有 query_bibliographicquery_authorquery_title)、filter(Crossref key:value,… 語法)、sort

  • orderrows(≤1000)+ offsetselect。深分頁:設 cursor="*",再把回傳 的 next_cursor 傳回續抓。所有工具預設回精簡欄位;傳 raw=true 取完整 Crossref JSON。

連接 MCP client

stdio(Claude Desktop / Cursor)claude_desktop_config.json

{
  "mcpServers": {
    "crossref": {
      "command": "uvx",
      "args": ["crossref-mcp"],
      "env": { "CROSSREF_MAILTO": "you@example.com" }
    }
  }
}

或以容器跑 stdio:"command": "docker""args": ["run", "-i", "--rm", "-e", "CROSSREF_MAILTO", "heyinnaneo/crossref-mcp"]

Streamable HTTP — 容器啟動後,將支援 HTTP 的 client 指向 http://localhost:8000/mcp。若設了 MCP_API_KEY,以 X-API-Key header 帶上。

當作 skill 使用(免 server)

不想架 server?skill.md 是自包含 skill,教 agent 直接呼叫 Crossref REST API — 只需 agent 有 HTTP/fetch 能力(免安裝、免 key、免容器)。 取捨:agent 自己發 raw HTTP、自己解析 Crossref JSON,沒有 MCP server 的 polite-pool 限速、欄位精簡、結構化錯誤。

Claude Code(Agent Skill):

mkdir -p ~/.claude/skills/crossref-api
curl -fsSL https://raw.githubusercontent.com/jtl-neo/crossref-api-MCP/main/skill.md \
  -o ~/.claude/skills/crossref-api/SKILL.md

(專案層級:放 repo 內 .claude/skills/crossref-api/SKILL.md。)

其他 agent(Cursor / Claude Projects / 自製):skill.md 內容貼進 system prompt / project knowledge / rules 檔。

Docker / HTTP 部署

cp .env.example .env          # 設定 CROSSREF_MAILTO
docker compose up -d          # 拉 heyinnaneo/crossref-mcp,HTTP 在 :8000
curl http://localhost:8000/health

/mcp 提供 Streamable HTTP,/health 供 compose 健康檢查。設 MCP_API_KEY 可要求 /mcpX-API-Key。要本地 build,取消 docker-compose.ymlbuild: . 註解。

公開部署(TLS / 反向代理)— 選用

放在內附的 Caddy proxy 後(Caddyfile + docker-compose.proxy.yml):TLS 終結 (自動 Let's Encrypt)、HTTP→HTTPS、SSE 串流、後端不對 host 公開。

cp .env.example .env   # 加上 DOMAIN=、ACME_EMAIL=、MCP_API_KEY=
docker compose -f docker-compose.proxy.yml up -d
curl https://your-domain/health

縱深防禦:proxy 邊界(可選 IP allowlist / Basic auth)+ MCP_API_KEY 應用層; 兩者皆留 /health 開放。需網域 DNS 指向主機、80/443 可達。Caddy 限流需 caddy-ratelimit plugin(自 build)。

Redis 快取 + 跨副本速率控制 — 選用

REDIS_URL 啟用回應快取(cache-aside 存原始 envelope;key 排除 mailto/ 密鑰),並以 RATELIMIT_BACKEND=redis 啟用共享 token bucket,讓多副本維持在 Crossref polite-pool 速率內。

docker compose -f docker-compose.redis.yml up -d
curl http://localhost:8000/health   # cache_enabled + ratelimit_backend + redis: up

Redis 故障會優雅降級(不快取、改 in-memory 限速);/health 仍回 200 並標 redis: down

CI / 發佈

.github/workflows/ci.ymltest(每次 push/PR 跑 ruff + format + pytest 含 覆蓋率)、security(Trivy fs 掃描)、build-pushmainv* tag 時 push multi-arch image 到 heyinnaneo/crossref-mcp),打 tag 時另跑 publish-pypi (OIDC Trusted Publisher)+ publish-registry(MCP registry)。

Repository secrets(Settings → Secrets and variables → Actions): DOCKERHUB_USERNAME = heyinnaneoDOCKERHUB_TOKEN = Docker Hub Access Token (Read/Write)。打 tag 發版(git tag v0.1.0 && git push origin v0.1.0);tag 須 與 pyproject.toml 版本一致。

從 MCP registry 安裝

io.github.jtl-neo/crossref-mcp 發佈(見 server.json),含 PyPI 套件(uvx crossref-mcp)與 OCI image。發佈於版本 tag 時自動進行 (publish-pypi + publish-registry);需公開 repo 與已設定的 PyPI Trusted Publisher。

安全與信任

  • 唯讀。 每個工具都是查詢,標註 readOnlyHint

  • 速率控制。 預設單 process in-memory — 勿當公開代理承載大流量;多副本請用 RATELIMIT_BACKEND=redis

  • Polite pool。 用你自己的 CROSSREF_MAILTO

  • 公開 HTTP。MCP_API_KEY 並前置 TLS。

  • 不內含密鑰。 .env 不進 image、不進 git。

授權

MIT。文獻資料來自公開的 Crossref REST API;與 Crossref 無隸屬關係。

Available Tools

18 tools
get_funderA
Read-only

Fetch one funder by its Crossref Funder Registry id (e.g. 100000001).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
funder_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful context about the ID format but does not disclose behavior for missing IDs, error conditions, or the nature of the response. With annotations covering safety, 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, front-loaded sentence that immediately states the action and key identifier format. Zero wasted words.

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?

For a simple fetch-by-ID tool with safe-read annotations, the description is functional but leaves gaps: it does not mention the 'raw' parameter, potential error responses, or return shape. Given the low complexity, it is minimally viable but not fully complete.

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?

The schema has 0% coverage, and the description only indirectly explains funder_id by stating it is a Crossref Funder Registry id. The 'raw' boolean parameter is completely unexplained. The description fails to compensate for the low schema coverage.

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 uses a specific verb 'fetch' with a clear resource 'one funder' and a precise identifier ('Crossref Funder Registry id'). This distinguishes it from sibling tools like search_funders (search across funders) and get_funder_works (works by funder).

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 usage: use when you have a specific funder ID. However, it does not explicitly state when to avoid this tool or mention alternatives like search_funders for searching by name. Guidance is implicit rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_funder_worksA
Read-only

List works funded by a given funder id.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
sortNo
orderNo
queryNo
cursorNo
filterNo
offsetNo
funder_idYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds no behavioral details like pagination behavior, sort semantics, or return shape, so it provides little beyond annotations.

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?

Single sentence, immediately states purpose, no filler.

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?

Tool has 9 parameters and no output schema; a one-line description is insufficient to guide correct usage for filtering, sorting, and pagination. Siblings suggest a richer API surface.

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 only names funder_id. Other parameters (raw, rows, sort, order, query, cursor, filter, offset) are left undefined; schema offers only defaults/titles, no explanation.

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?

Description states 'List works funded by a given funder id' - clearly specifies action (list), resource (works), and unique parameter (funder id), distinguishing it from siblings like search_works or get_member_works.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: use when you have a funder id and want its works. Doesn't mention alternatives or exclusions, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_journalA
Read-only

Fetch one journal by ISSN (NNNN-NNNN; hyphen optional).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
issnYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is known. The description adds the ISSN format and hyphen flexibility, which is parameter semantics rather than behavioral context. It does not describe return format, error handling, or rate limits, but annotations lower the burden.

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 front-loaded sentence that directly states the action and key parameter. There is no wasted wording, and the ISSN format is included efficiently.

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?

For a simple get-one tool, the description covers the identifier and format, but it omits explanation of the 'raw' parameter and the return value. With no output schema, the agent is left without details about what the tool returns or how 'raw' behaves, leaving notable gaps.

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?

The description adds meaning to 'issn' by specifying the format (NNNN-NNNN; hyphen optional), which is not in the schema. However, the 'raw' boolean parameter remains completely unexplained, and with 0% schema description coverage, the description does not fully compensate for parameter semantics.

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 uses a specific verb ('Fetch'), identifies the resource ('one journal'), and specifies the unique identifier ('by ISSN'), clearly distinguishing it from siblings like search_journals and get_journal_works.

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 usage when a specific ISSN is available and a single journal is needed, but it does not explicitly state when to prefer this tool over search_journals or when not to use it. No alternatives or exclusions are mentioned, leaving guidance implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_journal_worksB
Read-only

List works published in a given journal (by ISSN).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
issnYes
rowsNo
sortNo
orderNo
queryNo
cursorNo
filterNo
offsetNo

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to repeat that. However, it adds no additional behavioral context such as pagination behavior, default return format, or performance implications. The only extra detail is 'by ISSN', which is already evident from the parameter schema.

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 focused sentence, immediately stating the tool's purpose. It is concise and well-structured, with no extraneous information.

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 9 parameters, no output schema, and many sibling tools, the description is too sparse. It does not clarify the nature of the response, the meaning of optional parameters, or how the results are ordered or paginated, leaving the agent without enough context for effective use.

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%, with 9 total parameters. The description only mentions ISSN, leaving raw, rows, sort, order, query, cursor, filter, and offset entirely unexplained. The description fails to compensate for the lack of parameter documentation in the schema.

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 uses a specific verb 'List' and clearly identifies the resource 'works published in a given journal' with the method '(by ISSN)'. This distinguishes it from sibling tools like get_work, search_works, and get_journal.

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 for listing works of a specific journal identified by ISSN, but it does not explicitly compare with alternatives or state when to use this over search_works or get_work. No exclusions or conditions are mentioned, so usage guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_memberA
Read-only

Fetch one member (publisher) by numeric Crossref member id.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
member_idYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds no further behavioral context such as output format, error handling, or the effect of the 'raw' parameter. It only restates that it fetches a member, which is already clear from the name and annotations.

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 that is front-loaded with the action and resource. It contains no redundant information and is appropriately sized for a simple fetch tool.

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 is simple with one required parameter and no output schema. The description adequately conveys the core purpose and identifier type, but it omits details about the 'raw' parameter and return structure. Given the lack of output schema and parameter descriptions, a bit more context would make it complete.

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 clarifies that 'member_id' is numeric, but the 'raw' parameter is entirely unexplained. The description only partially adds meaning to one of two parameters, leaving the other undefined.

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 verb 'Fetch' with a specific resource 'one member (publisher)' and the key identifier required ('numeric Crossref member id'). This distinguishes it from sibling tools like 'search_members' (for searching) and 'get_member_works' (for works), so the tool's 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 Guidelines4/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 have a specific numeric Crossref member ID and need that member's details. It does not explicitly mention alternatives like 'search_members' for finding IDs, but the phrase 'by numeric ... id' provides clear context and exclusion of search use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_member_worksA
Read-only

List works published by a given member id.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
sortNo
orderNo
queryNo
cursorNo
filterNo
offsetNo
member_idYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and openWorldHint annotations already cover the safety profile, and the description adds no contradictions. It adds minimal behavioral context beyond the annotations (e.g., no mention of pagination, sorting, or response format), so the description adds some but not rich context.

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, front-loaded sentence with no filler. It efficiently conveys the core purpose without waste, earning a high score for conciseness.

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?

With no output schema, the description should explain what the tool returns and how parameters like cursor/offset/rows control pagination. It provides none of this, leaving the agent to guess about return structure and pagination behavior. The description is too skeletal for a tool with this complexity.

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 for parameter meaning. It only identifies 'member_id' as the key input, but ignores the other 8 parameters (raw, rows, sort, order, query, cursor, filter, offset) and their semantics. This is a significant gap for a tool with 9 parameters.

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 'List works published by a given member id', which is a specific verb+resource+scope. It distinguishes from siblings like search_works (broad search), get_work (single work), and get_journal_works/get_funder_works (other entity-scoped lists) by specifying member id.

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 wording implies use when you have a member id and need their published works, but it provides no explicit guidance on alternatives or exclusions. No mention of when to prefer this over search_works or other list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_prefixA
Read-only

Look up the owner of a DOI prefix (e.g. "10.1038").

    Crossref only exposes /prefixes/{owner_prefix}; there is no list endpoint.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
owner_prefixYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and openWorldHint. The description adds one useful constraint (no list endpoint) but does not disclose other behavioral traits like the meaning of the raw parameter or the response structure. This is minimal added context beyond the annotations.

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 extremely concise: two sentences with the main purpose front-loaded and a second sentence that adds a relevant limitation. No fluff or 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 is relatively simple with one required parameter and no output schema. The purpose and a key limitation are clear, but the raw parameter is undocumented and the return value is not described, leaving some ambiguity for the agent. Overall it is adequate but has clear gaps.

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?

The input schema has no descriptions for parameters (0% coverage). The description only gives an example for owner_prefix but leaves 'raw' entirely unexplained. This does not compensate for the lack of schema documentation, leaving the agent uncertain about the raw parameter's purpose.

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 function with a specific verb ('look up') and resource ('owner of a DOI prefix'), and provides a concrete example ('10.1038'). This distinguishes it from sibling tools like get_work or get_member, which target different entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells users that Crossref only exposes /prefixes/{owner_prefix} and that there is no list endpoint, setting expectations that a specific prefix must be provided. However, it does not explicitly mention when not to use the tool or contrast it with alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_typeA
Read-only

Fetch one work type by id (e.g. "journal-article").

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
type_idYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, covering the read-only safety profile. The description adds the 'by id' scoping and an example, but does not disclose other behavioral aspects such as error handling, pagination, or the effect of the 'raw' parameter. This is acceptable given the read-only annotation, but no additional context is provided beyond the purpose.

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, focused sentence with no filler. It front-loads the verb and resource, and uses an example to convey format. Every word earns its place.

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?

Given the tool's simplicity (2 params, no output schema, no nested objects), the description provides the core context: fetching a single work type by id. However, it omits the 'raw' parameter behavior and any error-handling notes, which is a slight gap for a complete understanding.

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?

With schema_description_coverage at 0%, the description should compensate for parameter documentation. It provides an example for type_id, which adds meaning, but it completely omits the 'raw' parameter. The description fails to explain what 'raw' controls, leaving the agent without guidance on half of the parameters.

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 fetches one work type by id, providing a specific verb (fetch), resource (work type), and scope (by id). The example 'journal-article' further clarifies the expected input. This distinguishes it from sibling tools like list_types and other get_* tools.

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 usage when a single work type id is known, but it does not explicitly mention when to use this tool versus alternatives like list_types or other getters. There are no exclusions or alternative references, so guidance is minimal but not misleading.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workA
Read-only

Fetch a single work's metadata by DOI.

    Accepts a bare DOI or a doi.org URL. Returns simplified fields unless
    `raw=True`. Returns a structured error if the DOI does not exist.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes
rawNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral details beyond the readOnlyHint and openWorldHint annotations: it states that a bare DOI or doi.org URL is accepted, that simplified fields are returned unless raw=True, and that a structured error is returned for nonexistent DOIs. These are useful operational details that annotations do not provide.

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 three sentences, front-loaded with the core purpose, and every sentence contributes unique information (input format, return behavior, error handling). There is no redundancy or filler.

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?

For a tool with only two parameters and no output schema, the description is largely complete. It covers input formats, return behavior, and error handling. The only minor gap is that it doesn't explicitly state what 'simplified fields' includes or provide an example, but the annotations and sibling context allow an agent to infer enough for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides only parameter names and types with 0% description coverage. The description compensates fully by explaining that 'doi' accepts a bare DOI or doi.org URL, and that 'raw' controls whether simplified fields are returned. This adds clear meaning beyond the schema.

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 opens with 'Fetch a single work's metadata by DOI,' which is a specific verb+resource+scope statement. It clearly distinguishes from siblings like get_work_quality, get_work_references, and search_works by focusing on metadata for a single work identified by DOI.

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 provides clear context that this tool is for fetching a single work's metadata by DOI, and specifies accepted input formats (bare DOI or doi.org URL). However, it does not explicitly compare against sibling tools or explain when to use this versus alternatives like get_work_quality or get_work_references. Usage is implied rather than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_qualityB
Read-only

Look up the registration agency for a DOI (Crossref, DataCite, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes
rawNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds the specific behavior of returning the registration agency, which is useful context. However, it discloses no other behavioral traits such as what 'raw' actually does, rate limits, or potential variations in output. Since annotations cover the main safety profile, the description meets a baseline but adds limited extra context.

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, front-loaded sentence that states the core purpose immediately. It contains no filler or redundant information, earning a perfect score for brevity and structure.

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 is relatively simple with two parameters and no output schema. The description covers the primary purpose but omits details about the 'raw' parameter and does not clarify what the response looks like. The name mismatch also reduces completeness. For a low-complexity tool, this is adequate but has clear gaps.

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 only implicitly references the 'doi' parameter through the phrase 'for a DOI'. It gives no explanation for the 'raw' boolean parameter, which remains ambiguous. The schema itself provides no descriptions, so the description fails to compensate for the lack of parameter semantics.

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's action ('Look up the registration agency for a DOI') with a specific resource (DOI) and gives examples (Crossref, DataCite). This distinguishes it from sibling tools like get_work or search_works. However, the tool name 'get_work_quality' suggests a different purpose, creating minor confusion and the description does not explicitly address the name mismatch.

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 provides no explicit guidance on when to use this tool versus alternatives. It only implies usage when you need a DOI's registration agency. There are no exclusions, prerequisites, or references to sibling tools, so the agent receives no decision support.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_work_referencesA
Read-only

List the reference list of a work (the works it cites), by DOI.

    `limit` is hard-capped at 50. Reads the `reference` field of the work.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
doiYes
rawNo
limitNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate read-only and open-world behavior; the description adds specific transparency by disclosing the hard cap of 50 for limit and that it reads the `reference` field, providing details beyond the generic annotations.

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 sentences, front-loaded with the main purpose, and every sentence provides useful information without redundancy.

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?

The tool is simple, and the description covers the core functionality, input (DOI), and a key constraint (limit cap). It does not detail the return structure, but the description's phrase 'reference list' and 'works it cites' gives a reasonable expectation. Given no output schema, this is adequate.

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?

With zero schema descriptions for parameters, the description partially compensates by explaining that doi identifies the work and that limit is capped at 50. However, the `raw` parameter is not explained, leaving a semantic gap.

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 action ('List') and the resource ('reference list of a work'), and further clarifies it's the works it cites, distinguishing it from sibling tools like get_work or get_work_quality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool (to retrieve references/citations of a work by DOI), but it does not explicitly mention alternatives or exclusions compared to other work-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_licensesA
Read-only

List licenses Crossref has seen. No single-license lookup exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
queryNo
offsetNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint: true and openWorldHint: true, covering the safety profile. The description adds valuable context beyond these annotations: it specifies that the list contains licenses 'Crossref has seen' (i.e., actual observed licenses, not an authoritative registry) and that no single-license lookup exists. This clarifies the tool's empirical nature and limitation, going beyond the basic annotation hints.

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 extremely concise, consisting of two sentences with no wasted words. It front-loads the core purpose and follows up with a key limitation. Every sentence 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?

For a simple list tool with read-only annotations, the description covers the core function and a key limitation. However, it is incomplete regarding parameter semantics and does not describe the return format or pagination behavior. Given the low parameter coverage and no output schema, more detail would be needed for full completeness, but the tool is simple enough that the current description is minimally viable.

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% and the description provides no explanation for the four parameters (raw, rows, query, offset). With such low coverage, the description was expected to compensate, but it mentions none of the parameters, leaving the agent to guess at their meaning. This is a significant gap, especially since query and raw could have nuanced behavior.

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 identifies the tool's function: 'List licenses Crossref has seen.' It uses a specific verb (List) and resource (licenses) with a clear scope (Crossref has seen). It also distinguishes from any potential single-license lookup by stating 'No single-license lookup exists,' which sets it apart from sibling tools that include individual get endpoints for other resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies that this is the only license-list endpoint and explicitly notes that no single-license lookup exists, which guides the agent to use this tool whenever license information is needed. However, it does not provide explicit when-to-use/when-not-to-use scenarios or describe alternative tools, though no direct sibling alternative exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_typesB
Read-only

List Crossref work types (journal-article, book-chapter, ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
offsetNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is clear. The description adds the specific resource domain (Crossref work types) but no behavioral traits like pagination or raw output handling. No contradiction with annotations.

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?

A single, front-loaded sentence that states the purpose and gives examples. 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?

For a simple list tool, the core functionality is stated adequately. However, the lack of parameter explanation (especially 'raw'), no usage guidance, and no return-value description leave gaps, though the annotations mitigate some concerns.

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?

With 0% schema description coverage, the description must compensate by explaining parameter meaning. It does not mention any of the three parameters; 'raw' in particular is left ambiguous, and rows/offset are only implied by naming.

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 uses a specific verb ('list') and resource ('Crossref work types'), with concrete examples. It clearly distinguishes from sibling tools like get_type, which retrieves a specific type.

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 is provided on when to use this tool versus alternatives such as get_type. The sibling context implies a distinction, but the description itself lacks any such direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingA
Read-only

Health check tool: returns the server name and version.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds useful context by specifying the return payload (server name and version) and confirms this is a non-destructive health check. No contradictions with annotations.

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 short sentences with no fluff. The description is front-loaded with 'Health check tool' and immediately specifies the return value, making it highly concise and well-structured.

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?

For a simple health-check tool with no parameters, the description fully communicates its purpose and output. The sibling set consists exclusively of data-querying tools, so usage context is effectively complete.

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 schema fully covers inputs. Per the rubric, a zero-parameter tool gets a baseline of 4; the description adds no unnecessary parameter details.

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?

Clearly identifies the tool as a health check that returns server name and version. It is distinct from sibling data-retrieval tools, which all focus on querying academic data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage as a health check, and sibling context makes it obvious when to use this tool (e.g., to verify server connectivity). However, it does not explicitly state when to use vs alternatives or when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_fundersB
Read-only

Search funding bodies by name. Returns funder id, name, location.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
queryNo
cursorNo
offsetNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description need not restate safety. It adds return field info ('funder id, name, location'), which is useful, but it does not disclose pagination behavior, cursor/offset semantics, the effect of 'raw', or any other side effects or constraints beyond the annotation. This matches the baseline for annotation-backed descriptions but adds relatively little behavioral context.

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, front-loaded with the core action and resource. No filler words. Every sentence conveys necessary information: what the tool does and what it returns.

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?

The tool is moderately complex with 5 optional parameters and no output schema. The description only covers the basic search and a few return fields. It omits critical context about pagination (cursor/offset), the 'raw' flag behavior, and the full structure of the response (which may include more than the listed fields). Given the lack of schema descriptions and output schema, the description is insufficient for reliable invocation and response interpretation.

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 any of the five parameters. The phrase 'by name' implies the 'query' parameter, but there is no explanation of 'rows', 'cursor', 'offset', or 'raw'. The description fails to compensate for the lack of schema documentation, leaving the agent to infer parameter behavior.

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?

Description states a specific verb ('Search') and resource ('funding bodies'), with a clear qualifier ('by name') and return fields. It distinguishes itself from sibling search tools by naming the entity type, and from 'get_funder' by being a search rather than a direct lookup.

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 is given on when to use this tool vs alternatives. It does not mention that 'get_funder' should be used to retrieve a specific funder by ID, nor does it explain when to use search_funders over other search_* tools. The only implied usage is that it searches by name, but no context or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_journalsB
Read-only

Search journals by title/keyword. Returns title, ISSNs, publisher.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
queryNo
cursorNo
offsetNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, which covers the safety profile. The description adds the return field list but does not disclose pagination behavior, what 'raw' means, or any search limitations, which are relevant behavioral traits.

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, front-loaded sentence that communicates the core action and return fields without waste. It is appropriately concise.

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 5 optional parameters, no output schema, and no parameter descriptions, the description is too minimal. It lacks context about pagination options, row limits, and the raw flag, which are necessary for correct invocation.

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% for the 5 parameters, and the description does not explain query, cursor, offset, rows, or raw. It only implies 'title/keyword' relates to the query parameter, which is insufficient compensation.

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 states a specific verb ('Search'), resource ('journals'), and search criteria ('title/keyword'), and lists the returned fields. This clearly distinguishes it from sibling tools like search_works and get_journal.

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 is provided on when to use this tool versus alternatives like search_works or get_journal. The description does not mention exclusions, prerequisites, or preferred use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_membersA
Read-only

Search Crossref members (publishers/societies). Returns id + primary name.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
queryNo
cursorNo
filterNo
offsetNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only and open-world behavior, so the description needs only to add complementary context. It does so by stating what the search returns ('id + primary name'), which goes beyond the annotations. It does not detail pagination behavior or result ordering, but the return format disclosure is valuable and nonredundant.

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, front-loaded sentence that conveys the core action and primary return field. Every word earns its place; there is no fluff or repetition. It is appropriately sized for a search tool.

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 6 optional parameters and no output schema, the description is insufficiently complete. It does not explain how to construct a query, what filters are available, how pagination works, or the significance of 'raw'. It also does not mention the relationship to get_member for fetching full member details, leaving the agent without enough context to use the tool effectively in complex scenarios.

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?

The input schema has 6 parameters with 0% description coverage, and the tool description provides zero explanation of what any parameter means. Terms like 'raw', 'filter', 'cursor', and 'offset' are left entirely to the agent's inference. The description does nothing to compensate for the schema's lack of documentation.

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: 'Search Crossref members (publishers/societies).' It uses a specific verb ('Search') and resource ('Crossref members'), and further clarifies scope with 'publishers/societies.' It also distinguishes from sibling search tools by naming the target entity type and explicitly stating the return shape ('id + primary name'), making it unambiguous.

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 is implied: this is the tool for searching Crossref members, as opposed to journals or funders. However, the description does not explicitly state when to prefer this over get_member, nor does it mention any exclusions or alternative tools. The guidance is present only through the resource name, not through direct recommendation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_worksA
Read-only

Search Crossref works (articles, books, datasets, ...).

    Use `query` for free-text, or the field-scoped variants
    (query_bibliographic / query_author / query_title). `filter` accepts
    Crossref's `key:value,key2:value2` syntax (e.g. "from-pub-date:2020,type:journal-article").
    `rows` is capped at 1000; `select` (e.g. "DOI,title") trims the payload.
    For deep paging set `cursor="*"`, then pass the returned `next_cursor` back.
    Returns simplified items unless `raw=True`.
    
ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
rowsNo
sortNo
orderNo
queryNo
cursorNo
filterNo
offsetNo
selectNo
query_titleNo
query_authorNo
query_bibliographicNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, but the description adds substantial behavioral context not captured in annotations: simplified output unless raw=True, cursor-based paging with next_cursor, rows capped at 1000, and select for trimming payload. These are concrete expectations that go beyond the safety profile.

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 compact and information-dense. It leads with a clear purpose, then proceeds through usage in logical order. Every line adds value—no filler or redundant phrasing. The multi-line bullet style improves scannability without being verbose.

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?

For a tool with 12 parameters and no schema descriptions or output schema, the description covers the most critical aspects: query modes, filter syntax, pagination, payload trimming, and output format. It lacks explicit details on sort/order/offset and rate limits, but those are minor given the overall thoroughness.

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?

Schema coverage is 0%, so the description carries the full burden for explaining parameters. It covers query, query_bibliographic/query_author/query_title, filter, rows, select, cursor, and raw with meaningful details. It omits sort, order, and offset, but these are relatively self-explanatory for a search API, so the description compensates well overall.

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 opens with "Search Crossref works" which is a specific verb+resource pair, and it explicitly lists content types (articles, books, datasets). This clearly distinguishes it from siblings like search_members or search_journals, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides detailed guidance on when to use different query modes (free-text vs field-scoped), filter syntax, rows cap, select, cursor, and raw. It does not explicitly name alternative tools for single-work lookup, but the context is clear enough that an agent would know to use this for searching works rather than get_work.

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. Dates show when Glama detected each change.

  1. 18 tool updatesv0.1.0
    • First observedget_funder
    • First observedget_funder_works
    • First observedget_journal
    • First observedget_journal_works
    • First observedget_member
    • First observedget_member_works
    • First observedget_prefix
    • First observedget_type
    • First observedget_work
    • First observedget_work_quality
    • First observedget_work_references
    • First observedlist_licenses
    • First observedlist_types
    • First observedping
    • First observedsearch_funders
    • First observedsearch_journals
    • First observedsearch_members
    • First observedsearch_works

TDQS

A3.6/5.0
Disambiguation4/5

Each tool targets a distinct entity (member, journal, funder, type, license, prefix, work). The only confusion is get_work_quality, which sounds like a quality metric but actually queries a DOI's registration agency; the description clarifies, but the name could mislead.

Naming Consistency4/5

Most tools follow a clear verb_noun pattern (search_*, get_*, list_*), with consistent entity-specific suffixes like '_works'. The outlier is get_work_quality, which uses a non-entity noun and doesn't reflect its purpose; ping is also non-standard but acceptable.

Tool Count4/5

At 18 tools, this is slightly above the ideal 3-15 range, but the broad scope of Crossref's API—covering multiple entity types plus complex work search—justifies the count. No tool feels redundant or extraneous.

Completeness3/5

The set covers search and retrieval for members, journals, funders, works, types, licenses, and prefixes, including references. However, there is no endpoint for works citing a given DOI (forward citations), which is a notable gap for a scholarly metadata server.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to search academic literature and retrieve detailed metadata for papers, journals, and funding organizations via the Crossref database. It supports DOI-based lookups and keyword searches to facilitate programmatic access to scholarly research data.
    7
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching scholarly literature via the OpenAlex database, with tools for full-text search, work details, citation lookup, and author queries.
    MIT

Latest Blog Posts

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/jtl-neo/crossref-api-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server