crossref-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@crossref-mcpsearch for works by author 'Einstein'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
crossref-mcp
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_MAILTOto 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 honoringRetry-After.Cursor deep paging, field
select,rawvs simplified output.Optional
X-API-KeyHTTP auth (/healthexempt),/healthendpoint.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 serverInspect with the MCP Inspector: uv run mcp dev src/crossref_mcp/server.py.
Configuration
Env var | Required | Default | Description |
| recommended | — | Email for Crossref's polite pool. |
| no | — | Crossref Plus API token (sent as a header). |
| no |
| API base URL. |
| no |
| Per-request timeout (seconds). |
| no |
|
|
| no | — | If set, HTTP requests need a matching |
| no |
| Log level (logs go to stderr). |
| no | — | Enable Redis cache + shared rate limiting (optional). |
| no |
| Cache TTL in seconds. |
| no |
|
|
Tools
Works — search_works, get_work (by DOI), get_work_references (capped
at 50), get_work_quality (registration agency).
Members / Journals / Funders — search_members · get_member ·
get_member_works; search_journals · get_journal (ISSN) ·
get_journal_works; search_funders · get_funder · get_funder_works.
Types / Licenses / Prefixes — list_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/healthServes 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/healthDefense 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: upRedis 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_KEYand front with TLS.No bundled secrets.
.envis 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 深分頁、欄位
select、raw與精簡輸出切換。可選
X-API-KeyHTTP 認證(/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 polite pool 用的 email。 |
| 否 | — | Crossref Plus API token(以 header 送出)。 |
| 否 |
| API base URL。 |
| 否 |
| 每請求逾時(秒)。 |
| 否 |
|
|
| 否 | — | 設了則 HTTP 請求需帶相符的 |
| 否 |
| 日誌層級(日誌走 stderr)。 |
| 否 | — | 啟用 Redis 快取 + 共享速率控制(選用)。 |
| 否 |
| 快取 TTL(秒)。 |
| 否 |
|
|
工具
Works — search_works、get_work(依 DOI)、get_work_references(上限
50)、get_work_quality(註冊機構)。
Members / Journals / Funders — search_members/get_member/
get_member_works;search_journals/get_journal(ISSN)/get_journal_works;
search_funders/get_funder/get_funder_works。
Types / Licenses / Prefixes — list_types/get_type;list_licenses;
get_prefix。另有 ping。
共用參數。 搜尋/列表工具接受 query(works 另有 query_bibliographic/
query_author/query_title)、filter(Crossref key:value,… 語法)、sort
order、rows(≤1000)+offset、select。深分頁:設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
可要求 /mcp 帶 X-API-Key。要本地 build,取消 docker-compose.yml 內
build: . 註解。
公開部署(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: upRedis 故障會優雅降級(不快取、改 in-memory 限速);/health 仍回 200 並標
redis: down。
CI / 發佈
.github/workflows/ci.yml:test(每次 push/PR 跑 ruff + format + pytest 含
覆蓋率)、security(Trivy fs 掃描)、build-push(main/v* 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 = heyinnaneo、DOCKERHUB_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 toolsget_funderARead-only
Fetch one funder by its Crossref Funder Registry id (e.g. 100000001).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| funder_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_worksARead-only
List works funded by a given funder id.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| sort | No | ||
| order | No | ||
| query | No | ||
| cursor | No | ||
| filter | No | ||
| offset | No | ||
| funder_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_journalARead-only
Fetch one journal by ISSN (NNNN-NNNN; hyphen optional).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| issn | Yes |
TDQS
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.
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.
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.
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.
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.
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_worksBRead-only
List works published in a given journal (by ISSN).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| issn | Yes | ||
| rows | No | ||
| sort | No | ||
| order | No | ||
| query | No | ||
| cursor | No | ||
| filter | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_memberARead-only
Fetch one member (publisher) by numeric Crossref member id.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| member_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_worksARead-only
List works published by a given member id.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| sort | No | ||
| order | No | ||
| query | No | ||
| cursor | No | ||
| filter | No | ||
| offset | No | ||
| member_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_prefixARead-only
Look up the owner of a DOI prefix (e.g. "10.1038").
Crossref only exposes /prefixes/{owner_prefix}; there is no list endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| owner_prefix | Yes |
TDQS
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.
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.
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.
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.
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.
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_typeARead-only
Fetch one work type by id (e.g. "journal-article").
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| type_id | Yes |
TDQS
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.
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.
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.
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.
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.
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_workARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| doi | Yes | ||
| raw | No |
TDQS
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.
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.
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.
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.
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.
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_qualityBRead-only
Look up the registration agency for a DOI (Crossref, DataCite, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| doi | Yes | ||
| raw | No |
TDQS
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.
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.
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.
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.
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.
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_referencesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| doi | Yes | ||
| raw | No | ||
| limit | No |
TDQS
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.
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.
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.
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.
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.
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_licensesARead-only
List licenses Crossref has seen. No single-license lookup exists.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| query | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_typesBRead-only
List Crossref work types (journal-article, book-chapter, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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.
pingARead-only
Health check tool: returns the server name and version.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_fundersBRead-only
Search funding bodies by name. Returns funder id, name, location.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| query | No | ||
| cursor | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_journalsBRead-only
Search journals by title/keyword. Returns title, ISSNs, publisher.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| query | No | ||
| cursor | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_membersARead-only
Search Crossref members (publishers/societies). Returns id + primary name.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| query | No | ||
| cursor | No | ||
| filter | No | ||
| offset | No |
TDQS
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.
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.
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.
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.
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.
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_worksARead-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`.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| rows | No | ||
| sort | No | ||
| order | No | ||
| query | No | ||
| cursor | No | ||
| filter | No | ||
| offset | No | ||
| select | No | ||
| query_title | No | ||
| query_author | No | ||
| query_bibliographic | No |
TDQS
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.
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.
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.
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.
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.
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.
18 tool updates
v0.1.0- First observed
get_funder - First observed
get_funder_works - First observed
get_journal - First observed
get_journal_works - First observed
get_member - First observed
get_member_works - First observed
get_prefix - First observed
get_type - First observed
get_work - First observed
get_work_quality - First observed
get_work_references - First observed
list_licenses - First observed
list_types - First observed
ping - First observed
search_funders - First observed
search_journals - First observed
search_members - First observed
search_works
TDQS
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.
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.
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.
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
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
Search 150M+ academic works, journals, and funders via Crossref API.
Crossref MCP — wraps the Crossref REST API (academic papers, free, no auth)
Scholarly search: OpenAlex, Crossref, arXiv, OpenCitations and PubMed in one endpoint.
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- AlicenseAqualityCmaintenanceEnables retrieval of academic literature metadata via DOI or search using the Crossref REST API.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching scholarly literature via the OpenAlex database, with tools for full-text search, work details, citation lookup, and author queries.MIT
- AlicenseNot gradedqualityCmaintenanceSearches and retrieves scholarly metadata from the CrossRef REST API, covering over 150 million records across all disciplines, without requiring an API key.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jtl-neo/crossref-api-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server