
Connects Claude to AniList, MyAnimeList via Jikan, and Kitsu for anime and manga lookups. Eight tools cover search, full media detail with dual scores (AniList and MAL side by side, never blended), franchise relation graphs with topological watch order sorting, airing schedules with UTC timestamps, character and voice actor lookups, recommendations, rankings, and studio filmography. Walks relation graphs up to four hops deep to untangle prequels, sequels, side stories, and adaptations. Spoiler tags are preserved by default. Built for local deployment only since the free APIs are rate limited per IP. Keyless, runs on public endpoints, returns AniList IDs as stable references.
Sponsors
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
Search anime/manga, get full detail, franchise relations, seasonal schedule, characters, rankings, and studio filmography via MCP. STDIO or Streamable HTTP.
Anime and manga data from AniList, Jikan (MyAnimeList), and Kitsu. Search titles, pull full detail with side-by-side AniList and MAL scores, walk a franchise's relation graph, check the airing schedule, and look up characters, voice actors, and studio filmographies.
| Tool | Description |
|---|---|
anime_search_media | Search anime or manga by title, genre, tag, season, year, format, or status. Returns ranked results with IDs, titles, scores, format, and episode/chapter counts. AniList primary; Jikan (MAL) fallback when AniList has no match for a title-only query. |
anime_get_media | Full detail for one anime or manga by AniList ID — synopsis, format, episode/chapter count, status, season, studios, source material, genres and tags (spoiler-flagged), AniList and MAL scores side by side, streaming links, cover/banner, and direct relations. |
anime_get_relations | Walks the related-works graph within a hop limit. Groups main and supplementary entries by relation priority, then year; not a strict chronology. |
anime_get_schedule | Airing schedule for a season or upcoming episode window. Season mode lists all anime airing in a given season/year. Upcoming mode returns the next episode for each airing title within a date window, with UTC timestamp and countdown. |
anime_find_characters | Characters and voice actors for a title, or look up a character/VA by name. Returns characters with role (main/supporting/background), voice actors by language, and cross-links to other media. |
anime_get_recommendations | Page AniList recommendations with matching MAL votes, or Jikan candidates resolved through AniList. Reports the selected source and Jikan availability; optionally echoes what you liked. |
anime_get_rankings | Top, trending, or seasonal rankings. Filterable by genre, tag, and format. Top returns all-time by score; trending uses AniList's trending order; seasonal returns the current or specified season sorted by popularity. |
anime_get_studio | A studio's full filmography by name or AniList studio ID — all titles the studio produced, sortable by year or score, with format, status, and episode count. |
| Resource | Description |
|---|---|
anime://media/{id} | Compact media record by AniList ID — title, synopsis, scores, genres, streaming count, and cover image. Stable URI for injectable context. |
skill://anime-guide/SKILL.md | Caller guide for franchise research, cast-to-career lookups, studio filmographies, and recommendation coverage. Also included in plugin, npm, Docker, and MCPB installs. |
Media resource data is also reachable via tools. Use anime_search_media to discover AniList IDs before fetching its resource URI.
anime_search_media toolpage/per_page pages results (max 50), and include_adult: true opts into adult titlesper_page 25 or less. Follow has_next_page; total_results is exact only on the final pagepage_depth_exceeded, so narrow the criteria insteadanime_get_media toolid, with adult content requiring include_adult: true; discover IDs through anime_search_mediadata_sources identifies successful supplements; not_found means the ID did not resolvefull_text: true returns the complete result as fenced JSON; by default the synopsis is a 500-character preview and tags and relations are shortened, with counts of what was omittedanime_get_relations toolid up to max_depth hops (default 2, max 4)main and supplementary entries with season year and episode/chapter counts, ordered by relation priority then year. not_found means the root ID did not resolvedepth, parent_id, relation_to_parent, and path show the shortest route to each entry. relation_to_root is set only for entries linked directly to the root, and is null otherwise. Entries at the hop limit are returned without their own relations; depth_reached is the deepest hop returnedanime_get_schedule toolseason mode requires season and season_year; upcoming uses days_ahead (default 7, max 30). Page with page/per_page (max 50); adult titles require include_adult: truetime_until_airing_seconds. Follow has_next_page; total_results is exact only on the final season page. invalid_season and conflicting_inputs identify invalid mode inputsanime_find_characters toolid, character_name, or voice_actor_name. language filters only media cast lookups; per_page is capped at 25mode. truncated: true carries next-page guidance for capped cast lists; media_not_found/not_found distinguish an unknown media ID from an unmatched namevoice_actor_data_available: false means the provider had no voice actor data, as opposed to an empty list. full_text: true returns every role on the page and the full biography as fenced JSON; by default biographies are 500-character previews and staff roles stop at 20, with counts of what was omittedanime_get_recommendations toolid with source: "anilist" (default) or source: "jikan"; optional liked_aspects is echoed unchanged. AniList pages its recommendations and adds matching MAL votes. Jikan deduplicates its supplied list by maximum votes, orders votes descending/MAL ID ascending, and locally pages candidates with page/per_page (max 25) before resolving that slice through AniList. Adult and unresolved candidates are omitted; has_next_page still follows candidate pages. Jikan does not guarantee a global ranking or a stable snapshot across callssource and jikan_status (available, unavailable, or not_applicable when the source lacks a MAL ID), plus separate anilist_rating, jikan_votes, and item sources. Jikan mode uses null anilist_rating and sources: ["jikan"]. Optional annotation failures retain AniList results; selected Jikan/resolution failures return retry-or-switch guidance. truncated: true supplies continuation with the same source; not_found means the source ID did not resolve, while valid empty pages succeedanime_get_rankings toolANIME or MANGA in top/trending; seasonal and season/year filters apply only to ANIME (anime_only_season otherwise). Genre/tag/format filters and page/per_page (max 50) remain available. Adult titles require include_adult: truerank and season_label. Follow has_next_page; total_results is exact only on the final page. Seasonal mode takes season/season_year together or neither for the current season (invalid_season otherwise)anime_get_studio toolname or id; sort by popularity, score, or release date and page with page/per_page (max 25)is_main_studio identifying main credits. Follow has_next_page; total_titles is exact only when the whole filmography fits on page 1. not_found means the studio did not resolveanime://media/{id} resourceapplication/json media record using an AniList id from anime_search_media or anime_get_mediainvalid_id before any upstream callanime_get_media for tags, studios, streaming links, and relationsBuilt on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
Anime/manga-specific:
idMal bridge — no cross-source ID guessingAgent-friendly output:
meanScore (0–100) and MAL score (0–10) with population size (scored_by) so agents can reason about weight; never blended into a compositefull_text: true carry all tags with their flagsanime_get_media.data_sources reports whether AniList, MAL/Jikan, and Kitsu data was retrieved; an unavailable supplement leaves its flag falseWINTER 2024) to avoid the winter/spring/summer/fall boundary footgunNo API keys required — all three upstream sources (AniList, Jikan, Kitsu) are keyless public APIs.
Add the following to your MCP client configuration file:
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/anime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/anime-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"anime-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/anime-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/anime-mcp-server.git
cd anime-mcp-server
bun install
cp .env.example .env
# edit .env if you want to change transport or log level
No server-specific env vars are required. All framework variables are optional with sensible defaults.
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_HTTP_HOST | Hostname for HTTP server. | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | Endpoint path for the MCP server. | /mcp |
MCP_SESSION_MODE | Session mode: auto, stateful, or stateless. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424): debug, info, notice, warning, error. | info |
LOG_TOOL_FAILURE_PAYLOADS | Log failed calls' arguments and results, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). Secrets inside free-form values are not redacted. | false |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t anime-mcp-server .
docker run --rm -p 3010:3010 anime-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/anime-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, and inits services. |
src/mcp-server/tools | Tool definitions (*.tool.ts). |
src/mcp-server/resources | Resource definitions (*.resource.ts). |
src/services/anilist | AniList GraphQL client — primary source for all queries. |
src/services/jikan | Jikan v4 REST client — MAL scores and recommendations. |
src/services/kitsu | Kitsu JSON:API client — streaming links with sub/dub language detail. |
tests/ | Unit and integration tests mirroring src/. |
skills/ | Published caller guide, available through plugins and MCP skill discovery. |
changelog/ | Per-version changelog files (changelog/<minor>.x/<version>.md). |
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/*/definitions/index.tsPromise.allSettledIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
@cyanheads/anime-mcp-server