# Reported issues for anime-mcp-server

Pod holds 21 of 27 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 [anime-mcp-server](/mcp/anime-mcp-server).

## Most discussed

### ux(anime_get_studio): missing-identifier case uses validationError() factory, not ctx.fail — data.reason is null

### Server version

0.1.1

### mcp-ts-core version

^0.9.21

### Runtime

Node.js

### Runtime version

>=24.0.0

### Transport

HTTP (Streamable HTTP)

### Description

When \`anime_get_studio\` is called with neither \`name\` nor \`id\`, the handler throws via \`validationError()\` factory directly (not \`ctx.fail\`). This produces \`error_data: null\` in the tool response — \`data.reason\` is absent, the error contract isn't declared, and machine consumers can't route on the structured reason

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/5) · 2026-06-07 · closed · 2 comments

### ux(anime_search_media): description leaks internal fallback routing detail

The `anime_search_media` description ends with: `'AniList is the primary source; Jikan (MAL) is used as a fallback when AniList returns no results.'`

This exposes internal service routing — which APIs the tool uses and in what order — rather than describing what the tool does for the caller. The output schema already surfaces a `source` field that indicates which service provided results, so callers can observe the actual source without being coached on the internal fallback logic.

### Steps t

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/4) · 2026-06-07 · closed · 2 comments

### ux(anime_get_media): scores output description meta-coaches rather than describes

The `scores` output field description in `anime_get_media` ends with a directive: `'AniList and MAL use different scales and methodologies — never blend them.'`

The phrase "never blend them" is meta-coaching — it tells the reader how to use the data rather than describing what the data is. Output schema descriptions should explain what the value *is*, not prescribe how to interpret it.

### Steps to reproduce

1. Call `tools/list` and inspect the `outputSchema.properties.scores.description` for

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/3) · 2026-06-07 · closed · 2 comments

### ux(anime_get_recommendations): liked_aspects param description has audience leak

The `liked_aspects` parameter description in `anime_get_recommendations` contains consumer-aware phrasing that names the calling agent as the reader.

### Current description

`'Included in the output for context; the agent can use it to highlight relevant picks.'`

The phrase "the agent can use it" names the LLM reader directly — this violates the definition language rule that descriptions should describe the value, not coach the caller.

### Steps to reproduce

1. Call `tools/list` and inspect

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/2) · 2026-06-07 · closed · 2 comments

### ux(anime_search_media,anime_get_rankings,anime_get_schedule): no notice field in empty-result structuredContent

`anime_search_media`, `anime_get_rankings`, and `anime_get_schedule` return empty `results`/`entries` arrays on zero matches, but their `structuredContent` (output schema) has no `notice` field. The `content[]` text says "No results found (source: anilist)." but this guidance is invisible to `structuredContent`-only clients (e.g., Claude Code API mode).

## Proposal

Add a `notice: z.string().optional()` field to the output schemas of these three tools. Populate it on empty results with an actio

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/1) · 2026-06-07 · closed · 2 comments

### feat(config): declare stateless mode in createApp

### Use case

Source, `bunx`, and npm launches still inherit the framework's `auto` session-mode default, which resolves to `stateful`. This read-only data server has no request-spanning user or session state.

The configuration-owned surfaces are already aligned in v0.1.6: `.env.example` actively selects `stateless`, and the Docker image sets `MCP_SESSION_MODE=stateless`.

### Proposed behavior

After cyanheads/mcp-ts-core#376 is released and adopted, declare `sessionMode: "stateless"` in `src/

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/17) · 2026-08-22 · open · 1 comment

### docs(community-health): CONTRIBUTING.md and SECURITY.md ship unresolved scaffold comments

### Description

`.github/CONTRIBUTING.md` and `.github/SECURITY.md` were scaffolded by the framework's community-health generator and committed with placeholder HTML comments still in place, meant to be filled in or removed by the maintainer.

### Actual behavior

`.github/CONTRIBUTING.md`:
```
<!-- Optional: swap the line above for direct links once you know your repo URL —
     https://github.com/OWNER/REPO/issues/new?template=bug_report.yml -->

<!-- If you accept pull requests, say so here 

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/16) · 2026-08-22 · closed · 1 comment

### bug(enrichment): expose capping guidance for two paged tools

### Server version

0.1.5

### mcp-ts-core version

0.12.3

### Runtime

Node.js

### Runtime version

v26.5.0

### Transport

stdio (the response-shaping path is shared with HTTP)

### OS

macOS 26.1 (Darwin 25.1.0)

### Description

On a capped `anime_find_characters` or `anime_get_recommendations` call, `ctx.enrich.truncated()` stores a default or supplied `notice`, but each tool's `enrichment` shape omits `notice`. The framework strips undeclared enrichment from `structuredContent` and its `

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/15) · 2026-08-21 · closed · 1 comment

## Most recent

### bug(anime_find_characters): restore voice actors in character mode

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`anime_find_characters` returns empty `voice_actors` for character-name appearances even when AniList has voice actors for those exact character/media edges. The service requests both `media.nodes` and `media.edges`; on this connection AniList returns the nested `edge.voiceActors` values as `null`, which the hand

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/27) · 2026-08-31 · open · 0 comments

### bug(pagination): stop presenting AniList totals as exact

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

Search, schedule, rankings, and studio responses present AniList `PageInfo.total` as an exact result count. AniList's official [pagination guide](https://docs.anilist.co/guide/graphql/pagination) says `total` and `lastPage` are not currently accurate and only `hasNextPage` should drive pagination.

### Steps to r

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/26) · 2026-08-31 · open · 0 comments

### bug(schemas): reject ambiguous multi-mode inputs

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

Three multi-mode tools expose flat all-optional schemas and resolve ambiguity by branch order. Valid-looking but contradictory inputs therefore succeed while silently ignoring declared fields.

### Steps to reproduce

1. Call `anime_find_characters` with both `id: 5114` and `character_name: "Edward Elric"`.
2. Ca

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/25) · 2026-08-31 · open · 0 comments

### feat(anime_get_rankings): expose the advertised tag filter

### Use case

`anime_get_rankings` says rankings are filterable by genre, tag, and format, but its public schema exposes genre and format only. Tag-led discovery is a real AniList workflow—for example, ranking `Isekai`, `Time Travel`, or `Found Family` titles within a media type—and AniList already supports the `tag` filter.

### Proposed behavior

Add an optional `tag` input to `anime_get_rankings`, pass it to the AniList media query, echo it in enrichment, and keep the tool description and REA

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/24) · 2026-08-31 · open · 0 comments

### bug(anime-media resource): validate IDs and align payload claims

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

The `anime://media/{id}` resource accepts numeric prefixes instead of validating the complete ID segment, and its advertised payload parity with `anime_get_media` is inaccurate.

### Steps to reproduce

1. Read `anime://media/16498junk`.
2. Compare `anime://media/5114` with `anime_get_media({ "id": 5114 })`.

###

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/23) · 2026-08-31 · open · 0 comments

### bug(anime_get_recommendations): include Jikan-only candidates

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`anime_get_recommendations` advertises combined AniList and Jikan recommendations, but Jikan can only annotate candidates already returned by AniList. Jikan-only candidates are collected in `jikanVoteMap`, left after overlap deletion, and never added to the response. A failed Jikan leg is also indistinguishable f

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/22) · 2026-08-31 · open · 0 comments

### bug(anime_search_media): preserve empty results when fallback fails

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

When AniList successfully returns an empty page, `anime_search_media` unconditionally calls Jikan. If that fallback is unavailable, the successful primary result is replaced with a `ServiceUnavailable` error, so callers cannot distinguish an exhausted page or genuine zero-match result from a total search outage.

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/21) · 2026-08-31 · open · 0 comments

### bug(anime_search_media): reject empty search criteria

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`anime_search_media` accepts no search criterion and treats empty strings as absent filters. A malformed or empty request therefore becomes an unfiltered AniList query instead of failing loudly.

### Steps to reproduce

1. Call `anime_search_media` with `{ "media_type": "ANIME", "per_page": 2 }`.
2. Repeat with `

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/20) · 2026-08-31 · open · 0 comments

### bug(format): make bounded text output lossless and retrievable

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

Several formatters omit data that exists in `structuredContent` without a same-page retrieval path. This leaves content-only clients with incomplete records even though the tool call succeeded.

Related: #11

### Steps to reproduce

1. Call `anime_get_media` with `{ "id": 5114 }`.
2. Compare all tags and relation

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/19) · 2026-08-31 · open · 0 comments

### bug(anime_get_relations): enforce traversal depth and preserve edge semantics

### Server version

0.1.7

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`anime_get_relations` processes a node at `max_depth` and still adds that node's children to the result. Those extra nodes are labeled with the edge from their immediate parent as `relation_to_root`, so multi-hop relationships are presented as direct root relationships and can distort the suggested order.

### St

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/18) · 2026-08-31 · open · 0 comments

### bug(tools): pass declared recovery hints into error responses

### Server version

0.1.5

### mcp-ts-core version

0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio and HTTP

### Description

The five tools that declare a `recovery` hint call `ctx.fail(...)` without its data argument on their reachable contract-failure paths. The framework therefore emits `data.reason` but omits `data.recovery.hint`, and `content[0].text` has no `Recovery:` line.

### Steps to reproduce

1. Call `anime_get_schedule` with `{ "mode": "season" }`.

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/14) · 2026-08-21 · closed · 1 comment

### bug(anime_search_media): Jikan fallback returns unusable AniList ID 0

### Server version

0.1.6

### mcp-ts-core version

^0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS (source-level and mocked-handler reproduction)

### Description

When AniList returns no matches for a title query, `anime_search_media` falls back to Jikan but returns every Jikan row with `id: 0`. That field is documented as an AniList media ID and is the input expected by the server's follow-up tools and `anime://media/{id}` resource, so fallback r

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/13) · 2026-06-30 · closed · 1 comment

### bug(anime_get_schedule): upcoming mode ignores include_adult

### Server version

0.1.6

### mcp-ts-core version

^0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0 / Node v26.5.0

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`anime_get_schedule` defaults `include_adult` to `false`, but its `upcoming` branch returns every AniList airing schedule it receives. The season branch already passes the flag to AniList; the upcoming branch needs local filtering because AniList's `Page.airingSchedules` field has no adult-content

[Read the thread](https://github.com/cyanheads/anime-mcp-server/issues/12) · 2026-06-30 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/anime-mcp-server/issues).
