Reported issues for crossref-mcp-server
Pod holds 18 of 57 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.
Back to crossref-mcp-server.
Most discussed
bug(crossref_search_works): fields projection can exclude required output fields
Server version
0.1.3
mcp-ts-core version
0.9.6
Runtime
Bun 1.3.11
Transport
HTTP (Streamable HTTP)
OS
macOS 15.x
Description
crossref_search_works returns isError: true with a serialization error when the fields input array omits type. The Crossref select= projection removes type from the upstream response, but WorkSummarySchema declares type: z.string() as required. The handler maps type: raw.type unconditionally, so when raw.type is `undef
Read the thread · 2026-05-23 · closed · 5 comments
bug(get_work,search_works): an alternatives wrapper renders one formula twice
Server version
0.3.6
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
OS
macOS
Description
Related: #54
A JATS <alternatives> wrapper holds several encodings of one object and expects a consumer to pick one. In an abstract it wraps a formula's presentation MathML beside the same formula's TeX, or a graphic beside its TeX. The markup strip has no rule for it, so every child that carries text is emitted and one expression
Read the thread · 2026-08-10 · closed · 4 comments
bug(response-parity): content output truncates references and abstracts
Server version
0.2.0
mcp-ts-core version
0.10.14
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
crossref_get_references and crossref_search_works return less data through content[] than through structuredContent. Content-only MCP clients therefore lose references, citation text, or most of an abstract with no equivalent retrieval path.
Steps to reproduce
- Call
crossref_get_referenceswit
Read the thread · 2026-07-16 · closed · 3 comments
bug(get_work): the publication-date fallback chain diverges from the three search tools
Server version
0.3.7
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
Description
Related: #58
The four tools that resolve a publication date call the same helper but chain their fallbacks at different points, so they can disagree about the same record.
crossref_get_work picks the source object first and parses once:
parseDateParts(raw.published ?? raw['published-print'] ?? raw['published-online'] ?? raw.issued)
`
Read the thread · 2026-08-10 · closed · 2 comments
bug(get_work): funder, affiliation, and date projections assume upstream fields Crossref does not guarantee
Server version
0.3.7
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
http
Description
crossref_get_work fails the whole call on three upstream shapes the Crossref message schema permits and the projection treats as impossible. All three are ordinary deposits, not corruption.
Related: #6, which closed the same class for type: null.
- A funder identified by ROR instead of by name. Crossref lets a funding assertion carry `id:
Read the thread · 2026-08-10 · closed · 2 comments
bug(get_work): a Markdown block marker at the head of an abstract is eaten in content[]
Server version
0.3.7
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
OS
macOS
Description
Related: #53
crossref_get_work is the one tool that renders a deposited value at column zero — format() pushes the abstract as its own line, with no **Label:** or - in front of it. A CommonMark block marker at the head of that value therefore opens a block, and the marker itself is cons
Read the thread · 2026-08-10 · closed · 2 comments
bug(get_work,search_works): a kept link tag reaches abstracts without saving an address
Server version
0.3.6
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
OS
macOS
Description
Related: #53
Link elements — a, ext-link, uri — keep their tags so that removing one cannot delete the address sitting in the href (#49, #50). Extending that to the JATS-deposited fields puts the whole tag, namespace declarations included, into title and abstract, which are otherwise clean text on both result surfaces.
T
Read the thread · 2026-08-10 · closed · 2 comments
bug(work-titles,abstracts): the JATS strip shatters formulas the reference strip joins tight
Server version
0.3.5
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
OS
macOS
Description
normalizeMarkupText — the pass work titles, subtitles, container titles, and abstracts run through — replaces every tag with a space except sub and sup. normalizeReferenceText learned three things that pass does not have: MathML matched as a region, the formula wrappers (formula, inline-formula, ref_formula, tex, `tex-
Read the thread · 2026-08-10 · closed · 2 comments
Most recent
bug(search_works): a zero-result response leads with an empty text block
Server version
0.3.9
mcp-ts-core version
0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0
Transport
http
Description
When a query matches nothing, format() in search-works.tool.ts builds lines from the works array and an optional nextCursor header — both empty — and returns ''. That empty string still ships as content[0], ahead of the enrichment trailer that carries the useful "No results matched the query" notice.
The information is all there; the res
Read the thread · 2026-08-25 · open · 0 comments
bug(search_journals,search_funders): works_cursor paging is rejected by Crossref — an explicit sort rides along with the cursor
Server version
0.3.9
mcp-ts-core version
0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0
Transport
http
Description
Related: #38
works_cursor never works on either tool. getJournalWorks and getFunderWorks both build their query string with a hardcoded sort: 'published', order: 'desc', then call setSubResourcePage(params, opts), which appends cursor when the caller passes one. Crossref rejects sort combined with cursor outright, so every cursor cal
Read the thread · 2026-08-25 · open · 0 comments
enhancement(get_references): refersplit and valueless-attribute tags survive the markup strip
Related: #50
Two brackets stripReferenceMarkup does not recognize still reach both result surfaces. Both are well-formed markup by the rule's own shape test, so neither is a case the "an ambiguous angle bracket must not cost the reader content" constraint argues for leaving.
<refersplit /> is not on the allow-list
A reference-separator element some publishers append to each packed citation string. It is self-closing, carries nothing in an attribute, and has no ordinary-word reading, s
Read the thread · 2026-08-10 · closed · 2 comments
bug(text-normalization): only five named HTML entities are decoded; the rest reach both surfaces literally
Server version
0.3.5
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP
OS
macOS
Description
decodeHtmlEntities in src/services/crossref/crossref-service.ts decodes five named entities — &, <, >, ", ' — plus numeric and hex references. Every other named entity a publisher deposits reaches both result surfaces as its literal source text.
It is the same pass all three normalization functions s
Read the thread · 2026-08-10 · closed · 2 comments
enhancement(get_references): the markup allow-list misses span, inf, and the JATS structured-citation vocabulary
Related: #49
The element-name allow-list in normalizeReferenceText clears inline emphasis, scripts, block boundaries, and MathML, but three element classes it does not name still reach both result surfaces as visible tags. None of them carries content in an attribute, so the constraint #49 established — an ambiguous angle bracket must not cost the reader a URL — does not argue for leaving them.
Reproducible against the live API, one curl each:
curl -s 'https://api.crossref.org/works/1
[Read the thread](https://github.com/cyanheads/crossref-mcp-server/issues/50) · 2026-08-09 · closed · 2 comments
### enhancement(get_references): reference free text carries raw markup; angle brackets are ambiguous there
Related: #44
`crossref_get_references` projects `unstructured`, `articleTitle`, `journalTitle`, and `author` through `normalizeText()` — entity decode and whitespace collapse, no markup stripping. A measurable slice of entries therefore reaches both result surfaces carrying raw markup.
Two live entries, each one `curl` away:
curl -s 'https://api.crossref.org/works/10.3934/dcds.2013.33.2211' | jq -r '.message.reference[0].unstructured'
J. T. Beale, T. Kato and A. Majda, Remarks on th
Read the thread · 2026-08-09 · closed · 2 comments
bug(get_member,get_prefix): publisher/member names never get HTML entity decoding
Server version
0.3.3
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP (Streamable HTTP)
Description
crossref_get_member's primaryName/names and crossref_get_prefix's ownerName project raw['primary-name']/raw.names/raw.name with no post-processing at all — neither file imports decodeHtmlEntities or stripJats from crossref-service.ts. Every other name-bearing surface in the server (work titles, journal titles,
Read the thread · 2026-08-09 · closed · 2 comments
bug(search_funders): countryCode output field is never populated
Server version
0.3.3
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP (Streamable HTTP)
Description
FunderSchema in crossref_search_funders declares countryCode ("ISO country code"), mapped from f['country-code']. The Crossref funders API returns no such key on any route — single lookup or name search — so the field is always absent and the mapping is dead.
The advertised outputSchema therefore promises a machine-reada
Read the thread · 2026-08-09 · closed · 2 comments
feat(search_funders): surface replaced-by/replaces so deprecated registry entries are visible
The Crossref Funder Registry supersedes entries: a deprecated funder carries replaced-by pointing at its current ID, and the current entry carries replaces. crossref_search_funders reads neither, so a deprecated record resolves like any other — name, country, works count, funded works — with nothing saying it has been superseded. Its work count is a fraction of the successor's, and that fraction is returned as the answer.
Proposal
Project replaced-by and replaces into the funder o
Read the thread · 2026-08-09 · closed · 2 comments
bug(search_journals): include_works is silently dropped when the matched journal has no ISSN
Server version
0.3.3
mcp-ts-core version
0.11.1
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP (Streamable HTTP)
Description
crossref_search_journals addresses a journal's works list by ISSN. When the matched record carries neither ISSN-L nor an ISSN entry, the handler returns the journal list and skips the works call — with no recentWorks, no worksTotal, and no notice on either surface. The caller asked for works and cannot tell whether the jo
Read the thread · 2026-08-09 · closed · 2 comments
The remaining reports are on the project's issue tracker.